衡量投資組合風險

Python 投資組合分析入門

Charlotte Werger

Data Scientist

投資組合的風險

  • 投資有風險:單一資產會上漲或下跌
  • 期望報酬是隨機變數
  • 報酬圍繞平均數的分散程度以變異數 $\sigma^2$ 衡量,是常見的波動度指標
  • $\sigma^2 = \frac{\sum\limits_{i=1}^N (X -\mu)^2}{N}$

如同平衡木的風險

Python 投資組合分析入門

變異數

$$

  • 單一資產的變異數不同:有的分散較大,有的較小
  • 投資組合的變異數不是各資產變異數加權後那麼簡單
  • 因為資產報酬彼此相關,計算會更複雜

高變異與低變異的分佈

Python 投資組合分析入門

變異與相關如何影響組合風險?

$$

  • 資產 1 與 2 的相關係數以 $\rho_{1,2}$ 表示,說明它們同向變動的程度
  • 投資組合變異數同時考量各資產的變異數($\sigma_1^2, \sigma_2^2, etc$)、在組合中的權重($w_1, w_2$),以及彼此的相關性
  • 標準差($\sigma$)是變異數($\sigma^2$)的平方根,兩者皆為波動度指標
Python 投資組合分析入門

計算投資組合變異數

$$ 投資組合變異數公式

  • $\rho_{1,2} \sigma_1 \sigma_2$ 稱為資產 1 與 2 的共變異數
  • 共變異數也可寫為 $ \sigma_{1,2} $
  • 因此可重寫為:

重寫後的投資組合變異數公式

Python 投資組合分析入門

將投資組合變異數寫得更精簡

投資組合變異數公式

  • 可用矩陣表示,較方便在程式中使用:

矩陣表示的投資組合變異數

  • 用白話說,在 python 中要計算的是:

    投資組合變異數 = 權重轉置 ×(共變異數矩陣 × 權重)

Python 投資組合分析入門

用 python 計算投資組合變異數

price_data.head(2)

ticker        AAPL       FB        GE       GM       WMT
date                    
2018-03-21    171.270    169.39    13.88    37.58    88.18
2018-03-22    168.845    164.89    13.35    36.35    87.14
# Calculate daily returns from prices
daily_returns = df.pct_change()
# Construct a covariance matrix for the daily returns data
cov_matrix_d = daily_returns.cov()
Python 投資組合分析入門

用 python 計算投資組合變異數

# Construct a covariance matrix from the daily_returns
cov_matrix_d = (daily_returns.cov())*250
print (cov_matrix_d)

        AAPL          FB          GE          GM          WMT                    
AAPL    0.053569    0.026822    0.013466    0.018119    0.010798
FB      0.026822    0.062351    0.015298    0.017250    0.008765
GE      0.013466    0.015298    0.045987    0.021315    0.009513
GM      0.018119    0.017250    0.021315    0.058651    0.011894
WMT     0.010798    0.008765    0.009513    0.011894    0.041520
weights = np.array([0.2, 0.2, 0.2, 0.2, 0.2])
Python 投資組合分析入門

用 python 計算投資組合變異數

# Calculate the variance with the formula
port_variance = np.dot(weights.T, np.dot(cov_matrix_a, weights))
print (port_variance)

0.022742232726360567
# Just converting the variance float into a percentage
print(str(np.round(port_variance, 3) * 100) + '%')

2.3%
port_stddev = np.sqrt(np.dot(weights.T, np.dot(cov_matrix_a, weights)))
print(str(np.round(port_stddev, 3) * 100) + '%')
15.1%
Python 投資組合分析入門

一起來練習吧!

Python 投資組合分析入門

Preparing Video For Download...