ファイナンス機械学習:機械学習を使った資産アロケーション 練習問題 ストックプライス
投資戦略のN個の証券の損益(PnL)系列が与えられているとする。
週次の取引とし、週次の観測値に合わせ、リターンの共分散から、階層クラスターを求め、クラスター化された相関係数行列を可視化する。
from datetime import datetime
from pandas_datareader import data as pdr
import yfinance as yfin
yfin.pdr_override()
ticker_symbols=['AAPL','ACN','ADBE','ADI','ADP','ADSK','AEP','AFG',
'ALGN','AMD','AMGN','AMZN','ANSS','AON','ASML','AVGO','AXP','AZN',
'BA','BABA','BAC','BKNG','BKR','BP','BUD','C','CAT','CDNS','CHTR',
'CMCSA','COST','CPRT','CRM','CSCO','CSGP','CSX','CTAS','CTSH','CVX','DLTR',
'DXCM','EBAY','EXC','FANG','FAST','FTNT','GOOG','GOOGL','IBM',
'IDXX','ILMN','INTC','JD','KDP','KHC','KLAC',
'LULU','MAR','MCHP','MDLZ','MELI','META','MRVL','MSFT','NFLX',
'NXPI','NVDA','ODFL','ORLY','PANW','PAYX','PCAR','PYPL','QCOM','REGN','POST',
'SGEN','SIRI','SNPS','TMUS','TTD','TXN','VRSK','VRTX','WBA','WDAY'
]
startdate= datetime(2016,2,1)
enddate = datetime(2024,2,1)
s_data= pdr.get_data_yahoo(ticker_symbols, startdate, enddate,interval='1d')['Adj Close']
#s_data= pdr.get_data_yahoo(ticker_symbols, startdate, enddate,interval='1h')
s_data=s_data.dropna(axis=1)
s_data.isnull().sum().sort_values(ascending=False)
s_data_ds= s_data.resample('W').last()
s_returns = s_data_ds.pct_change().dropna(how='all')
s_returns
この共分散行列からのクラスタリングは以下の通りとなる。
cov= s_returns.cov()
plt.figure(figsize=(7, 7))
g = sns.clustermap(cov)
g.fig.suptitle('Covariance Matrix of Asset Returns', fontsize = 20)
plt.show()
相関行列の証券同士の距離からクラスタリングを行う。
corr = s_returns.corr()
dist = correlDist(corr)
clusters = linkage(squareform(dist), method="single")
columns = s_returns.columns
plt.figure(figsize=(21, 7))
dendrogram(clusters, labels=columns)
plt.xlabel('Tickers', fontsize=14)
plt.ylabel('Cluster Leaves Distances', fontsize=12)
plt.title('Hierarchical Clustering Dendrogram', fontsize=12)
plt.savefig('./HLD.pdf')
plt.show()
クラスタリングされた共分散行列を用い、HRP,CLA,IVPの三つの方法でポートフォリオの配分を計算する。
hrp=getHRP(cov, corr)
cla=getCLA(cov.values)
ivp=getIvp(cov)
hrp=pd.concat([hrp,pd.Series(cla,index=hrp.index)],axis=1)
hrp=pd.concat([hrp,pd.Series(ivp,index=hrp.index)],axis=1)
hrp.columns=['HRP','CLA','IVP']
hrp