金融特征工程经常被理解为计算工作:选择数据、定义窗口、编写公式、生成特征,再将结果交给模型或回测系统。
例如,20日动量可以简化为:
text
momentum_20d(t)
= adjusted_close(t) / adjusted_close(t-20) - 1
但公式正确、程序运行成功,只能证明特征被算出来了,不能证明它可以安全进入投资决策。
金融特征治理真正解决的问题是:
如何保证正确的特征按时进入模型,错误的特征被挡在模型之外;发生异常后,系统还能够判断影响范围,并选择阻断、降级或恢复。
总说
金融特征治理可以归纳为三件事:
- 定义清楚:明确特征用于什么决策、如何计算、何时可用,并记录数据、规则和代码版本。
- 发布把关:计算结果先进入候选区,通过完整性、时点和分布检查后,才能发布给模型。
- 失败兜底:局部异常可以隔离并降级,系统性错误必须阻断,沿用旧版本必须明确标记。
这三件事背后是一条连续的推导链:
text
投资决策
→ 交付标准
→ 控制机制
先明确特征服务什么决策,才能判断它需要满足什么条件;明确了交付条件,才能设计相应的质量门禁和异常处理机制。
一、为什么计算正确还不够
金融特征的价值不来自计算本身,而来自它对投资决策的影响。
一个动量特征可能用于因子研究,也可能用于模型评分、组合构建或风险监控。用途不同,对数据时点、质量和交付时间的要求也不同。
用于历史研究的特征,更关注数据版本和实验复现;用于次日交易的特征,还必须在组合生成之前完成发布。
因此,同一个特征在晚上22点计算正确,如果模型在20点已经完成评分,它对当天的决策仍然不可用。
除了延迟,计算成功也无法排除以下问题:
- 复权数据错误,把除权识别为价格暴跌;
- 股票与交易日错位,导致收益区间错误;
- 使用了决策时点之后才获得的数据;
- 新股、停牌和行情漏传被当成同一种缺失;
- 计算中的临时结果被模型提前读取。
这些问题未必会导致程序报错,却可能改变股票排名、模型评分和目标仓位。
所以,金融特征工程不能只回答"怎么算",还必须回答:
这个特征服务什么决策,满足什么条件才能交付,以及不满足条件时系统应该怎么办?
二、从投资决策倒推治理机制
1. 明确决策用途
治理的第一步不是设置质量规则,而是明确特征将被谁在什么时间使用。
至少需要回答:
- 特征用于研究、模型、组合还是实盘交易;
- 消费者在什么时间读取;
- 特征会影响什么判断;
- 错误或延迟会造成什么后果。
假设20日动量用于T日晚间模型评分和T+1组合构建,那么它的目标就不是"每天运行一次",而是:
在模型运行前,提供基于当时可获得信息生成的可信动量特征。
这句话同时确定了三个边界:
text
数据边界:只能使用当时已获得的数据
时间边界:必须在模型运行前发布
用途边界:用于T+1评分和组合构建
有了决策用途,后续的质量和时效要求才有判断依据。
2. 定义交付标准
第二步是把抽象的"特征正确"转化为可验证条件。
对于20日动量,至少要满足:
- 行情、复权和股票池版本已经确定;
- 每只股票每天只有一条特征记录;
- 不使用决策时点之后才获得的数据;
- 股票覆盖率达到约定标准;
- 缺失原因能够被解释;
- 特征分布没有无法解释的异常变化;
- 在模型运行前完成发布。
这里需要区分几个状态:
text
计算完成
≠ 质量通过
≠ 可信发布
≠ 本次决策可用
例如,任务计算完成但覆盖率明显下降,只能说明程序执行结束;特征是否可以进入模型,还需要经过质量判断。
同样,特征最终发布成功,但已经错过模型运行时间,也不能算本次交付成功。
3. 建立控制机制
明确交付标准后,才能设计工程控制。
首先建立特征定义和版本记录,保存公式、参数、输入来源、复权口径、可用时间和负责人。
每次计算还要绑定:
- 交易日;
- 行情版本;
- 复权版本;
- 股票池版本;
- 代码和参数版本。
这样,模型结果异常时,才能还原当时使用了什么,并以相同条件重新计算。
其次,将计算和发布分离:
text
版本化计算
→ 候选结果
→ 质量检查
→ 可信发布
→ 模型消费
计算结果先进入候选区。模型只能读取已经发布的可信版本,不能直接读取计算中的临时结果。
发布前重点检查四类问题:
- 唯一性:是否出现重复股票记录;
- 覆盖率:股票缺失是否超过合理范围;
- 时点正确性:是否使用了未来才获得的数据;
- 分布稳定性:缺失率、分位数或极端值是否异常变化。
这些检查的目的不是追求数据绝对完美,而是阻止无法解释的异常进入模型。
三、20日动量特征如何落地
假设模型每天20点开始生成股票评分,20日动量必须在此之前完成发布。
正常链路如下:
text
T日行情和复权数据到达
→ 确定当日股票池版本
→ 计算20日动量
→ 写入候选区
→ 执行质量检查
→ 发布可信版本
→ 模型读取并生成评分
如果某只股票当天除权,而复权因子没有正确到达,未经治理的系统可能把正常除权识别成暴跌,并输出一个极端负动量。
程序并没有报错,但错误会继续传播:
text
复权价格错误
→ 动量错误
→ 股票排名错误
→ 模型评分错误
→ 目标仓位错误
质量门禁应通过极端值、分布变化和复权数据完整性发现这个问题,并根据影响范围选择处理方式。
1. 局部异常:隔离后降级发布
如果只有少量股票行情缺失,可以将这些股票从当日可交易集合中排除,其余股票继续发布。
发布记录必须说明:
- 哪些股票被排除;
- 排除原因;
- 最终覆盖率;
- 当前版本处于降级状态。
模型看到的不只是特征值,还应知道当前数据是否完整。
2. 系统性异常:阻断整个版本
如果出现以下问题,应阻断整个版本:
- 整批复权因子错误;
- 交易日整体错位;
- 使用了未来数据;
- 股票池版本无法确认;
- 大面积覆盖率异常。
这类问题会影响整个横截面排名,不能通过删除几只股票解决。
系统应保留上一可信版本,修复输入或规则后重新计算,而不是把错误结果继续交给模型。
3. 沿用旧版本:必须显式标记
如果业务允许暂时使用上一日特征,可以沿用旧版本,但必须向模型明确返回:
text
决策日期:2026-08-29
特征数据日期:2026-08-28
质量状态:STALE
降级原因:当日行情不完整
不能简单复制旧结果并修改日期,否则模型和后续复盘都会误以为当天特征已经正常计算。
是否允许使用旧版本,不应由数据平台单方面决定。研究或投资负责人需要根据特征衰减速度和模型依赖程度预先制定规则。
四、将治理结果沉淀为特征契约
经过上述推导,可以将20日动量沉淀为一份精简的特征契约。
| 项目 | 定义 |
|---|---|
| 特征名称 | momentum_20d |
| 决策用途 | T+1模型评分和组合构建 |
| 计算口径 | 复权收盘价20日收益 |
| 可用时间 | T日20:00模型运行前 |
| 输入版本 | 行情、复权、股票池、代码和参数 |
| 发布门禁 | 唯一性、覆盖率、时点和分布检查 |
| 阻断条件 | 未来数据、日期错位、系统性复权错误 |
| 降级条件 | 少量股票输入异常 |
| 失败策略 | 隔离、阻断或显式沿用旧版本 |
| 责任分工 | 研究定义、工程生产、投资决策 |
这份契约不是公式的附属文档,而是研究、数据工程和投资团队之间的共同约定。
研究负责人定义特征含义和使用边界;数据工程负责人保证计算、检查和发布稳定运行;投资负责人决定降级状态下是否允许继续生成仓位。
结语
金融特征治理的起点不是质量平台,也不是增加审批,而是明确特征最终服务的投资决策。
从决策出发,才能推导出特征的交付时间、正确性要求和失败代价;再通过版本记录、候选隔离、质量门禁和可信发布,把这些要求落实为工程机制。
整套方法可以概括为:
text
明确决策用途
→ 定义交付标准
→ 建立发布控制
→ 设计失败策略
→ 保留运行证据
金融特征治理不是保证特征永远不出错,而是保证:
满足条件的特征才能进入模型;不满足条件时,系统能够及时阻断、合理降级,并在修复后恢复可信交付。