数学、统计与计算方法 / QT01

金融数据、变量与版本

本篇的任务是整理出一张能够重建历史输入的数据表。

Agent Markdown ↓
本领域路线 · 1 / 9 重建给定时点的数据截面,并核对单位与公司行动。

一、我们究竟要保存什么

做分析时,一张表很容易被想象成“日期加数字”:某天价格是多少,某季度增长了多少,按日期排好就可以计算了。但同一个季度可能先后公布几个不同的数;一只股票也可能因为拆股,在公司没有瞬间损失四分之三价值的情况下,每股报价变成原来的四分之一。我们要保存的不只是数字,还包括这个数字在说什么,以及它在什么时候、以什么版本进入了分析。

本篇的任务是整理出一张能够重建历史输入的数据表。整理完成后,别人给出一个信息截止时点,我们不仅能返回一个数,还能解释为什么当时允许选这一条记录,而不允许选另一条。随后再把这套做法迁移到价格、收益和公司行动。

这里先区分两种对象。已经公布的 −32.9 是一条历史记录的取值;在公布前,未来会公布什么数,可以在模型中写成随机变量。历史记录不因为来自一个随机模型,就失去了明确的单位和版本;一条已经观察到的历史也不等于整个未来分布。后一个区分可就地查阅 QT03

《Forecasting: Principles and Practice》§2.1 用索引识别观测时点,用键识别不同序列。我们沿用这个出发点,但在原始数据层增加“发布版本”:同一序列、同一观察期的两个发布值,是两条需要保留的记录,而不是应该随手删除的重复行。1

二、同一个季度,两个都真实存在过的公布值

我们先读两份真实材料,而不从下载网站今天展示的最终序列开始。下表只摘录本篇使用的一个指标,未重排整份国民经济核算表。

观察对象观察期来源发布时间原件与版本公布值及单位
美国实际 GDP 的季度环比年化增长率,经季节调整2020Q2,即 4–6 月2020-07-30 08:30 EDTBEA 20–37,Advance estimate−32.9%
同一对象同一 2020Q22020-08-27 08:30 EDTBEA 20–41,Second estimate−31.7%

第一份说明数据尚不完整,后来可能修订;第二份的“Updates to GDP”给出两版对照。这两个数描述同一观察期,并不是先后两个月的 GDP 增长率。来源日期与数值分别定位于两份原件的发布时间、开篇及修订表。23

定义(本篇的数据记录)。 令一项指标的对象、统计口径、单位与观察频率已经固定,则一条发布记录是“观察期、来源版本、来源发布时间、取值及原件位置”的组合。涉及真实系统回放时,再独立记录该系统收到这条记录的时间。

“观察期”和“可得时间”承担不同职责。2020Q2 在 6 月底结束,告诉我们数字所描述的活动属于哪一段时间;7 月 30 日的发布时点,才告诉我们该版本何时由来源公开。它们不能交换。还要再区分以下两层:

字段回答的问题本例的处理
release_at来源何时发布这一版本?来自 BEA 原件,保留 −04:00 时区偏移
received_at某一个具体研究或交易系统何时收到它?没有取得接收日志,记为 null
retrieved_at本教学材料何时重新取得原件?2026-09-21;不能反写成历史接收时间
decision_at这一次分析允许使用的信息截止到何时?由研究任务明确指定,不是原始数值的属性

ALFRED 保留历史数据版本;它的帮助页也说明来源日期的取得方法和数据库更新可能存在的时间差。API 的实时区间按日期指定,不能据此证明某个盘中系统在发布后的第一毫秒已经收到数据。45

先把真实的两条记录都保留。接下来才建立某个决策时点的截面,而不是在导入时就留下“最新的一条”。

三、从版本表得到“当时的输入”

在本例中,版本顺序由来源明确给出:初值在先,次值在后。记第 \(v\) 个版本的发布时点为 \(r_v\),取值为 \(x^{(v)}\)。我们只讨论同一对象、同一观察期,不混入别的季度。

