数据与算法

量化策略的终极博弈:为什么高质量数据比复杂算法更决定成败

signal = model.predict(clean_price, clean_volume, timestamp)

量化策略的终极博弈:为什么高质量数据比复杂算法更决定成败

回测系统中,最危险的错误通常不在模型这一行。它们发生在更早的位置:时间戳被错误对齐,停牌记录被填充,退市股票从样本中消失,除权除息没有正确还原,训练集混入了未来信息。

这些错误不会让程序崩溃。

它们会让净值曲线变得平滑,让夏普比率升高,让参数搜索看起来有效。直到策略进入实盘,统计分布发生变化,交易信号开始失真。此时再替换模型,通常已经没有意义。输入层已经污染了输出层。

量化团队长期存在一个事实:数据工程与清洗可能占据约80%的工作时间。算法只占其中一部分。更复杂的网络结构不会自动修复错误的行情数据,也不会识别错误的复权因子,更不会替你判断一个成交量究竟发生在北京时间还是纽约夏令时。

数据工程的隐形成本:80%的时间都在“洗数据”

量化研究可以拆成几个层级。

第一层是数据采集。包括行情、财务、宏观、新闻、订单簿、期货合约、公司行为和交易日历。

第二层是数据标准化。统一字段名、时间格式、证券代码、币种、价格精度和交易所标识。

第三层是数据清洗。处理缺失值、重复记录、异常值、错位时间戳、停牌状态和历史修订。

第四层是特征生成。计算收益率、波动率、均值回归指标、动量因子、成交量因子和机器学习输入变量。

第五层才是模型训练与策略回测。

研究团队往往把注意力集中在第五层。讨论长短期记忆网络、变换器结构、梯度提升树,讨论损失函数,讨论学习率和网络深度。前四层则被视为工程工作。

这是分类错误。

如果特征生成依赖错误价格,那么模型学习到的不是市场规律,而是数据管道中的确定性缺陷。模型越复杂,拟合能力越强,缺陷越容易被编码进参数。

一条数据记录至少要回答六个问题

对任意一条行情记录,系统至少需要知道:

  • 这条记录属于哪个证券、合约或交易品种;
  • 它对应哪个交易所和哪个时区;
  • 时间戳表示撮合时间、收盘时间、接收时间,还是供应商落库时间;
  • 价格是否经过拆股、分红、配股或合约换月调整;
  • 该时点是否允许交易;
  • 这条记录在当时是否已经能够被研究系统获得。

最后一个问题直接对应前视偏差。

如果模型在2020年1月1日生成信号,输入数据中却包含了2020年1月2日之后发布的财务修订值,那么回测系统并没有模拟当时的决策环境。它只是用未来信息重新解释过去。

这种错误不需要高级算法。一个简单的均线交叉策略也会因此得到虚假的表现。

清洗不是删除异常值

金融数据中的异常值不能按照通用统计规则直接删除。

假设某只股票在一个交易日内价格从100跳到50。这个变化可能是:

1. 数据供应商录入错误;

2. 拆股导致的价格变化;

3. 现金分红或配股后的除权;

4. 流动性极低时的真实成交;

5. 不同市场价格字段被错误拼接;

6. 复权前后数据混用。

如果系统只用正态分布的三倍标准差过滤异常值,可能会删除真实的公司行为。也可能保留错误的价格,因为错误值本身并不一定位于统计分布的极端尾部。

清洗逻辑必须与金融事件关联。价格异常不是单纯的数学异常。它需要通过公司行为表、交易所公告、合约规则和原始成交记录进行交叉验证。

对高频数据而言,处理逻辑更加严格。盘口价格可以短暂跳动,成交量可能分散在多个撮合事件中,撤单和成交的时间顺序也会影响信号。对日频基本面策略而言,主要风险则可能来自财务数据发布日期、报告期和修订版本。

同一个“异常值”,在不同策略中含义不同。

均值回归策略可能依赖短期价格偏离。直接删除极端收益,会删除策略真正依赖的样本。趋势策略可能更关注连续性。错误的跳点会制造虚假的突破。不能用一套通用清洗规则覆盖所有模型。

数据清洗不是把数据变得“漂亮”。它只负责让数据符合当时可观察、可交易、可解释的条件。

GIGO法则的量化实证:数据质量如何改变预测力

