替代的投資組合最佳化

Python 投資組合分析入門

Charlotte Werger

Data Scientist

以歷史資料評估預期風險與報酬

$$

  • 歷史平均報酬或歷史組合變異,對 mu 與 Sigma 都是「不完美的估計」
  • 以此最佳化得到的權重,對未來資料「不保證表現良好」

$$ 如果歷史會重演的玩笑

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 投資組合分析入門

在最佳化中使用下行風險

$ $

  • 回想 Sortino 比率:只使用負報酬的變異
  • 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...