定义(来源公开截面)。 给定截止时点 \(t\),在满足 \(r_v\le t\) 的记录中,选取来源版本顺序最新的一条,得到 \(x^{\mathrm{pub}}(t)\);没有合格记录时,结果是“尚未公开”,而不是零。

这表示“来源在当时已经公布了什么”,不是某个真实系统的接收证明。要做系统接收截面,还须要求该版本有接收记录 \(a_v\),且 \(a_v\le t\)。本例不讨论提前收到的禁发材料,因此有效接收记录还须满足 \(a_v\ge r_v\)。若接收时间未知,就报告该系统的历史输入无法核定,不能偷偷退回公开截面。相同发布时点若出现冲突版本,也应请求消歧,不以文件行序代替来源的修订顺序。

取一个只用于检验版本选择的教学规则:当输入 \(x>-32\) 时,信号为 1,否则为 0;缺少输入时信号也缺失,不按 0 处理。阈值是人为选的,不是预测模型的研究结果。

截止时点,均为 EDT来源公开截面信号 \(\mathbf 1_{\{x>-32\}}\)有据可说的话
2020-07-30 08:29:59缺失缺失初值还没有公开
2020-08-03 16:00:00−32.90只能选已经公开的初值
2020-08-27 08:30:00−31.71在“发布事件已发生”的顺序约定下,次值进入公开截面

表中最后一行不是实际成交许可。接收、计算与下单还可能继续耗时。两条真实记录的 received_at 都未知,所以这三行都不能被包装成某个账户的系统日志。

现在故意犯一次错误:把 8 月 27 日的次值填回 8 月 3 日。信号就会从 0 变成 1。算式本身没有错,错的是把后来取得的输入放进了较早的决定。这个例子只证明信息泄漏可以改变计算,不证明这条信号有交易收益。

命题(追加未来版本不应改写较早截面)。 固定截止时点 \(t\)、既有记录及版本选择规则。向数据集中追加若干发布时点都严格晚于 \(t\) 的记录,来源公开截面 \(x^{\mathrm{pub}}(t)\) 不变。

证明。 新记录均不满足 \(r_v\le t\),因此合格记录集合不变。来源版本顺序下的最新元素也不变;原先没有合格记录时,追加后仍没有。结论成立。对系统接收截面,在本篇 \(a_v\ge r_v\) 的条件下,同样成立。这个命题的用途是编写数据检查,而不是声称历史输入永远不能勘误:若后来发现原来记错了发布时间,那是对输入记录的更正,须另留更正说明。

两版本之间的修订幅度为 −31.7 − (−32.9) = 1.2 个百分点。另一个容易出错的地方是年化。令季度环比增长率的小数表示为 \(g_q\),对应的年化率为 \(g_a\),则按四个同幅季度复合的定义,\(1+g_a=(1+g_q)^4\)。因此

\[ g_q=(1+g_a)^{1/4}-1. \]

把公布值 −32.9% 先换成 −0.329,得到约 −9.493321%;把 −31.7% 换入,得到约 −9.091357%。这是由已四舍五入的公布率反推的近似季度率,不能当作官方未舍入数据。也不能直接把 32.9 除以 4,因为这里使用的是复合关系。24

四、迁移到价格:单位变化不等于财富变化

现在把“版本”问题暂时放下,检查另一个同样会使计算失真的地方:每股的单位有没有变化。Apple 在 2020 年 7 月 30 日公告 4:1 拆股,并说明自 8 月 31 日起按拆股调整交易。我们已经核对公告,但本篇没有取得、也不展示那两天的真实成交价格。6

以下价格全部是教学设定。拆股前持有 1 股,每股 400 美元;只改变股数单位、不加入价格波动时,拆股后变成 4 股,每股 100 美元。把两个报价直接相除,会得到 \(100/400-1=-75\%\);按持有财富计算,却是 \(4\times100/(1\times400)-1=0\)。