“垃圾进,垃圾出”并不是一句工程口号。它描述的是输入误差如何穿过整个计算链路。

1963年,国际商业机器公司的程序员乔治·富彻尔提出了“垃圾进,垃圾出”这一概念。此后,这个原则被广泛用于软件系统、数据库和统计建模。

量化交易中,输入数据的影响可以分成三类。

观测错误

观测错误发生在原始数据层。

例如:

  • 收盘价缺失;
  • 成交量被重复计入;
  • 交易日期落在周末;
  • 证券代码发生变化但没有建立映射;
  • 期货主连数据在换月时出现不连续;
  • 盘口数据的买卖方向被颠倒。

这类错误通常可以通过数据校验发现。系统能够检查字段范围、重复率、时间顺序和主键完整性。

语义错误

语义错误更难发现。字段本身有值,但含义被误读。

例如“收盘价”可能表示未复权收盘价,也可能表示后复权价格。财务数据中的“净利润”可能属于报告期,也可能是滚动十二个月口径。成交时间可能是本地交易所时间,也可能是供应商服务器时间。

程序可以正常运行。

结果仍然错误。

过程错误

过程错误发生在数据被使用的阶段。

比如先用完整样本计算标准化均值和标准差,再切分训练集与测试集。此时测试集的统计信息已经进入训练过程。又比如先对全历史样本进行股票池筛选,再回测过去十年。这个股票池可能已经包含了未来才知道的上市状态、流动性和财务信息。

过程错误最容易被误判为模型有效。

数据准备可以改变模型结果

关于财务困境预测的研究显示,经过符合经济学逻辑的数据准备后,模型平均准确率提升约15.6个百分点,特异度平均提升约26.9个百分点。

这两个数字需要分开理解。

准确率提升,表示总体分类结果改善。特异度提升,表示模型识别负类样本的能力改善。在风险识别场景中,特异度并非附属指标。它决定了系统是否会把大量正常企业错误归入风险组,也影响后续的资金配置、风控阈值和组合规模。

研究还指出,数据质量对预测性能的贡献,大约相当于算法选择所带来性能差异的一半。

这不是“算法不重要”。它说明算法改进建立在可用数据之上。如果输入层已经存在系统性偏差,模型之间的性能差异会被数据误差掩盖。此时从随机森林切换到变换器,可能只是在更换一种拟合噪声的方式。

用统计测试识别数据问题

数据质量不能依靠人工抽样确认。至少需要建立以下测试。

完整性测试

检查每个交易日是否存在,证券在上市期间是否连续,分钟数据是否出现不合理空洞。

完整性测试不能简单要求每个证券每天都有数据。停牌、涨跌停、夜盘缺失、节假日和交易所临时休市都可能是合法状态。

因此,测试需要关联交易日历和证券状态表。

一致性测试

检查开盘价、最高价、最低价和收盘价之间的关系:

  • 最高价不应低于开盘价和收盘价;
  • 最低价不应高于开盘价和收盘价;
  • 成交量不应出现负值;
  • 时间戳应保持单调;
  • 买价通常不应高于卖价。

这些是基础规则。它们无法识别所有错误,但可以快速阻止低级污染进入特征层。

稳定性测试

对价格、收益率、成交量和波动率进行分布监控。

不能假设金融数据服从正态分布。收益率通常存在厚尾、偏度和波动聚集。用均值与标准差描述全部分布,信息不足。

更适合监测:

  • 分位数变化;
  • 中位数绝对偏差;
  • 尾部比例;
  • 零值占比;
  • 极端跳变频率;
  • 不同供应商之间的相关性;
  • 数据修订前后的差异。

可追溯测试

每个派生字段都应能够追溯到原始字段和转换版本。

例如,后复权收盘价需要记录:

  • 原始收盘价;
  • 公司行为事件;
  • 复权因子;
  • 计算时间;
  • 计算程序版本;
  • 数据供应商版本。

否则,回测出现异常时,只能重新下载数据。无法回答异常从哪一步产生。

回测中的隐形杀手:幸存者偏差与除权除息

回测不是把历史价格放进一个循环。

回测是在复原一个历史时点上的信息集合、交易规则和可交易资产集合。缺少任何一个维度,净值曲线都可能偏离实际。

幸存者偏差:样本集合已经被未来筛选

幸存者偏差常见于股票池构建。

