当央行发布政策利率决定或统计局发布新的通胀数据时,原始公告通常会出现噪音:编码文物,部分页面,缺失的字段或与前一个月相矛盾的修订. 像许多聚合器一样,简单地提供这些数据将问题直接传递给开发者.
在FXMacroData,我们将数据质量视为一流的产品关注. 每种货币的每个指标在写入Firestore并通过API暴露之前都经历了确定性验证管道. 这篇文章从采集者下载原始响应到值变得可查询的时刻,从层次到层次通过该管道层行走.
终点如 /v1/announcements/{currency}/{indicator}现在我们要做什么?
管道一览
接下来,我们将将将这些数据归纳到
步骤1 摄入:结构化来源采集者
验证在单个值提取之前就开始.每个货币都有专门的获取类,针对官方主源央行网站,国家统计局或政府数据门户网站.我们故意避免摄入途径中的次要聚合器:它们的延迟,许可条款和偶尔的沉默修订引入了我们无法控制的不确定性.
取取器是实现一个 async with 进入后,它们打开一个 aiohttp.ClientSession 让我们看看现实 User-Agent 控制时间止息;在退出时,它们关闭得很干净,无论获取是否成功或升高.在每个获取器内,解析是严格的:HTML是通过 lxml 没有 BeautifulSoup 通过使用精确元素选择器而不是对原始标记的regex回落,并且通过键入的接入键访问JSON API,如果一个字段缺失或更名,即时提起.
采集合同 需要输出密钥
{
"date": "2026-03-31", #ISO-8601日期字符串
"val": 3.5, #浮动 永远不要串
"announcement_datetime": "..." # UTC ISO-8601 如果可用
}
输出合同在采集者边界执行:任何记录都缺失了. date 没有 val 在它进入下一个阶段之前就被丢弃了. announcement_datetime 在摄入时是可选的,但对于向发布的终端需要,这些终端将事件时间暴露给API用户.
测试的过程中,
阶段2 测试方案:类型和完整性验证
原始获取器输出交给一个方案验证器,该系统对每个记录进行四次检查:
日期格式
解析为ISO-8601日期. 无法解析的字符串,未来的日期超过两天的宽限窗口,以及1960年前的日程都被拒绝.
值类型
val 必须强迫一个有限的Python. float现在我们要做什么? NaN没有人知道. Inf,以及非数字字符串 (例如: "n/a"它们被拒绝而不是被迫达到零.
检测重复
如果两个记录相同 (currency, indicator, date) 管道保存最近吞下来的,记录碰撞.
货币指标对合
每个记录都与公布的指标目录进行验证. unemployment 对于没有暴露该指标的货币,该指数会产生错误并停止批量.
方案失败被表现为结构化云日志条目标记 severity=ERROR没有人知道. stage=schema_check这使得在GCP控制台中交叉运行变化非常简单.
接下来,我们将将把它放在一个新的位置.
阶段3 范围和异常值过
结构有效性是必要的,但不够的. 250.0 对于美元CPI来说,语法是正确的,但显然是错误的.第三阶段应用了两个补充的检查来捕捉这些语义错误.
硬范围的边界
每个指标都有一个目录条目,包括可选的 min_val 现在我 max_val 根据可信的历史范围以及宽厚的安全边际.例如,政策利率是 -5.0 现在我 30.0 平均每年通胀率在 -30.0 现在我 300.0 百分比足以容纳超通货膨胀事件,而不会限制新兴市场的合法数据.
滚动z分异常值检测
对于在FireStore中至少24个月历史的指标,该管道计算了36个月的滚动平均值和标准偏差,并标记了任何新记录的z分数超过. |4.0|截至目前,Z-score标志并没有自动丢弃记录,而是创建一个复习条目并附加一个 outlier_flag: true 文件,以便API用户可以在自己的工作流中选择性地过异常标记的记录.
为什么是4σ而不是3σ?
宏观指标确实显示出大量的数据. 由于COVID-19供应冲击,2022年能源危机和央行快速走山周期,统计数据都很少,但实际值. 3σ值将在政权变更期间隔离合法的数据,正是当准确的读数最重要时.
关键词: 关联
第4阶段 跨部门调和
对于一个非常重要的指标子集央行政策利率,CPI和失业率,管道保持了二次来源进行交叉参考.这不是请求时的现场备用数据 (所有向用户提供的数据都来自FireStore);这是摄入时间一致性检查.
当初级和次级值相同时 (currency, indicator, date) 对于政策利率,宽限是: 对于保险利率的宽限, 5 basis points对于CPI来说,是 0.1 percentage points对于这些指标,宽限是故意狭窄的,因为即使是小差异也往往表明解析错误,报告延迟或初步与最终修订冲突.
首要来源
- 中央银行官方公布
- 国家统计局
- 政府数据门户
交叉参考来源
- 并行官方终点 (例如BIS)
- 修订标记的历史记录
- 内部前期一致性检查
管道还进行了一个 持续性检查:如果一个新记录代表了超过 N 预期版本与最终版本经常有所不同;管道记录了两个值,并暴露了一个 revised 标记日期的值在首次发布后更新时.
五:工作日诚信度
第五阶段 业务日内诚信
验证的最后阶段解决了一个微妙但重要的限制:每一个 announcement_datetime 必须在有效的工作日 市场时间区 统计局和央行不会在周末或节日发布公告,所以如果管道产生一个时间,在东京的星期六或悉尼的节日,
验证器正在呼叫. is_valid_announcement_date(currency, local_date),该程序可以检查日期与每个货币时区定义和库存的完整假日日历.每个由API AUD,EUR,GBP,JPY,USD,CAD,CHF,NZD和其他所有货币服务的货币都有自己的独立时区和假日表.货币不会继承其外汇会议;纽约的星期五可以是悉尼的星期六,验证器精确处理这一点.
业务日验证 (简化)
没有 是_有效_公告_日期(currency: str, local_date: date) -> bool: tz = CURRENCY_TIMEZONE[currency] #拒绝周末 if local_date.weekday() >= 5: 返回 False #拒绝公众节日 if local_date in _build_holiday_set(currency, local_date.year): 返回 False 返回 True
计算日期失败时, next_valid_announcement_date 推迟到下一个工作日,例如,推迟圣诞节公告到下周一. 这确保向API消费者提供的发布日历终点总是包含可以直接在交易日历中使用的日期,而不需要手动清理. 这些工作日规则也由CI测试套件执行,如果目录中的任何货币缺失时区或假期数据,则无法构建.
发布日历的准确性: 预期事件日期从发布日历终点,如下一次美联储会议或央行利率决定,保证在货币市场时区的有效工作日落. 货币: 货物: 其他货币 直接反映了这个验证的时间表.
监控的情况
持续监测和警报
通过一次验证管道不够.管道运行在一个时间表上,由云任务和后备工作流动触发,每个运行都产生结构化遥测,为监控层提供料.
阶段警报
任何管道阶段的故障都会立即发出云记录条目,
内容哈希
每一个Firestore写包括一个 content_hash 检测和表面的安静上游修订.
检查耐磨性
读取器检测存储数据落后超过N天后期,并显示一个差距信号,而不是默默返回陈旧值.
当一个采集器无法返回数据时,网络时间过时,上游站点变化或响应结构变化,管道不会在请求时间回归到上游电话.相反,它发出验证失败,返回空结果或结构化 DataUnavailableError 这样就防止过时或部分验证的数据,即使是暂时,也能到达API层.
没有任何其他方法可以帮助我.
修订和重新表达的情况
宏观数据的修订是生活中的一个事实.最初的GDP估计被修改两到三次.工资额被大幅调整.管道直接处理修订而不是默默地覆盖:
- 首张印刷品的存储时间: 管道存储给定的第一个值.
(currency, indicator, date)没有一个revised: false旗. - 检测修改情况: 在接下来的摄入运行中,如果某个日期的值变化超过了指标的修订值,则更新文件并
revised: true已经设置. - 历史保护: 原始的第一打印值保存在
prior_val为了审计和比较. - 应用程序透明度: 没有什么.
revised应用程序可以区分初步和最终读数.
这对于非农业工资表等指标最重要, 预印和后续修订可能有数万个工作位的差异, 农业以外的工资终点现在我们要做什么?
这对API消费者来说意味着什么?
这对API消费者意味着什么
对于任何查询API的人来说,
- 没有
NaN没有null系列中的值 在第二阶段,不作为漏洞,而排除了无效值的记录. - 值得信赖的日期 答案中的每一个日期都是该货币市场的工作日期的有效日期,适合直接用于交易日历或后台测试引擎.
- 预告时间在秒精度 提供时,
announcement_datetime反映了官方发布的 UTC 秒的精确时间,而不是午夜的位置标记. - 修订标志 没有
revised让您区分您是否正在进行初步或最终读数. - 一致的指标单位 利率指标总是以百分比,而不是十进制 (例如
5.25没有0.0525),与中央银行官方网站上的表示相匹配.
查询任何指标政策利率,标题CPI,失业率,您所获得的答案已经通过了所有五个阶段.指标目录记录了每个系列的来源,因此您可以独立验证任何数据点的来源.
关闭CTA