上一节中我们学习了如何通过单因子策略进行股票交易,在实际的股市中,因子(也就是指标)数量往往非常之多,比如市盈率/市净率/净资产收益率等,在使用这些因子的过程中,我们会发现有的因子与收益率为正相关,有的因子为负相关,而有些因子几乎完全无关。
所以我们可以通过计算不同因子与收益率的相关系数,得到可以指导我们进行操作的因子。相关系数最大值为1,当相关系数大于0.5时,就可以认为该指标是有效指标,当相关系数小于-0.5时,就可以认为该指标是反向指标,当相关系数接近0的时候,该指标就是无效指标,这个就是基于IC值的多因子计算方法的通俗解释。
基于IC值的多因子计算方法
因子IC法来自于多因子模型的打分法,指的是选用若干能够对股票未来时间段收益产生预测作用的因子,根据每个因子在对应位置的状况给出股票在该位置上的得分,然后按照一定的权重将各个因子的得分相加,从而得到该股票各个因子的最终得分。
因此在打分模型中,各个因子的权重设定和计算非常重要,即使是非常好的因子,在权重配置下也可能会有不好的结果。
IC的计算公式如下:
从公式中可以看到,IC的计算公式实际上就是不同序列的相关系数的计算,那么IC值的计算用一句话解释就是:“IC值为因子与对应的下个周期收益率之间的相关系数“。python中的Numpy工具包提供了非常方便的计算方法,即corrcoef函数:
corr = np.corrcoef() #计算相关系数
假设不同股票在某个时间段对应的因子值和下期的收益率如下表所示:
因子A | 因子B | 下期收益率 | |
---|---|---|---|
股票a | 6 | 2 | 0.02 |
股票b | 1 | 4 | 0.004 |
股票c | 2 | 8 | 0.005 |
股票d | 7 | 9 | 0.007 |
我们可以计算不同因子对收益率影响的系数大小(即IC值)
import numpy as np
factor_A = [6,1,2,7]
factor_B = [2,4,8,9]
return_profit = [0.02,0.004,0.005,0.007]
coef_matrix_A = np.corrcoef(factor_A,return_profit) #求factor_A 和 return_matrix 之间的相关系数
coef_matrix_B = np.corrcoef(factor_B,return_profit) #求factor_B 和 return_matrix 之间的相关系数
coef_A = coef_matrix_A[0, 1] #提取第0行,第1列的数值,即相关系数
coef_B = coef_matrix_B[0, 1] #提取第0行,第1列的数值,即相关系数
print(coef_A,coef_B)
运行结果如下:
可以看出,因子A的IC值(相关系数)为0.593,正相关,因子B的IC值为-0.65,为负相关。在实际使用中我们可以给因子A一个正的加权系数,给因子B一个负的加权系数,而得到一个新的因子值,通过新的因子来计算与收益率的相关系数,就有可能得到与收益率相关系数更大的结果。
除了直接求相关系数的计算方法外,还有一种IC值的计算方法,即回归法。 简单来说,就是用该期的股票收益率对上期的因子值做回归,并用该期的因子值预测下期股票的收益率,取下期预测的收益率与下期实际收益率的相关系数。
回归法的详细解释可参考博客:https://blog.csdn.net/qq_30868737/article/details/109164548
代码如下:
import statsmodels.api as sm #
import numpy as np
factor_A = [6,1,2,7]
factor_B = [2,4,8,9]
return_profit = [0.02,0.004,0.005,0.007]
x = sm.add_constant(factor_A) #因为OLS回归中不包括常数项,因此在数据左侧增加上常数项
y = return_profit
model = sm.OLS(y,x) # 做线上拟合
results = model.fit() #然后获取拟合结果。
print(results.params) #打印拟合结果
pre_return_profit = results.params[0]+np.asarray(factor_A)*results.params[1] # 根据拟合函数求因子A对应的预测收益率
corr = np.corrcoef(pre_return_profit,return_profit) # 求预期收益率与实际收益率的相关系数
print(corr)
运行结果如下:
与方法1对比,可看出两种方法求得的相关系数值是相同的。
IC值代表因子预测股票收益的能力。IC具体为全部股票在调仓周期期初的排名与本调仓周期收益排名的线性相关度。IC的均值是多个调仓周期IC的平均值。
因子IR(信息比率)代表因子在历史上表现的稳定性,公式如下(均值/标准差):
I
R
=
I
C
m
e
a
n
I
C
s
t
d
IR = \frac{IC_{mean}}{IC_{std}}
IR=ICstdICmean
因子在不同历史时期的表现有可能差别很大,表现在IC上,就是IC的波动率很大,假设IC均值一定,IC的波动率越小,因子表现的越稳定,IR就越大。
因子IC值计算的目标,合成IC值(相关系数)更高的因子
前面我们学习过了单因子策略,但采用单个因子得到的收益率并不是非常理想,所以我们可以通过IC值的方法,合成相关系数更高的因子,来预测股票的收益率。
比如有如下数据
因子A | 因子B | 因子C | 下期收益率 | |
---|---|---|---|---|
股票a | 6 | 2 | 1 | 0.02 |
股票b | 1 | 4 | 5 | 0.004 |
股票c | 2 | 8 | 6 | 0.005 |
股票d | 7 | 9 | 2 | 0.007 |
我们可以求得不同因子的相关系数
import numpy as np
factor_A = [6,1,2,7]
factor_B = [2,4,8,9]
factor_C = [1,5,6,2]
return_profit = [0.02,0.004,0.005,0.007]
coef_matrix_A = np.corrcoef(factor_A,return_profit) #求factor_A 和 return_matrix 之间的相关系数
coef_matrix_B = np.corrcoef(factor_B,return_profit) #求factor_B 和 return_matrix 之间的相关系数
coef_matrix_C = np.corrcoef(factor_C,return_profit) #求factor_C和 return_matrix 之间的相关系数
coef_A = coef_matrix_A[0, 1] #提取第0行,第1列的数值,即相关系数
coef_B = coef_matrix_B[0, 1] #提取第0行,第1列的数值,即相关系数
coef_C = coef_matrix_C[0, 1] #提取第0行,第1列的数值,即相关系数
print(coef_A,coef_B,coef_C)
运行结果如下:
从结果可以看出,A是正向因子,B和C是反向因子,因此我们可以选用其中两个相关系数绝对值大的合成新因子,这里我先采用等比例加权法
import numpy as np
factor_A = [6,1,2,7]
factor_B = [2,4,8,9]
factor_C = [1,5,6,2]
return_profit = [0.02,0.004,0.005,0.007]
coef_matrix_A = np.corrcoef(factor_A,return_profit) #求factor_A 和 return_matrix 之间的相关系数
coef_matrix_B = np.corrcoef(factor_B,return_profit) #求factor_B 和 return_matrix 之间的相关系数
coef_matrix_C = np.corrcoef(factor_C,return_profit) #求factor_C和 return_matrix 之间的相关系数
coef_A = coef_matrix_A[0, 1] #提取第0行,第1列的数值,即相关系数
coef_B = coef_matrix_B[0, 1] #提取第0行,第1列的数值,即相关系数
coef_C = coef_matrix_C[0, 1] #提取第0行,第1列的数值,即相关系数
print(coef_A,coef_B,coef_C)
#合成新的因子
factor_new = np.asarray(factor_B)*(-1)+np.asarray(factor_C)*(-1) #负相关,所有这里乘以-1
coef_matrix_new = np.corrcoef(factor_new,return_profit)
print(coef_matrix_new[0][1])
运行结果如下:
可以看到,新因子的相关系数为0.86,因为我们用新的因子预测收益率的正确概率会更高一些。
之后一节,我们将通过该方法进行实例演示。进一步阐述基于IC值的多因子计算方法如何应用到收益率预测中。