前言
前一篇 15.因子的来源和生成
已经生成了因子,这些因子如何评价其好坏,或如何分析其如何起怎么作用,本文通过有一款神器级别的库------Alphalens,以其强大的因子评价功能,成为了众多专业投资者的首选工具。
由于 Alphalens 这个工具很多年没有更新了,在使用过程中会有不兼容的问题,因此,本文直使用聚宽的自带的函数 analyze_factor
进行。
python
#所以重新导入get_factor_values
from jqfactor import get_factor_values
#导入平台内置的因子分析函数
from jqfactor import analyze_factor
#导入datetime,为了一会儿方便
import datetime
选择标的
上一篇的前10个标的
python
#通过上一篇的思路
#选出几只股票,做成列表备用
portfolio = ['000617.XSHE',
'600000.XSHG',
'601916.XSHG',
'000166.XSHE',
'600015.XSHG',
'300059.XSHE',
'601169.XSHG',
'600674.XSHG',
'601939.XSHG',
'600036.XSHG']
选择时间区间
python
#使用datetime获取当日的日期
today = datetime.date.today()
#把日期的格式转换为需要传入参数的格式
#作为截止日期
end_date = '%s-%s-%s'%(today.year, today.month, today.day)
#使用timedelta找到500天前的日期
start_date = today - datetime.timedelta(days = 500)
#检查是否成功
print(start_date, end_date)
2023-10-29 2025-03-07
选择因子
成交量的5日指数移动平均,算是一个情绪因子
python
使用get_factor_values获取股票成交量的5日指数移动平均
#股票池参数设置为我们选出的股票
#因子参数设置为"VEMA5",是平台提供的成交量5日移动平均因子
#起止日期设置为我们计算好的起止日期
factor_vema5 = get_factor_values(securities = portfolio,
factors = ['VEMA5'],
start_date = start_date,
end_date = end_date,
)['VEMA5']
#使用analyze_factor函数进行因子分析
#weight_method参数设置为使用市值"mktcap"来加权计算分位数
#universe参数就设为我们选好的股票池就好
#分位数quantiles设为5(默认值)
#计算收益的周期periods参数分别为1天、5天,和10天
far = analyze_factor(factor=factor_vema5,
start_date= start_date,
end_date= end_date,
weight_method='mktcap',
universe = portfolio,
quantiles=5,
periods=(1,5,10))
需要说明的是这里,是用市值的大小,作为分位标准,由于标的比较少,因此只分了5类,如何数据量多,建议分10个分位,特别是小市值策略,会非常明显的 。
这里选了三个周期,分别是1天、5天和10天。
看一下因子结构
python
factor_vema5.tail()
code | 000617.XSHE | 600000.XSHG | 601916.XSHG | 000166.XSHE | 600015.XSHG | 300059.XSHE | 601169.XSHG | 600674.XSHG | 601939.XSHG | 600036.XSHG |
---|---|---|---|---|---|---|---|---|---|---|
2025-03-03 | 8.934963e+06 | 2.711796e+06 | 7.278557e+07 | 6.683460e+07 | 6.409448e+06 | 5.624518e+06 | 1.594690e+07 | 1.036379e+06 | 4.033024e+07 | 9.179058e+06 |
2025-03-04 | 7.878431e+06 | 2.423823e+06 | 7.105874e+07 | 5.917139e+07 | 6.666683e+06 | 4.660227e+06 | 1.386861e+07 | 8.764814e+05 | 3.733944e+07 | 7.867627e+06 |
2025-03-05 | 7.509706e+06 | 2.478404e+06 | 7.903343e+07 | 5.277523e+07 | 7.555297e+06 | 4.205392e+06 | 1.896673e+07 | 8.099299e+05 | 4.411007e+07 | 8.728076e+06 |
2025-03-06 | 1.111263e+07 | 2.552305e+06 | 7.502350e+07 | 5.979378e+07 | 7.403899e+06 | 5.725045e+06 | 2.050434e+07 | 7.551269e+05 | 4.347571e+07 | 8.971150e+06 |
2025-03-07 | 1.106395e+07 | 2.467216e+06 | 6.782158e+07 | 5.922929e+07 | 7.217427e+06 | 5.412177e+06 | 1.760342e+07 | 7.373280e+05 | 4.196422e+07 | 9.317038e+06 |
收益情况
python
#查看因子值5个分位对应的3个周期的收益
far.mean_return_std_by_quantile
factor_quantile | period_1 | period_5 | period_10 |
---|---|---|---|
1 | 0.000643 | 0.000454 | 0.000488 |
2 | 0.001012 | 0.000650 | 0.000363 |
3 | 0.000742 | 0.000341 | 0.000250 |
4 | 0.000555 | 0.000290 | 0.000205 |
5 | 0.000592 | 0.000251 | 0.000167 |
函数各参数见注释
python
#使用create_full_tear_sheet来获取全部的因子分析结果
#这里demeaned参数设置为False,意思是不使用超额收益来进行计算
#group_adjust设置为False,意思是不使用行业中性化来计算收益
#by_group设置为False,意思是不按照行业展示
#turnover_periods是调仓周期,这里设置为None
#avgretplot参数设置的是因子预测的天数
#(5,15)是指向前预测5天,向后预测15天
#std_bar参数的意思是是否显示标准差,这里我们设置为False
far.create_full_tear_sheet(demeaned=False,
group_adjust=False,
by_group=False,
turnover_periods=None,
avgretplot=(5, 15),
std_bar=False)
分位数统计
factor_quantile | min | max | mean | std | count | count % |
---|---|---|---|---|---|---|
1 | 3.204195e+05 | 8.564838e+06 | 1.685251e+06 | 1.094044e+06 | 658 | 20.0 |
2 | 1.198164e+06 | 2.627657e+07 | 5.648666e+06 | 3.482236e+06 | 658 | 20.0 |
3 | 4.334390e+06 | 4.844261e+07 | 1.154578e+07 | 6.095443e+06 | 658 | 20.0 |
4 | 8.632391e+06 | 1.516630e+08 | 3.203102e+07 | 1.839835e+07 | 658 | 20.0 |
5 | 2.869900e+07 | 2.699810e+08 | 7.676779e+07 | 3.743556e+07 | 658 | 20.0 |
收益分析
- | period_1 | period_5 | period_10 |
---|---|---|---|
Ann. alpha | -0.046 | -0.021 | -0.015 |
beta | 0.898 | 0.768 | 0.699 |
Mean Period Wise Return Top Quantile (bps) | 7.386 | 5.999 | 6.642 |
Mean Period Wise Return Bottom Quantile (bps) | 6.536 | 7.998 | 12.932 |
Mean Period Wise Spread (bps) | 0.850 | -1.164 | -3.627 |
上表中的bps是指basic point 基点,是债券和票据利率改变的度量单位。
Mean Period Wise Return:平均期内收益
Mean Period Wise Spread:最高分位平均收益与最低分位平均收益的差
从上图可以看出,小的成交量并不是带来更高的收益,即成交量大小在这段时间内是无效的,反则中等的成交量有较好的收益。
多空组合收益
从上图来看累计收益达到30%左右,收益情况不错。
从上图来看,做多最大分位做空最小分位,情况并不一致,5天平均和10天平均,在2024年9月份之前,收益在10%以上,而9月之后,完全相反,亏损达10%以下,如果相反,做多最小分位做空最大分位,可以盈利。
该图展示的是各个因子分组的累计收益。在这个图表中,我们关注的是每个分组在不同时间段的收益表现。在这个图表中,每个分组的收益是通过对该分组中所有股票的每日收益取平均得到的,而每个分组中的股票权重相同。这种方式可以帮助我们更好地理解因子在不同分组的表现,也就是因子的预测力。
累计收益情况,并不按因子大小区分度很好,这个与第一张图一致。
上图展示了最高分位组(第5组)的平均收益率减去最低分位组(第1组)的平均收益率的变化。这个图表可以帮助我们理解因子在最高和最低分位组的表现差异,也就是因子的预测力。头部和尾部分位组的重要性往往大于其他的分组,在实际的投资策略中,我们通常会做多头部分位组(即因子值最高的股票),做空尾部分位组(即因子值最低的股票)。因此,这个图表提供的是一种实际策略的模拟结果。图表中蓝色阴影部分则展示了头尾部分位组收益差的分布情况,可以帮助我们理解这个差异的波动范围。而红线表示头部和尾部分位组收益差的一个月移动平均线,可以帮助我们更好地观察这个差异的长期趋势。
从上图来看并没有长期趋势。
IC 分析
- | period_1 | period_5 | period_10 |
---|---|---|---|
IC Mean | 0.021 | 0.046 | 0.036 |
IC Std. | 0.297 | 0.282 | 0.287 |
IR | 0.072 | 0.162 | 0.124 |
t-stat(IC) | 1.309 | 2.944 | 2.252 |
p-value(IC) | 0.191 | 0.003 | 0.025 |
IC Skew | 0.054 | -0.235 | -0.297 |
IC Kurtosis | -0.240 | -0.183 | -0.278 |
上表IC指标 在不同周期的表现
以上是对这些指标的解释:
- 1)IC Mean(IC均值):IC值用来评估因子值与未来收益之间的相关性,反映因子的预测能力。IC的均值代表了因子预测的平均准确性。IC 的绝对值越大,表示因子的预测能力越强(绝对值>0.05认为有效),在本例中,1D和10D的IC均值分别为0.021和0.036,IC值的绝对值并不太高,这表示因子在1D和10D这两个周期的预测能力不太强。
- 2)IC Std.(IC标准差):IC的标准差代表了这种预测准确性的稳定性或一致性。在本例中,1D和10D的IC标准差分别为0.297和0.287,这表示因子的预测能力在不同的时间点上有一定的波动。
- 3)Risk-Adjusted IC(风险调整后的IC):这是IC均值除以IC标准差得到的值,这个值也称作IR,它代表了在考虑预测稳定性的情况下的预测能力。在本例中,1D和10D的风险调整后的IC分别为0.072和0.124,其绝对值并不高,这表示在考虑预测稳定性后,因子在1D和10D这两个周期的预测能力依然不太强。
- 4)t-stat(IC)(IC的t统计量):这是一个用来检验IC均值是否显著不为0的统计量(即用来评估 IC 的可靠性)。一个高的 t-Statistic 值(绝对值通常大于 2)表示 IC 的显著性较高,即因子的预测能力不是偶然发生的。在本例中,1D和10D的t统计量分别为1.309和2.252,表示IC均值有一定的显著性。
- 5)p-value(IC)(IC的p值):这是一个用来检验IC均值是否显著不为0的概率值。在本例中,1D和10D的p值都为0.000,这表示IC均值显著不为0。
- 6)IC Skew(IC的偏度):这是一个衡量IC分布的偏斜程度的指标。在本例中,1D和10D的IC偏度分别为-0.235和-0.297,这表示IC的分布有一定的偏斜。
- 7)IC Kurtosis(IC的峰度):这是一个衡量IC分布的尖锐程度的指标。在本例中,1D和10D的IC峰度分别为-0.240和-0.278,这可能表示IC的分布不是非常尖峰。
IC不同周期的时序图

