第8章 数据
TL;DR:黑箱再精巧,喂进去的是垃圾就只能吐出垃圾——本章讲的是量化系统的输入端。数据分两大类:价格数据(含成交量、时间戳、整个指令簿)偏短期,基本面数据(财务健康、财务表现、财务价值、情绪)偏长期,二者的更新频率直接决定了策略的持有周期。数据来源从交易所源头直采到二手供应商再到第三方供应商,每往外一层就多一层便利、少一分速度和控制权。数据清洗要处理缺失值、错误观测值、公司行为未调整、错误时间戳,以及最阴险的前视偏差——「昨天之前就知道了昨天的新闻」。存储上平面文件、关系数据库、数据立方体各有取舍,没有绝对最优。
详读
开篇:黑箱的输入端
作者用一句匿名期货量化交易者的话开场:「我会卖了孩子后再卖数据,但我不会卖掉我的孩子。」(本章题记)——夸张,但把数据在宽客心中的地位说尽了。
前面几章拆的是黑箱内部:阿尔法模型、风险模型、交易成本模型、投资组合构建模型、执行模型。本章掉转方向,看的是喂进黑箱的东西。作者把量化系统定位成一个输入/输出模型(input/output model)——这个术语来自计算机领域,源头是计量经济学的投入/产出模型。它受青睐的关键属性是确定性:同样的输入变量,跑多少遍输出都不变。这个属性是把双刃剑——它意味着结果的全部责任都压在输入上。
物理链路是:服务器连接多个数据源,数据经服务器进入黑箱;服务器上跑着宽客所称的数据馈送处理器(data feed handlers),负责把各家格式的数据转成量化系统能存能用的格式。
数据的重要性:输入的属性决定系统的能力上限
作者用了一个生动的比喻:手头只有生菜、西红柿和黄瓜,造不出喷气式发动机——最多做份沙拉。要造发动机,至少得有能扛高速、高加速度、高纬度、高温低温的材料。量化系统同理:拿到的是宏观经济数据,就很难做出一个不反映宏观经济状况的模型。
更具体地说,输入变量的特征决定模型的诸多细节。假设你拿到的是缓慢变化的宏观数据(如美国季度GDP),而且是公开发布一周后才拿到——那你不可能建一个以分钟计算持仓时间的快速交易模型。而且数据的适用边界很硬:美国的数据预测债券或货币相关产品可能有用,但在股票市场上不足以建立有效模型;美国GDP更无法提供乌拉圭或波兰证券市场的信息。存储和提取所用的数据库技术、乃至软硬件选型,也很大程度上取决于数据的属性。
反面的重要性来自后果。作者举的是1999年火星气候卫星(Mars Climate Orbiter, MCO):价值两亿美元的卫星与大气层摩擦烧毁,原因是一个项目组的软件工程师按牛顿为力学单位编写助推器控制程序,另一个项目组处理传输到卫星的数据时用的是磅力。控制模型本身运行准确,但输入数据被缩小为原来的1/4.5,卫星下降时偏离轨道、离火星大气层过近而被摩擦烧毁。事后NASA没有把责任归给”软件错误”,而是归给软件的检验与重检过程以及输入软件的数据——这个归因方式本身就是本章的论点。
另外两个提醒:一是虚假精确(false precision)——结果输出一串带很多位小数的精确数字,并不意味着可以完全信赖它;二是时效性——一个能很好预测股票次日价格、但需要一周后才能拿到的数据的模型,毫无意义。
正因为此,作者指出绝大部分顶级公司都是自己从源头直接搜集数据,而不从数据供应商购买,并在快速获取、清洗、存储上投入大量资源;一些公司有几十甚至上百名员工专职做数据抓取、清洗与最优化存储。
数据类型:价格数据与基本面数据
作者把数据分成两大类。
价格数据不只是价格:还包括从交易行为中得到或提取的其他信息——成交量、每笔交易的时间及规模。实际上整个指令簿都算价格数据,因为它包含一个交易日中给定金融产品所有买入价、卖出价及量的连续记录。各种指标水平(如标普500每日记录的波动百分比)也归入价格数据,即使算出的数值本身不是可交易产品。
基本面数据范围宽泛到难以有效分类——某种意义上就是”除价格数据之外的所有数据”,共同特征是有助于决定未来价格或至少描述当前状况。作者给了四个最常见子类:
- 财务健康状况:公司资产负债表;国家层面的财政预算、贸易赤字、个人存款;应计科目与总收入之比、现金流与利润之比。
- 财务表现:利润表和现金流量表中的总净利润、自由现金流;国家层面的美国GDP。
- 财务价值:股票的账面价值、净现金流。
- 情绪:宽客如何评级一只股票、公司内部人员对本公司股票的买卖行为、股票期权的隐含波动率;宏观层面则如经济学家对下季度GDP增长的预测。
作者随即反过来防止读者把分类看死了:聪明的研究人员一直在找别人没用过的创新数据源。有公司(和数据供应商)对英文新闻报道做量化分析,系统性地做句法分析提取量化信息并据此建策略;还有一家公司试图用GPS卫星定位数据判断经济活动水平,比政府公布的指标更迅速准确。但作者的判断是:这些本质上仍是基本面数据——新闻分析只是在追求更快更稳健的情绪指标,GPS只是搜集手段的改进(或变革),基本面数据的属性没变。这不是否定其创造性,只是说明现有分类框架够用。
一个很实用的规律:价格数据多是日度甚至日间连续数据,基本面数据通常是周度、月度或季度数据。由此立刻可推出——用价格数据的策略通常是短期策略,用基本面数据的通常是长期策略,因为价格数据更新频率更高。但这不绝对:有些基本面策略,尤其是关注基本面或情绪变化的策略,可能很短期。绝大多数情形下这一规律成立,是构建量化策略的常用准则。
数据来源:三层结构,每层都有代价
最直接也最具挑战性的是从源头直接拿原始数据——比如直接从纽交所拿纽交所交易股票的价格数据。好处是对清洗和存储有最大控制权,且速度上有很大优势。成本也高:得和每一个数据源建立联系,而如果要在多个市场、多个交易所交易多种产品(股票和期货),数据源数量会很庞大,且每个源都需要相应软件把它的格式转成系统可用格式。
作者列出的主要数据源及种类:
| 来源 | 提供什么 |
|---|---|
| 交易所 | 价格、交易量、时间戳、持仓量、空头持仓量、订单簿数据 |
| 监管机构 | 各公司财务报表、个股大股东持股情况、内部买卖活动 |
| 政府 | 宏观经济数据,如失业率、通货膨胀、GDP |
| 公司 | 财务报告及其他公告(如红利变化) |
| 新闻机构 | 新闻报道 |
| 数据专营供应商(数据加工者) | 生产数据,如经纪公司发布的上市公司报告、基金现金流数据 |
因为源头直采工作量巨大,很多公司改用数据供应商的加工数据——例如有供应商从世界各地的监管文件中提取财务报表数据,加工成量化数据库授权给交易者。供应商赚的是”把各源数据置于统一框架下存储和分类”的钱。
但这引出一个具体麻烦:不同供应商通常只提供一种类型数据(一家给价格、另一家给基本面),而且识别股票的方式各不相同——一个用股票代码,另一个用SEDOL码或其他标识符。作者在注释中说明:SEDOL全称 Stock Exchange Daily Official List,是英国和爱尔兰股票的唯一证券识别码列表;其他常用的有 ISIN(International Securities Identification Number)和 CUSIP(Committee on Uniform Security Identification Procedures,基本用于美国和加拿大股票);很多数据供应商还用自己的识别码。
解决工具叫证券主管(security master)——一个控制文件,把供应商识别股票的多种方式统一映射到宽客自己系统中所用的特定识别方法。
再往外一层是第三方数据供应商(tertiary data vendors):整合来自不同供应商、不同类型的数据成统一格式数据库,与很多数据源和二手供应商建立联系,维护证券主管系统,甚至做一些数据清洗。因此在量化公司中很流行。代价是:它在宽客和原始数据之间加了一层,导致丧失速度优势,也可能丧失一部分对清洗、存储方法或获取方式的控制权。
数据清洗(一):缺失值
作者先给了一个容易被低估的前提:以下这些数据问题看起来都很明显,但在一个每小时处理上百万数据(对高频交易者甚至是每分钟)的系统里,注意到它们非常有挑战性。
第一类问题是缺失值:信息确实存在,但因各种原因提供者给不出来。没有数据,系统什么也做不了;更糟的是,只用存在的那部分数据,系统可能算出错误的结果。
一个关键陷阱:很多数据库会自动把缺失值赋成零。零和缺失确实有很多共同之处,但在一些情形下差别巨大——“当前价格为零”(比如持有多头,该头寸将获得100%损失)和”当前价格未知”完全是两回事。所以很多宽客在数据库和交易系统中明确区分零和空值。
两种常用处理法:
- 沿用最近一个已知价格,直到新价格可用。这条对实时数据可行。
- 插补(在缺失位置补上一个合理数据)。这条对历史数据有用,对实时数据不奏效——因为它要用到缺失时点之后的信息。
作者用一个半导体公司股票的例子说明插补(设例):已知缺失时点前后的价格,最简单是取前后两点的平均值;进一步,如果还知道缺失时点附近的股指、科技板块、半导体行业和主要竞争对手的表现,把这些信息与相关事件结合,可能算出更合理的价格。无法保证精确、事实上也不太可能精确,但至少能得到一个不会引发系统故障的合理数值——这个目标定位很务实。
数据清洗(二):错误观测值与异常值过滤的两难
第二类问题是错误观测值,小数点错误就很常见。作者的例子是英国股票价格:有时以英镑为单位,有时以便士为单位。10英镑记作1000便士,但如果只标记”1000”而系统默认收到的是英镑,模型就会以为价格快速大幅上升——如果价格突然莫名其妙涨了100倍,一个没有数据复核机制的系统可能会大幅卖出该股票。
还有坏点(bad prints):那些根本不会出现、或至少不会以数据源所预示的方式出现的数值。交易所和其他数据源经常会排除它们。
最常用的解法是异常值过滤(spike filter):寻找价格中幅度特别大、突然的变动,加以平滑或直接删除。
但这里有本章最有意思的两难:有时异常值是真的。作者给了两个真实的市场事件:
- 2008年7月15日,美元兑墨西哥比索迅速下跌近3个百分点,然后在几秒钟内回复正常水平。
- 2008年3月28日,10年期德国国债——世界上交易最活跃的期货合约之一——在交易日内几秒钟之内大跌1.4%,随后很快恢复。作者特意用它说明:这种事不是只发生在交易不活跃的产品上。
异常值过滤会把这类点当坏点处理,但它们是真实存在的点。所以过滤器可能拒绝有效数据,或者忽略异常值、或者把它替换成一个错误的值。
作者给的三条缓解办法,都是”降级使用”而不是”信任自动化”:
- 把异常值过滤降级为报警器——由系统监管人员进一步查看该数值,基于所看到的事实做人工判断。
- 多源交叉核实:若匹配,很可能是正确价格;若不匹配,至少其中一个有问题。(作者坦承:两个供应商数据不匹配时该采取什么措施,“属于另一个话题”——本章没有展开。)
- 近似:观察坏点前后的值,或根据相关产品的表现得到近似值——与缺失值处理同理。
数据清洗(三):公司行为与错误时间戳
公司行为(配股、分红等)是另一类常见错误。假设一只股票按 3:1 配股,价格一般会下降 2/3 以抵消股数增加。如果供应商没记录这次配股、没调整历史数据,系统就会被误导,以为股价一夜之间下跌了67%。解法主要靠对公司行为的独立追踪,加上前述异常值过滤的人工监管。作者在注释中补了一句:为简单起见此处没考虑配股效应,但很多人认为确实存在——该理论认为股票真实下降程度不会像按配股规模算出来的那么严重,因为人们喜欢购买被低估的股票。
错误时间戳是”比较难解决的问题”,常见于日间数据或实时数据。时间序列的路径至关重要——尤其对关注阿尔法收益的交易者,需要指明买入、卖出、清仓的时机。数据源出错导致时间序列被打乱,后果是两个方向的:宽客可能相信一个实际上运行错误的系统(注释:理论上称第一类错误,接受假阳性,原假设错误时却认为正确),或在系统实际运行正常时却认为它错了(注释:第二类错误,接受假阴性)。
最有效的解法:如果公司自己实时存储数据,就把接收到数据的时间戳与存储数据时的内部时间做比对。难点在于——需要可靠的实时存储,还要用软件对每一个数据点做比对而不至于过度拖慢系统。而且这个方法只适用于实时抓取和存储数据的系统;购买数据的宽客只能靠多源交叉检验。这是本章”源头直采 vs 买数据”这条线的又一个落点。
前视偏差:昨天之前就知道了昨天的新闻
最不明显的数据问题是前视偏差(look-ahead bias):在某些事情真实发生之前,便错误地假设已经知道了相关信息。作者给的形象说法是「昨天之前就知道了昨天的新闻」(“数据清洗”小节末)。他说明这个主题在全书中会被多次探讨,本章只讨论数据层面的这一类偏误,其根源是数据的不同步性。
例子(设例):美国公司每季度末向监管当局上报财务报表,但报告通常在季度末4~8周之后才公开发布。设2010年第1季度结束,5月1日顶点建筑公司(Acme Concrete)报告Q1利润每股1美元,而宽客在3月31日的预计只有每股0.5美元——是个利好。问题在于:绝大部分数据供应商一旦拿到这个数字,就会把它记在3月31日名下,而不是5月1日。
三年后,一个宽客用这份收益数据验证策略:数据里 Acme 的 2010Q1 每股收益是1美元,他信以为真——可实际上5月1日之前他不可能知道。验证结果里,模型4月就买入了 Acme,因为每股1美元的收益让它4月起市盈率就很好;到5月初策略突然带来很大利润,因为这时数据才公布于众。整条收益曲线是假的。
宏观数据也一样:如失业率,有些指标初次发布几个月后会修正。不仔细追踪修正记录,宽客就会以为自己在过去能拿到修正后的数据,而实际上他当时只能拿到不太准确的初始值。
忽视这类错误的后果,作者说得很直白:他会犯第一类错误——认为自己的策略很有效会带来收益,但事实上只是看起来如此。
两条解法:
- 记录下更新后数据的发布日期,模型验证时只在合理的时间段才使用这些数据。
- 加人工滞后项,让模型对该指标的敏感度延误,延误幅度足以克服前视偏差。
作者最后点了一个容易被忽略的方向性事实:前视偏差在研究中很特殊,真实交易中并不存在这类问题——现实中宽客们希望尽可能快地把所有相关数据纳入系统。前视偏差纯粹是回测世界的病。
前视偏差的第二种形态:全球收盘时间不同步
另一类源于不同步性的前视偏差,来自世界各交易市场收盘时间不同:
- SPY(跟踪标普500的ETF)下午4点15分结束交易,但构成标普500的股票4点后就不再交易。
- 欧洲股票市场在纽约时间上午11点到晚上12点间不交易。
- 一天中纽约开盘时,亚洲市场已经收市。
- 很多情形下,美国的新闻和交易活动对欧洲和亚洲市场的重大影响,直到第二天才能体现出来。
作者用 2008年10月10日那一周 做实例:
- 10月10日(周五):日经225当日跌幅超9%——但纽约开盘时它已经收盘了。欧洲同日跌7%到10%不等。欧洲收盘时标普500当天跌约6%。而在美国东部时间下午2点、其他地方都进入周末而美国还有两小时交易时,标普500突然飙升,收盘时只跌了1%多一点。
- 10月13日(周一):日本休市。欧洲强力反弹,几个主要市场收盘涨幅都超过11%;纽约市场日中”只”涨了6%,但当日收盘时涨幅也超过11%,反超欧洲。
- 10月14日(周二):日经涨14%。
- 随后一个交易日:欧洲涨约3%,美国微跌。
结论:忽略这种不同步性会为收盘价的分析带来很大问题,因为同一天中这些收盘价的时间各不相同。“同一天”这个字眼在跨市场分析里根本不是一个可靠的对齐单位。作者收束说,前视偏差对研究、资产管理乃至主观判断型交易者都有很多不易察觉的影响,关键挑战在于如何处理它的各种形态。
数据存储:平面文件、关系数据库与数据立方体
平面文件(flat file):没有相对关系结构的二维数据库,跟普通表格很像。优点是不会因为要加载太多内容而变慢,简洁而广受欢迎,容易搜索,通常是顺序搜索(第一行到最后一行)。缺点显而易见——在几百万条记录的平面文件里找接近末尾的某条记录,可能要花相当长时间。于是有了指针平面文件(indexed flat files):多一步,但指针为电脑建了一张虚拟的”小抄”(cheat sheet),提供比顺序搜索更智能的算法。
关系数据库:允许数据集中出现更复杂的关系。作者的例子很贴合宽客的日常——不仅要追踪股票自身数据,还要它所在产业、生产部门、所在国指数以及所处股市的数据。用平面文件,每组数据得建一个独立表结构;只要每张表的组成元素不变还好办,但现实中每次发生公司行为、合并或其他事件,每一张表里该股票的所有相关记录都得更新。关系数据库只需创建一个包含每只股票属性(行业、板块、市场、范围)的表,数据库根据已建立的关系管理其余部分。代价:搜索能力虽强,但过程可能缓慢冗长,因为要扫描很多表单、元表单以及数据表之间的关系。
数据立方体(data cube):一类很重要的关系数据库,说法源自 Stark 量化投资公司前总裁苏德·齐德卡拉(Sudhir Chhikara)。它强调关系数据库的一致性,把所有金融产品所有属性的取值放进一个三维数据表——对某个日期,所有产品列在一个坐标轴上,第二个轴存所有产品的某个给定属性(如当日收盘价),第三个轴存其他属性(如当日每股收益)。每天都创建一个数据立方存储所有相关数据。
它的收益和代价是一体两面:它把某些关系强行连接了起来,并通过保留每天每种产品的全部属性,使得给定产品和属性时不需要去搜索最新数据点。但强行连接导致灵活性缺乏——一旦关系的性质或数据查询方式发生变化,就会出现很大问题。
作者的收尾是一贯的立场:各种存储方法各有优缺点,在一定假设条件下容易说哪种”最优”,但实际最优取决于所要解决的问题——就像黑箱的其他部分一样,宽客在这里做出的判断会决定成败。
小结与两点如实说明
作者在小结中承认:数据很少是量化策略中令人兴奋的部分,但它不可或缺,对宽客做的所有事都很重要,也为如何评价一个量化交易系统提供很多信息,因而值得深入理解。下一站是研究过程——黑箱探索的最后一站。
关于图表:本章提到三幅图——图8-1(2008年7月15日墨西哥比索9月到期合约价格异常图)、图8-2(2008年3月28日德国国债期货6月到期合约价格异常图)、图8-3(黑箱结构)。在本次所依据的文本中,这三幅图只有图题、没有图形内容,因此本文只依据正文中的文字描述(跌幅、日期、恢复速度)复述,不对图中曲线细节作任何推断。
关于幸存者偏差:本章讨论的偏差只有前视偏差一种,并未涉及幸存者偏差(survivorship bias)。作者明确说前视偏差”将在本书中多次探讨”、“下一章我们将继续讨论”,但幸存者偏差是否在后续章节出现,第8章本身没有交代。此处如实说明,不作补写。
案例档案
| 案例 | 一句话经过 | 在书中的作用(佐证哪个论点) |
|---|---|---|
| 火星气候卫星(MCO),1999 | 一组工程师按牛顿写助推器程序、另一组按磅力处理传输数据,输入被缩小为1/4.5,两亿美元卫星偏离轨道被大气摩擦烧毁 | 模型完全正确、输入单位错误就足以毁掉一切;NASA把责任归给检验流程与输入数据而非”软件错误” |
| 美元兑墨西哥比索,2008年7月15日 | 一个交易日内迅速下跌近3个百分点,几秒钟内回复正常水平(图8-1,本文本仅有图题) | 真实存在的异常值——异常值过滤可能把它当坏点误删 |
| 10年期德国国债期货6月合约,2008年3月28日 | 世界上最活跃的期货合约之一,交易日内几秒钟大跌1.4%,随后很快恢复(图8-2,本文本仅有图题) | 证明真实异常值不只出现在交易不活跃的产品上,过滤两难普遍存在 |
| 2008年10月10日—14日全球市场,日经225 / 欧洲 / 标普500 | 10日日经跌超9%、欧洲跌7%~10%、标普盘中跌6%但收盘只跌1%多;13日日本休市、欧洲涨超11%、美国收盘涨超11%反超;14日日经涨14%;次日欧洲涨约3%、美国微跌 | 各市场收盘时间不同 → “同一天的收盘价”根本不同时,跨市场分析会引入前视偏差 |
| 苏德·齐德卡拉(Sudhir Chhikara),Stark 量化投资公司前总裁 | 提出”数据立方体”这一说法 | 数据立方体的命名来源;引出强制关系连接的收益与灵活性代价 |
| 英国股票价格的英镑/便士单位(行业常见现象) | 同一价格有时以英镑、有时以便士计价,10英镑记作1000而无单位标识 | 小数点/单位错误如何让模型误判价格上涨100倍并触发大幅卖出 |
作者另外还用了两个设例(非真实事件,故不入上表):半导体公司股票的缺失值插补,以及顶点建筑公司(Acme Concrete)2010年第1季度每股收益1美元的前视偏差演示。后者虽为设例,却是本章前视偏差论证的主力载体。
延伸案例(编者补)
编者补,非原书内容。
2010年5月6日美国”闪电崩盘”(Flash Crash):美股主要指数在几分钟内暴跌约9%,部分个股一度成交在每股0.01美元或10万美元的极端价位,随后大部分在20分钟内收复。事后交易所取消了大量偏离参考价60%以上的成交。这个事件正好把本章”异常值过滤两难”推到极致:那些一分钱的成交既是真实发生的成交,又被事后官方判定为无效。一个纯自动的 spike filter 无论保留还是删除都是错的——保留则模型看到荒谬价格,删除则丢掉了当天真正发生过的市场结构信息。本章开出的药方(把过滤器降级为报警器 + 人工判断 + 多源交叉核实)在这里恰好是唯一可行的路。此案例可用来理解原书论点,但不属于原书内容。
怎么用
- 先问”我的数据频率是多少”,再决定策略的持有周期——不要反过来。本章给的准则很硬:价格数据多为日度/日间 → 短期策略;基本面数据多为周/月/季度 → 长期策略。如果你手上只有季度财报和一周的发布延迟,就不要去设计分钟级的模型;同理,美国GDP不能拿去解释波兰股市。
- 在数据库里把”零”和”空”分开,并给每个数据点记两个时间戳——一个是数据所属的时点,一个是你实际能拿到它的时点。回测时只准使用第二个时间戳之后的数据。这一条直接消灭本章讲的两类前视偏差;若做不到精确记录,退而求其次是给该指标加人工滞后项。
- 把异常值过滤当报警器用,不要当橡皮擦用。德国国债和墨西哥比索的例子证明真实的秒级剧烈波动确实存在。可行的组合是:过滤器只负责标记 → 多数据源交叉核实 → 不匹配的交给人工判断。同时把公司行为(配股、分红)做独立追踪,否则 3:1 配股会被系统读成一夜暴跌67%。
要点清单
- 量化系统是输入/输出模型,同样输入跑多少遍输出都一样——这意味着结果的全部责任压在输入上,“输入垃圾,输出垃圾”。
- 输入变量的属性决定了系统能干什么、模型的诸多细节、乃至数据库和软硬件的选型。
- 火星气候卫星的教训:模型完全正确、只是输入单位从牛顿变成磅力(缩小为1/4.5),两亿美元灰飞烟灭;NASA把责任归给检验流程和输入数据。
- 数据分两类:价格数据(含成交量、时间戳、整个指令簿、指标水平)和基本面数据(财务健康、财务表现、财务价值、情绪);新闻量化和GPS经济活动追踪本质上仍是基本面数据。
- 价格数据频率高 → 短期策略;基本面数据频率低 → 长期策略。例外是关注基本面/情绪变化的策略,可能很短期。
- 来源分三层:源头直采(速度与控制最优,成本最高)→ 二手供应商(解决统一框架问题,靠证券主管映射 SEDOL/ISIN/CUSIP 等不同标识)→ 第三方供应商(最便利,但多一层就丧失速度和对清洗/存储/获取方式的控制权)。顶级公司多选源头直采,甚至配几十到上百人专职做数据。
- 清洗四大问题:缺失值(别让数据库把空默认成零;沿用最近值或插补)、错误观测值(单位/小数点错误、坏点;用异常值过滤但要防误删真实异常)、公司行为未调整(3:1 配股被读成跌67%)、错误时间戳(用接收时间戳与内部存储时间比对,仅限实时抓取者可用)。
- 前视偏差 = “昨天之前就知道了昨天的新闻”,根源是数据不同步:财报数据被记在季度末而非4~8周后的实际发布日;宏观指标事后修正;各市场收盘时间不同。忽视它就会犯第一类错误——以为策略有效,其实只是看起来如此。前视偏差只存在于研究/回测中,真实交易里不存在。
- 存储三选:平面文件(简洁快,大文件顺序搜索慢 → 加指针)、关系数据库(能表达复杂关系、维护成本低,但扫表慢)、数据立方体(三维强制连接关系、无需搜索最新点,代价是灵活性缺乏)。没有绝对最优,取决于要解决的问题——判断本身决定成败。