跳到内容

如何构建可靠的内幕交易备案管道

您是否知道备案管道的可靠性取决于其cron作业?面对17个不同的监管机构,这些系统背后的架构对于准确数据至关重要。

作者:Simon Azoulay19 min · 6,244 字

备案管道的可靠性取决于其最不起眼的cron作业。

工具文章的撰写方式常常让人觉得机器每小时自动启动,获取一个整洁的文件,然后再次休眠。这纯属虚构。在17个监管机构之间,真实的系统是一个由调度器、队列、解析器、去重器和警报组成的小型官僚机构,它们都试图将公开披露转化为一个能够在生产环境中经受考验的数据集。

对于内幕交易而言,这一点至关重要。遗漏的备案不仅仅是缺少一行数据。它可能扭曲事件研究,污染回测,并产生那种在图表中看起来体面、在审计中却显得荒谬的隐性偏差。因此,幕后架构值得比通常更多的关注。

涵盖的监管机构
17regulators
管线中的司法辖区
Source, Sigma Journal article brief
申报文件语料库
162000filings
追踪到的内幕交易申报文件
Source, Sigma Journal article brief
内幕交易申报指标
250,000filings
每年处理的申报文件总数
+5% from 2022
Source, SEC EDGAR · 2023

该系统并非单一管道,而是17个不稳定的休战协议

监管机构数据源听起来是单一的。但在实践中,每个数据源都像是与现实进行的一场谈判。

一些监管机构发布结构化数据源。一些发布HTML列表,当网站管理员心血来潮时,其格式就会改变。一些提供PDF文件,它们在技术上是文本,就像砖头在技术上是家具一样。一些使用当地市场时间戳,一些使用UTC,一些则根本没有明确的时区。一些明确显示修订,一些将其隐藏在文档标签中,一些似乎认为版本控制是一种道德上的弱点。

对于内幕交易平台而言,这些差异并非表面文章。它们决定了您轮询的频率、什么构成新记录、如何检测修订以及如何协调通过两个不同渠道看到的申报文件。

为什么cron仍然重要

人们倾向于嘲笑cron作业,仿佛任何未被描述为“事件驱动”的事物都必须依靠烛光供电。这是不公平的。对于许多监管数据源来说,轮询仍然是实际的默认方式,因为没有webhook,没有可靠的推送数据源,也没有保证“最后更新”的含义。

Cron,或扮演相同角色的调度程序,为您提供了三个有用的特性。

首先,可预测性。您知道何时会检查数据源,并可以推断其新鲜度。

其次,可重放性。您可以在解析器修复后重新运行失败的时间窗口,或回填日期范围。

第三,源特定控制。每天更新一次的监管机构不应与在市场交易时间内持续发布的监管机构同等对待。

问题在于,cron本身并非架构。它仅仅是唤醒其余机器的部分。

适配器模式并非可选项

一个常见的错误是过早地将所有监管机构的数据都通过一个通用的抓取-解析-标准化函数处理。这会产生一个代码库,表面上看起来简洁,但在操作上却像一个陷阱。

更好的模式是为每个监管机构设置适配器,并遵循共享契约:

  • 发现新的候选文件
  • 抓取原始文件
  • 提取源元数据
  • 解析为规范模式
  • 发出沿袭和质量信号

这使您能够在不假定输入标准的情况下标准化输出。它还使得在不影响其他地方的情况下进行特定于源的修复成为可能。法国金融市场管理局(AMF)不关心美国证券交易委员会(SEC)如何标记XML元素,您的代码也应该表现出同样健康的漠不关心。

MarketRegulatorRuleDeadlineNotes
FRAMFMAR 第 19 条T+3履行管理职责人员及其关联人士必须在市场滥用框架内通知交易。
EUESMAMAR 框架T+3ESMA 提供跨欧盟场地的问答和监管解释,但发布机制仍属各国自行规定。
USSEC第16节,表格4T+2结构化电子申报相对友好,但这不代表它令人愉快。
披露规则可能大致相似,但各监管机构的操作发布和检索模式存在显著差异。