如果当前仍然上市、规模较大、数据完整的股票被用于回测过去十年,那么已经退市、破产、被收购或长期停牌的股票可能被排除在外。样本天然偏向存活者。

策略因此少面对了一部分负收益路径。

错误流程通常是:

1. 以当前日期的上市股票列表作为历史股票池;

2. 下载这些股票的历史价格;

3. 对过去多个年份进行回测;

4. 计算收益率和最大回撤。

这不是历史回测。它是使用当前幸存样本对过去进行重构。

正确做法需要保存时点股票池。每个回测日期只能使用当时已经上市、当时可以交易、当时符合筛选条件的资产。

数据结构也必须支持退市记录。退市不是空值。退市本身就是状态变化,可能对应策略中的持仓清算、价格归零、现金结算或最后交易日处理。

前视偏差:未来信息进入过去

前视偏差不只来自明显的未来价格。

以下情况都可能造成前视偏差:

  • 用当天收盘价计算信号,并假设当天收盘成交;
  • 用日终成交量筛选当天盘中股票;
  • 用最终修订后的财务报表回测报告发布前的交易;
  • 用完整历史样本计算行业均值;
  • 用后验方式填补缺失数据;
  • 用未来才知道的成分股调整记录;
  • 在特征标准化时使用测试区间统计量。

时间切分必须早于所有可能从全样本中学习的操作。

数据清洗、缺失值填补、标准化、特征选择和参数优化,都需要在训练区间内完成,再应用于验证区间和测试区间。不能先处理全样本,再进行时间切分。

除权除息:价格连续性与可交易价格不是同一件事

复权数据适合计算长期收益率,但不一定适合直接模拟交易成交。

假设股票发生现金分红。后复权价格会调整历史价格,使收益率序列保持连续。策略如果只使用收益率和趋势指标,后复权数据通常更方便。

但成交模拟需要知道当日真实可成交价格。若直接用后复权价格计算买入、卖出金额,资金曲线可能产生错误。分红现金、红股、配股和税费都需要单独处理。

可以将价格数据分成两类:

数据类型适用场景主要风险
未复权价格模拟实际成交、订单执行和资金变化长期收益率可能出现人为跳点
前复权价格保持当前价格口径,观察历史形态早期价格被重新缩放,不能直接代表当时成交价
后复权价格计算长期持有收益、连续收益率和技术指标不应直接替代实际成交价格
公司行为明细还原分红、拆股、配股和现金流需要与持仓、交易日期和税费规则联动

最稳妥的做法不是在三种价格中永久选择一种,而是分离用途。

收益特征可以使用经过一致调整的价格序列。交易执行需要使用当时有效的市场价格。公司行为则进入现金流和持仓数量计算。

混用字段,是复权错误的根源。

回测净值的平滑,不等于策略逻辑的稳定。越平滑的结果,越需要检查它是否来自未来信息。

多源数据对接:时区、停牌与3%的错误率

量化系统经常连接多个数据源。行情来自一个供应商,财务数据来自另一个接口,交易日历由交易所提供,新闻和公告又来自独立数据库。

多源数据的难点不在接口数量,而在语义对齐。

时区不是显示格式

时间戳处理常被简化为“统一成北京时间”。这远远不够。

每个时间字段至少需要区分:

  • 事件发生时间;
  • 交易所本地时间;
  • 数据供应商接收时间;
  • 数据库写入时间;
  • 策略系统可见时间。

这些时间可能不同。

全球市场还存在夏令时切换。美国市场的开收盘时间在中国本地时间上的映射会发生变化。如果系统把固定时差写死,跨市场策略会在一年中的部分日期出现错位。

错位的影响并不总是明显。日频数据可能只表现为财务数据与行情数据的发布日期关系异常。分钟策略则可能直接把上一交易日尾盘数据拼接到下一交易日开盘前。

处理方式应当是:

1. 原始数据保留交易所本地时间;

2. 保存时区标识;

3. 转换为统一标准时间;

4. 生成交易日和交易时段字段;

5. 通过交易所日历校验开盘、收盘和休市状态;

6. 在特征计算前确认所有输入已经对齐。

不要直接覆盖原始时间戳。覆盖后无法判断错误发生在采集端还是转换端。

停牌不是缺失值

停牌期间没有成交,不等于价格缺失。

如果把停牌日期用前值填充,技术指标可能认为价格保持稳定。波动率被压低。收益率被压平。策略可能继续产生买卖信号。

