アセットマネージャーのためのファイナンス機械学習:ポートフォリオの構築 練習問題 ランダム共分散行列と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()
クラスター構造のない共分散行列によるポートフォリオ

いいなと思ったら応援しよう!