信息表征与 A 股微观陷阱
最后一章讲两件事,它们都发生在「回测世界」的边界上:一是信息的边界——一份看起来很高级的新数据,怎么判断它到底有没有信息;二是规则的边界——回测代码写得再干净,也会被 A 股的微观交易规则(涨跌停、除权除息)打碎。这两件事有个共同点:它们的坑都不在代码里,而在对世界的表征里。
指标 ≠ 信息 ≠ 收益
Section titled “指标 ≠ 信息 ≠ 收益”先立一个三层结构,它是后面所有讨论的骨架:
可观测指标 o → 潜在信息 s → 未来收益 r(你拿到的数据) (真实的状态) (你要的东西)人话解释:第 11 章说过,因子是真实信号 的带噪代理——数据里混着信息和大比例的噪声。这一章再往深一层:很多数据连 的边都没碰到。龙虎榜、资金流、舆情热度、另类数据……每一家供应商都会告诉你「这是独立信息源」。判断的标准只有一条:把日 K 线已有的信息剔除之后,它对未来收益还有没有解释力。
为什么必须「剔除之后再看」?因为日 K(价格、成交量)是全市场都在看的信息,任何新数据里与日 K 重合的部分毫无价值——市场早就消化了。新数据的全部价值在于它的增量。
相关与偏相关:手算
Section titled “相关与偏相关:手算”判断的第一步是把「相关」算清楚。Pearson 相关系数第 2 章见过,这里手算一遍最小样本。5 个交易日,某新数据当日值(已标准化) 与次日收益 (%):
| 日期 | 新数据 | 次日收益 |
|---|---|---|
| 1 | −2 | −0.3 |
| 2 | −1 | +0.5 |
| 3 | 0 | −0.4 |
| 4 | +1 | +0.6 |
| 5 | +2 | −0.4 |
(五个值恰好加起来为零),;,。代入:
≈ 0,正交。这份数据与未来收益基本不相关——无论供应商的 PPT 写得多玄。
但「原始相关 ≈ 0」还不是终点。考虑一种更微妙的情况:新数据与收益的原始相关有 0.4,看着不错;可它与日 K 信息的相关高达 0.8——它预测收益的能力,其实是「换算过的价格动量」,日 K 本来就能做到。判断增量要用偏相关,人话版三步:
- 用日 K 信息回归未来收益,取残差(收益中日 K 解释不掉的部分);
- 用日 K 信息回归新数据,取残差(新数据与日 K 重合的部分剥掉);
- 算两个残差的相关——这就是「剔除日 K 之后,新数据对收益还有多少解释力」。
信息审计象限:正交区 = 价格盲区
Section titled “信息审计象限:正交区 = 价格盲区”把每个候选数据画到一张二维地图上:横轴 = 它与日 K 已有信息的相关,纵轴 = 它与未来收益的相关。原点十字把平面切成四个象限,三个有名字:
- 增量区(右上,横 ≈ 0、纵 > 0):与已有信息正交、且预测收益——真·新信息,值得进特征池;
- 冗余区(右下,横 > 0、纵 ≈ 0):与日 K 高度重合、对收益无增量——换皮的老信息,白花钱;
- 盲区(原点附近):既不与日 K 重合、也不预测收益——与价格世界完全无关。
本章演示数据是 40 个候选「另类数据」变量的合成截面(信息审计象限演示(合成):40 个候选另类数据变量。x = 与日K已有综合信息的截面相关,y = 与未来收益的截面相关。三个区域预置:增量区 6 个(x≈0、y>0.15:与已有信息正交且预测收益)、盲区 24 个(x≈0、y≈0:与价格世界无关)、冗余区 10 个(x>0.4、y≈0:与日K高度重合、无增量)。横纵均为同一截面、同一对齐口径的相关系数):
先声明成色:三个区域的点位是按剧本生成的(增量 6 个、盲区 24 个、冗余 10 个),但区域的比例是写实的——真实研究里,绝大多数另类数据点落在原点附近那个最拥挤的象限。
这正是本节标题的反直觉结论:正交区 = 价格盲区。「与价格信息正交」经常被当成卖点(「独立信息源,与市场无相关性!」),但实测的真相是:与日 K 正交、同时也与未来收益正交的数据占绝大多数——正交不是「独立的信息」,正交恰恰意味着它落在价格世界的盲区里,什么也照不亮。反过来,真正能预测收益的信息,市场往往已经(部分地)反映在价格里了,反而不会完全正交。所以面对任何新数据,第一问不是「它新不新」,而是「它增不增」。
涨跌停:你的订单可能根本不存在
Section titled “涨跌停:你的订单可能根本不存在”信息审计管「输入」,接下来的两节管「输出」——回测假设的成交,在 A 股会怎样失真。
规则先摆齐:主板 ±10%,创业板 / 科创板 ±20%,ST ±5%,北交所 ±30%。涨停价 = 前收盘 ×(1 + 限制比例),四舍五入到分。
微观现实是:一字涨停板上,你的买单大概率不成交。涨停价封死意味着卖盘枯竭、涨停价上堆积巨量买单,你的单子排在队尾——没有人卖给你,价格就不动,你就成交不了。跌停想卖出同理。而回测引擎「收盘价成交」的默认假设,在板上一文不值。
更要命的是资产冻结:想卖卖不掉,风险敞口被强制延续。手算一遍——三只股票等权持仓,账户止损线 −7%。某天 A、B 双双跌停 −10%,C 跌 −6%:
回测的幻想:三只全部按收盘价卖出,组合当日 ,触发止损,清仓离场,事故到此结束。
现实的账:只有 C(−6%,没封板)卖掉了。A、B 冻结在持仓里。次日 A 再跌停 −10%,B 打开跌停 −5% 卖出:
−13.2%——比回测的结局再深 4.5 个百分点,而且 A 还冻着。这 4.5 个点不在任何「参数」里,它来自撮合假设。回测引擎必须模拟它:
- 收盘价 = 涨停价(尤其次日开盘仍封死的)→ 买入视为不成交(排队失败);
- 收盘价 = 跌停价 → 卖出视为排队中,持仓冻结带入下一日重试;
- 一律从保守 side 处理:高估成本、低估成交。回测是给现实拍预告片,不是拍写真。
双口径复权:指标用 QFQ,记账用 BFQ
Section titled “双口径复权:指标用 QFQ,记账用 BFQ”第 1 章讲过复权消除除权跳空:前复权(QFQ)把除权前的历史价格按比例缩下去,序列连续,均线、动量等指标才不会在除权日出现断崖。但账户记账必须用另一套口径:真实价格(不复权,BFQ)+ 真实股数 + 现金事件。
手算一遍为什么。持有某股 1000 股,收盘价 20 元,市值 20000 元。公司公告:10 派 2 送 10(每股派现金 0.2 元,每 10 股送 10 股)。除权日:
除权后你拥有:2000 股 × 9.9 元 = 19800 元 + 现金分红 1000 × 0.2 = 200 元,合计 20000 元——一分没亏(红利税此处从简)。价格腰斩是记账事件,不是亏损。
两种典型的错账:
- 记账跟着 QFQ 走:QFQ 序列在除权日是连续的(比如仍显示 19.8),用它 × 旧股数 1000 = 19800——送股的 1000 股凭空消失,此后每天净值都错一倍持仓。
- 只调股数不记现金:股数改成 2000 了,但 200 元分红没进现金账户——每次分红都漏记,净值系统性偏低。
正确架构是两层分离:信号层用 QFQ 算指标(第 3 章的 建立在连续价格上);账户层用 BFQ 真实价格 + 真实股数 + 除权事件表(事件日:股数 × 送转比例,现金 += 每股分红 × 旧股数)。两层的桥接点只有一个:信号算完、换成订单的那一刻。
伪代码:带微观规则的撮合与记账
Section titled “伪代码:带微观规则的撮合与记账”输入:BFQ 价格、复权因子与分红送转事件表、QFQ 口径的信号 s[t]输出:真实账户净值序列
对每个交易日 t: 1. 信号层:用 QFQ 价格计算指标,生成 s[t] (只用 t 日及之前数据,第 3 章防前视纪律) 2. 事件层:若 t 是除权日,先处理持仓: 股数 ← 股数 × 送转比例 现金 ← 现金 + 每股分红 × 处理前股数 3. 撮合层:执行昨日的信号(信号次日生效,第 3 章约定): 买入:若 t 日收盘 = 涨停价且盘中未开板 → 排队失败,不成交 否则按成交价(含滑点)成交,扣佣金 卖出:若 t 日收盘 = 跌停价 → 排队中,持仓冻结,次日重试 否则按成交价卖出 4. 记账层:净值[t] = 现金 + Σ(股数 × BFQ 收盘价)
限额提示:涨停/跌停价按板块规则分别取 ±10% / ±20% / ±5% / ±30%,按股票代码硬匹配,不许全局写死一个 10%- 「另类数据」崇拜。正交 ≠ 增量。采购或接入任何新数据源之前,先跑一遍象限审计——多数数据在原点附近,那一步就能省下几个月的工程和一份年费。
- 偏相关忘了防前视。审计用的「未来收益」必须从 起算、「日 K 信息」必须只用 及之前——审计本身也是回测,第 1 章的未来函数在这里同样适用。
- 涨跌停只处理一边。买入排队模拟了、卖出冻结没模拟(或反过来)——牛市的回测和熊市的回测各错一半。两边都要有,且都从保守 side。
- 限价比例写死 10%。创业板 20%、ST 5% 全被当成「未封板」处理,拒单检测漏掉一半的板。按代码前缀分板块配置,写进测试用例。
- 复权只在价格层做。指标层 QFQ、账户层也顺手用 QFQ 价格 × 股数——每次除权账户错一截。事件表(股数、现金)必须和 BFQ 价格在同一层记账。
到这里,「研究者亲手做研究」的武器已经齐备:状态机、门禁、排序、无偏验证、信息审计——每一个结论都要能被数据证伪,每一分回测利润都要能扛住摩擦与规则再落地。但接下来的三章要面对一个新的现实:机器开始介入研究本身——机器在公式空间里自动挖因子、机器像研究员一样提假设跑实验,以及无论研究者是人还是机器都绕不开的原料质检:论文与工具怎么挑。