如果把停牌数据删除,时间序列会出现不连续。持仓收益、最大持仓天数和风险暴露都可能被错误计算。

停牌需要显式状态:

  • 是否停牌;
  • 停牌开始时间;
  • 停牌结束时间;
  • 是否允许卖出;
  • 是否发生公司行为;
  • 复牌后首个成交日的价格状态。

对于组合回测,停牌资产还会影响资金占用。不能因为没有新价格,就把持仓当作不存在。

3%的错误率足以污染模型

一个包含1000万条记录的数据管道,即使只有3%的错误率,也可能不触发系统报错。

原因很简单。很多错误值符合字段类型和数值范围。

例如:

  • 日期仍然是合法日期;
  • 价格仍然是正数;
  • 成交量仍然是整数;
  • 证券代码仍然存在;
  • 行数与预期接近;
  • 数据库主键没有重复。

但错误已经分散进入不同证券、不同日期和不同特征。模型看到的是被局部扰动的统计分布。

如果错误集中在波动放大时期,影响会更大。极端行情本来就是模型区分风险状态的重要样本。将这些时点错误处理为缺失、重复或错误复权,会直接改变尾部分布。

因此,数据质量监控不能只统计整体错误率。还要观察错误的空间和时间聚集:

  • 是否集中在某个供应商;
  • 是否集中在某个交易所;
  • 是否集中在开盘或收盘;
  • 是否集中在换月和除权除息日期;
  • 是否集中在波动率上升阶段;
  • 是否集中在某类证券或某个行业。

总体错误率相同,分布方式不同,后果完全不同。

数据源之间应当做差异检测

多源数据可以互相验证,但不能简单采用“多数表决”。

如果两个供应商都使用同一上游数据,错误可能同步出现。更可靠的方式是比较关键统计量和事件记录:

  • 日收盘价差异;
  • 最高价和最低价的相对误差;
  • 成交量数量级;
  • 交易日集合;
  • 复权因子;
  • 公司行为发生日期;
  • 期货合约最后交易日;
  • 盘口买卖价的方向关系。

对差异设置分层阈值。微小报价差异可能来自精度和撮合口径。大幅价格差异需要回溯原始记录。不能所有差异都自动修正,也不能所有差异都忽略。

算法与数据的博弈:复杂模型不能替代可靠输入

模型选择仍然有价值。

线性模型适合建立基线。树模型适合处理非线性和特征交互。神经网络能够从高维序列中提取复杂表示。变换器结构适合处理长序列依赖。不同算法在不同数据结构、样本规模和计算预算下会产生差异。

但这些差异必须建立在可复现的数据流程上。

先建立基线,再增加复杂度

量化研究中,最有效的模型流程通常不是直接训练复杂网络,而是按顺序建立基线:

1. 用简单收益率或均值回归规则建立无机器学习基线;

2. 用线性回归、逻辑回归或普通最小二乘验证特征方向;

3. 用树模型测试非线性关系;

4. 引入时间序列模型;

5. 最后评估深度学习结构是否带来稳定增量。

每一层都需要保留独立测试结果。

如果简单模型和复杂模型都在同一数据集上表现优异,首先检查是否存在前视偏差,而不是立即认为市场规律被成功提取。

如果复杂模型只在单次随机切分中有效,在滚动时间窗口中失效,通常意味着过拟合或分布漂移。金融时间序列不满足独立同分布假设。随机打乱样本会破坏时间顺序,也会让相邻样本的信息泄漏到训练集和测试集之间。

过拟合的来源不只在网络参数

常见过拟合来源包括:

  • 网络层数过深;
  • 参数数量过多;
  • 特征数量远超有效样本量;
  • 反复调整回测区间;
  • 通过多个指标筛选最优策略;
  • 根据测试集表现修改模型;
  • 使用未来修订数据;
  • 忽略交易成本和滑点;
  • 按最终收益选择资产池;
  • 在多个市场和周期中反复试验,却只报告最好结果。

最后两项经常被忽略。

即使模型没有训练参数,研究过程本身也可能过拟合。研究者不断尝试因子、窗口、阈值和过滤条件,最终会在历史噪声中找到一组看似有效的组合。

