衡量投资组合风险

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, …$)、组合中的权重($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 投资组合分析入门

Passons à la pratique !

Python 投资组合分析入门

Preparing Video For Download...