QuantWeft量化经纬
English
本章小节

第 37 章/ 45

金融机器学习的基本立场(ML for Finance Philosophy)

主线:预测准确率提高,扣除成本后的投资结果仍可能变差;金融机器学习要把预测、决策、成本和证据放在同一张账上评价。 先修:第7章统计推断、第22章研究方法与多重检验、第31章模型验证、第35章交易成本。完成后你能:用一个可手算的反例说明准确率与净收益为何背离;写出重叠标签、状态切换和多次尝试对证据强度的影响;给出一份把样本外、稳定性、成本、尾部和经济逻辑一起检查的评价清单。

1. 本章目标

读完本章,你应能完成下面六件可核验的事:

  1. 对一组日收益和多空仓位,手算方向准确率(directional accuracy)、毛收益、换手(turnover)、成本和净收益,并写出准确率与收益之间的恒等式 ∑tptrt=∑t∣rt∣(2ct−1)\sum_t p_t r_t=\sum_t |r_t|(2c_t-1)(pt=±1p_t=\pm1)。
  2. 解释金融预测的四个结构性难点:非平稳(non-stationarity)、低信噪比(low signal-to-noise ratio)、时间依赖(temporal dependence)和状态切换(regime shift),并为每一个给出一个可运行的数值例子。
  3. 计算 NN 个零真实收益策略中最好那个的样本内夏普比率期望值,说明它为什么不能当作发现。
  4. 把数据泄漏(data leakage)分成目标泄漏、前视特征、预处理泄漏、选择泄漏和重叠标签泄漏五类,各给一个错误写法与修复。
  5. 说出金融问题与 Kaggle 类竞赛在数据生成、测试集、评价指标上的差别,并据此选择基准(baseline)。
  6. 为后续第38–40章和 Project6 写出评价门槛:样本外、稳定性、成本、尾部和经济逻辑五项同时检查。

完成条件:第15–17节每道题能独立做出,答案与第18节一致;能解释第8节历史缓存的输入、输出与局限。默认读者入口与重新运行的身份差别见第9节;本批不重跑模拟。

2. 为什么 Quant 需要它

假设你在评审一个日频方向预测模型。研究员报告:测试集上涨跌方向准确率从 52% 提高到 55%。这个数字可能让你批准上线,也可能让你亏钱。准确率把每一天看成同样重要,组合收益却按当天收益的大小记账。一个模型在 100 个平静的日子里猜对,在 3 个暴跌日猜错,准确率很高,账户可能亏损。再加上模型每天翻转仓位,交易成本会吃掉剩下的利润。

前面各章已经准备好零件。第7章给出估计量的抽样误差,第22章讲研究方案冻结和多重检验,第31章讲标签区间、purging 与 walk-forward,第35章讲成本。本章把这些零件放到机器学习的语境里,回答一个更根本的问题:在金融里训练预测模型,你到底在优化什么,又凭什么相信结果。

本章不训练复杂模型。第38章搭建按日期划分、训练内拟合的管线,第39章用正则化线性模型做受控比较,第40章才引入树模型。本章的结论会成为它们的验收门槛。

从预测分数走到账户:先固定三张表

读三章时始终拿着三张表:信息表记录“这次拟合与决策当时能读到什么”;预测表记录“在什么日期、对哪些资产预测了什么”;账本记录“什么时候成交、仓位如何变化、付了多少成本”。本章先把后两张表接起来,第38章补齐信息表,第39章在同一管线中比较估计器。

这条路径也决定比较的顺序:先固定时钟与基准,再用训练内验证选模型,最后在冻结测试期报告预测和组合两层结果。看见一个更高的准确率,还不能跳过成交和成本直接读成更高的净收益。

3. 直觉

先看一个只有十天的构造例子(教学构造,不是市场数据)。一只资产十天的开盘到开盘收益(%)为

r=(+0.4,  +0.3,  −0.2,  +0.5,  −3.0,  +0.4,  +0.2,  −0.1,  +0.3,  −2.5). r=(+0.4,\;+0.3,\;-0.2,\;+0.5,\;-3.0,\;+0.4,\;+0.2,\;-0.1,\;+0.3,\;-2.5).

第5天和第10天是两次大跌,其余八天波动很小。两个模型每天给出方向,你按方向持有一单位多头(+1+1)或空头(−1-1)。

  • 模型 B 在八个小波动日全部猜对,两次大跌都猜成上涨。准确率 80%。
  • 模型 A 在三个小波动日猜错,两次大跌都猜成下跌。准确率 70%。

只看准确率你会选 B。看账户,B 在两次大跌日各亏一整份跌幅,A 在两次大跌日各赚一整份跌幅。小日子里的对错只值零点几个百分点,大日子里的对错值几个百分点。B 还在第3天、第8天两次反手,换手比 A 多。第8节会算出:扣除每单位换手 0.1% 的成本后,A 的十天复利净收益约 +5.69%,B 约 −4.00%。

这个例子故意很小,它的作用是让你看清机制:准确率与盈利由不同的权重聚合同一串对错。真实数据里,收益的厚尾让少数日子决定大部分盈亏,这个机制只会更强。简化的边界也要说明:这里的仓位只有 ±1\pm1,成本与仓位变化线性相关,没有冲击和容量限制;第35、36章的成本模型更完整。

4. 数学基础

本章用到的符号如下,频率均为日频,收益为小数(0.004 表示 0.4%)。

符号 含义 单位/维度
t=1,…,Tt=1,\dots,T 交易日编号 无量纲
rtr_t 第 tt 日开盘到第 t+1t+1 日开盘的简单收益 小数/日
d^t∈{−1,+1}\hat d_t\in\{-1,+1\} 模型在第 t−1t-1 日收盘后给出的方向预测 无量纲
ptp_t 第 tt 日开盘建立并持有到下一开盘的仓位,单位为财富的倍数 财富倍数
ct=1{sign⁡(pt)=sign⁡(rt)}c_t=\mathbf 1\{\operatorname{sign}(p_t)=\operatorname{sign}(r_t)\} 第 tt 日方向是否正确 0 或 1
κ\kappa 每单位仓位变化的成本 小数(财富比例)
τt=∣pt−pt−1∣\tau_t=\lvert p_t-p_{t-1}\rvert,p0=0p_0=0 第 tt 日换手 财富倍数
WtW_t 第 tt 日结束时财富,W0=1W_0=1 货币单位(归一)

时间约定:信号时点(signal_time)是第 t−1t-1 日收盘,成交时点(trade_time)是第 tt 日开盘,收益区间(return interval)是第 tt 日开盘到第 t+1t+1 日开盘。收盘信号不在同一收盘成交,这与第29章账本的 lag>=1 约定一致。这个十日例用开盘成交,便于手算;第38、39章与 Project6 只有收盘价,改为“信号收盘后的下一交易日收盘成交、标签从成交收盘起算”,两种约定各自自洽,不要混用。

用到的统计工具:样本均值的方差、相关系数与决定系数的关系(第7、8章)、正态分布最大值(第32章;多重检验原则见第22章)。若你对 Var⁡(xˉ)\operatorname{Var}(\bar x) 在序列相关时的写法不熟,先复习第32章 Newey–West 一节。

5. 正式定义

预测(prediction)与决策(decision)。 预测是一个从信息集到目标变量估计的映射 f:Ft−1→y^tf:\mathcal F_{t-1}\to\hat y_t;决策是一个从预测(及成本、风险约束)到仓位的映射 g:(y^t,pt−1,约束)→ptg:(\hat y_t,p_{t-1},\text{约束})\to p_t。投资结果由 ptrt−κτtp_t r_t-\kappa\tau_t 决定,它依赖 gg,而不只依赖 ff。引入这对区分,是因为同一个 ff 配上不同的 gg 会得到完全不同的净收益;评价模型时必须写清楚你评价的是 ff 还是 ff 与 gg 的组合。

