【魔码量化工程实战进阶 #17】因子计算雏形:把感觉变成可回测的数字
【魔码量化工程实战进阶 #17】因子计算雏形:把"感觉"变成可回测的数字
入门系列讲的都是"指标"(MA、动量、量比)。本篇把它们升级成量化正规军的语言——因子(factor):一个把原始数据映射成"可排序数字"的纯函数
f(data) → 数值。并引入检验因子有没有用的尺子 IC(信息系数)。这是模块三(指标信号)到模块四(回测风控)的桥。
本文你将得到什么
- 因子的严格定义:
f(数据) → 数字,与指标的区别 - 因子的工程流水线:去极值(winsorize)→ 标准化(z-score)→ 横截面排名
- IC(信息系数)雏形:因子排名与下期收益排名的相关性,因子有没有用只看它
- 本机复核(合成面板 seed=42):20 日动量因子在随机游走下 rank-IC ≈ 0.000(纯噪声无预测力)
一、痛点:"感觉"不能回测
"我觉得低市盈率的好"——这是感觉。量化要把它变成:f = −pe(市盈率越低因子值越高),然后用历史数据验证"低 pe 下期是否真涨"。因子就是这座桥:把主观判断变成可计算、可检验、可排名的数字。
二、工程方案:因子流水线
2.1 因子即纯函数
def factor_momentum(panel):
return panel / panel.shift(20) - 1 # 20日动量因子(面板)
def factor_reversal(panel):
return -panel.diff(5) # 5日反转因子
2.2 去极值 + 标准化(防极端值)
def winsorize(x, lo=0.01, hi=0.99):
return x.clip(*x.quantile([lo, hi])) # 截尾,不用裸极值
def standardize(x):
return (x - x.mean()) / x.std() # 横截面 z-score
2.3 IC:因子有没有用的尺子
因子值本身不重要,它预测下期收益的能力才重要。用 rank-IC:
fwd_ret = panel.shift(-1) / panel - 1 # 下期收益
ic = []
for t in range(20, len(panel)-1):
ic.append(np.corrcoef(factor_momentum(panel).iloc[t].rank().values,
fwd_ret.iloc[t].rank().values)[0, 1])
ic_mean = np.nanmean(ic)
|IC| 越大,因子预测力越强;IC=0 → 纯噪声。
三、本机复核(合成面板 seed=42)
20 日动量因子,在纯随机游走面板上算 rank-IC:
20日动量因子 rank-IC 均值 = 0.000 (示意样本,随机游走下≈0)
这正是关键教学点:动量因子在随机游走(无真实规律)下 IC≈0,毫无预测力。一个"看起来有道理"的因子,必须用 IC 证伪——如果历史上 IC≈0,它只是噪声,上实盘必亏。真实有效的因子(如低波、质量)IC 通常在 0.02~0.08 区间且样本外稳定。
四、原理深挖:四个真实坑
- 前视偏差(最致命):因子若用了
t当天数据(含当天收益)去预测t当天收益,IC 必然虚高。因子与信号必须全部基于 t−1 及之前的数据。 - 幸存者偏差:回测只用工信存在的股票,漏掉退市的,因子 IC 被高估。截面必须用"当时全部上市股票"。
- IC 要样本外:在训练期 IC 高不代表未来高。必须滚动样本外检验(如每月用过去 12 个月估 IC,预测下月)。
- 因子衰减:很多因子 IC 随时间衰减(被套利走)。要监控 IC 的时间序列稳定性,而非单次高低。
五、小结
因子 = 把"感觉"变成 f(data)→数字 的纯函数;去极值 + 标准化让它跨期可比;IC 是它有没有用的唯一尺子——随机游走下 IC≈0,提醒我们"有道理 ≠ 能赚钱"。到这里,模块三收口:指标(#13–#15)→ 横截面排名(#16)→ 因子(#17)。下一篇进入模块四,用回测框架把信号变成"可验证的收益"。
因子的工程化计算、去极值、IC 检验都建立在全市场对齐数据上;魔码因子体系(19 接口 / 77 因子)提供现成因子源,配合完整历史权限可直连你的回测。了解各档证书权益见文末。
免责声明:本文所有示例数据仅用于接口演示,不构成任何投资建议;市场有风险,投资需谨慎。
系列持续更新中。 想要亲手跑通上面的代码?前往 魔码证书申请页 免费领取你的专属证书,复制即用、按次计费、稳定可用。
