1. 概述
这篇文章我们将分享《中金公司-量化多因子系列(6):关于动量,你所希望了解的那些事》中关于动量因子的适用场景,研报中提到截面分域中,动量特征在高机构覆盖、大市值、低波动、高价值的股票池中更明显;而反转效果在低覆盖、小市值、高波动、低流动性、低价值的股票池内更为显著。 本篇文章将使用PandaAI平台快速构建市值、波动性、流动性因子再叠加动量因子,验证研报中关于动量的结论。本文也算是线性多因子组合的入门教程,大家看完就明白一点都不难了。
2. 市值因子
相信大家都听说过小市值策略,今天我们就用PandaAI来试验下小市值因子在A股的表现,首先构建市值因子。直接在PandaAI助手提问,选择python版本的,点击应用,左边窗口回测区间选择5年,调仓周期为周度调频,股票池选择全A股,我们先回测小市值因子,选择因子方向选择负向。
class MarketCapFactor(Factor):
def calculate(self, factors):
# 方法1:直接使用系统预计算的市值
market_cap = factors['market_cap']
# 通常会对市值取对数处理
log_market_cap = LOG(market_cap)
return RANK(log_market_cap)
从结果上可以看出,单纯的小市值在A股市场的表现还算及格,IC的绝对值大于0.03,有一定的预测能力,但是预测稳定性还不够。
下表也同时给出各个指标的定义以及各个指标的参考范围,以帮助大家判断因子的好坏,在进行因子回测的时候可以对比着看。
📈 因子评价指标定义与判断标准
📊 预测能力类
指标名 | 定义 | 意义 | 判断标准 |
---|---|---|---|
IC_mean | 因子值与未来收益的 Pearson 相关均值 | 衡量预测方向是否正确 | > 0.02 合格,> 0.05 稳定有用,< 0 为反向 |
Rank_IC | 因子值与未来收益的 Spearman(秩)相关系数 | 抵抗极端值后的预测能力 | > 0.02 合格 |
IC_std | IC 的标准差 | 衡量预测结果的稳定性 | 越小越好,< 0.05~0.1 较理想 |
IC_IR | IC_mean / IC_std | 衡量预测“稳定性与强度”的性价比 | > 0.3 合格,> 0.5 较好,> 1.0 优质因子 |
📉 概率类
指标名 | 定义 | 意义 | 判断标准 |
---|---|---|---|
P(IC < -0.02) | IC 表现很差的概率 | 衡量反向失效概率 | < 40% 稳健,> 50% 表示经常反向失效 |
P(IC > 0.02) | IC 表现良好的概率 | 衡量正向有效的概率 | > 60% 较好,> 70% 表现稳定 |
📉 显著性类
指标名 | 定义 | 意义 | 判断标准 |
---|---|---|---|
t统计量 | t = IC_mean / (IC_std / √N),用于判断 IC_mean 是否显著不为 0 | 衡量是否统计显著有效 | > 1.96 表示在 95% 置信水平下显著有效 |
3. 波动因子
波动因子(Volatility Factor)是量化投资中常用的一个风险类因子,用于衡量股票或资产价格的波动程度。波动性越大,表明该资产的价格越不稳定,风险越高;波动性越小,则说明价格走势较为平稳,风险较低。
我们取过去20个交易日的日收益率的标准差作为波动因子,因子代码如下:
class VolatilityFactor(Factor):
def calculate(self, factors):
close = factors['close']
# 计算每日收益率
daily_returns = RETURNS(close, period=1)
# 计算20日滚动标准差
volatility = STDDEV(daily_returns, window=20)
# 对波动率进行横截面排名
return RANK(volatility)
运行之后的结果如下:
从结果上看波动性因子在全A股市场是个负向指标,把因子方向调整成负向,再回测得到如下结果,符合我们的期望。
4. 流动性因子
流动性因子(Liquidity Factor)是量化投资和因子投资中用来衡量股票或资产在市场上买卖时的难易程度的指标。流动性越好,买卖越容易,交易成本和价格冲击越小;流动性差则反之。我们直接采用换手率来衡量流动性的大小,原本打算采用Amihud流动性来计算,但平台的数据提示不对齐,所以我们换成换手率来衡量流动性。代码如下:
class TurnoverLiquidityFactor(Factor):
def calculate(self, factors):
turnover = factors['turnover'] # 换手率
# 计算换手率指标 - 使用过去20日的平均换手率
avg_turnover = TS_MEAN(turnover, window=20)
# 进行横截面排序
return RANK(avg_turnover)
运行结果如下:
从结果可以看到换手率是一个负向因子,我们换成反向跑一跑看。
结果有明显的改善。
5.多因子组合
有了上述因子的定义之后,我们再回到开头说的结论,截面分域中,动量特征在高机构覆盖、大市值、低波动、高价值的股票池中更明显;而反转效果在低覆盖、小市值、高波动、低流动性、低价值的股票池内更为显著。 我们按研报的思路去组合因子,由于PandaAI目前还缺少财务数据,因此价值因子我们暂时忽略掉,机构覆盖度因子获取也有难度,也舍弃掉。那么我们将因子组成分成两组去测试。
第一组:大市值、低波动、正向动量三个合成一个因子,验证动量特性
第二组:小市值、高波动性、低流动性、反向因子,四个合成一个因子,验证反转特性
5.1 第一组:大市值、低波动、正向动量
代码如下,我们采用等权的形式组合
class CompositeFactor(Factor):
def calculate(self, factors):
close = factors['close']
market_cap = factors['market_cap']
# 1. 大市值因子 (直接使用市值)
size_factor = RANK(market_cap)
# 2. 低波动因子 (波动率排名取反)
daily_returns = RETURNS(close, period=1)
volatility = STDDEV(daily_returns, window=20)
low_vol_factor = -RANK(volatility) # 取负值表示低波动
# 3. 正向动量因子 (20日收益率排名)
momentum_returns = RETURNS(close, period=20)
momentum_factor = RANK(momentum_returns)
# 等权合成三个因子 (标准化后相加)
composite = (SCALE(size_factor) + SCALE(low_vol_factor) + SCALE(momentum_factor)) / 3
return composite
实际跑出的效果较差,可能是还缺少其他因子的原因,我们将选股范围调整到沪深300试一试,因为动量特性主要是机构持股相关系数比较高。
换成沪深300之后,效果得到一定的改善。
5.2 第二组:小市值、高波动性、低流动性、反向因子
代码如下:
class CompositeFactor(Factor):
def calculate(self, factors):
close = factors['close']
turnover = factors['turnover']
market_cap = factors['market_cap']
# 1. 小市值因子 (取负值表示小市值)
size_factor = -RANK(market_cap)
# 2. 高波动性因子
daily_returns = RETURNS(close, period=1)
volatility = STDDEV(daily_returns, window=20)
volatility_factor = RANK(volatility)
# 3. 低流动性因子 (采用20天换手率平均值,取负值表示低流动性)
liquidity = TS_MEAN(turnover, window=20)
liquidity_factor = -RANK(liquidity)
# 4. 反向动量因子 (取负的动量)
momentum = RETURNS(close, period=20)
reverse_momentum_factor = -RANK(momentum)
# 等权合成四个因子
composite = (size_factor + volatility_factor + liquidity_factor + reverse_momentum_factor) / 4
return composite
回测结果如下:
从结果上看效果还不如单纯的小市值,然后回到刚才流动性的回测时,20天的高流动性明显是个负向的因子,此时可以考虑将计算波动性的天数减少。笔者将波动性调整到3天,跑出来的效果如下:
结果并没有多少改善,干脆考虑将波动性因子改成负向的,再试试。
跑出来的效果也一般,说明用换手率这个表达流动性可能不够,需要换其他的计算方式。
如果想调整策略中的某个因子的权重,可以直接乘以相应的系数。如下,将市值因子跟动量因子结合,市值因子占0.8,动量因子占0.2,回测效果略好于单纯的市值因子。
结果显示,比单纯的小市值因子,有一点点改善。其实从前面的这几个例子可以看出因子的组合优化是一个复杂的工作,文章中用到的因子数量也少,在后期,大家可以增加因子的数量,同时也可以考虑使用IC加权、IR加权、主成分分析以及机器学习方法(用于非线性组合)来进行优化,可以参考社区中其他同学发表的《基于《AI系列研究之一:端到端的动态Alpha模型》系列。
6. 结语
在复现研报的过程中,我们常常会遇到与原文结论不一致的情况,这其实是很正常的现象。数据环境、处理细节、参数设定的差异都可能影响结果。关键在于,我们是否从中学到了有价值的知识,是否提升了对策略逻辑和市场机制的理解。最后,希望这个系列可以帮助大家简单的入门多因子选股,欢迎交流~~