金融中的可重复性:当结果无法重新运行
复制金融研究的实用标准:数据来源、可执行代码、变量定义,以及如何处理本模块中未经验证的 Cassella-Nguyen 归属。
无法重现的结果是故事
金融与复制有特殊关系。每个人都说它重要。几乎没人愿意花一年重建别人的数据集,发现未记录的退市收益约定,然后向宁愿发表新异常的期刊提交结果。
结果是文献充满精确表格和不精确来源。论文可能告诉你变量在六月底测量,但不告诉你会计数字在该日期是否可用。它可能说极值被处理,但不告诉你处理阈值是对全样本计算一次还是在每年内计算。它可能提供只在以 /Users/author/old_project/ 开头的路径上运行的代码。
可重复性不是礼貌功能。它是证据的一部分。不能重构的声称收益模式不一定错,但它应比独立研究人员可以从记录数据和代码包复制的得到更少信心。
复制的三种含义
词复制隐藏几种不同测试。
计算可重复性意味着相同数据和代码产生相同表格、图表和统计。这是已发表结果是否内部连接其代码的最小测试。
直接复制意味着独立团队尽可能紧密地遵循原设计,常用相同数据源和样本定义。它问报告结果能否在不依赖原作者记忆下重创造。
概念复制用不同数据集、市场、时期或操作测试相同底层声称。它问机制是否超出原实现迁移。
因子可以通过一个失败另一个。代码可能精确复制表格而因子在后续样本失败。新数据集可能确认经济想法而原代码包含 bug。好的研究报告它已赢得哪种复制形式。
本模块的引用问题
要求阅读列表提到“Cassella-Nguyen 复制研究”并将一组金融复制统计归属于它。期刊、SSRN 和书目结果的精确名称搜索未识别匹配该描述的可验证论文。这意味着引用不应作为带精确样本计数的已建立来源呈现。
这不是脚注级别烦扰。它是文章教训:在几个笔记中出现的数字可以获取证据外观即使底层论文无法定位。安全处理是将归属标记为未经验证并依赖已记录复制项目来声称可重复性。
相关已验证工作包括 Hou、Xue 和 Zhang 的 Replicating Anomalies,它重新检查大型已发表异常集并发现许多在更严格过滤器下变弱,以及 Chen 和 Zimmermann 的 Open Source Cross-Sectional Asset Pricing 项目,它标准化因子定义并使复制更系统(Hou, Xue, and Zhang 2020;Chen and Zimmermann 2021)。更广泛点不是每个标题复制百分比可互换。是证据应可追溯到另一个研究人员可以检查的论文、数据集和方法。
为什么金融异常难以复制
金融数据不是单个公共电子表格。典型横截面研究可能连接证券价格、流通股数、退市收益、会计报表、分析师预测、机构持仓、交易所代码和公司行为。每个源有自己的标识符、修订、时序约定和缺失值。
同一公司可能出现于几个证券标识符下。股票可以改变交易所、代码、股份类别或公司状态。退市公司可以从朴素数据库消失,只留下成功幸存者。基本变量可以按财政期、文件日期、公告日期或供应商摄取日期日期化。如果策略应使用当时可用的信息,那些日期不可互换。
这是穿戴数据工程徽章的生存偏差。如果当前数据库只含存活到今天的公司,历史回测悄悄移除破产和被收购的公司。如果研究人员使用修订收益数字而非原本可用数字,模型瞥见未来。使用更干净但不同数据库的复制可能在概念上公平而未能匹配确切已发表表格。
收益计算是决策链
考虑由特征 形成的月度多空组合。通用组合收益是
其中权重满足组合约束如多头腿的 。要复制 ,复制者需要多过句子“将股票排序到五分位”。他们需要知道:
- 时刻 的整体;
- 交易所和股份类别过滤器;
- 确切排名变量及其时间戳;
- 缺失值处理;
- 断点以及它们是否仅使用 NYSE 公司;
- 等权或价值加权;
- 组合形成和持有滞后期;
- 退市收益处理;
- 再平衡和换手;
- 基准和无风险系列。
两个实现都可以遵循论文散文并产生不同收益。散文不是算法。算法是可重复性包。
如果已发表信号是诸如账面市值比的比率,
那么“时刻 的账面价值”不够。账面价值来自最新财政年度吗?它在财政年末可知还是只在文件日期可知?负账面值被移除吗?金融公司被包括吗?市值用六月价格吗?每个答案改变样本。
适当复制包包含什么
有用复制包有五层。
清单识别论文、软件环境、数据供应商、许可限制、提交哈希和预期输出。未来研究人员应知道什么版本的世界产生了表格。
原始数据映射列出每个源、字段、标识符、日期覆盖和变换。专有数据可能不可再分发,但包仍可提供模式、访问指令、允许处校验和及小的合成夹具。
清理管道将源数据转换为分析就绪表。它应明确退市处理、点时连接、过滤器、极值处理和缺失数据规则。
分析代码应从干净环境运行无需手工编辑绝对路径。命令应从声明输入重建表格和图表。随机化程序应设置种子并报告它们。
验证层用容差比较重建输出和已发布输出。仅在有人手工改变三个常量后才匹配的表未经验证。
该结构也使合法分歧成为可能。复制者可以说,“原结果依赖于关于负账面值的选项”,而非争论谁的笔记更真实。
可重复性和识别
复制目标不仅是重现数字。它是识别数字来自哪里。假设原均差是每月 。复制得到 。该差异可以来自新样本、不同数据库、缺失退市收益、不同断点或代码缺陷。
有用分解是
没有受控实验这些项不可唯一定义,但分期复制可以分离它们:
- 在原数据上运行原代码。
- 在相同数据上运行独立实现。
- 在标准化数据构建上运行原实现。
- 在后续或替代样本上运行标准化实现。
如果步骤 1 失败,论文非计算可重复。如果步骤 1 工作但步骤 2 失败,结果可能依赖于隐藏代码细节。如果两者都在原数据上工作但后续失败,问题是外部有效性或衰减。这比单个是/否复制标签更有信息。
代码正确结论仍可能错
可重复代码不保证有效推理。完美打包的回测可以包含前瞻偏差。干净回归可以使用忽略横截面和时间依赖的标准误。正确复制的因子可以是多重检验赢家。
Aronson 的基于证据框架区分结果可重复和有意义的差别(Aronson 2006)。López de Prado 对金融机器学习提出相同点:回测是研究工具,不是研究结论(López de Prado 2018,第 1 和 11-15 章)。
复制因此需要有效性审计以及重新运行。检查数据在信号形成时是否可用、组合是否可实施、成本是否建模、基准是否合适、统计检验是否匹配搜索历史。重现的错误仍是错误。它只是有更好打包的错误。
小清单检查
即使简单清单也能防止无声漂移。以下示例记录文件哈希和复制运行期望的环境标签。它不解决专有数据访问,但它使运行可审计。
from pathlib import Path
import hashlib
def sha256(path):
digest = hashlib.sha256()
with Path(path).open("rb") as handle:
for block in iter(lambda: handle.read(1024 * 1024), b""):
digest.update(block)
return digest.hexdigest()
print(sha256("data/prices.parquet"))
真实包应将哈希、包版本、代码修订和数据获取日期与输出一起存储。重点不是围绕 parquet 文件创建仪式。是使无声供应商修订伪装成新研究结果变得困难。
对缺失代码和专有数据做什么
缺失复制包不自动是不当行为证据。数据许可、隐私限制和旧软件可能使共享困难。它仍是限制,应清楚披露。
如果数据专有,发布合成或公共数据版本运行完整管道。提供确切供应商字段、变换和访问要求。如果供应商更改历史,归档允许提取或记录校验和和检索日期。如果代码不能发布,发布足够精确的伪代码用于独立实现并在发布前审查该实现。
对工作中的量化,规则实用:如果你不能获得数据并重构变量,将论文视为假设来源而非可部署信号。引用不是数据许可。
严肃复制声称的标准
复制报告应说明它测试哪个声称以及它不能测试什么。它应包括:
- 原样本和数据定义;
- 独立重构程序;
- 确切软件和包版本;
- 对缺失、退市和极端观察的处理;
- 表格和图表的匹配容差;
- 与原方法的偏差;
- 总收益和净收益;
- 独立后续样本上的结果;
- 任何差异的解释。
不要仅当标题系数接近时报告“已复制”。重现样本计数、组合收益、标准误和关键稳健性表。如果一个表匹配而三个不匹配,如实说。精度关于失败比二元徽章更有价值。
工作量化的复制队列
在交易已发表因子前,按以下顺序执行轻量级复制:
- 定位原论文、附录、数据声明和代码库。
- 记录变量定义和信息时间戳。
- 在点时数据上重建信号。
- 在比较收益前比较组合计数和断点。
- 重计算总差。
- 添加成本、借券和容量约束。
- 不改变规则测试后续时期。
- 记录每个偏差。
如果因子在步骤 2 因定义模糊而失败,该模糊性本身是证据。依赖于隐藏选择的策略默认不稳健。
要点
金融不因为研究人员特别粗心而有复制问题。它有是因为被复制的对象历史偶然、数据密集且奖励新颖性。这使可重复性更难,不是可选。
未经验证的 Cassella-Nguyen 归属是有用警告:重复散文可创建事实形对象。保持源账本。声称大规模复制时使用已记录项目如 Hou-Xue-Zhang 和 Chen-Zimmermann。分离计算可重复性和经济复制。然后问不时髦问题:另一个研究人员能否不每天下午打电话给原作者运行分析?
如果答案是否,在你降低标准前降低信心。
可重复性有级别
将结果分级比将复制视为二元徽章有帮助。级别一是可读:论文定义变量和样本足够好让仔细读者理解声称。级别二是计算:提供代码运行并在提供数据上重现已发表表格。级别三是独立:另一个团队在不依赖隐藏作者决策下重构结果。级别四是外部:机制存活新样本、市场或数据源。
结果可以通过级别二但失败级别三因为代码包含未记录假设。它可以通过级别三但失败级别四因为效应样本特定或发表后衰减。报告级别防止关于词“已复制”的争论。
对投资决策,级别四是相关目的地。计算可重复性仍必要因为它允许团队诊断从数据到结论的路径。没有它,外部失败不能从实现失配区分。
包也应保留负面证据。如果标准化练习显示已发表因子依赖于特定断点,包括该结果。如果后续样本失去效应,保持后续样本在库中。只含成功表的可重复性包是有校验和的广告包。
研究团队可通过发布清单使其实用。冻结数据快照或供应商检索日期。锁定环境。从干净目录运行管道。比较预期行计数、日期范围、标识符计数、组合断点和汇总统计。针对独立实现审查输出。将验证报告与模型版本一起存储。
这些控制与部署在数据库供应商更改回填时特征定义改变的信号相比便宜。它们也使维护更容易。三年后当代码停止运行,团队可以看到断点是软件漂移、数据漂移还是原假设的改变。
- Hou, K., Xue, C., and Zhang, L. (2020). “Replicating Anomalies.” The Review of Financial Studies, 33(5), 2019-2133.
- Chen, A. Y. and Zimmermann, T. (2021). “Open Source Cross-Sectional Asset Pricing.” Critical Finance Review, 10(1), 1-62.
- McLean, R. D. and Pontiff, J. (2016). “Does Academic Research Destroy Stock Return Predictability?” The Journal of Finance, 71(1), 5-32.
- Harvey, C. R., Liu, Y., and Zhu, H. (2016). “…and the Cross-Section of Expected Returns.” The Review of Financial Studies, 29(1), 5-68.
- Aronson, D. (2006). Evidence-Based Technical Analysis. Wiley, 第 9-12 章.
- López de Prado, M. (2018). Advances in Financial Machine Learning. Wiley, 第 1、7 和 11-15 章.