# Stefano Ciccarelli
import quandl
import pandas as pd
quandl.ApiConfig.api_key = "TyKZthWgcxsqfZf9yeXD"
data = dict()
for n in range(10):
request = quandl.get_table('SHARADAR/SF1', calendardate='201{}-12-31'.format(n))
request.index = request['ticker']
data['201{}'.format(n)] = request
def labeling(x):
if x >= 0.3:
return 1
else:
return 0
for n in range(9):
data['201{}'.format(n)]['Return'] = data['201{}'.format(n + 1)]['price']/data['201{}'.format(n)]['price'] - 1
data['201{}'.format(n)]['Label'] = data['201{}'.format(n)]['Return'].apply(labeling)
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
columns = list(data['2011'].columns[6:])
data_standard = pd.DataFrame(columns = data['2011'].columns)
for var in data:
if var not in ("2010", "2018", "2019") :
dataset_standard = data[var].copy()
dataset_standard[columns] = scaler.fit_transform(dataset_standard[columns])
data_standard = data_standard.append(dataset_standard)
else:
pass
data_standard.index = data_standard["calendardate"]
data_standard.tail()
X, y = data_standard[columns], data_standard['Label']
from sklearn.model_selection import train_test_split
X_train, X_test = X[:'2017-01-01'], X['2017-01-01':]
y_train, y_test = y[:'2017-01-01'], y['2017-01-01':]
import autokeras as ak
search = ak.StructuredDataClassifier(max_trials=15)
search.fit(x=X_train, y=y_train, verbose=1)
loss, acc = search.evaluate(X_test, y_test, verbose=0)
print('{:.2f}%'.format(acc*100))
y_predictions = search.predict(X_test)
y_train, y_test = y[:'2017-01-01'], y['2017-01-01':]
df = pd.DataFrame(y_test)
df["Expected"] = y_predictions
returns = data["2017"]
returns.index = returns["calendardate"]
df["Return"] = returns["Return"]
df["Ticker"] = returns["ticker"]
df
df["Strategy"] = df['Expected']*(df['Return']+1)
print("This Algorithm for Stock Selection produces an average annualized return of {:.2f}%".format(df["Strategy"].mean()*100))
import yfinance as yf
stocks = pd.DataFrame()
count = 0
insert = list(df["Expected"])
for i in df["Ticker"]:
if insert[count] == 1:
count += 1
try:
data = yf.download(i, start="2017-01-01", end="2017-12-30")
stocks[i] = data['Adj Close']
except:
print('failed: ', i)
else:
count += 1
pass
print(stocks)
stocks = stocks.dropna(axis='columns')
stocks.head(10)
import sys
import yfinance as yf
import lxml
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import figure
from sklearn.preprocessing import MinMaxScaler
import os
log_ret = np.log(stocks/stocks.shift(1))
np.random.seed(42)
num_ports = 2000
all_weights = np.zeros((num_ports, len(stocks.columns)))
ret_arr = np.zeros(num_ports)
vol_arr = np.zeros(num_ports)
shape_arr = np.zeros(num_ports)
for x in range(num_ports):
weights = np.array(np.random.random(len(stocks.columns)))
weights = weights/np.sum(weights)
all_weights[x,:] = weights
ret_arr[x] = np.sum((log_ret.mean()*weights*252))
vol_arr[x] = np.sqrt(np.dot(weights.T, np.dot(log_ret.cov()*252, weights)))
shape_arr[x] = ret_arr[x]/vol_arr[x]
print('Max sharpe ratio in the array: {}'.format(shape_arr.max()))
print("Its location in the array: {}".format(shape_arr.argmax()))
max_sr_ret = ret_arr[shape_arr.argmax()]
max_sr_vol = vol_arr[shape_arr.argmax()]
print('Proportion ratio: ',100*all_weights[shape_arr.argmax(),:])
plt.figure(figsize=(12,8))
plt.scatter(vol_arr, ret_arr, c=shape_arr)
plt.colorbar(label='Sharpe Ratio')
plt.xlabel('Volatility')
plt.ylabel('Return')
plt.scatter(max_sr_vol, max_sr_ret, c='red', s=50)
plt.show()
print("The Expected return of this optimal portfolio would be {:.2f}%, with a volatility of {:.2f}%, generating a Sharpe Ratio of {:.2f}".format(ret_arr[1451]*100,vol_arr[1451]*100,shape_arr[1451]))
equipment = list(stocks.columns.values)
sizes = list(100*all_weights[shape_arr.argmax(),:])
dictionary = {}
count = 0
for x in equipment:
dictionary[x] = sizes[count]
count += 1
print(dictionary)
a = pd.DataFrame.from_dict(dictionary,orient= "index")
a.to_csv("final.csv")
fig1, ax1 = plt.subplots()
fig1.set_size_inches(8, 6)
ax1.pie(sizes, labels=equipment, autopct='%1.1f%%',
shadow=True, startangle=90)
ax1.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.
fig1.set_facecolor('white')
plt.show()
28.26 - 3.291 * (8)