アセットマネージャーのためのファイナンス機械学習:ポートフォリオの構築 練習問題 ランダム共分散行列とNCO
クラスター構造を持たないランダム共分散行列を作成し、NCOを入れたポートフォリオとNCOを入れないポートフォリオの二乗誤差を測定する。
雑音除去の章で用いたgetRndCovを使い、ランダム共分散行列を作成する。
def getRndCov(nCols, nFacts):
w=np.random.normal(size=(nCols,nFacts))
cov=np.dot(w,w.T)
cov+=np.diag(np.random.uniform(size=nCols))
return cov
def formTrueMatrixNB(nCols,nFacts=0):
cov0=getRndCov(nCols,nFacts)
std0=np.random.uniform(.05,.2,cov0.shape[0])
mu0=np.random.normal(std0,std0,cov0.shape[0]).reshape(-1,1)
return mu0,cov0
これを用いて、$${50\times 50}$$の共分散行列をつくし、最小分散ポートフォリオを最大シャープレシオポートフォリオを、NCO有りとNCO無しでモンテカルロシミュレーションを行い、元データのポートフォリオと誤差を取る。
def main():
nCols=50
np.random.seed(0)
mu0, cov0 = formTrueMatrixNB(nCols)
minVarPortf=True
w1, w1_d=PortExp(mu0=mu0,cov0=cov0,minVarPortf = minVarPortf)
w0 = MP.optPort(cov0, None if minVarPortf else mu0)
w0 = np.repeat(w0.T, w1.shape[0], axis=0)
print('minVar Markowitz RMSE: ',
round(np.mean((w1-w0).values.flatten()**2)**.5,4))
print('minVar NCO RMSE:',
round(np.mean((w1_d-w0).values.flatten()**2)**.5,4))
minVarPortf=False
w1, w1_d=PortExp(mu0=mu0,cov0=cov0,minVarPortf = minVarPortf)
w0 = MP.optPort(cov0, None if minVarPortf else mu0)
w0 = np.repeat(w0.T, w1.shape[0], axis=0)
print('maxSR Markowitz RMSE: ',
round(np.mean((w1-w0).values.flatten()**2)**.5,4))
print('maxSR NCO RMSE:',
round(np.mean((w1_d-w0).values.flatten()**2)**.5,4))
if __name__ == '__main__':
main()