调度是穿工作靴的市场微观结构问题

如果您每五分钟轮询所有来源,您将浪费资源,触发速率限制,并且仍然会错过微妙的发布窗口。如果您轮询速度过慢,您的数据新鲜度会下降,并且您的用户会在您的仪表板之前发现延迟。

因此,调度器需要编码市场特定和源特定的行为,而不仅仅是一个通用的时间间隔。

§ 01 调度与检索

轮询频率应遵循发布行为

一个有效的调度器对不同的来源使用不同的频率:

  • 在已知发布窗口期间进行高频轮询
  • 在夜间或周末进行低频轮询
  • 当源过时或不可用时进行自适应退避
  • 偶尔进行深度扫描以捕获延迟发布或重新索引的文件

这比机器学习不那么光鲜,但比大多数机器学习更有用。

例如,一个通常在固定时间批量发布披露信息的监管机构,将受益于在这些窗口期进行有针对性的轮询,以及稍后的对账扫描。一个持续更新的来源可能需要稳定的轮询和更强的重复抑制。一个基础设施脆弱的来源可能需要比普通工程师自然提供的更温和的并发性和更多的耐心。

重试需要分类,而非一腔热忱

“失败时重试”这句话听起来很完整,实则不然。

失败类型各异。超时、429限速响应、瞬时502错误、格式错误的文档以及解析器异常,不应触发相同的行为。良好的重试设计始于分类:

  • 传输错误:采用指数退避和抖动机制重试
  • 服务器过载或限速:放慢重试速度,降低并发量,若存在相关头部信息则予以遵守
  • 永久性未找到:不要因为一个URL错误就持续冲击源站
  • 内容解析失败:存储原始文件,若超出阈值则发出警报,仅当已知源文档会发生变异时才重试
  • 模式不匹配:路由至解析器维护队列,因为更快地重复相同的错误并非弹性

抖动至关重要,因为同步重试可能将上游的一次小波动转化为自我造成的拒绝服务。这是分布式系统的标准卫生习惯,但在许多任务都按同一整点时间表运行时,它变得尤为重要。监管机构并未要求因您的不耐烦而进行负载测试。

水印有用,直到它们撒谎

大多数调度器都维护一个水印,即最后看到的时间戳、最后的文件ID、最后的页面令牌。这既必要又危险。

必要,因为您需要一种高效的方式来发现新记录。

危险,因为源排序通常不稳定。文档可能会延迟出现。时间戳可能会被修改。搜索索引可能滞后于发布页面。一份文件可能在一个端点可见,然后才在另一个端点可见。如果您的水印逻辑假设存在单调性而实际上并不存在,您将悄无声息地跳过记录。

通常的补救措施是滑动回溯窗口。与其询问“有什么比我上次时间戳更新的”,不如询问“在过去X小时或X天内出现了什么”,然后进行下游去重。这会增加抓取成本,但能提高安全性。在文件处理管道中,安全性通常比事后调查的尴尬成本更低。

幂等性是数据集与谣言之间的区别

如果调度器重新运行一个任务,一个工作进程中途崩溃,或者源站重新发布了带有微小元数据更改的相同文件,系统都应保持冷静。幂等性就是实现这一点的关键。

简而言之,同一份文件被处理两次不应产生两个经济事件。

先原始捕获,后规范化

一个稳健的模式是将数据管道分为多个层:

  1. 原始采集,对获取的工件和元数据进行不可变存储
  2. 提取,将特定来源的数据解析为结构化字段
  3. 规范化,映射到通用模式
  4. 实体解析,关联发行人、内部人、金融工具和交易场所
  5. 发布,将清理后的文件提供给下游研究和产品

这种分层设计提供了可重放性。如果解析器得到改进,您可以重新处理原始捕获数据,而无需重新访问监管机构。如果去重规则发生变化,您可以重新运行规范化,而无需假装历史从未发生。

它还创建了可审计性。您可以回答那个令人不适但必要的问题:为什么会有这一行数据?