方向准确率(directional accuracy / hit rate)。 在 pt≠0p_t\neq0 且 rt≠0r_t\neq0 的日子上,Acc=1T′∑tct\mathrm{Acc}=\frac1{T'}\sum_t c_t。成立条件:只在有仓位、收益非零的日子定义;零收益日剔除,否则“方向”无意义。它承接分类模型的输出,把每一天赋予相同权重。

幅度加权准确率(magnitude-weighted accuracy)。 Acc∣r∣=∑t∣rt∣ct/∑t∣rt∣\mathrm{Acc}_{|r|}=\sum_t |r_t|c_t\big/\sum_t|r_t|。它是为了把准确率与 ±1\pm1 仓位的毛收益联系起来而引入的辅助量,下一节推导两者的关系。

教学代理账本的边界。 本章以目标方向差 ∣pt−pt−1∣|p_t-p_{t-1}| 代理换手;它没有逐笔处理持仓漂移、扣费后的目标再平衡,不能等同第29章精确自融资账本。下面累加收益与复利财富均在这一明示代理模型内计算。

净收益与财富路径。 第 tt 日净收益 nt=ptrt−κτtn_t=p_tr_t-\kappa\tau_t,财富 Wt=Wt−1(1+nt)W_t=W_{t-1}(1+n_t)。TT 个日收益对应 T+1T+1 个财富点 W0,…,WTW_0,\dots,W_T。期末未平仓头寸的退出成本在本章例子中不计;计入时再加 κ∣pT∣\kappa|p_T|。

非平稳(non-stationarity)。 若 (xt,yt)(x_t,y_t) 的联合分布随 tt 改变,过程非平稳。对预测有用的特例是条件期望 E[yt∣xt]E[y_t\mid x_t] 的形状随时间变化,例如线性斜率 btb_t 改变。第16章的平稳性针对单个序列的矩;这里关心的是预测关系本身是否稳定。

状态切换(regime shift)。 非平稳的一种:存在日期 t∗t^\ast,在其前后预测关系取不同的常数,bt=b(1)b_t=b^{(1)}(t<t∗t<t^\ast)、bt=b(2)b_t=b^{(2)}(t≥t∗t\ge t^\ast)。切换点事前未知。

信噪比(signal-to-noise ratio)。 对 y=bx+εy=bx+\varepsilon,xx 与 ε\varepsilon 独立,信噪比为 SNR=b2Var⁡(x)/Var⁡(ε)\mathrm{SNR}=b^2\operatorname{Var}(x)/\operatorname{Var}(\varepsilon);总体决定系数 R2=SNR/(1+SNR)=ρ2R^2=\mathrm{SNR}/(1+\mathrm{SNR})=\rho^2,ρ\rho 为 xx 与 yy 的相关系数。金融收益预测中 ρ\rho 通常只有百分之几,R2R^2 在千分之几的量级(见第11节证据边界)。

时间依赖(temporal dependence)。 观测之间存在相关;本章的正相关重叠结构减少了均值估计的有效信息,但负自相关下均值的有效样本量也可大于观测数。本章重点是重叠标签(overlapping labels):每天计算一次未来 hh 日收益作为标签,相邻标签共享 h−1h-1 个日收益。

多重检验(multiple testing)与选择偏差。 尝试 NN 个设定、报告最好的那个,报告值的期望高于任何单个设定的真实值。第22章已给出 FWER、FDR 与试验账本;本章用它解释“调参”和“换特征”也是尝试。

数据泄漏(data leakage)。 训练或选择模型时用到了在预测时点无法获得的信息。本章按信息进入的路径分五类:目标泄漏(target leakage,特征由标签本身或其未来部分构成)、前视特征(look-ahead feature,特征的可用时点晚于信号时点)、预处理泄漏(preprocessing leakage,标准化、填补、降维用到测试数据)、选择泄漏(selection leakage,用测试集选模型、选特征、选阈值)和重叠泄漏(overlap leakage,训练标签区间与测试标签区间相交)。五类的共同点是:测试表现中混入了部署时拿不到的信息。

基准(baseline)。 与候选模型在同一样本、同一时间约定、同一成本下比较的简单规则。本书默认三条:零预测(不持仓)、训练均值预测、简单规则(如买入持有或第25章动量)。没有基准的样本外数字无法解释。

样本外 R2R^2(out-of-sample R2R^2)。 对测试样本 yty_t 与预测 y^t\hat y_t、基准预测 yˉtbase\bar y_t^{\text{base}},ROS2=1−∑t(yt−y^t)2/∑t(yt−yˉtbase)2R^2_{\text{OS}}=1-\sum_t(y_t-\hat y_t)^2\big/\sum_t(y_t-\bar y_t^{\text{base}})^2。基准取训练均值时,它比较的是“模型是否比历史均值更好”(Campbell–Thompson 对指数收益的定义);基准取 0 时,比较的是“模型是否比不预测更好”(Gu–Kelly–Xiu 对个股收益的定义,理由是个股历史均值本身噪声很大)。两种基准会给出不同的数字,报告时写明。

这几个概念的顺序有逻辑:预测与决策的区分告诉你要评价什么;非平稳、低信噪比、时间依赖说明为什么证据弱;多重检验和泄漏说明证据为何会被人为抬高;基准和 ROS2R^2_{\text{OS}} 给出比较的参照。

6. 推导

6.1 准确率与毛收益的恒等式

假设:pt∈{−1,+1}p_t\in\{-1,+1\},rt≠0r_t\neq0。

第一步,按方向是否正确拆分单日毛收益。若 ct=1c_t=1,ptp_t 与 rtr_t 同号,ptrt=∣rt∣p_tr_t=|r_t|;若 ct=0c_t=0,异号,ptrt=−∣rt∣p_tr_t=-|r_t|。两种情况合写为

ptrt=∣rt∣ (2ct−1). p_tr_t=|r_t|\,(2c_t-1).

第二步,对 tt 求和:

∑t=1Tptrt=∑t∣rt∣(2ct−1)=2∑t∣rt∣ct−∑t∣rt∣=(∑t∣rt∣)(2 Acc∣r∣−1). \sum_{t=1}^T p_tr_t=\sum_t|r_t|(2c_t-1)=2\sum_t|r_t|c_t-\sum_t|r_t|=\Big(\sum_t|r_t|\Big)\big(2\,\mathrm{Acc}_{|r|}-1\big).

最后一个等号用了幅度加权准确率的定义。毛收益为正当且仅当 Acc∣r∣>1/2\mathrm{Acc}_{|r|}>1/2。当 ∣rt∣|r_t| 全部相等时,普通准确率 Acc\mathrm{Acc} 对任意对错模式都等于加权准确率;幅度不等时一般不能替代,但仍可能偶然相等。例如幅度为 (1,2,3,4)(1,2,3,4),仅第1、4项正确,两种准确率均为 1/21/2。若允许空仓,两种准确率都须限制在同一有仓位且收益非零的评价子集;上述恒等式仍只适用于该子集上的 ±1\pm1 仓位。

用途:这条恒等式告诉你分类损失(0-1 损失)与投资损失不是同一个目标。当你用交叉熵或准确率训练方向模型时,模型在大波动日和小波动日犯错的代价被同等对待;投资者的代价按 ∣rt∣|r_t| 加权。若要训练方向模型,可以在损失里以 ∣rt∣|r_t| 为样本权重,或直接回归收益。不能用的情形:仓位大小随预测置信度变化时,pt≠±1p_t\neq\pm1,恒等式不成立,要回到 ∑ptrt\sum p_tr_t 本身。

6.2 成本把净收益拉开

∑tnt=∑tptrt−κ∑tτt,τt=∣pt−pt−1∣∈{0,1,2}. \sum_t n_t=\sum_tp_tr_t-\kappa\sum_t\tau_t,\qquad \tau_t=|p_t-p_{t-1}|\in\{0,1,2\}.

±1\pm1 仓位从多翻空,τt=2\tau_t=2:先卖掉一单位多头,再卖空一单位。若方向预测近似随机,翻转的概率约 1/2,平均每天换手约 1,年化换手约 252 个单位;κ=0.1%\kappa=0.1\% 时每年成本约 25%。这就是第35章说的“成本是交易频率的函数”。累加只是近似;精确值要用 WT=∏(1+nt)W_T=\prod(1+n_t)。两者差别是二阶项,十天例子中约 0.1 个百分点(第8节)。

6.3 信噪比与 R2R^2

假设:y=bx+εy=bx+\varepsilon,E[ε]=0E[\varepsilon]=0,ε\varepsilon 与 xx 独立,Var⁡(x)=σx2\operatorname{Var}(x)=\sigma_x^2,Var⁡(ε)=σε2\operatorname{Var}(\varepsilon)=\sigma_\varepsilon^2。

Var⁡(y)=b2σx2+σε2,R2=b2σx2b2σx2+σε2=SNR1+SNR. \operatorname{Var}(y)=b^2\sigma_x^2+\sigma_\varepsilon^2,\qquad R^2=\frac{b^2\sigma_x^2}{b^2\sigma_x^2+\sigma_\varepsilon^2}=\frac{\mathrm{SNR}}{1+\mathrm{SNR}}.

又 Cov⁡(x,y)=bσx2\operatorname{Cov}(x,y)=b\sigma_x^2,ρ=bσx/b2σx2+σε2\rho=b\sigma_x/\sqrt{b^2\sigma_x^2+\sigma_\varepsilon^2},所以 ρ2=R2\rho^2=R^2。相关系数 0.05 对应 R2=0.0025R^2=0.0025,即 0.25%。

这个数字不说明信号无用。第23章已经证明:截面上按标准化信号 ziz_i 构建权重 wi=zi/Nw_i=z_i/N 的组合,单期收益等于 ICt⋅σy,t\mathrm{IC}_t\cdot\sigma_{y,t}(σy,t\sigma_{y,t} 为当期截面收益标准差)。若 IC 每期都在 0.05 附近、波动不大,组合收益就很稳定,尽管每只股票的 R2R^2 只有 0.25%。低信噪比改变的是证据量:你需要很多独立截面和很多期,才能把 0.05 与 0 区分开;同时,任何小的泄漏或过拟合都足以伪造一个 0.05。

6.4 重叠标签的自相关与有效样本量

假设:日收益 utu_t 独立同分布,方差 σ2\sigma^2;第 tt 日的 hh 日标签 Yt=∑j=1hut+jY_t=\sum_{j=1}^h u_{t+j}。

YtY_t 与 Yt+kY_{t+k}(0≤k<h0\le k<h)共享 h−kh-k 个日收益:

Cov⁡(Yt,Yt+k)=(h−k)σ2,Var⁡(Yt)=hσ2,ρk=h−kh. \operatorname{Cov}(Y_t,Y_{t+k})=(h-k)\sigma^2,\qquad \operatorname{Var}(Y_t)=h\sigma^2,\qquad \rho_k=\frac{h-k}{h}.

k≥hk\ge h 时不再共享,ρk=0\rho_k=0。样本均值 Yˉ=1n∑t=1nYt\bar Y=\frac1n\sum_{t=1}^nY_t 的方差(n≫hn\gg h)为

Var⁡(Yˉ)≈Var⁡(Yt)n(1+2∑k=1h−1ρk)=hσ2n(1+2∑k=1h−1h−kh)=hσ2n⋅h. \operatorname{Var}(\bar Y)\approx\frac{\operatorname{Var}(Y_t)}{n}\Big(1+2\sum_{k=1}^{h-1}\rho_k\Big) =\frac{h\sigma^2}{n}\Big(1+2\sum_{k=1}^{h-1}\frac{h-k}{h}\Big)=\frac{h\sigma^2}{n}\cdot h.

第二个等号用了 ∑k=1h−1(h−k)=h(h−1)/2\sum_{k=1}^{h-1}(h-k)=h(h-1)/2,括号内等于 1+(h−1)=h1+(h-1)=h。与独立样本公式 hσ2/nh\sigma^2/n 相比,方差放大 hh 倍,有效样本量约为 n/hn/h。h=5h=5 时,把 1,000 个重叠标签当独立样本计算 tt 值,会把 tt 值放大约 5≈2.24\sqrt5\approx2.24 倍。修正办法:在已知独立日收益构造下,直接使用这里推导的精确协方差/均值方差,或只取不重叠日期。无核衰减地按已知MA阶数截断,与固定带宽Bartlett Newey–West不是同一估计器。共享实现NW滞后 q=h−1q=h-1 时权重为 1−k/h1-k/h,其极限因子是 1+2∑k=1h−1(1−k/h)ρk=(2h2+1)/(3h)1+2\sum_{k=1}^{h-1}(1-k/h)\rho_k=(2h^2+1)/(3h);h=5h=5 时为3.4,不是真长期方差因子5。覆盖非零协方差阶数不保证固定Bartlett带宽精确还原或一致估计;一般带宽与一致性条件见第23、32章。

有限 n≥hn\ge h 时,均值方差的精确放大因子为 1+2∑k=1h−1(1−k/n)ρk=h−(h2−1)/(3n)1+2\sum_{k=1}^{h-1}(1-k/n)\rho_k=h-(h^2-1)/(3n);有效样本量定义为 nn 除以此因子。一般序列若加权自协方差之和为负,因子可小于1、有效样本量可大于 nn。

适用边界:日收益本身若有自相关或波动聚集,ρk\rho_k 偏离 (h−k)/h(h-k)/h;放大倍数不再正好是 hh,Newey–West 仍可使用但滞后要另作判断。

6.5 多次尝试的最大夏普比率

假设:NN 个策略日收益独立、真实均值为 0,每个策略样本有 TT 天。日夏普比率估计 SR^d\widehat{SR}_d 近似服从 N(0,1/T)N(0,1/T),年化 SR^=252 SR^d≈N(0,252/T)\widehat{SR}=\sqrt{252}\,\widehat{SR}_d\approx N(0,252/T)。

E[max⁡1≤i≤NSR^i]≈252T  E[max⁡1≤i≤NZi],Zi∼iidN(0,1). E\Big[\max_{1\le i\le N}\widehat{SR}_i\Big]\approx\sqrt{\frac{252}{T}}\;E\Big[\max_{1\le i\le N}Z_i\Big],\qquad Z_i\overset{iid}{\sim}N(0,1).

第一个约等号来自正态近似;E[max⁡Z]E[\max Z] 可以用数值积分精确求出(第32章 research_protocol 模块中的精确积分函数),也可用 Bailey–López de Prado 近似 (1−γ)Φ−1(1−1/N)+γΦ−1(1−1/(Ne))(1-\gamma)\Phi^{-1}(1-1/N)+\gamma\Phi^{-1}(1-1/(Ne)),γ≈0.5772\gamma\approx0.5772。T=504T=504(两年)时 252/504=0.707\sqrt{252/504}=0.707;N=100N=100,E[max⁡Z]≈2.51E[\max Z]\approx2.51,最好的那个策略年化夏普的期望约 1.77。所有策略的真实夏普都是 0。

用途:当你看到“在 100 个特征组合里挑出的最佳模型年化夏普 1.8”,先把它和 1.77 比较。它与零假设下的期望几乎相同,不构成发现。第32章讨论 Deflated Sharpe Ratio,试验登记与多重检验原则见第22章。期望最大值只是参照,不是精确的选择后 pp 值或 FWER。

6.6 状态切换下的样本外 R2R^2

假设:yt=btxt+εty_t=b_tx_t+\varepsilon_t,xt,εt∼iidN(0,1)x_t,\varepsilon_t\overset{iid}{\sim}N(0,1) 相互独立;状态1斜率 +b+b,状态2斜率 −b-b;用状态1的 OLS 估计 b^\hat b(截距近似 0)预测状态2,基准为零预测。

E[(y−b^x)2]=E[(−bx+ε−b^x)2]=(b+b^)2+1,E[y2]=b2+1. E[(y-\hat bx)^2]=E[(-bx+\varepsilon-\hat bx)^2]=(b+\hat b)^2+1,\qquad E[y^2]=b^2+1.

条件于已经拟合的固定 b^\hat b,总体风险比值为 1−[(b+b^)2+1]/(b2+1)1-[(b+\hat b)^2+1]/(b^2+1);有限测试样本的 ROS2R^2_{\text{OS}} 是两个样本平方和之比,其期望不等于总体风险比值,忽略拟合截距也只是近似。所以 ROS2≈1−(b+b^)2+1b2+1R^2_{\text{OS}}\approx1-\dfrac{(b+\hat b)^2+1}{b^2+1}。若 b^≈b\hat b\approx b,ROS2≈−3b21+b2R^2_{\text{OS}}\approx-\dfrac{3b^2}{1+b^2};b=0.1b=0.1 时约 −2.97%-2.97\%。当 b^\hat b 从 bb 向 −b-b 靠近时,(b+b^)2(b+\hat b)^2 下降;仅有 b^<b\hat b<b 不足以保证损失下降,越过 −b-b 后继续远离会增大损失。要点:预测关系反转时,模型比不预测更差,而且样本内 R2R^2 不会提醒你。滚动窗口能跟上变化,但窗口越短估计噪声越大,这是第37-C01要你权衡的问题。

7. 金融解释

为什么大日子决定盈亏。 日收益厚尾:极少数日子的绝对收益远大于典型日子(第11章、第33章)。∑tptrt\sum_tp_tr_t 被这些日子主导,准确率却把它们与平静日等权。一个只学会“平静日略涨”的模型可以有很高准确率;它在危机日的错误代价远超平时的收益。风险管理(第33章)关心的尾部损失,正是准确率看不到的那部分。

为什么低信噪比是常态。 若某个公开可得的信号能稳定、大幅地预测收益,交易者会买入被预测上涨的资产直到预期收益被价格吸收。剩下来能被发现的可预测性,要么很小,要么需要承担风险或成本作为补偿(第14章、第24–27章的因子溢价解释)。所以金融里“R2R^2 很低”本身不是模型缺陷,而“R2R^2 很高”反而要先怀疑泄漏。

为什么关系会变。 市场参与者会学习并利用已发表的规律;监管、市场结构、利率体制会改变;资金流入同一策略会压缩其收益。这些都使 E[y∣x]E[y\mid x] 随时间移动。第37-C01 讨论用多长的训练窗口应对。

与 Kaggle 类竞赛的差别。 以允许反复公开榜提交、近似同分布的竞赛作为典型简化对照;不同竞赛也可能有时间划分、提交限制和分布漂移。金融里:你只有一条历史路径,测试期只能真正使用一次;分布随时间漂移;评价目标是成本后的风险调整收益,而不是预测指标;你的交易会影响价格和成本(第35、36章)。竞赛中的常用技巧,如随机打乱后做 K 折交叉验证、在公开排行榜上反复调参,在本章重叠标签结构下可能引入重叠泄漏,反复测试调参则引入选择泄漏;随机拆分的具体问题应按信息与标签结构诊断。

可实现性。 一个模型的价值取决于它的预测能否在 trade_time 之前算出、能否以合理成本成交、在容量和借券约束下能否放大。这些不在模型的损失函数里,必须在评价中补上。

8. Numerical Example

8.1 十日案例:输入

(教学构造。)日收益 rr 如第3节;成本 κ=0.001\kappa=0.001(每单位换手 0.1%);p0=0p_0=0。下表中 pBp^B、pAp^A、pBHp^{\text{BH}} 分别为模型 B、模型 A 与买入持有的仓位。

日 tt 1 2 3 4 5 6 7 8 9 10
rtr_t(%) +0.4 +0.3 −0.2 +0.5 −3.0 +0.4 +0.2 −0.1 +0.3 −2.5
pBp^B +1 +1 −1 +1 +1 +1 +1 −1 +1 +1
pAp^A +1 +1 +1 +1 −1 −1 −1 −1 +1 −1
pBHp^{\text{BH}} +1 +1 +1 +1 +1 +1 +1 +1 +1 +1

8.2 手算准确率与毛收益

∑t∣rt∣=0.4+0.3+0.2+0.5+3.0+0.4+0.2+0.1+0.3+2.5=7.9\sum_t|r_t|=0.4+0.3+0.2+0.5+3.0+0.4+0.2+0.1+0.3+2.5=7.9(%)。

  • B:错在第5、10日,∑错∣r∣=3.0+2.5=5.5\sum_{\text{错}}|r|=3.0+2.5=5.5。Acc=8/10=0.80\mathrm{Acc}=8/10=0.80。毛收益 =(7.9−5.5)−5.5=−3.1%=(7.9-5.5)-5.5=-3.1\%。Acc∣r∣=2.4/7.9=0.304\mathrm{Acc}_{|r|}=2.4/7.9=0.304。
  • A:错在第3、6、7日,∑错∣r∣=0.2+0.4+0.2=0.8\sum_{\text{错}}|r|=0.2+0.4+0.2=0.8。Acc=0.70\mathrm{Acc}=0.70。毛收益 =(7.9−0.8)−0.8=+6.3%=(7.9-0.8)-0.8=+6.3\%。Acc∣r∣=7.1/7.9=0.899\mathrm{Acc}_{|r|}=7.1/7.9=0.899。
  • 买入持有:错在4个下跌日,∑错∣r∣=0.2+3.0+0.1+2.5=5.8\sum_{\text{错}}|r|=0.2+3.0+0.1+2.5=5.8,Acc=0.60\mathrm{Acc}=0.60,毛收益 =2.1−5.8=−3.7%=2.1-5.8=-3.7\%。

用恒等式 ∑ptrt=(∑∣rt∣)(2Acc∣r∣−1)\sum p_tr_t=(\sum|r_t|)(2\mathrm{Acc}_{|r|}-1) 核对 A:7.9×(2×0.899−1)=7.9×0.797=6.307.9\times(2\times0.899-1)=7.9\times0.797=6.30。

8.3 换手与成本

  • B:p0=0→+1p_0=0\to+1(1),第3日 +1→−1+1\to-1(2),第4日 −1→+1-1\to+1(2),第8日(2),第9日(2)。合计 9 单位,成本 9×0.1%=0.9%9\times0.1\%=0.9\%。
  • A:初始 1,第5日 +1→−1+1\to-1(2),第9日(2),第10日(2)。合计 7,成本 0.7%。
  • 买入持有:1,成本 0.1%。

8.4 净收益:近似与精确

Acc Acc∣r∣\mathrm{Acc}_{\lvert r\rvert} 毛收益和 换手 成本 累加近似净值 复利精确净收益
A 0.70 0.899 +6.30% 7 0.70% +5.60% +5.6879%
B 0.80 0.304 −3.10% 9 0.90% −4.00% −3.9980%
买入持有 0.60 0.266 −3.70% 1 0.10% −3.80% −3.8072%
零仓位 — — 0 0 0 0 0

精确列由 W10=∏t=110(1+nt)W_{10}=\prod_{t=1}^{10}(1+n_t) 得到,例如 A 的第1日 n1=0.004−0.001=0.003n_1=0.004-0.001=0.003,W1=1.003W_1=1.003;B 的第3日 n3=(−1)(−0.002)−2×0.001=0n_3=(-1)(-0.002)-2\times0.001=0,W3=W2=1.006009W_3=W_2=1.006009。完整财富路径保存在 course/zh/chapters/ch37/figures/ch37_results.json,共 11 个财富点对应 10 个日收益。准确率最高的 B 输给了“什么都不做”的零仓位,也输给了买入持有。

8.5 一个 R2R^2 量级的手算

若某特征与次日收益的相关系数为 0.03,R2=0.032=0.0009R^2=0.03^2=0.0009。若日收益标准差 2%,在含截距的线性投影中,预测部分的标准差为 ∣ρ∣σy=0.0006=0.06%|\rho|\sigma_y=0.0006=0.06\%。这不是任意非线性可预测部分的上限,也不是期望交易利润。每单位换手成本0.1%不能直接与预测标准差当作同一种收益相减;净收益还取决于仓位规则、翻转概率、持有期和阈值。多资产分散、平滑仓位或低频交易都可能改善成本后的表现,仍须按实际账本检查。

9. Python Implementation

脚本:code/ch37_ml_philosophy.py。历史工程脚本可重算构造实验;工作树版本即使指定新 --out 仍可能覆盖原章图,故此处不提供直接覆盖指令。默认接受读者包中的第37章 Notebook会新算十日案例、100000重叠日、三组各200次零信号实验和状态切换,并在唯一运行目录写十日财富图;本批仅解释该行为,未执行。CLI历史先计算 N=1N=1 再计算10/100/1000,Notebook从10开始,随机数消耗不同,同seed3702不代表同一次具体结果。Notebook英文语言层在BIL23完成。

输入全部为脚本内的教学构造参数与固定种子(3701 状态切换、3702 多重检验、3703 重叠标签);输出 ch37_results.json(拒绝覆盖已有文件)及三张图。数据频率为日频;十日案例的 signal_time 为前一日收盘、trade_time 为当日开盘、收益区间为开盘到次日开盘。缺失值策略:输入出现 NaN 或 inf 直接报错,不填补。

核心函数:

  • decision_ledger(returns, positions, cost_per_unit):返回逐日毛收益、换手、净收益与 T+1T+1 个财富点。
  • magnitude_identity(returns, positions):核对 6.1 节恒等式。
  • overlap_autocorrelation(h, n_days, seed):重叠标签的样本自相关与理论值 (h−k)/h(h-k)/h。
  • max_null_sharpe(n_strategies, n_days, n_sims, seed):零真实信号下最佳样本内夏普与同一策略留出期夏普;复用第32章 quant_course.research_protocol.expected_max_standard_normal(_exact)。
  • regime_shift(n_per_regime, slope, seed):状态1训练、状态2评价。

测试:tests/test_ch37_philosophy.py。下面的片段可以单独运行,核对十日案例:

import numpy as np

r = np.array([0.004, 0.003, -0.002, 0.005, -0.030, 0.004, 0.002, -0.001, 0.003, -0.025])
models = {
    "A": np.array([1, 1, 1, 1, -1, -1, -1, -1, 1, -1]),
    "B": np.array([1, 1, -1, 1, 1, 1, 1, -1, 1, 1]),
}
kappa = 0.001
for name, p in models.items():
    turnover = np.abs(np.diff(np.concatenate([[0], p])))
    net = p * r - kappa * turnover
    wealth = np.concatenate([[1.0], np.cumprod(1 + net)])
    acc = np.mean(np.sign(p) == np.sign(r))
    assert np.isclose((p * r).sum(), (np.abs(r) * (2 * (np.sign(p) == np.sign(r)) - 1)).sum())
    print(name, f"acc={acc:.2f}", f"turnover={turnover.sum()}", f"net={wealth[-1] - 1:+.6f}", f"points={wealth.size}")

预期输出:A acc=0.70 turnover=7 net=+0.056879 points=11,B acc=0.80 turnover=9 net=-0.039980 points=11。

历史冻结运行的其余数字(ch37_results.json):

  • 重叠标签 h=5h=5,100,000 个日样本:样本自相关 (0.802,0.604,0.403,0.203,0.004)(0.802,0.604,0.403,0.203,0.004),理论 (0.8,0.6,0.4,0.2,0)(0.8,0.6,0.4,0.2,0)。
  • 多重检验,T=504T=504 日、200 次模拟:N=10,100,1000N=10,100,1000 时最佳样本内年化夏普的模拟均值 1.138、1.814、2.304,公式值 1.088、1.773、2.292;被选中策略在等长留出期的平均夏普 −0.094-0.094、−0.052-0.052、+0.105+0.105。零信号构造使独立留出期的总体期望为0,有限Monte Carlo均值仍可偏离;不能把三组一概称为“与0无法区分”。缓存 N=1000N=1000 的200次均值为0.10456881,描述标准误0.04797481,普通正态近似95%区间约[0.01054,0.19860]。这是缓存的事后描述,不是新的预注册检验,更不是市场alpha。
  • 状态切换,每状态 1,000 个观测、b=0.1b=0.1:状态1估计斜率 +0.0682+0.0682,状态2上相对零预测的 ROS2=−1.95%R^2_{\text{OS}}=-1.95\%;总体 R2R^2 在每个状态内为 0.01/1.01=0.99%0.01/1.01=0.99\%。按 6.6 节公式代入 b^=0.0682\hat b=0.0682:1−[(0.1682)2+1]/1.01≈−1.81%1-[(0.1682)^2+1]/1.01\approx-1.81\%,与模拟值的差来自有限样本中 xx 的方差和截距估计。

10. Visualization

图37-1 十日构造案例的财富路径

图37-1:横轴为财富点编号(0 为起点,第 tt 点是第 tt 日收益之后),纵轴为扣除每单位换手 0.1% 成本后的财富(起点 1.0)。阴影标出第5、10日两次大跌。观察点:B 与买入持有在两次大跌日同步下挫,A 在同样两天上升;B 的准确率最高,终点最低。数据为教学构造。

图37-2 状态切换下的滚动斜率

图37-2:横轴为滚动窗口终点的观测编号,纵轴为 250 个观测窗口的 OLS 斜率(yy 对 xx 的单位变化);虚线为真实斜率,在第 1,000 个观测从 +0.1 变为 −0.1。观察点:滚动估计在切换后约一个窗口长度才跟上;在此之前用旧斜率预测会亏。标题给出状态1训练、状态2评价的 ROS2R^2_{\text{OS}}。构造数据。

图37-3 零真实信号下的最佳夏普比率

图37-3:左图横轴为尝试的零收益策略个数 NN(对数刻度),纵轴为年化夏普比率;红线为 200 次模拟中最佳样本内夏普的平均,虚线为 252/T E[max⁡ZN]\sqrt{252/T}\,E[\max Z_N],绿线为被选中策略在留出期的平均夏普。右图为 N=1000N=1000 时每次模拟的(最佳样本内夏普,留出期夏普)散点。观察点:样本内最佳值随 log⁡N\log N 增长,留出期围绕 0 散布,与样本内高低无关。构造数据,所有真实夏普为 0。

11. Real Market Example

本章不报告真实市场的实测数字。原因:本课程目前没有经许可可用于内部培训的日频个股价格面板(第 Project5 数据决策已记录 Yahoo、Alpha Vantage、Tiingo 等来源的条款限制);Project6 的真实数据状态为 blocked。没有数据时,本节只写清楚一个真实检验应如何做,以及文献里可以引用到哪一步。

应做的检验(数据获得后)。 取一个固定、事前冻结的股票池和样本期;用收盘可得的特征预测下一交易日开盘到开盘的收益;在按日期的 walk-forward 测试中同时报告:方向准确率、幅度加权准确率、IC 与 ROS2R^2_{\text{OS}}(相对 0 和训练均值)、按预测构建的多空组合在成本前后的收益、换手、最大回撤和尾部(最差 1% 日)。若准确率高于 50% 而成本后收益不为正,就复现了本章十日案例的机制。

文献可支持到哪一步。 以下是作者实际读到的原文位置(详见 source_notes.md),它们是别人的样本和口径,不是本书的实测:

  • Gu, Kelly, Xiu(2020,RFS)对美国个股月度超额收益做大规模机器学习预测。其式(19)(第2249页)把样本外 R2R^2 定义为相对零预测、分母不减均值;作者说明对个股而言历史均值预测通常远差于零预测,若改用历史均值作基准,所有方法的月度 R2R^2 约上升三个百分点。表1(第2250页)中用全部特征的 OLS 为 −3.46%-3.46\%,只用规模、价值、动量三个变量的 OLS 为 0.16%,带 Huber 损失的弹性网为 0.11%;正文报告三层神经网络最高约 0.40%。同一篇文章在引言中报告,按神经网络预测排序的十分位多空组合年化样本外夏普为 1.35(市值加权)和 2.45(等权)。这组数字同时说明两件事:个股月度 R2R^2 不到 1%,以及低 R2R^2 可以与可观的组合夏普并存。它们是成本前的数字;等权结果对小盘股和成本更敏感。
  • Campbell, Thompson(2008;NBER 工作论文 w11468 版本,式(1),第5页)对市场指数收益把 ROS2R^2_{\text{OS}} 定义为相对截至上一期的历史均值,并指出即使很小的样本外 R2R^2 也可能对投资者有经济意义。

两篇文章用了不同的基准:个股截面预测用零,指数择时用历史均值。本书第38、39章与 Project6 同时报告两种基准,并写明各自含义。

12. Common Mistakes

12.1 用准确率挑选交易模型

错误:按测试集准确率排序选 B。原因:准确率对每天等权,交易收益按 ∣rt∣|r_t| 加权(6.1节)。

import numpy as np
r = np.array([0.004, 0.003, -0.002, 0.005, -0.030, 0.004, 0.002, -0.001, 0.003, -0.025])
A = np.array([1, 1, 1, 1, -1, -1, -1, -1, 1, -1]); B = np.array([1, 1, -1, 1, 1, 1, 1, -1, 1, 1])
acc = lambda p: np.mean(np.sign(p) == np.sign(r))
wrong_choice = max(("A", A), ("B", B), key=lambda kv: acc(kv[1]))[0]          # 错误:按准确率
pnl = lambda p: (p * r).sum() - 0.001 * np.abs(np.diff(np.concatenate([[0], p]))).sum()
right_choice = max(("A", A), ("B", B), key=lambda kv: pnl(kv[1]))[0]           # 修复:按成本后收益
print(wrong_choice, right_choice, round(pnl(A), 4), round(pnl(B), 4))          # B A 0.056 -0.04

修复:用与决策一致的目标评价,至少同时报告准确率、幅度加权准确率和成本后收益。

12.2 不计换手

错误:只报告毛收益。原因:翻转方向的模型换手大,十日案例中 B 的成本 0.9% 超过 A 的 0.7%;若作示意年化,应先把十日累计成本除以10得到日均,再乘252;不能把十日累计差直接乘252。该外推并不保证未来换手频率不变。修复:评价时把换手和成本列入同一张表;成本口径沿用第35章。

12.3 在全样本里挑最好的策略,再在同一样本里报告

错误代码(零真实信号,100 个策略,挑最好的报告其样本内夏普):

import numpy as np
rng = np.random.default_rng(0)
ins, outs = rng.normal(0, 0.01, (504, 100)), rng.normal(0, 0.01, (504, 100))
sr = lambda x: np.sqrt(252) * x.mean(0) / x.std(0, ddof=1)
k = int(np.argmax(sr(ins)))
print("reported (in-sample) Sharpe:", round(float(sr(ins)[k]), 2))     # 错误:约 1.5–2.2
print("same strategy, holdout:", round(float(sr(outs[:, [k]])[0]), 2))  # 修复:留出期才是证据

本书运行打印 1.92 与 0.83。单次留出期夏普的抽样标准差约 252/504=0.71\sqrt{252/504}=0.71,所以 0.83 只是一次抽样;图37-3 中 200 次模拟的留出期平均值接近 0。原因:选择过程本身制造了高夏普(6.5节)。修复:冻结研究方案,在从未用于选择的留出期评价;同时报告尝试次数并做第22章的多重检验校正及第32章DSR评价。

12.4 把重叠标签当独立样本

错误:每天计算一次 5 日未来收益,对 1,000 个日期直接用 s/1000s/\sqrt{1000} 计算标准误。原因:相邻标签相关 0.8、0.6、…(6.4节),有效样本约 200。修复:

import numpy as np
rng = np.random.default_rng(1)
u = rng.normal(0.0005, 0.01, 1005)
y = np.convolve(u, np.ones(5), mode="valid")[:1000]          # 1000 个重叠的 5 日标签
naive_se = y.std(ddof=1) / np.sqrt(len(y))
nonoverlap = y[::5]
honest_se = nonoverlap.std(ddof=1) / np.sqrt(len(nonoverlap))
print(round(honest_se / naive_se, 2))                        # 约 2.2,接近 sqrt(5)

已知本构造协方差时可直接使用6.4节精确均值方差;第23章 ic_summary(nw_lags=h-1) 是既定Bartlett核诊断,固定 h−1h-1 不等于精确重叠修正(6.4节)。

12.5 数据泄漏(五类各一例)

类别 错误写法 修复
目标泄漏 特征“过去5日收益”误用 shift(-5) 计算,实际是未来5日收益 每个特征登记 available_at,断言 available_at ≤ 精确决策截点(日期与时刻的区别见第38章)
前视特征 用季报“报告期末日”作为财务数据可用时点 用公告/入库时点(第3、第12章 PIT)
预处理泄漏 先对全样本做标准化,再切训练/测试 标准化器只在训练行上拟合(第38章 Pipeline)
选择泄漏 看了测试结果再改特征、再测 测试只用一次;改设计要换新的留出期并记入试验账本
重叠泄漏 随机打乱后 K 折交叉验证,训练标签区间覆盖测试标签区间 按日期划分,按实际标签区间排除训练行(第31、38章)

第38章给出预处理泄漏和随机 K 折的可运行反例与数值差。

12.6 没有基准

错误:报告“样本外 R2=0.3%R^2=0.3\%,模型有效”。原因:不知道 0.3% 是相对 0 还是相对训练均值,也不知道简单规则能做到多少。修复:同表报告零预测、训练均值和一个简单规则在同一测试期、同一成本下的结果;ROS2R^2_{\text{OS}} 写明基准。

13. Quant Research Application

把本章变成一份评价协议,第38–40章与 Project6 都按它执行。

假设。 写成可以被证伪的形式:“收盘可得的特征集合 XX 对未来 hh 日截面收益排序有正的预测力,且按预测构建的美元中性组合在每单位换手成本 κ\kappa 下有正的净收益。”

设计(冻结后才看结果)。 资产池、样本期、频率、signal_time/trade_time、标签区间、特征清单、模型族与超参数网格、训练窗口、调仓频率、成本假设、评价指标与通过门槛。冻结前看过哪些结果要登记(第22章 TrialLedger)。

五项同时检查。

  1. 样本外:按日期 walk-forward;预测指标(IC、ROS2R^2_{\text{OS}} 相对 0 和训练均值)与组合指标(成本后收益、夏普)分开报告。
  2. 稳定性:逐折、逐年的 IC 与收益;系数或重要性在各折间是否同号;状态切换前后是否反转。
  3. 成本:至少两个成本水平;换手;成本前后的差额。
  4. 尾部:最大回撤、最差 1% 日、在大波动日的方向准确率。
  5. 经济逻辑:信号为什么应该有效,谁在付出这份收益;若无法回答,结果再好也只是候选。

基准。 零预测(空仓)、训练均值(截面上全部相同的预测,排序组合为空仓)、一个简单规则。候选模型必须在同一测试期、同一成本下优于基准才进入下一步。

反证条件(任一成立即不支持假设)。 成本后净收益不大于零;ROS2R^2_{\text{OS}} 相对训练均值不为正且 IC 的 Newey–West tt 值不显著;结果只在一个子期成立;结果依赖于选择次数校正前的显著性。

零与负结果。 保留并报告。第39章与 Project6 的构造实验中,有些模型在成本后输给零仓位,这些结果与正结果同样写入报告。

14. Chapter Summary

准确率、R2R^2、IC 是预测的度量;净收益是决策与成本的结果。±1\pm1 仓位下两者由恒等式 ∑ptrt=(∑∣rt∣)(2Acc∣r∣−1)\sum p_tr_t=(\sum|r_t|)(2\mathrm{Acc}_{|r|}-1) 联系,收益幅度相等足以让普通准确率直接替代加权准确率;幅度不等时一般不能替代。金融预测的信噪比低,R2R^2 千分之几是常态,组合是否可用取决于截面宽度、换手与成本。重叠标签使有效样本约减为 1/h1/h;尝试 NN 个设定会把最佳夏普抬高约 252/T E[max⁡ZN]\sqrt{252/T}\,E[\max Z_N];预测关系可能反转,使样本外 R2R^2 为负。泄漏有五条入口,任何一条都会把部署时拿不到的信息带进测试成绩。所以评价金融机器学习模型时,样本外、稳定性、成本、尾部和经济逻辑要一起过关,并始终对照零预测、训练均值和简单规则。

15. Exercises

37-E01(手算:准确率与净收益)

日收益(%)r=(+1.0, −0.2, +0.3, −4.0, +0.2)r=(+1.0,\,-0.2,\,+0.3,\,-4.0,\,+0.2)。模型 C 仓位 (+1,−1,+1,+1,+1)(+1,-1,+1,+1,+1),模型 D 仓位 (−1,−1,−1,−1,+1)(-1,-1,-1,-1,+1)。成本 κ=0.1%\kappa=0.1\% 每单位换手,p0=0p_0=0。分别计算两模型的准确率、幅度加权准确率、毛收益和、换手、累加近似净收益,并说明哪一个更好。

37-E02(换手)

证明:±1\pm1 仓位下,若每天翻转方向的概率为 qq 且与过去独立,TT 天的期望换手为 1+2q(T−1)1+2q(T-1)。q=0.5q=0.5、T=252T=252、κ=0.1%\kappa=0.1\% 时,年化期望成本是多少?

37-E03(状态切换)

在 6.6 节模型中,若用状态1 的完美估计 b^=b\hat b=b 预测状态2,b=0.2b=0.2,求 ROS2R^2_{\text{OS}}(相对零预测)。若状态2 的真实斜率是 0(关系消失),结果又是多少?

37-E04(信噪比)

y=bx+εy=bx+\varepsilon,σx=1\sigma_x=1,σε=2%\sigma_\varepsilon=2\%。要使相关系数达到 0.05,bb 应为多少?此时 R2R^2 与 SNR 各是多少?

37-E05(重叠标签)

h=10h=10 的重叠标签,相邻 1 日、5 日、10 日的理论自相关各是多少?2,520 个日度重叠标签的有效样本量约为多少?

37-E06(多重检验)

T=252T=252 天,尝试 N=50N=50 个零收益策略。用 E[max⁡Z50]≈2.25E[\max Z_{50}]\approx2.25 估计最佳年化夏普的期望。若有人报告“最佳策略年化夏普 2.0”,你如何回应?

37-E07(泄漏分类)

判断下列各属于哪一类泄漏,并给出修复:(a) 用全样本的特征中位数填补缺失;(b) 用测试期的 IC 决定保留哪 5 个特征;(c) 特征“分析师预测修正”使用的是事后修订后的数据库版本;(d) 用随机 10 折交叉验证评估 20 日收益标签的模型。

37-E08(与竞赛的差别)

列出三条金融预测与典型机器学习竞赛在数据生成或评价上的差别,并为每一条说明它会使哪种常见做法失效。

37-E09(基准)

某模型测试期 ∑(y−y^)2=0.981\sum(y-\hat y)^2=0.981,∑y2=0.990\sum y^2=0.990,∑(y−yˉtrain)2=0.985\sum(y-\bar y_{\text{train}})^2=0.985。分别计算相对零与相对训练均值的 ROS2R^2_{\text{OS}},并解释两者为何不同。

37-T01(新增:从分数到三张表)

研究员报告准确率55%,未说明信息入库、成交时点和成本。按“信息表→预测表→账本”各写一个必须补齐的字段,并说明本章下一开盘例与第38–39章下一收盘例能否直接共用标签。

16. Programming Exercises

37-P01(决策账本)

实现 decision_ledger(returns, positions, cost_per_unit),返回逐日换手、净收益和 T+1T+1 个财富点。验收断言:(1) 十日案例 A、B 的复利净收益分别为 +0.056879+0.056879、−0.039980-0.039980(容差 10−610^{-6});(2) 财富点个数 = 收益个数 + 1;(3) 成本为 0 时,±1\pm1 仓位满足 6.1 节恒等式;(4) 输入含 NaN、inf 或长度不一致时抛 ValueError;(5) 某日净收益 ≤−100%\le-100\% 时抛错。

37-P02(有效样本量)

写函数,输入 hh 和日收益序列,生成重叠标签,返回 (a) 样本自相关前 hh 阶,(b) 不重叠子样本与全部重叠样本的标准误之比。用 h=5h=5 和 100,000 个 N(0,1%)N(0,1\%) 日收益验证 (a) 与 (h−k)/h(h-k)/h 的绝对差都小于 0.02,(b) 在 2.0 与 2.5 之间。

37-P03(选择偏差)

模拟 N∈{10,100,1000}N\in\{10,100,1000\} 个零收益策略,各 T=504T=504 天,重复 200 次;记录最佳样本内夏普及其留出期夏普。验收:样本内均值与 252/T E[max⁡ZN]\sqrt{252/T}\,E[\max Z_N] 的差小于 0.15;留出期均值的绝对值小于 0.25。

17. Challenge Problems

37-C01(窗口长度的权衡)

在 6.6 节模型里,真实斜率在未知时点从 bb 变为 −b-b。你用最近 LL 个观测的 OLS 斜率预测下一期。(1) 写出切换后第 ss 期(s<Ls<L)的估计斜率期望。(2) 写出 LL 对估计方差的影响(σx=σε=1\sigma_x=\sigma_\varepsilon=1 时 OLS 斜率方差约 1/L1/L)。(3) 若切换平均每 MM 期发生一次,讨论 LL 的选择。额外先修:第17、19章。评分:(1)(2) 推导正确各 30%;(3) 给出偏差—方差权衡的定性结论并指出无法事前知道 MM 时应怎样做稳健性检查,40%。

37-C02(设计一份评价协议)

为“用 20 个收盘特征预测未来 5 日截面收益”的研究写一页评价协议,覆盖第13节五项检查、三个基准、冻结内容和反证条件。开放题,评分见第18节。

18. Solutions / Solution Hints

37-E01

∣r∣|r| 合计 1.0+0.2+0.3+4.0+0.2=5.71.0+0.2+0.3+4.0+0.2=5.7。C:错在第4日(+1+1 对 −4.0-4.0),Acc=4/5=0.80\mathrm{Acc}=4/5=0.80,Acc∣r∣=1.7/5.7=0.298\mathrm{Acc}_{|r|}=1.7/5.7=0.298,毛收益 1.7−4.0=−2.3%1.7-4.0=-2.3\%。换手:0→+10\to+1(1),第2日 +1→−1+1\to-1(2),第3日 −1→+1-1\to+1(2),共 5,成本 0.5%,近似净收益 −2.8%-2.8\%。D:错在第1、3日,Acc=0.60\mathrm{Acc}=0.60,错的 ∣r∣=1.3|r|=1.3,Acc∣r∣=4.4/5.7=0.772\mathrm{Acc}_{|r|}=4.4/5.7=0.772,毛收益 4.4−1.3=+3.1%4.4-1.3=+3.1\%;换手:初始 1,第5日 −1→+1-1\to+1(2),共 3,成本 0.3%,近似净 +2.8%+2.8\%。D 更好,尽管准确率更低。

37-E02

第1日从 0 建仓,换手 1。之后每天以概率 qq 翻转,翻转一次换手 2,否则 0。期望 =1+∑t=2T2q=1+2q(T−1)=1+\sum_{t=2}^T2q=1+2q(T-1)。q=0.5q=0.5、T=252T=252:1+251=2521+251=252 单位;成本 252×0.1%=25.2%252\times0.1\%=25.2\% 每年(累加口径)。

37-E03

b^=b=0.2\hat b=b=0.2:ROS2=1−[(0.4)2+1]/(0.04+1)=1−1.16/1.04=−11.5%R^2_{\text{OS}}=1-[(0.4)^2+1]/(0.04+1)=1-1.16/1.04=-11.5\%。若状态2 真实斜率为 0:y=εy=\varepsilon,E[(y−b^x)2]=1+b^2=1.04E[(y-\hat bx)^2]=1+\hat b^2=1.04,E[y2]=1E[y^2]=1,ROS2=−4%R^2_{\text{OS}}=-4\%。关系消失也会让模型比零预测差,因为模型仍在下注。

37-E04

ρ=bσx/b2σx2+σε2=0.05\rho=b\sigma_x/\sqrt{b^2\sigma_x^2+\sigma_\varepsilon^2}=0.05,即 b2=0.0025(b2+0.0004)b^2=0.0025(b^2+0.0004),b2(1−0.0025)=10−6b^2(1-0.0025)=10^{-6},b=0.001001b=0.001001(每单位 xx 0.1001%)。R2=0.0025R^2=0.0025;SNR=R2/(1−R2)=0.002506\mathrm{SNR}=R^2/(1-R^2)=0.002506。

37-E05

ρ1=0.9\rho_1=0.9,ρ5=0.5\rho_5=0.5,ρ10=0\rho_{10}=0。有效样本约 2520/10=2522520/10=252。

37-E06

252/252×2.25=2.25\sqrt{252/252}\times2.25=2.25。报告值 2.0 低于零假设下最佳值的期望,不能视为发现;应要求留出期结果、尝试次数和 Deflated Sharpe(第32章;多重检验见第22章)。

37-E07

(a) 预处理泄漏:中位数只用训练行计算,或用每个日期截面中位数(只用当日信息)。(b) 选择泄漏:特征选择放在训练内(内层验证),测试只评价一次。(c) 前视特征:使用 point-in-time 版本,按数据入库时点筛选。(d) 重叠泄漏:20 日标签在随机折之间重叠;改为按日期 walk-forward,并按实际标签区间排除训练行。

37-E08

参考答案(任三条,各需对应失效做法):(1) 分布漂移:典型简化竞赛近似同分布;金融中的时间漂移使随机划分可能把未来状态混入训练,应按实际信息结构判断。(2) 测试集只有一次:部分竞赛允许反复公开榜提交;金融里反复看测试期即选择泄漏。(3) 目标不同:竞赛指标即目标;金融目标是成本后风险调整收益,准确率高可能亏钱。(4) 交易影响价格:竞赛的预测不改变答案;交易规模影响成本与容量。评分:每条差别 1 分,对应失效做法 1 分。

37-E09

相对零:1−0.981/0.990=0.91%1-0.981/0.990=0.91\%。相对训练均值:1−0.981/0.985=0.41%1-0.981/0.985=0.41\%。训练均值本身已解释了 1−0.985/0.990=0.51%1-0.985/0.990=0.51\%(测试期均值不为零且与训练均值同号),模型超出均值的部分只有 0.41%。

37-P01 参考实现与测试

参考实现即 code/ch37_ml_philosophy.py 的 decision_ledger;测试在 tests/test_ch37_philosophy.py,包括十日案例数值、财富点个数、恒等式、非有限输入和 −100%-100\% 边界。运行:

.venv/bin/python -m pytest tests/test_ch37_philosophy.py -q

数值核对:A 的财富路径第 5 点 1.037269、终点 1.056879;B 的终点 0.960020。

37-P02

参考实现 overlap_autocorrelation。本书运行(种子 3703)样本自相关 (0.802,0.604,0.403,0.203,0.004)(0.802,0.604,0.403,0.203,0.004);不重叠与重叠标准误之比在第12.4节片段中约 2.2。若比值超出 [2.0, 2.5],检查标签是否用了 mode="valid" 并截断到相同长度。

37-P03

参考实现 max_null_sharpe;本书运行(种子 3702)样本内均值 1.138、1.814、2.304,公式值 1.088、1.773、2.292,差都小于 0.06;留出期均值 −0.094-0.094、−0.052-0.052、+0.105+0.105。

37-C01 参考论证

(1) 窗口内有 L−sL-s 个旧状态观测、ss 个新状态观测,且 xx 独立同分布时,OLS 斜率近似为两段斜率按样本数加权:E[b^]≈(L−s)b+s(−b)L=b(1−2s/L)E[\hat b]\approx\frac{(L-s)b+s(-b)}{L}=b(1-2s/L),在 s=L/2s=L/2 时过零,s=Ls=L 时完全跟上。(2) 固定设计尺度稳定、误差独立同方差时斜率方差约 σ2/(Lσx2)\sigma^2/(L\sigma_x^2),故按 1/L1/L 变化;LL 越短方差越大。(3) 切换后的平均偏差损失约与 L/ML/M 成正比,方差损失约与 1/L1/L 成正比,在孤立切换、窗口内独立设计且相邻切换不干扰的近似下,若平均损失写作 AL/M+B/LA L/M+B/L,求导得 A/M−B/L2=0A/M-B/L^2=0,故 L≈BM/AL\approx\sqrt{BM/A};常数依信号、噪声与漂移方式而变,不是精确全局最优窗口。无法知道 MM 时,报告多个 LL 的结果,并检查结论是否只在某一 LL 成立。评分:见题面权重;只给结论无推导最多得 40%。

37-C02 评分准则

满分 10 分:五项检查各 1 分(须写出具体指标,如“IC 的 Newey–West t 值,滞后 4”);三个基准 1 分;冻结清单包含时间约定与成本 1 分;反证条件可操作 1 分;说明冻结前看过的结果并登记 1 分;指出零与负结果的保留方式 1 分。可接受的结论包括“证据不足”;把构造数据结果当真实证据扣 3 分。

37-T01 完整解答

信息表可补特征available_at、标签label_available_at、fit_time或精确信号截点,并检查当时可读;预测表可补信号日期、资产、预测值或评价日期集;账本可补trade_time、仓位、换手或成本。每张表任一字段且解释作用即可。55%未包含这些契约,不能直接推出净收益。下一开盘与下一收盘对应不同收益起点,不能共用一个未经重定义的标签;第38章会把精确时刻与日期索引分开。

19. Further Reading

  • Must Know:第22章(研究方案、多重检验)、第32章(DSR与HAC)、第31章(标签区间、purging、walk-forward)。用途:本章 6.4–6.5 节的工具来源。
  • Must Know:scikit-learn《Common pitfalls and recommended practices》(SK_PITFALLS),数据泄漏与训练内预处理两节。用途:第12.5节泄漏分类的软件侧对照。
  • Should Know:Bailey, Borwein, López de Prado, Zhu(2017)关于回测过拟合概率(PBO)。用途:把 6.5 节的选择偏差推广到组合级的过拟合概率。
  • Should Know:第20节列出的机器学习资产定价与回测协议文献,读其样本外 R2R^2 的定义与组合评价部分。
  • Optional:第35、36章,复习换手成本与执行。

20. References

  • SK_PITFALLS:scikit-learn, Common pitfalls and recommended practices。支持第5节预处理泄漏定义与第12.5节修复写法。
  • PBO:Bailey, D. H., Borwein, J., López de Prado, M., Zhu, Q. J. (2017). The probability of backtest overfitting. Journal of Computational Finance. 支持第6.5节选择偏差的背景。
  • DSR:Bailey, D. H., López de Prado, M. (2014). The Deflated Sharpe Ratio. 支持第6.5节 E[max⁡Z]E[\max Z] 近似式(本书第32章 expected_max_standard_normal 实现)。
  • CH22_HLZ2014:Harvey, Liu, Zhu. …and the Cross-Section of Expected Returns. 支持第5节多重检验在因子研究中的背景。
  • CH37_GKX2020:Gu, S., Kelly, B., Xiu, D. (2020). Empirical Asset Pricing via Machine Learning. Review of Financial Studies 33(5), 2223–2273. 作者核读:§1.8 式(19)第2249页(ROS2R^2_{\text{OS}} 相对零预测及理由)、表1 第2250页(OLS −3.46%-3.46\%、OLS-3 0.16%、ENet+H 0.11%)、§2.2 NN3 0.40%、引言中多空组合夏普 1.35/2.45。支持第5节 ROS2R^2_{\text{OS}} 基准、第11节证据边界。
  • CH37_CT2008:Campbell, J. Y., Thompson, S. B. (2008). Predicting Excess Stock Returns Out of Sample: Can Anything Beat the Historical Average? Review of Financial Studies 21(4), 1509–1531;作者读 NBER w11468 版本式(1)第5页。支持第5节历史均值基准定义。
  • CH37_AHM2019:Arnott, R., Harvey, C. R., Markowitz, H. (2019). A Backtesting Protocol in the Era of Machine Learning. Journal of Financial Data Science 1(1), 64–74。来源侦察报告读到全文(引言、交易成本一节);作者未重新打开,仅作第13节评价协议的延伸阅读。
  • 泄漏的学术定义(Kaufman 等 2012)与“准确率与经济收益背离”的专题论文(Leung 等 2021)均因访问限制未读到全文,本章不引用其具体结论;对应内容由第6.1节推导与 SK_PITFALLS 支撑。核读记录见 course/zh/chapters/ch37/source_notes.md。

搜索教材

输入关键词开始搜索。