命题(纯拆股的单位一致性)。 设拆股比例为 \(k>0\),拆股前股数与每股价格分别为 \(q,S\)。若只作单位转换,令 \(q'=kq\)、\(S'=S/k\),则 \(q'S'=qS\)。

证明。 将两项替换代入,\((kq)(S/k)=qS\)。这里的条件“只作单位转换”不可删掉:真实市场价格仍可能涨跌;该恒等式并没有预测拆股后的实际价格。

进一步设拆股后真实的、但仍属本例假设的期末价格为 102 美元,另已收到每股新股 1 美元现金分配,现金不再投资。期末股票价值是 408 美元,分配现金是 4 美元,财富为 412 美元。三种口径分别是:

口径计算本例结果
错接不同每股单位的报价变化\(102/400-1\)−74.5%
同一新股单位下的价格收益\(102/(400/4)-1\)2%
本例含分配、未再投资的持有总收益\((4\times102+4\times1)/400-1\)3%

定义(本例的收益口径)。 对正的初始价格 \(S_0\),在股数单位已统一、期间没有交易、全部分配现金 \(D\) 留存且不计利息、费用和税的条件下,简单价格收益为 \(S_1/S_0-1\),持有总收益为 \((S_1+D)/S_0-1\)。若 \(S_1>0\),对数价格收益为 \(\log(S_1/S_0)\)。

对数价格收益在连续持有区间可以相加,因为对数把价格比率的连乘变成求和;总财富增长倍数也可以按明确定义的再投资规则逐期相乘。但刚才的“现金留存”例子并没有建立分配再投资指数。供应商的调整价格怎样纳入分配、采用哪一个基准日,仍要读其口径,不能仅凭列名 Adj Close 推定。

还有一个时间上的细节:为了今天画图而把历史价格统一到今天的每股单位,不必然使每一种收益计算都有前视偏差;纯比例缩放会在比率中抵消。但按绝对价格阈值发信号、混用未调整成交量,或用后来才知道的调整规则重放历史,都需要重新检查。先判断变换是否改变所研究的量,而不是见到“复权”就一概判定安全或不安全。这些结论来自上述单位计算,不是本例对某个供应商数据质量的实证评价。

五、让两种错误在界面上显形

配套 交互页 有两块面板。第一块改变信息截止、公开/实际接收/假设延迟模式;第二块改变拆股比例、期末价格与分配。先预测哪一项会变化,再操作。

版本面板默认在 2020-08-03 16:00 EDT来源公开截面,显示初值、信号 0,以及“实际接收时间未知”。切换到“真实接收记录”后应显示无法核定,而不是继续显示 −32.9。切换到“假设延迟 5 秒”属于另一个明确的模拟:7 月 30 日 08:30:03 尚未模拟收到,08:30:05 才收到。假设接收字段不得覆盖真实记录中的 null

不能使用脚本时,第三节的截面表、第四节的收益表就是完整静态替代。默认拆股面板输入为 q=1, S0=400, k=4, S1=102, D=1,其静态输出已经给出。缺失值必须显示“未知/尚未发布”等状态,不画成零点;非法单位或非正拆股比例直接报错。

六、自检:换一份材料还能做吗

题一:解释。 某文件把 2020Q2 数据的时间列写成 2020-06-30,取值为 −31.7,并称“按日期排序后就没有未来数据”。指出缺少什么,并说明怎样修。

解析。 这只有观察期标签,没有次值的来源发布时间。必须恢复 2020-08-27 08:30 EDT 这条版本记录,并保留初值记录。对 8 月 3 日的公开截面选初值;对真实系统回放,还要有接收日志。只把时间列改成发布日期也不充分,因为那会丢失它描述 2020Q2 的事实;两个时间维度都要保留。