选择文件标识

幂等性取决于一个稳定的键。当源提供唯一的登记号或文档标识符时,这很容易。当源只提供标题、日期和如果网站重组就会更改的URL时,这就不那么容易了。

实践中,文件标识通常结合了几个要素:

  • 来源监管机构
  • 来源原生文件ID(如果可用)
  • 发布时间戳
  • 发行人标识符
  • 内部人姓名或角色
  • 交易日期
  • 文档哈希(用于原始工件)

确切的层级关系很重要。如果您只依赖文档哈希,一个微小的格式更改就可能产生一个错误的“新”文件。如果您只依赖时间戳和名称,两个合法的文件可能会合并成一个。明智的方法是采用具有置信度等级的确定性身份策略,并明确处理修订和更正。

修订不是重复

这正是许多数据管道意外失真的地方。一份更正后的申报文件可能与原始文件共享大部分字段,但仍代表着实质性更新。将每个近似匹配项都视为重复项可能会抹去修订痕迹。将每次修订都视为一个全新的事件则可能导致活动重复计数。

正确的模型通常存储:

  • 文档级记录,即每个已发布的工件
  • 事件级记录,即当前理解的经济交易
  • 版本或取代链接,尽可能将修订与原始文件关联起来

这让研究人员可以选择。有些人想要第一个公开信号。有些人想要最新的更正状态。有些人两者都想要。您的系统不应通过主键约束来强制给出哲学上的答案。

可观测性是产品,而非点缀

一个缺乏可观测性的申报系统,就像一场带有仪表盘的信任游戏。您可能认为您正在收集披露信息。但您实际收集的却是假设。

§ 02 可观测性与质量控制

首先重要的四个指标

您可以追踪许多指标。有四个指标值得优先关注。

新鲜度滞后

从源发布到成功摄取到您的规范存储之间的时间有多长?这应该按监管机构、按申报类型衡量,理想情况下应按百分位数衡量,而不仅仅是平均值。平均滞后时间可能看起来很健康,但一小部分延迟申报的文件却悄悄地破坏了及时性。

解析成功率

在发现的候选文档中,有多少比例成功解析为所需字段?按来源和解析器版本进行跟踪。突然下降通常意味着来源格式发生了变化,而不是公司内部人士集体忘记了表格的运作方式。

重复候选率

有多少获取到的工件解析为已知文档或事件身份?此指标有助于调整回溯窗口和去重规则。过低可能意味着您重新扫描不足。过高可能意味着您的调度器噪音过大或您的源索引不稳定。

源错误预算

在源被视为降级之前,可接受的失败程度是多少?这包括传输错误、预期非空但返回空响应,以及结构性变化。错误预算很有用,因为它们在用户成为您的监控系统之前强制升级问题。

日志记录应保留取证价值

应用程序日志通常是在事件发生时为开发人员编写的。备案日志在六个月后,当有人质疑历史记录时,也应具有实用价值。

这意味着结构化日志应包含:

  • 源和适配器版本
  • 调度器运行ID
  • 请求URL或端点密钥
  • 响应状态和延迟
  • 原始工件校验和
  • 解析结果
  • 发出的规范记录ID
  • 去重决策原因

这并非小题大做。当某个源在假日周一改变行为而您的解析器礼貌地假装没有注意到时,这就是您重建事件发生过程的方式。

警报应具备源感知能力

单一的全局“管道失败”警报几乎毫无用处。它告诉您某个地方、某个时候出了问题。更好的警报应具备源感知能力并基于阈值:

  • AMF新鲜度滞后超出阈值
  • SEC解析成功率低于阈值
  • 在正常活跃窗口期间,某个源返回零文档
  • 调度器更改后重复率飙升
  • 修订检测异常低或高

重点不在于生成更多警报,而在于生成更少但质量更高的警报。运营团队不需要更多噪音,他们需要证据。

解析:理论与充满主观意见的PDF相遇之处

架构讨论听起来可能很清晰,直到解析环节出现。届时,整个讨论就会变得一团糟。