因此,需要记录所有实验,而不是只保留成功版本。实验日志至少包括:

  • 数据版本;
  • 样本区间;
  • 特征版本;
  • 模型参数;
  • 交易成本;
  • 滑点假设;
  • 训练方式;
  • 验证方式;
  • 评价指标;
  • 失败原因;
  • 是否使用过测试集。

没有实验记录,回测结果无法解释。

低延迟数据不等于高质量数据

高频交易环境中,数据延迟会影响信号价值。低延迟是工程指标。但低延迟数据如果存在时间乱序、重复成交、撤单遗漏或撮合方向错误,仍然不能用于可靠回测。

数据质量至少包含四个维度:

  • 准确性:数值是否接近真实市场记录;
  • 完整性:关键事件是否缺失;
  • 一致性:不同数据源和不同字段是否互相匹配;
  • 时效性:数据是否在策略决策前可用。

低延迟只覆盖时效性的一部分。

如果数据先到,但含义错误,系统只是更快地处理错误。速度不会抵消错误。

特征工程必须保留时间边界

以财务数据为例,企业报告期、披露日期和数据入库日期不是同一个概念。

模型可以使用的时间点,应当以市场实际可获得时间为准,而不是报告期结束时间。季度报告属于哪个季度,是会计问题。投资者何时能够看到报告,是交易问题。

同样,新闻文本的发布时间、抓取时间和清洗完成时间也不同。自然语言处理模型如果使用了后来修订的新闻标签,回测结果会偏离真实信息环境。

所有特征都应包含可用时间。数据库设计中可以采用双时间模型:

  • 有效时间:事件在现实世界中发生的时间;
  • 记录时间:系统获知并记录该事件的时间。

对于回测,第二个时间通常更关键。

一套可执行的数据验证流程

数据验证不应被放在项目末尾。它应当是管道的一部分,和特征计算、模型训练一样可重复。

第一步:冻结原始层

原始数据只追加,不覆盖。

供应商修订数据时,新增版本并保留旧版本。记录下载时间、文件哈希、接口参数和供应商版本。这样才能知道模型使用了哪一份历史数据。

如果原始层被直接覆盖,任何回测都只能依赖当前数据状态。历史结果无法复现。

第二步:建立标准化层

统一:

  • 证券和合约标识;
  • 时间格式;
  • 价格和数量精度;
  • 币种;
  • 交易所代码;
  • 交易日历;
  • 公司行为类型;
  • 期货合约生命周期。

标准化层不负责“修正”全部数据。它只负责让字段拥有明确、稳定的含义。

第三步:建立异常检测层

异常检测需要分为规则检测和统计检测。

规则检测适合发现:

  • 负价格;
  • 负成交量;
  • 最高价低于最低价;
  • 时间戳倒序;
  • 重复主键;
  • 非交易日成交;
  • 合约到期后仍有交易记录。

统计检测适合发现:

  • 收益率极端跳变;
  • 成交量突然放大;
  • 价格长期不变;
  • 某字段分布发生结构性变化;
  • 某个数据源与其他数据源出现长期偏离。

检测结果不要直接删除。应当进入异常队列,由规则、公司行为和原始记录共同决定处理方式。

第四步:建立时点快照

对每一个回测日期,系统需要生成当日可见的数据快照。

快照应包括:

  • 当日可交易证券;
  • 当日已知财务数据;
  • 当日已经发布的公司公告;
  • 当日可获得的行情;
  • 当日有效的交易规则;
  • 当日可用的指数成分和行业分类。

快照的目的不是增加存储负担,而是消除未来信息混入。存储成本通常低于错误策略进入实盘后的成本。

第五步:进行滚动验证

不要只做一次训练集与测试集切分。

可以采用滚动窗口:

1. 用早期区间训练;

2. 用随后的区间验证;

3. 向前推进时间;

4. 重新训练;

5. 在下一个区间测试;

6. 汇总多个窗口的分布。

观察的不只是平均收益,还包括:

  • 各窗口收益方向;
  • 最大回撤;
  • 换手率;
  • 交易成本占比;
  • 预测准确率;
  • 精确率和召回率;
  • 特异度;
  • 尾部损失;
  • 信号覆盖率;
  • 交易数量。

如果策略只在一个窗口内有效,不能称为稳健。至少需要解释其失效原因。

第六步:做数据扰动测试

对输入数据进行小幅、合理的扰动,观察策略是否出现非线性崩溃。

