CNE6因子复现系列——波动率因子Volatility

1. 波动率因子Volatility

  CNE6当中,波动率因子Volatility是一个一级因子,有二级因子BETA和Residual Volatility,其下还有多个三级因子。

一级因子二级因子三级因子
VolatilityBETABETA
Residual Volatilityhistory sigma
daily standard deviation
cumulative range

2. 三级因子

2.1 BETA

  BETA因子反应了市场收益率对单只股票收益率的影响。对于单只股票收益率 r i r_i ri和市场收益率 R R R,建立回归模型 r i = α + β R + u r_i = α + βR + u ri=α+βR+u。系数 β β β就是因子值。
  此外,在计算当中,由于时间越近,影响越大,因此选则252个交易日的数据,并采用指数衰减法确定权重,采用63作为半衰期。对于指数衰减法,参见本人另一篇博客: 确定权重的方式——半衰期与指数衰减法。下方函数half_decay_weight也在这篇博客里定义。

import numpy as np
from sklearn.linear_model import LinearRegression
from half_decay_weight import half_decay_weight

# 导入股票数据
stock_close = np.array()  # 导入一个m * n的数组,m是行,代表日期,n是列,代表每一只股票
# 导入市场收益率,可以用某一股票指数,也可以使用单只股票加权计算市场收益率
# 这里采用沪深300指数
hs300 = np.array()

# 计算股票对数收益率
stock_r = np.log(stock_close[1:][:]) - np.log(stock_close[:-1][:])

# 计算市场收益率
hs300_r = np.log(hs300[1:]) - np.log(hs300[:-1])

# 确定权重
weight = half_decay_weight(63, 251)  # 由于计算收益率后,只剩下251个数据,所以时间窗口选251

# 单只股票对市场收益回归
facotr1 = np.zeros(stock_close.shape[1])
for i in range(stock_close.shape[1]):
    X = hs300_r.reshape(-1, 1)  # X必须是列向量,reshape方法第一个参数写-1表示自动选择维度
    Y = stock_r[:, i]
    model = LinearRegression()
    model.fit(X, Y, sample_weight=weight)
    factor1[i] = model.coef_
    
# 得到最终因子
factor_beta = factor1 

2.2 history sigma

  对于历史波动率,其实就是取刚才BETA回归中残差的波动率。

# 前面的都不变
facotr1 = np.zeros(stock_close.shape[1])
for i in range(stock_close.shape[1]):
    X = hs300_r.reshape(-1, 1)  # X必须是列向量,reshape方法第一个参数写-1表示自动选择维度
    Y = stock_r[:, i]
    model = LinearRegression()
    model.fit(X, Y, sample_weight=weight)  # 拟合模型,估计出参数
    Y_pred = model.predit(X)  # 带入X进行预测
    u = Y - Y_pred  # 得到残差
    factor1[i] = np.std(u)

factor_history_sigma = factor1

2.3 daily standard deviation

  对于日标准差,是股票超额收益率在过去252个交易日的的波动率,并依然使用指数衰减加权,半衰期为42个交易日。

import numpy as np
from sklearn.linear_model import LinearRegression
from half_decay_weight import half_decay_weight

# 导入股票数据
stock_close = np.array()  # 导入一个m * n的数组,m是行,代表日期,n是列,代表每一只股票
# 导入市场收益率,可以用某一股票指数,也可以使用单只股票加权计算市场收益率
# 这里采用沪深300指数
hs300 = np.array()

# 计算股票对数收益率
stock_r = np.log(stock_close[1:][:]) - np.log(stock_close[:-1][:])

# 计算市场收益率
hs300_r = np.log(hs300[1:]) - np.log(hs300[:-1])

# 计算超额收益率
stock_excess = stock_r - hs300_r

# 确定权重
weight = half_decay_weight(42, 251)  # 由于计算收益率后,只剩下251个数据,所以时间窗口选251

# 超额收益率加权平均
weight_average = np.average(stock_excess, axis=0, weights=weight)

# 超额收益率加权方差
variance = np.average((stock_excess - weight_average) ** 2, axis=0, weights=weight)

# 超额收益率标准差
factor = np.sqrt(variance)

2.4 cumulative range

  累积超额收益区间指的是对过去一段时间取累积超额收益,由于超额收益有正有负,所以累积的超额收益会在某一时间点达到最大,某一时间点达到最小。累积超额收益区间就是最大减最小的差。
  在CNE6中,对cumulative range的描述是过去12个月的 m a x ( r e x c e s s ) − m i n ( r e x c e s s ) max(r_{excess}) - min(r_{excess}) max(rexcess)min(rexcess)

import numpy as np
from sklearn.linear_model import LinearRegression
from half_decay_weight import half_decay_weight

# 导入股票数据
stock_close = np.array()  # 导入一个m * n的数组,m是行,代表日期,n是列,代表每一只股票
# 导入市场收益率,可以用某一股票指数,也可以使用单只股票加权计算市场收益率
# 这里采用沪深300指数
hs300 = np.array()

# 计算12个月的对数收益率
stock_r12 = np.zeros((12, stock_close.shape[1]))
hs300_r12 = np.zeros(12)
count = 0
for i in range(0, 232, 21):
    stock_r12[count][:] = np.log(stock_close[i + 20][:]) - np.log(stock_close[i][:])
    hs300_r12[count] = np.log(hs300[i + 20]) - np.log(hs300[i])
    count += 1

# 计算超额收益率
stock_excess = stock_r12 - hs300_r12.reshape(-1, 1)

cum_rate = np.cumsum(stock_excess, axis=0)  # np.cumsum方法能够沿某一轴进行累加,并把累加值放在该位置上

factor = np.max(cum_rate, axis=0) - np.min(cum_rate, axis=0)

3. 二级因子和一级因子

  依然为了方便考虑,二级因子和一级因子都是对上一级因子等权相加。所以:

B E T A = B E T A BETA=BETA BETA=BETA

R e s i d u a l V o l a t i l i t y = 1 3 h i s t o r y s i g m a + 1 3 d a i l y s t a n d a r d d e v i a t i o n + 1 3 c u m u l a t i v e r a n g e Residual\enspace Volatility=\frac{1}{3} history\enspace sigma + \frac{1}{3} daily \enspace standard \enspace deviation + \frac{1}{3} cumulative \enspace range ResidualVolatility=31historysigma+31dailystandarddeviation+31cumulativerange

V o l a t i l i t y = 1 2 B E T A + 1 2 R e s i d u a l V o l a t i l i t y Volatility = \frac{1}{2} BETA + \frac{1}{2}Residual\enspace Volatility Volatility=21BETA+21ResidualVolatility

  • 28
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书江南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值