市场风险的一个数字
大多数股票在市场上涨时上涨,下跌时下跌。资产的贝塔度量涨跌的幅度:贝塔为 1.5,意味着市场变动 1% 时,资产平均变动 1.5%。它是资产收益对市场收益的斜率,covariance(asset, market) / variance(market)。贝塔是无法通过分散化消除的那部分风险,因为市场里每个资产都带着它。
import numpy as np
market = np.array([0.01, -0.02, 0.015, 0.005, -0.01, 0.02])
asset = 1.5 * market + np.array([0.002, -0.001, 0.003, 0.0, -0.002, 0.001]) # moves 1.5x the market, plus noise
market_dev = market - market.mean()
covariance = np.sum((asset - asset.mean()) * market_dev) / (len(market) - 1)
variance = np.sum(market_dev ** 2) / (len(market) - 1)
print(round(float(covariance / variance), 4)) # 1.5972: about 1.5, the noise moves it a little
print(round(float(np.polyfit(market, asset, 1)[0]), 4)) # the regression slope gives the same number# Beta does not care about a constant, and scales with the asset
import numpy as np
def beta(asset, market):
market_dev = market - market.mean()
return float(np.sum((asset - asset.mean()) * market_dev) / np.sum(market_dev ** 2))
rng = np.random.default_rng(4)
market = rng.normal(0, 0.01, size=100)
print(round(beta(2.5 * market, market), 4)) # 2.5 an asset that moves 2.5x the market
print(round(beta(market + 0.01, market), 4)) # 1.0 adding a constant changes nothing
print(round(beta(-market, market), 4)) # -1.0 a perfect hedge资本资产定价模型
CAPM 把它变成风险的价格。投资者只因承担市场风险而得到补偿,除此之外没有别的,所以资产的预期收益是无风险利率加上贝塔乘以市场风险溢价(市场收益减无风险利率):E[R] = rf + beta * (E[R_m] - rf)。贝塔为 0 赚无风险利率,贝塔为 1 赚市场收益,贝塔为 2 赚无风险利率加两倍溢价。
def capm_expected_return(rf, beta_value, market_return):
return rf + beta_value * (market_return - rf)
rf, market_return = 0.01, 0.06
for b in (0.0, 0.5, 1.0, 1.5, 2.0):
print(b, round(capm_expected_return(rf, b, market_return), 4)) # 0.01, 0.035, 0.06, 0.085, 0.11阿尔法:剩下的部分
如果 CAPM 成立,资产恰好赚到其贝塔所对应的收益。实际赚到的与 CAPM 预期的差,就是詹森阿尔法:mean(asset) - (rf + beta * (mean(market) - rf))。阿尔法为正,说明表现超过了其市场风险所能解释的部分;这正是主动管理人所兜售的东西,也是最难找到的。市场解释不了的那部分波动是残差风险,用回归残差的标准差度量,可以通过分散化消除。
# Alpha and residual risk of an asset with a little skill in it
import numpy as np
rng = np.random.default_rng(2)
market = rng.normal(0.0004, 0.01, size=500)
asset = 0.0003 + 1.2 * market + rng.normal(0, 0.005, size=500) # true alpha 3 bps a day, beta 1.2, residual 0.5%
rf = 0.0001
market_dev = market - market.mean()
b = np.sum((asset - asset.mean()) * market_dev) / np.sum(market_dev ** 2)
alpha = asset.mean() - (rf + b * (market.mean() - rf))
a = asset.mean() - b * market.mean()
residual = asset - (a + b * market)
print(round(float(b), 3), round(float(alpha), 5), round(float(np.sqrt(np.sum(residual ** 2) / (len(asset) - 2))), 4))贝塔是统计量,不是常数用 60 天估计的贝塔误差范围很大,还会随市场状态和指数选择而变化;用日收益还是月收益,数字也不一样。CAPM 本身是一种简化:后来的研究发现了更多能解释收益的因子,这是下一节的主题。请把贝塔当作测量得到、带有不确定性的输入。
- 贝塔 =
covariance(asset, market) / variance(market),对市场的斜率;是无法分散的风险部分。 - CAPM:
rf + beta * (market - rf);詹森阿尔法 = 平均收益减去它,即超出市场风险的能力(或运气)。 - 残差风险是
asset - (a + b * market)的标准差(除以n - 2);可以分散;贝塔本身有噪声。
下一节:多因子模型(Fama–French),用市场之外的因子解释收益。
实验:评分内容
- 用
beta度量对市场的敏感度25 分 - 用
capm_expected_return给风险定价25 分 - 用
jensen_alpha寻找超额能力(如果有的话)25 分 - 用
residual_vol衡量剩余风险25 分