可测试:

  • 成交价格加入微小滑点;
  • 删除少量非关键记录;
  • 延迟一个交易周期;
  • 改变缺失值处理方式;
  • 调整复权因子精度;
  • 使用不同供应商的价格;
  • 缩短可用历史区间;
  • 移动训练和验证边界。

稳健策略不应依赖某一个精确参数、某一个数据源或某一个异常日期。

这不是要求结果完全不变。结果可以变化。变化幅度和方向需要符合交易逻辑。

数据与算法的投入顺序

量化项目资源有限。计算预算、数据费用和研发时间都需要排序。

建议按照以下顺序投入:

优先级工作内容目标
第一层原始数据留存与版本管理保证结果可复现
第二层交易日历、时间戳和证券状态消除结构性错位
第三层公司行为和复权处理保证收益与成交口径分离
第四层前视偏差与幸存者偏差控制复原历史信息集合
第五层成本、滑点和成交约束接近实际执行条件
第六层基线模型和滚动验证判断信号是否存在
第七层复杂算法和分布式计算放大已验证的有效信息

顺序不能倒置。

直接建设分布式训练集群,却没有可靠的时点数据,得到的只是更快的错误结果。直接训练变换器,却没有基线模型,也无法判断复杂结构贡献了什么。

区块链与金融数据:不可篡改不等于正确

区块链金融场景中,经常把“不可篡改”与“数据可靠”混为一谈。

区块链可以增强记录的可追溯性。它能够保存交易记录、时间戳、哈希和状态变化。它不能保证写入链上的数据在进入系统时就是正确的。

如果预言机输入错误,错误数据仍然可以被永久记录。如果资产标识映射错误,链上记录仍然无法代表真实证券。如果链下事件没有被及时同步,链上状态也会产生延迟。

因此,区块链数据同样需要:

  • 来源验证;
  • 时间可用性检查;
  • 资产标识映射;
  • 异常交易识别;
  • 链上链下状态对账;
  • 合约升级和数据修订记录。

不可篡改解决的是审计问题的一部分。它不解决统计质量问题,也不解决交易可用性问题。

机器学习可以用于数据质量,但不能替代规则

异常检测模型可以帮助识别复杂模式。例如,通过聚类识别不同供应商的数据分布差异,用自编码器检测高维盘口异常,用监督模型判断某个价格跳变是否与公司行为相关。

但模型本身也需要训练数据。

如果历史标签错误,异常检测模型会复制错误标准。如果模型只在正常市场训练,极端行情可能被全部标记为异常并删除。结果是数据被处理得更加平滑,尾部风险反而消失。

金融数据清洗应当采用规则与模型结合的方式:

  • 规则负责硬约束;
  • 统计模型负责软检测;
  • 公司行为和交易日历负责语义验证;
  • 人工审查负责高影响事件;
  • 版本系统负责记录处理结果。

不能让一个黑箱模型自动重写全部历史数据。

参数优化:先优化数据流程,再优化模型参数

策略参数优化通常集中在窗口长度、阈值、持仓数量、止损比例和再平衡周期。

这些参数当然需要测试。但在此之前,至少要固定以下条件:

  • 数据版本;
  • 复权口径;
  • 交易日历;
  • 股票池生成方式;
  • 交易成本;
  • 滑点模型;
  • 信号可用时间;
  • 缺失值处理方式;
  • 训练和测试边界。

否则,参数搜索同时优化了数据误差。最后得到的不是最优策略参数,而是最适应当前数据缺陷的参数。

不要只优化收益指标

单独最大化年化收益,很容易找到高换手、高杠杆或极端集中持仓的结果。

参数评价应当同时观察:

  • 年化收益;
  • 最大回撤;
  • 收益波动率;
  • 夏普比率;
  • 卡玛比率;
  • 换手率;
  • 单笔交易收益;
  • 交易成本敏感度;
  • 资金容量;
  • 多空两侧表现;
  • 不同市场阶段表现;
  • 不同资产和时间窗口表现。

如果一个参数组合只在成本为零时有效,它没有工程价值。如果增加一个合理滑点后,收益立即归零,说明信号可能依赖不可实现的成交价格。

参数稳定区间比单点最优更有价值

对参数进行网格搜索后,不要只记录最高收益点。需要观察邻近参数的表现。

例如,窗口长度为20时收益最高,窗口长度为19和21时明显下降,这通常意味着模型对参数非常敏感。单点结果可能来自样本噪声。

