1.波动率问题:
从数理统计的角度来看,普通的线性回归都隐含了一个对原始数据的假设,即“数据的方差近似不变”。
但实际上,因为不同的时期,市场的波动率不一样,所以因变量(收益率)的标准差不一样,自然方差也不一致了
从直观理解的角度来看,市场波动率较高的时候,收益率无论涨跌,数值都比较大,他们对回归系数的影响程度会远大于波动率较低时期的收益率的影响。
如果直接用原始的收益率,会出现回归系数被高波动率数据“绑架”的情况。
一种解决办法是,用收益率的历史标准差作为市场波动率的代理变量,然后用历史标准差对最新的收益率进行标准化(除以标准差) 这样得到的数据,在每个时刻的方差就会比较接近了。
但是这种调整方法毕竟是扭曲了真实的数据,我们需要在原始收益率和调整后收益率上面都进行回归分析并检验模型
如果两个收益率得到的模型都揭示了同一个规律,那么这个规律的可信度会比较高
检验5个交易日的日历效应
之前我们按照5个交易日为一组,划分了4个虚拟变量:
- trade_first_1_5 每月第1-5个交易日
- trade_first_6_10 每月第6-10个交易日
- trade_last_6_10 每月倒数第6-10个交易日并且不属于1,2的交易日
- trade_last_1_5 每月倒数第1-5个交易日并且不属于1,2的交易日
我们首先猜测最没有特色的是第3个,trade_last_6_10,我们把这个列忽略,并且加上截距项,进行虚拟变量回归并检验模型
result = smf.ols("ret ~ tradeday_first_1_5 + tradeday_first_6_10 + tradeday_last_1_5 + 1", data).fit()
result.summary()
注:这里主要查看T检验,每个变量的显著性
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
Intercept | -0.0003 | 0.001 | -0.535 | 0.593 | -0.002 | 0.001 |
tradeday_first_1_5 | 0.0025 | 0.001 | 2.847 | 0.004 | 0.001 | 0.004 |
tradeday_first_6_10 | 0.0007 | 0.001 | 0.762 | 0.446 | -0.001 | 0.002 |
tradeday_last_1_5 | -0.0002 | 0.001 | -0.236 | 0.813 | -0.002 | 0.001 |
下面再方差分析(方差分析主要考察各个因素的影响情况)
anova_lm(result)
df | sum_sq | mean_sq | F | PR(>F) | |
---|---|---|---|---|---|
tradeday_first_1_5 | 1.0 | 0.003277 | 0.003277 | 10.518536 | 0.001194 |
tradeday_first_6_10 | 1.0 | 0.000314 | 0.000314 | 1.008635 | 0.315305 |
tradeday_last_1_5 | 1.0 | 0.000017 | 0.000017 | 0.055801 | 0.813275 |
Residual | 3254.0 | 1.013637 | 0.000312 | NaN | NaN |
方差分析显示,tradeday_first_1_5的F值远大于1,说明这个分组的均值显著地不同于其他分组。
同时我们看到回归系数是大于0的,也就是说,这个分组的收益率显著高于其他组,并不是随机因素导致的,而是确实存在相关性的。(但这里我们不能就此认为因果关系存在)
同样再用波动率调整后的收益来检验一下!也是OK!!
股票市场是动态系统,从滞后的观察来说,市场不是没有规律,而是规律在不断变化。我们现在找到的规律,在未来能够适用吗?
当然,未来是不可知的,但是,至少在最近的一段过去的时间里,还适用吗?
我们试试缩短样本的时间,只要最近期的数据,来看看是否有仍然存在规律?
result = smf.ols("ret ~ tradeday_first_1_5 + tradeday_first_6_10 + tradeday_last_1_5 + 1", data.query("year==2018")).fit()
result.summary()