上图波动较大,趋势不明显
Q-Q 图

Q-Q图(Quantile-Quantile图)是一种图形工具,用于比较观察数据的分布与理论分布(通常为正态分布)。在这里,我们使用Q-Q图来比较IC的分布与正态分布。在Q-Q图上,x轴代表理论分布(这里是正态分布)的分位数,y轴代表观察数据(这里是IC)的分位数。每个点代表一个特定的分位数。如果观察数据严格符合理论分布,那么Q-Q图上的点应该沿一条45度线(即y=x线)分布。这条线被称为等分线。然而,如果观察数据并不符合理论分布,那么点会偏离这条线。如果因子具有良好的预测性,那么IC的分布不应该是正态的,而应该呈现S形曲线。这种S形曲线表明IC的分布的尾部更厚,这通常被解释为因子在极大值或极小值(即尾部)有更强的预测力,也就是说,因子包含的信息更多。在这种情况下,Q-Q图上的点会在中间部分接近等分线,而在两端(尾部)偏离等分线,形成S形曲线。这种形态的Q-Q图表明IC的分布与正态分布有所偏离,尾部更厚。
IC热力图

IC的热力图是一个用来展示IC在不同月份中的平均表现情况的工具。在这个热力图中,每一行代表一个特定的年份,每一列代表一个特定的月份,图中的每一个格子代表该年份和月份对应的IC的平均值。颜色的深浅代表IC值的大小,颜色越深表示IC值越大,即因子预测未来收益的能力越强。反之,颜色越浅表示IC值越小,即因子预测未来收益的能力越弱。图中的蓝色系代表IC值为正值,红色系代表IC值为负值。通过观察热力图上的颜色分布,我们可以了解因子的一致性,以及跨越不同市场周期时的表现。热力图还可以帮助我们理解因子预测能力是否存在季节性或其他时间相关的模式。例如,如果我们发现某一列(即某一月份)的颜色普遍较深,那么可能说明在这个月份,因子的预测能力较强。在这篇文章中,我们详细解析了Alphalens库中create_information_tear_sheet函数输出的各项图标。这些图表可以帮助我们更好地理解因子IC在历史上的表现,并可能提供一些关于其在未来表现的线索。同时需要注意的是,因子IC只是因子评价的一部分,我们需要结合因子其他方面的评价,来全面的选择有效因子。而且,任何因子的表现都可能会随着市场环境的变化而变化,因此,我们需要定期更新和重新评估我们的因子模型。
换手率分析
- | period_1 | period_10 | period_5 |
---|---|---|---|
Quantile 1 Mean Turnover | 0.037 | 0.124 | 0.091 |
Quantile 2 Mean Turnover | 0.072 | 0.259 | 0.198 |
Quantile 3 Mean Turnover | 0.069 | 0.216 | 0.179 |
Quantile 4 Mean Turnover | 0.099 | 0.245 | 0.201 |
Quantile 5 Mean Turnover | 0.066 | 0.141 | 0.117 |
换手率用来衡量投资组合的成分变动程度。具体来说,它度量的是投资组合在一定时间内的买入和卖出的股票数量占投资组合总股票数量的比例。一个高换手率意味着投资组合经常进行买卖交易,反之则表示投资组合的交易较少。上面的表格展示了不同因子分组(例如,因子值最大的组合,因子值最小的组合等)在1D(1天)和10D(10天)两个周期的平均换手率,这可以帮助你理解不同因子值的股票组合的交易活跃度是如何分布的。
- | period_1 | period_5 | period_10 |
---|---|---|---|
Mean Factor Rank Autocorrelation | 0.993 | 0.982 | 0.974 |
该图用于展示因子排名的自相关性,即因子排名在不同时间间隔的相关程度。在这个图中,X轴代表时间,Y轴代表自相关系数。图中的每一个点代表在某个时间点,因子的当前排名与之前排名的相关性。自相关系数的范围是[-1, 1],1表示完全正相关,-1表示完全负相关,0表示无关。自相关系数可以帮助我们理解因子值的稳定性。如果一个因子的自相关系数较高,那么这个因子的排名可能会在时间上比较稳定,换手率可能较低。反之,如果一个因子的自相关系数较低,那么这个因子的排名可能会频繁变动,换手率可能较高。需要注意的是,因子的自相关性并不直接影响其预测未来收益的能力,但它可以影响到我们策略的交易成本。如果一个因子的换手率较高,那么我们可能需要频繁地调整投资组合,这可能会带来较高的交易成本。在本节中,我们详细解析了Alphalens库中create_turnover_tear_sheet函数输出的各项图表,这些工具可以帮助我们理解因子值对应的股票组合的交易活跃度以及因子排名的稳定性。换手率是一个重要的指标,因为它直接影响到投资策略的交易成本。一个高换手率可能意味着频繁的交易,这将导致较高的交易成本,从而降低投资组合的净收益。因此,理解和管理换手率是量化投资策略中的一个重要环节。同时,我们也需要注意,尽管换手率和交易成本对投资收益有重要影响,但它们并不直接决定因子的预测能力。我们需要结合其他的信息和工具,如因子的分组测试、IC分析等,来评估一个因子的整体性能。
因子预测能力

结论
这份因子评价报告的内容很多,图文并茂,限于篇幅不在此列出,大家可以运行上述代码查看。这份因子评价报告主要有三个部分的内容:1)因子分组收益的评价;2)因子信息系数(IC)的评价;3)因子换手率的评价。上述三个部分的内容实际上是调用了三个子函数来实现的:create_returns_tear_sheet函数、create_information_tear_sheet函数、create_turnover_tear_sheet函数。
Alphalens对因子性能的评价主要有三部分:1)因子分组收益的评价;2)因子信息系数(IC)的评价;3)因子换手率的评价。本文将继续以市值因子为例,详细介绍因子分组收益的评价。因子分组收益评价是通过调用Alphalens库的create_returns_tear_sheet函数完成的。