如果窗口长度在18至25之间都能维持相近结果,说明参数处于稳定区间。稳定区间不代表策略必然有效,但比单点峰值更接近可部署状态。

可以将参数面理解为一个统计曲面。尖峰通常对应过拟合风险。宽平台更适合继续验证。

最后的测试集只能使用一次

测试集不是调参工具。

一旦测试结果被用于修改特征、窗口、模型或交易规则,它就已经不再是独立测试集。应当重新划分新的测试区间,或者使用扩展后的时间窗口进行验证。

研究过程中需要区分:

  • 训练集:拟合模型;
  • 验证集:选择参数和结构;
  • 测试集:进行最终评估;
  • 实时观察集:上线后检测分布变化。

如果没有足够长的历史数据,也不能通过反复切分制造独立性。样本量不足时,应当降低模型复杂度,减少自由度,而不是增加参数搜索次数。

模型的局限性必须写进结果

高质量数据可以降低输入误差。它不能消除市场的随机性,也不能保证策略盈利。

市场数据存在分布变化。交易制度会变化,参与者结构会变化,流动性会变化,成本会变化。一个在历史样本中稳定的因子,可能在未来失去解释力。

模型还可能受到以下限制:

  • 样本量不足;
  • 资产之间存在相关性;
  • 极端行情样本很少;
  • 标签定义带有主观阈值;
  • 交易成本难以精确模拟;
  • 实盘执行存在延迟;
  • 资金规模会改变成交价格;
  • 数据供应商会修订历史记录;
  • 新上市资产缺少长历史;
  • 退市样本可能不完整。

这些限制不能靠更大的神经网络消除。

如果模型依赖少数日期的收益,应该单独报告这些日期对总收益的贡献。如果策略主要赚取开盘跳空,需要测试不同开盘成交假设。如果策略依赖成交量异常,需要验证数据供应商对大宗交易和场外转让的处理方式。

只报告一条净值曲线,信息不足。

结语:数据质量是模型的边界条件

量化策略的核心竞争力,不是把模型堆到最复杂,而是让每一层输入都能被解释、复现和验证。

80%的数据工程投入并不意味着算法可以被删除。它意味着算法工作的前提成本经常被低估。经过合理准备的数据,曾让财务预测模型的平均准确率提高约15.6个百分点,特异度提高约26.9个百分点。这个量级足以改变模型评价,也足以改变策略是否能够进入下一轮验证。

处理顺序应当固定:

1. 冻结原始数据;

2. 建立版本系统;

3. 校验时间、证券状态和交易日历;

4. 分离复权价格与实际成交价格;

5. 消除幸存者偏差和前视偏差;

6. 对多源数据进行差异检测;

7. 用简单模型建立基线;

8. 通过滚动窗口和数据扰动测试稳健性;

9. 最后才进行复杂模型和参数优化。

不要用算法掩盖数据问题。

先验证数据。再验证信号。最后验证模型。

任何跳过前两步的参数优化,都可能只是对错误输入进行更高精度的拟合。

Related reading: 量化模型中的前瞻偏差:数据泄露的隐蔽成因与检测机制 and 量化策略回测指标的虚与实:如何看穿超高收益率背后的陷阱.

常见问题

为什么量化回测中净值曲线平滑反而可能是坏事?
平滑的净值曲线可能掩盖了数据处理中的错误,如混入了未来信息或错误处理了停牌记录。这种虚假的表现往往在实盘中因统计分布变化而导致策略失效。
如何避免回测中的前视偏差?
必须确保时间切分早于所有从全样本中学习的操作,并严格使用历史时点快照,即每个回测日期仅使用当时已上市、可交易且已发布的数据。
复权数据是否可以直接用于模拟交易成交?
不建议直接使用。复权数据适合计算长期收益率,但模拟实际成交应使用当时有效的市场价格,且需单独处理分红、拆股及税费等公司行为。
为什么说3%的数据错误率就足以污染量化模型?
即使错误率较低,若错误集中在波动放大时期或关键交易节点,模型会学习到被局部扰动的统计分布,从而导致预测力失效。
在量化研究中,数据质量对模型性能有多大影响?
研究显示,经过符合经济学逻辑的数据准备后,财务困境预测模型的准确率可提升约15.6个百分点,特异度提升约26.9个百分点,其贡献度约相当于算法选择差异的一半。