第二十四章:高频因子库
做高频交易的人都知道,因子就是你的武器库。没有因子,你连市场的大门都摸不着。今天咱们就来聊聊高频因子库的完整构建流程——从分类到构建,从检验到组合,再到最后的衰减分析。
我个人习惯把高频因子分成三大类:价格类、订单流类和微观结构类。价格类因子看的是价格变化模式,订单流类因子看的是买卖力量的博弈,微观结构类因子则深入到盘口的每一个细节。你想想看,这三类因子其实对应了市场信息的三个不同层次。
因子分类:先搞清楚你在看什么
我在项目中遇到过不少新手,上来就堆砌因子,结果回测效果一塌糊涂。其实分类是第一步,也是最关键的一步。
| 类别 | 典型因子 | 数据来源 | 更新频率 |
|---|---|---|---|
| 价格类 | 收益率、波动率、价格动量 | Tick级成交数据 | 毫秒级 |
| 订单流类 | 买卖压力、订单不平衡、VPIN | Level2行情 | 秒级 |
| 微观结构类 | 买卖价差、深度斜率、订单簿熵 | 订单簿快照 | 毫秒级 |
说白了,价格类因子是「结果」,订单流类因子是「过程」,微观结构类因子是「环境」。三者缺一不可。
因子构建:从原始数据到可用信号
构建因子时,我最常犯的错误就是过度拟合。嗯,这里要注意——高频因子的构建必须遵循「简洁有效」的原则。
举个例子,构建一个简单的买卖压力因子:
def build_order_imbalance_factor(tick_data):
"""
构建订单不平衡因子
"""
# 计算主动买盘和主动卖盘
buy_volume = tick_data[tick_data['side'] == 'B']['volume'].sum()
sell_volume = tick_data[tick_data['side'] == 'S']['volume'].sum()
# 标准化处理
total_volume = buy_volume + sell_volume
if total_volume == 0:
return 0
# 因子值在[-1, 1]之间
imbalance = (buy_volume - sell_volume) / total_volume
return imbalance
你看,就这么几行代码。我曾经见过有人用50个参数去拟合一个因子,结果实盘第一天就崩了。记住:高频因子的核心是捕捉市场微观结构中的规律,而不是用数学公式去硬凑。
因子检验:别被回测骗了
因子检验这块,我吃过不少亏。最惨的一次,一个看起来完美的因子,实盘跑了一周就失效了。后来复盘发现,问题出在检验方法上。
核心检验指标:
- IC值(信息系数):衡量因子与未来收益的相关性,绝对值大于0.05才算有效
- Rank IC:排序后的IC值,更稳健,不容易受极端值影响
- 夏普比率:因子组合的夏普比率至少要大于1.5
- 换手率:高频因子的换手率通常很高,但超过50%就要警惕了
检验时还有一个坑——数据窥探偏差。你想想看,如果你用同一段数据反复调整因子参数,最后得到的「好结果」其实只是运气。我的做法是:把数据分成训练集、验证集和测试集,比例大概是6:2:2。
因子组合:1+1>2的艺术
单个因子再强,也有失效的时候。因子组合的目的就是分散风险,提升稳定性。
我常用的组合方法有两种:
- 等权组合:简单粗暴,把多个因子的信号等权重加总。适合因子之间相关性较低的情况。
- 动态权重组合:根据近期表现调整权重。比如过去N天IC值高的因子,权重就大一些。
这里有个小技巧——组合前一定要做相关性分析。如果两个因子的相关系数超过0.7,那就只保留一个。否则组合后的效果跟单个因子没什么区别。
我的经验:组合3-5个低相关性的因子效果最好。太多因子反而会引入噪声,太少又不够分散。
因子衰减:没有永恒的圣杯
所有高频因子都会衰减,这是铁律。为什么?因为市场在进化,套利机会会被填平。
我观察过上百个因子的生命周期,发现一个规律:
| 因子类型 | 平均有效周期 | 衰减模式 |
|---|---|---|
| 简单价格因子 | 1-3个月 | 快速衰减 |
| 订单流因子 | 3-6个月 | 缓慢衰减 |
| 微观结构因子 | 6-12个月 | 阶梯式衰减 |
我曾经有一个微观结构因子,用了整整8个月都表现良好。结果有一天突然失效了,后来发现是交易所改了撮合规则。所以,定期监控因子的衰减情况非常重要。
避坑指南:我曾经因为一个因子连续3个月表现好就放松了监控,结果第4个月直接亏了5%。现在我的系统里,每个因子都有独立的衰减监控模块,一旦IC值连续5天低于阈值,自动降低权重。
完整的因子生命周期管理
说了这么多,其实我想表达的是——高频因子库不是建完就完事了。它是一个动态的系统,需要持续维护。
下面这张图是我个人习惯的因子管理流程:
你看,整个流程是个闭环。因子失效了怎么办?不是直接扔掉,而是回到构建阶段,看看能不能优化。我见过太多人,因子一失效就放弃,其实很多时候只是参数需要微调。
最后说一句——高频因子库的维护,本质上是对市场微观结构理解的持续深化。你越了解市场,构建的因子就越持久。这个道理,做久了自然就懂了。