ポートフォリオを計算する
ここでは、各月の最適なポートフォリオを見つけるために、複数のポートフォリオを生成します。numpy の random.random() は一様分布から乱数を生成します。その後、/= 演算子 を使って値の合計が1になるよう正規化します。これらの重みを使って、リターンとボラティリティを計算します。リターンは重みと各銘柄のリターンの積の合計で求められます。ボラティリティはより複雑で、各銘柄間の共分散が必要になります。
最後に、後で使えるよう、月ごとの日付をキーとしてディクショナリに値を保存します。
ここでは処理を速くするために各日付あたり10個のポートフォリオのみ生成しますが、実際のユースケースでは、少数の銘柄に対して1,000〜5,000程度のランダム生成ポートフォリオを使うことをお勧めします。
この演習はコースの一部です
Python による金融のための Machine Learning
演習の手順
np.random.random()を使って、重みとなる乱数を 3 つ生成します。weightsとループ内の現在のdateにおける月次リターンのドット積(np.dot();要素ごとの積を計算して合計する)を取り、returnsを計算します。.setdefault()メソッドを使って、現在のdateのキーで空のリスト([])をportfolio_weightsディクショナリに追加し、そのリストにweightsを追加します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
portfolio_returns, portfolio_volatility, portfolio_weights = {}, {}, {}
# Get portfolio performances at each month
for date in sorted(covariances.keys()):
cov = covariances[date]
for portfolio in range(10):
weights = np.random.random(____)
weights /= np.sum(weights) # /= divides weights by their sum to normalize
returns = np.dot(____, returns_monthly.loc[____])
volatility = np.sqrt(np.dot(weights.T, np.dot(cov, weights)))
portfolio_returns.setdefault(date, []).append(returns)
portfolio_volatility.setdefault(date, []).append(volatility)
portfolio_weights.setdefault(date, ____).append(____)
print(portfolio_weights[date][0])