结构化数据源是恩赐,而非保证

美国证券交易委员会(SEC)的电子申报基础设施相对结构化。这有所帮助,但并不能消除验证、标准化和异常处理的必要性。结构化申报文件仍然包含不一致的名称、边缘案例交易代码以及需要仔细处理的修订表格。

在《市场滥用条例》框架下的欧洲数据源,由于发布通过国家主管机构和特定交易场所渠道进行,操作上可能更为分散。欧洲证券和市场管理局(ESMA)可以在一定程度上协调解释,但这并不能使每个发布终端都像一个规范的API那样运作。

PDF和HTML需要防御性提取

对于半结构化或非结构化数据源,防御性解析至关重要:

  • 保留原始文件
  • 在可能的情况下,分别提取文本和布局
  • 使用字段级别的置信度评分
  • 根据预期范围和枚举进行验证
  • 隔离低置信度解析结果,以供审查或延迟发布

解析器应该被允许说“我不知道”。那些强行将每个文档都纳入完整模式的系统往往会制造确定性。这对于吞吐量来说是极好的,但对于真相来说却是糟糕的。

规范模式需为源数据特性留有余地

内幕交易的通用模式通常包括发行人、内幕人士、角色、交易日期、通知日期、工具、交易类型、价格、数量、货币和来源元数据。这部分是容易的。

难点在于如何在不使规范模型过于复杂的前提下,保留特定来源的细微差别。您需要扩展字段或保留源负载,以避免不寻常的属性被丢弃。否则,每个规范化决策都将变得不可逆,而在解析器不确定性下做出的不可逆决策,正是未来争议的开端。

治理、沿袭和回放是数据可投资性的基石

研究级数据不仅仅是存在的数据。它是来源可解释、转换可回放的数据。

§ 03 沿袭、回放与信任

不可变原始存储是保险策略

每个获取到的工件都应以不可变的方式存储,并包含校验和、获取时间戳、源端点以及相关的头部或元数据。存储成本低廉,而后悔代价高昂。

不可变原始存储支持:

  • 解析器改进
  • 历史审计
  • 争议解决
  • 下游错误后的恢复
  • 独立验证源变更

如果监管机构删除或修改了历史文件,您的原始存档可能是您的系统当时实际看到的唯一稳定记录。

重新处理应是常规操作,而非例外

数据管道会日趋成熟,解析器会不断改进,实体映射会得到修正,新的修订逻辑会被引入。如果重新处理过程痛苦,就会被避免。如果被避免,已知的错误就会成为机构记忆。

健康的架构将回放视为常态:

  • 针对特定来源和日期范围重新运行提取
  • 从原始捕获重建规范记录
  • 比较新旧输出
  • 发布包含沿袭的差异

这就是为什么基于队列、阶段分离的系统比单体系统更经久耐用。它们允许您重放一个层,而无需假装整个世界都需要重启。

数据契约优于部落知识

当涉及17个监管机构时,未记录的假设会成倍增加。每个适配器的数据契约应明确规定:

  • 发现方法
  • 预期发布延迟
  • 身份策略
  • 修订处理
  • 必填和可选字段
  • 已知边缘案例
  • 警报阈值
  • 测试夹具

没有这些,系统就只存在于少数工程师和一位“了解法国来源”的人的脑海中。那个人最终会去度假,这虽然不体贴但很常见。

合理的架构在实践中是怎样的

没有唯一的正确堆栈,但幸存下来的系统都有可识别的形态。

参考设计

从高层次看:

  1. 调度层 以特定监管机构的节奏触发每个监管机构的发现作业
  2. 发现工作器 枚举候选文件或页面
  3. 抓取工作器 检索原始工件并写入不可变存储
  4. 解析工作器 使用版本化解析器运行特定于来源的提取
  5. 规范化工作器 映射到规范模式并应用幂等更新插入
  6. 实体解析服务 标准化发行人、内部人和工具
  7. 质量和可观察性层 计算新鲜度、成功率、重复和异常指标
  8. 发布层 暴露文档级和事件级数据集

