始める無料で始める

ポートフォリオを計算する

ここでは、各月の最適なポートフォリオを見つけるために、複数のポートフォリオを生成します。numpyrandom.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])
コードを編集して実行