[控场AI]
· 5 分钟阅读· 2,845 字

一人一年造18亿行另类数据平台,揭示量化回测三大陷阱

一人一年造18亿行另类数据平台,揭示量化回测三大陷阱

一名退伍军人用一年时间独力搭建了含 764 张表、18 亿行的时点量化数据平台,并总结了三条数据质量教训。

本文讲述一位自学成才的开发者用一年时间、在一台工作站上独自构建量化研究数据平台的过程。平台含 764 张表、约 18 亿行数据,覆盖另类数据、SEC 文件、政府记录和市场数据,核心设计是双时态时点数据(103 张表)与幸存者偏差处理,用以对抗回测中的前视偏差。作者用 206 份架构决策记录和 680 份研究笔记沉淀方法论,并总结了三条数据质量教训:字段标签不可信、须以官方规范为准;自我对比的测试无法发现系统性错误,必须引入外部对账;实体解析应看精确率而非匹配率。项目已开源拆股调整工具与七套 SEC 数据字典。

一个自学成才的退伍军人,用一年时间独自搭建了一个量化研究数据平台——764张表、约18亿行数据,涵盖另类数据、SEC文件、政府记录和市场数据。这个项目的核心不是模型有多聪明,而是数据是否经得起回测的检验。作者用206份架构决策记录和680份研究笔记,记录下每一个值得深究的问题。

rss source: One developer, one year, 1.8 billion rows: a point-in-time alternative-data platform

量化数据平台的硬核架构

这个平台在技术选型上紧扣量化研究的真实需求。最关键的是时点数据机制:每条记录不仅标注事件发生时间,还标注信息变为公开的时间,其中103张表采用双时态设计(有效时间与记录时间并存)。这是对抗前视偏差的核心防线——回测中最常见的自我欺骗方式。

幸存者偏差的处理同样彻底。退市和更名的公司保留完整历史,股票消亡的窗口用退市回报率打分,而不是被直接剔除。实体解析层跨越ticker、CIK、LEI和CUSIP进行记录链接,并支持时点符号映射:ticker会被重命名、复用和退市,因此"某公司在某日对应哪个证券"的答案必须按当日状态回答。

公司行动方面,拆股和分红调整用独立数据源验证,而非自我印证。NLP信息抽取覆盖8-K事件、盈利指引、新闻稿、IPO招股书、SEC意见函、重要合同、13D/13G受益所有权、内部人3/4/5表格以及XBRL财报,全部转化为结构化、带日期的事实。

数据架构采用medallion湖仓模式,Bronze、Silver、Gold三层基于Parquet,PostgreSQL作为服务层,约456份数据契约守护,数据血缘可一键回答"这张表变了会影响什么下游"。整个平台还包含MLOps和模型验证(特征管道、前向滚动与清洗交叉验证、回测和模拟交易),以及领域专用小模型和MCP服务器让AI代理查询数据。

所有这一切运行在一台工作站上,通过资源代理调度重任务,避免机器自噬。自2025年11月21日以来,项目累计4776次提交,5281个Python文件,其中738个测试文件。

前视偏差(Look-ahead Bias) 是量化回测中最具破坏性的错误之一:模型在时间点 T 做决策时,使用了在 T 时刻实际上还不可得的信息。典型场景是财报数据——公司可能在 3 月 31 日结束财季,但直到 5 月初才向 SEC 提交 10-Q,若回测直接把 3 月 31 日标记为数据可用日,就等于让策略提前一个月"偷看"了业绩。解决方案是双时态建模:一条记录同时携带"业务有效时间"(事件真实发生日)与"系统记录时间"(信息公开可获取日),回测时只允许查询记录时间早于决策时点的版本。这也是为什么 103 张表需要成对维护两套时间戳,而非简单加一个 as_of_date 字段。

幸存者偏差(Survivorship Bias) 源于只保留"活到今天"的样本。若数据库仅包含当前仍在上市的公司,历史上退市、破产、被并购的标的就被系统性剔除,导致回测收益被高估——因为那些失败者恰恰是拖累真实收益的部分。处理方式是保留完整历史:退市公司的股票窗口不删除,而是用退市回报率(delisting return)填充窗口末端,让策略在回测中真实"经历"这笔损失。同理,被改名的公司(如 Facebook 更名为 Meta)需要用实体解析把前后代码链接为同一实体,否则历史数据会被切成互不相干的两段。

Medallion 湖仓架构 将数据按加工程度划分为三层:Bronze 保存原始摄入数据(未清洗、保留供应商原貌),Silver 做清洗、去重、标准化和实体解析,Gold 面向具体业务场景生成聚合表或特征表。这种分层让错误可以回溯到源头,也允许不同团队在不同层级独立消费数据。配合数据契约(Data Contract)——即对表结构、字段类型、取值域和新鲜度的显式约定——上游变更前必须通告下游,避免"生产者改了字段含义、消费者毫无察觉"的静默失败。456 份契约意味着几乎每张对外暴露的表都有明确的接口承诺。

三条数据质量教训

作者在构建过程中踩过的坑,比任何技术警告都更有价值。

标签会撒谎,规范不会

SEC的基金持仓数据(N-PORT表格)有一个叫"Ticker"的字段。对SEC已发布所有季度的数据测量发现,约1740万个值中28%不是股票ticker——抵押贷款池代码、债券发行方符号、期货合约混杂其中。一个池代码FG同时也是纽交所ticker,天真地做join会把房地美抵押贷款池变成一家保险公司的股票。

修复之道不是更聪明的代码,而是元数据管理。SEC自己的表格说明指出该字段是回退标识符。作者现在处理任何机构数据前,先根据官方文档构建数据字典。前七本字典就发现SEC自己发布文件中的12处缺陷。

N-PORT 是 SEC 于 2019 年起强制要求注册基金按季度提交的持仓披露表格(Form N-PORT),取代了此前的 N-Q。它包含基金每一笔持仓的标识、数量、估值、以及衍生品敞口等信息,是研究机构资金流向的重要一手数据。但 N-PORT 的字段设计预留了大量"兜底"标识符:当持仓不是普通股时,申报人可以在 Ticker 字段填入 CUSIP、抵押贷款池代码或衍生品符号。这解释了为什么 28% 的值并非股票代码——它不是数据错误,而是规范允许的宽泛语义被下游误读为"这是一个 ticker"。这也是作者强调"先读官方表格说明、再动手解析"的直接动因。

数据自我对比的测试证明不了什么

某晚所有价格数据质量检查都通过了。第二天早上独立对账发现,236天的价格被重写到了拆股的错误一侧。每一项检查都在比较管道与自己的输出。现在,数据质量主张需要外部见证者。

覆盖率不等于精确率

实体解析中容易衡量的指标是匹配率,但有用的指标是精确率。一个将匹配率提高十個百分点的捷径,对照独立标识符只有38%的准确率。它从未发布。

已开源的工具

目前有两个开源发布。split-adjustment-tool是一个供应商中立的Python工具(基于Polars),用于验证、修复和应用拆股调整,Apache 2.0协议,版本0.4.0。us-gov-data-dictionary提供七个SEC数据集的可机读数据字典,共1469个字段,每个字段附有SEC自己的定义和引用、官方代码表,以及已发布文件实际内容的画像,采用W3C CSVW和SKOS格式,CC BY 4.0协议。

后续会覆盖更多机构。作者最想听到的是:如果你处理公共金融数据时曾被数据悄悄欺骗过,那个故事值得分享。

#量化数据平台#另类数据#时点数据#前视偏差#幸存者偏差#数据质量#SEC数据#实体解析
分享:

相关推荐