调度器可以是 cron、工作流协调器或队列驱动的定时服务。命名不如保证重要。作业可以安全重试吗?可以确定性地重放吗?您能看到文件卡在哪里吗?如果不能,那么架构只是装饰性的。

测试应反映来源实际情况

单元测试是必要但不足够的。有用的测试套件还包括:

  • 使用真实历史文档的基于夹具的解析器测试
  • 针对源发现假设的契约测试
  • 针对已知源格式变更的回归测试
  • 历史窗口上的重放测试
  • 针对超时、部分获取和重复交付的混沌式测试

一个通过了合成测试却在监管机构年度改版时失败的解析器,算不上健壮。它只是过于乐观。

内部发布的枯燥指标

如果您运行这样的系统,每周内部审查应包括:

  • 按来源划分的新鲜度中位数和 p95
  • 按解析器版本划分的解析成功率
  • 隔离文档计数
  • 重复抑制率
  • 修订链接率
  • 未解决实体计数
  • 顶级特定来源事件和恢复时间

这些都不光鲜亮丽。但这正是它们有用的原因。

监管层仍然塑造着工程层

将这一切视为纯粹的基础设施是很诱人的。但事实并非如此。披露规则塑造了发布紧迫性、修订频率和用户期望。

例如,根据欧盟《市场滥用条例》,履行管理职责的人员及与其密切相关的人员必须在规定期限内通知交易,根据第19条框架,通常理解为三个工作日内。在美国,第16条表格4报告通常在两个工作日内完成。这些法律时钟影响着“新鲜”在操作上的含义,以及用户将什么视为遗漏而非延迟。

这并不意味着工程部门可以仅凭发布时间戳推断法律合规性。这意味着架构应该意识到及时性是产品可信度的一部分。

履行管理职责的个人及其密切关联人,应在交易发生之日起三个工作日内,及时向发行人或排放配额市场参与者及主管机关通报其自身账户进行的与该发行人股份或债务工具、或与此相关的衍生品或其他金融工具的每笔交易。
European Parliament and Council · 立法者, Regulation (EU) No 596/2014, Article 19

实际教训很简单。如果您的管道旨在支持信号研究、合规监控或市场情报,那么源滞后和修订处理就不是后台问题。它们是功能,无论是否被宣传。

默默的回报

在幕后,成功的架构很少是最时髦的。它假定监管机构会前后不一,网络会中断,解析器会失效,重复的候选数据会成批出现。它存储原始证据,有节制地重试,谦逊地去重,并像重视它一样衡量数据的新鲜度,因为这确实很重要。

具体的下一步不是购买更大的仪表盘。而是为您的17个数据源中的每一个编写一份一页的适配器合同,涵盖数据传输频率、身份、回溯窗口、重试分类和警报阈值,然后对一个混乱的历史月份进行重放。悬而未决的问题是,您当前对“新申报”的定义能否在不遗漏修订或产生重复数据的情况下经受住该重放。大多数系统都以尴尬的方式发现了答案。

来源与拓展阅读

  1. AMF, 经理人交易及密切关联人交易regulator
  2. ESMA, 市场滥用条例 (MAR)regulator
  3. ESMA, 市场滥用条例问答regulator
  4. EUR-Lex, 关于市场滥用的第 596/2014 号(欧盟)条例law2014-06-12
  5. SEC, 快速解答:表格 3、4、5 和规则 16regulator
  6. SEC, EDGAR 申报人手册regulator
  7. Kleppmann, 设计数据密集型应用book2017-03-16
  8. AWS 架构博客, 指数退避和抖动technical2015-03-04
  9. OpenTelemetry 文档, 可观测性信号technical

最后审阅 · 2026-05-18 · 作者 Simon Azoulay · 来源:SEC EDGAR, AMF BDIF, 以及其他 28 家监管机构。

立即行动

信号今日推荐筛选内部人士信号筛选器覆盖范围覆盖的全部公司

相关阅读