ファイナンス機械学習:機械学習を使った資産アロケーション 練習問題 ストックプライス

投資戦略の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
84個のPnL系列

この共分散行列からのクラスタリングは以下の通りとなる。

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
ポートフォリオ配分
配分率


この記事が気に入ったらサポートをしてみませんか?