代替的なポートフォリオ最適化

Pythonで学ぶポートフォリオ分析入門

Charlotte Werger

Data Scientist

過去データに基づく期待リスクとリターン

$$

  • 過去平均リターンや過去のポートフォリオ分散は、μ と Σ の推定としては不完全
  • よって最適化で得たウェイトが将来データでうまく機能する保証はない

$$ 歴史は繰り返す?のジョーク

Pythonで学ぶポートフォリオ分析入門

過去データ

時系列データは時間とともに変化

Pythonで学ぶポートフォリオ分析入門

指数加重リターン

$$

  • より良いリスク・リターン指標が必要
  • 指数加重は直近データを重視
  • 図の指数移動平均: t-1 観測に最大の重み

指数加重リターンの重み

Pythonで学ぶポートフォリオ分析入門

指数加重共分散

$$

  • 指数加重共分散行列: 直近データにより大きな重みを付与
  • 図: 黒の指数加重ボラは、青の標準ボラより実際のボラに近い

$$ 指数加重と通常の共分散の比較

1 Source: https://systematicinvestor.github.io/Exponentially-Weighted-Volatility-RCPP
Pythonで学ぶポートフォリオ分析入門

指数加重リターン

from pypfopt import expected_returns
# 指数加重移動平均
mu_ema = expected_returns.ema_historical_return(df, 
                         span=252, frequency=252)
print(mu_ema)
symbol
XOM     0.103030
BBY     0.394629
PFE     0.186058
Pythonで学ぶポートフォリオ分析入門

指数加重共分散

from pypfopt import risk_models
# 指数加重共分散
Sigma_ew = risk_models.exp_cov(df, span=180, frequency=252)
Pythonで学ぶポートフォリオ分析入門

最適化で下方リスクを使う

$ $

  • ソルティノ比を想起:負のリターンの分散のみを使用
  • PyPortfolioOpt では最適化にセミ共分散を使用可能。下方リスクの尺度

$ $ 下方リスクの計算

Pythonで学ぶポートフォリオ分析入門

PyPortfolioOpt のセミ共分散

Sigma_semi = risk_models.semicovariance(df,     
                        benchmark=0, frequency=252)

print(Sigma_semi)
         XOM         BBY          MA         PFE
XOM     0.018939    0.008505    0.006568    0.004058
BBY     0.008505    0.016797    0.009133    0.004404
MA      0.006568    0.009133    0.018711    0.005373
PFE     0.004058    0.004404    0.005373    0.008349
Pythonで学ぶポートフォリオ分析入門

練習しましょう!

Pythonで学ぶポートフォリオ分析入門

Preparing Video For Download...