一、因子融合概述:高频与低频因子的定义、区别与互补性
做量化这些年,我越来越觉得因子融合是个绕不开的坎。你想想看,高频因子像显微镜,看得细但视野窄;低频因子像望远镜,看得远但模糊。怎么把这两者结合起来?这就是我们今天要聊的核心。
1.1 高频因子 vs 低频因子:到底差在哪?
先给个直观的定义。我个人习惯这样区分:
- 高频因子:基于分钟级、Tick级数据构建,持仓周期通常在几分钟到几天。比如订单簿不平衡、瞬时收益率反转、盘口挂单压力等。
- 低频因子:基于日频、周频甚至月频数据,持仓周期从几天到几个月。比如市盈率、市净率、动量因子、质量因子等。
说白了,一个在微观层面捕捉噪声中的信号,一个在宏观层面把握趋势中的价值。
核心区别一览:
| 维度 | 高频因子 | 低频因子 |
|---|---|---|
| 数据频率 | 分钟级/秒级 | 日频/周频 |
| 信号来源 | 微观结构、订单流 | 财务数据、宏观指标 |
| 持仓周期 | 几分钟~几天 | 几天~几个月 |
| 换手率 | 极高(>10倍/月) | 较低(<2倍/月) |
| 容量 | 小(千万级) | 大(亿级) |
| 衰减速度 | 快(几天失效) | 慢(数月有效) |
我在项目中遇到过不少团队,高频因子做得风生水起,但一上大资金就崩。为什么?容量不够。低频因子虽然容量大,但信号太钝,抓不住短期波动。这就是互补性的来源。
1.2 互补性:为什么非要融合?
你想想看,高频因子擅长什么?捕捉市场的短期错误定价。比如某只股票突然被大单砸盘,高频因子能瞬间识别出这是流动性冲击而非基本面变化,然后快速介入。但高频因子有个致命弱点——它不知道这个错误定价是暂时的还是趋势的开始。
低频因子正好相反。它能告诉你这只股票的估值是否合理、基本面是否扎实。但低频因子反应太慢,等它确认趋势时,价格已经跑了一大截。
所以,融合的核心思想就四个字:长短互补。
我个人经验:最有效的融合方式不是简单加权平均,而是让高频因子做「信号增强」,低频因子做「方向判断」。高频因子告诉你「现在有机会」,低频因子告诉你「这个机会值不值得参与」。
1.3 融合增强的核心价值
说白了,融合增强的价值体现在三个层面:
- 提升信息利用率:单一频率的数据只反映了市场的一个侧面。融合后,你能同时看到微观结构和宏观趋势,信息量翻倍。
- 改善信号稳定性:高频因子噪声大,低频因子滞后强。两者结合,相当于用低频的「慢变量」去过滤高频的「快噪声」,信号质量明显提升。
- 扩大策略容量:纯高频策略容量有限,纯低频策略收益平庸。融合后,你可以用低频因子做大方向配置,用高频因子做精细化执行,容量和收益都能兼顾。
避坑指南:我曾经犯过一个错误——直接把高频因子和低频因子做等权合成。结果呢?高频因子噪声太大,把低频因子的信号全污染了。后来我改用「分层融合」的思路,先让低频因子筛选股票池,再在高频维度做精细化排序,效果才出来。
1.4 融合增强的知识体系
嗯,这里我画了一张图,帮你理清整个知识脉络:
这张图其实概括了我们整个课程的核心逻辑。从数据层开始,到因子层,再到融合方法,最后输出增强信号。每一步都有坑,每一步也都有技巧。
1.5 一个简单的融合示例
光说不练假把式。我写个简单的Python代码,展示一下高频因子和低频因子融合的基本思路:
import pandas as pd
import numpy as np
# 假设我们有高频因子和低频因子数据
# high_freq: 分钟级因子值
# low_freq: 日频因子值
def simple_fusion(high_freq, low_freq, alpha=0.3):
"""
简单的线性融合
alpha: 高频因子权重
"""
# 先对低频因子做上采样,对齐到高频时间轴
low_freq_aligned = low_freq.reindex(high_freq.index, method='ffill')
# 标准化处理
high_z = (high_freq - high_freq.mean()) / high_freq.std()
low_z = (low_freq_aligned - low_freq_aligned.mean()) / low_freq_aligned.std()
# 融合
fused = alpha * high_z + (1 - alpha) * low_z
return fused
# 实际项目中,alpha不是固定的
# 我习惯用滚动窗口的动态权重
def dynamic_fusion(high_freq, low_freq, window=20):
"""
动态权重融合
根据近期IC表现调整权重
"""
# 计算滚动IC
rolling_ic_high = high_freq.rolling(window).corr(returns)
rolling_ic_low = low_freq.rolling(window).corr(returns)
# 动态权重
alpha = rolling_ic_high / (rolling_ic_high + rolling_ic_low + 1e-8)
# 融合
fused = alpha * high_freq + (1 - alpha) * low_freq
return fused
这段代码很简单,但核心思想都在里面了。你想想看,静态权重虽然简单,但高频因子衰减快,过段时间可能就失效了。动态权重能自适应调整,这是我比较推荐的做法。
一个小技巧:我在做动态权重时,不会直接用原始IC,而是用IC的秩相关系数。这样对异常值更鲁棒,融合出来的信号也更稳定。
1.6 融合中的常见误区
做融合这几年,我踩过不少坑。这里列几个最常见的:
- 误区一:频率越高越好——不是的。高频因子噪声大,过度依赖反而会引入大量虚假信号。
- 误区二:融合就是加权平均——太天真了。不同频率的因子,它们的信号结构、衰减速度、容量特征完全不同,简单加权等于什么都没做。
- 误区三:忽略换手率匹配——高频因子换手率极高,低频因子换手率低。强行融合后,你会发现交易成本把收益全吃掉了。
我曾经踩过的坑:有一次我融合了一个高频反转因子和一个低频动量因子。结果呢?高频因子天天喊「反转了快卖」,低频因子说「趋势向上继续持有」。两个信号天天打架,最后策略收益还不如单因子。后来我加了「信号一致性检验」,只有当两个因子方向一致时才开仓,效果才好转。
好了,这一章的内容就到这里。因子融合不是简单的拼凑,而是一门需要理解数据本质、因子特性和市场微观结构的艺术。下一章我们会深入具体的融合方法,从线性到非线性,从静态到动态,一步步把融合做到极致。
公众号:蓝海资料掘金营,微信deep3321