1. 波动率因子Volatility
CNE6当中,波动率因子Volatility是一个一级因子,有二级因子BETA和Residual Volatility,其下还有多个三级因子。
一级因子 | 二级因子 | 三级因子 |
---|---|---|
Volatility | BETA | BETA |
Residual Volatility | history 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
标签:CNE6,weight,hs300,因子,np,close,Volatility,stock From: https://blog.csdn.net/m0_70629983/article/details/140578839