题二:迁移。 一家公司某年报的原版于 3 月 1 日公开,4 月 10 日更正一个金额。研究截止在 3 月 20 日,系统于 3 月 2 日收到原版,但没有更正版的历史接收日志。应保存几条记录?当时能用哪个版本?

解析。 至少保留原版与更正版两条,绑定同一报告期和不同来源版本。3 月 20 日只能使用原版;已有 3 月 2 日的接收记录还支持该系统届时已经收到。更正版的接收时间继续留空,不会妨碍这个较早截止时点的结论。若截止改到 4 月 11 日,则来源公开截面可选更正版,但系统是否已经收到仍不能确定。

题三:迁移计算。 纯 2:1 拆股前持有 3 股,每股 80 美元;拆股后期末每股 42 美元,并已收到每股新股 0.5 美元现金,现金留存。求期末财富、价格收益、总收益。

解析。 新股数 6;同一新股单位的初始价格 40。股票价值 \(6\times42=252\),现金分配 \(6\times0.5=3\),财富 255;初始财富 240,所以价格收益 5%,总收益 6.25%。若算出接近 −50%,说明又把不同每股单位直接拼接了。

到这里,我们已经能给出“允许进入计算的记录”和“计算量的单位”。下一篇 QT07 接着处理另一个不能省略的问题:即使信息已经合法取得,目标持仓又是从什么时候开始真正承担价格变化的?


  1. Rob J Hyndman、George Athanasopoulos,Forecasting: Principles and Practice,3rd ed,在线版(本次读取日 2026-09-21);§2.1 全节,定位 “The index variable”“The key variables”及单位转换、唯一键说明。支持索引、键和单位组织;增加发布版本是本篇的应用设计。 ↩︎

  2. U.S. BEA,2020-07-30,2020Q2 GDP Advance Estimate,BEA 20–37。定位页首 08:30 EDT、开篇 −32.9%、数据可修订段、文末 “Statistical conventions”。只用于固定历史版本,不称现值。 ↩︎ ↩︎

  3. U.S. BEA,2020-08-27,2020Q2 GDP Second Estimate,BEA 20–41。定位页首 08:30 EDT、开篇、 “Updates to GDP”及其 Real GDP 行。 ↩︎

  4. Federal Reserve Bank of St. Louis,ALFRED Help,本次读取 2026-09-21。定位 vintage、数据何时加入、Release Dates 的确定方法及增长率公式;不把日期粒度当盘中接收日志。 ↩︎ ↩︎

  5. Federal Reserve Bank of St. Louis,FRED API:Real-Time Periods,Introduction 全单元,realtime_start / realtime_end 及闭区间定义。本篇没有调用 API,也没有使用示例 API key。 ↩︎

  6. Apple,2020-07-30,Apple Reports Third Quarter Results,定位包含 “four-for-one stock split” 与 “August 31, 2020” 的完整公告段。仅支持拆股事实与日期,不支持本文假设价格。 ↩︎

动手试一试

金融数据、变量与版本

这篇词条与哪些内容相连

图中汇集本篇及其段落的直接关系,具体使用位置见下方列表。箭头按关系名称阅读。例如“需要先修”指向需要掌握的内容;推荐阅读顺序另见本领域路线。

逐条查看关系与依据

KEEP ASKING

把这一页,变成一堂课。

专属 Prompt 与同源材料会一并复制。Agent 先读取指定文献,再围绕本页的材料、推导和练习展开教学。

READ TOGETHER

一起读,也一起把问题说清楚。

关于整篇的想法留在这里;某个推导、算例或表格的问题,可以点小节旁的“章说”,在原处展开讨论。

使用 GitHub 账号参与

本篇讨论

搜索笔记

让 Agent 教我

这里包含专属 Prompt 及本次学习范围的正文、案例、来源和图表说明,分支内容以当前选择为准。复制后粘贴到你常用的 Agent。