跳转到内容

信息表征与 A 股微观陷阱

最后一章讲两件事,它们都发生在「回测世界」的边界上:一是信息的边界——一份看起来很高级的新数据,怎么判断它到底有没有信息;二是规则的边界——回测代码写得再干净,也会被 A 股的微观交易规则(涨跌停、除权除息)打碎。这两件事有个共同点:它们的坑都不在代码里,而在对世界的表征里。

先立一个三层结构,它是后面所有讨论的骨架:

可观测指标 o → 潜在信息 s → 未来收益 r
(你拿到的数据) (真实的状态) (你要的东西)

人话解释:第 11 章说过,因子是真实信号 ss 的带噪代理——数据里混着信息和大比例的噪声。这一章再往深一层:很多数据连 ss 的边都没碰到。龙虎榜、资金流、舆情热度、另类数据……每一家供应商都会告诉你「这是独立信息源」。判断的标准只有一条:把日 K 线已有的信息剔除之后,它对未来收益还有没有解释力。

为什么必须「剔除之后再看」?因为日 K(价格、成交量)是全市场都在看的信息,任何新数据里与日 K 重合的部分毫无价值——市场早就消化了。新数据的全部价值在于它的增量。

判断的第一步是把「相关」算清楚。Pearson 相关系数第 2 章见过,这里手算一遍最小样本。5 个交易日,某新数据当日值(已标准化)xx 与次日收益 rr(%):

日期新数据 xx次日收益 rr
1−2−0.3
2−1+0.5
30−0.4
4+1+0.6
5+2−0.4

rˉ=0\bar{r} = 0(五个值恰好加起来为零),∑xi(ri−rˉ)=0.6−0.5+0+0.6−0.8=−0.1\sum x_i(r_i - \bar{r}) = 0.6 - 0.5 + 0 + 0.6 - 0.8 = -0.1;∑xi2=10\sum x_i^2 = 10,∑(ri−rˉ)2=0.09+0.25+0.16+0.36+0.16=1.02\sum (r_i-\bar{r})^2 = 0.09+0.25+0.16+0.36+0.16 = 1.02。代入:

corr(x,r)=−0.110×1.02=−0.13.19≈−0.03\text{corr}(x, r) = \frac{-0.1}{\sqrt{10 \times 1.02}} = \frac{-0.1}{3.19} \approx -0.03

≈ 0,正交。这份数据与未来收益基本不相关——无论供应商的 PPT 写得多玄。

但「原始相关 ≈ 0」还不是终点。考虑一种更微妙的情况:新数据与收益的原始相关有 0.4,看着不错;可它与日 K 信息的相关高达 0.8——它预测收益的能力,其实是「换算过的价格动量」,日 K 本来就能做到。判断增量要用偏相关,人话版三步:

  1. 用日 K 信息回归未来收益,取残差(收益中日 K 解释不掉的部分);
  2. 用日 K 信息回归新数据,取残差(新数据与日 K 重合的部分剥掉);
  3. 算两个残差的相关——这就是「剔除日 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%:

回测的幻想:三只全部按收盘价卖出,组合当日 −10−10−63=−8.67%\frac{-10-10-6}{3} = -8.67\%,触发止损,清仓离场,事故到此结束。

现实的账:只有 C(−6%,没封板)卖掉了。A、B 冻结在持仓里。次日 A 再跌停 −10%,B 打开跌停 −5% 卖出:

净值=0.9×0.9+0.9×0.95+0.943=0.81+0.855+0.943≈0.868\text{净值} = \frac{0.9 \times 0.9 + 0.9 \times 0.95 + 0.94}{3} = \frac{0.81 + 0.855 + 0.94}{3} \approx 0.868

−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 股)。除权日:

除权参考价=20−0.22=9.9 元\text{除权参考价} = \frac{20 - 0.2}{2} = 9.9 \text{ 元}

除权后你拥有:2000 股 × 9.9 元 = 19800 元 + 现金分红 1000 × 0.2 = 200 元,合计 20000 元——一分没亏(红利税此处从简)。价格腰斩是记账事件,不是亏损。

两种典型的错账:

  1. 记账跟着 QFQ 走:QFQ 序列在除权日是连续的(比如仍显示 19.8),用它 × 旧股数 1000 = 19800——送股的 1000 股凭空消失,此后每天净值都错一倍持仓。
  2. 只调股数不记现金:股数改成 2000 了,但 200 元分红没进现金账户——每次分红都漏记,净值系统性偏低。

正确架构是两层分离:信号层用 QFQ 算指标(第 3 章的 sts_t 建立在连续价格上);账户层用 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%
  1. 「另类数据」崇拜。正交 ≠ 增量。采购或接入任何新数据源之前,先跑一遍象限审计——多数数据在原点附近,那一步就能省下几个月的工程和一份年费。
  2. 偏相关忘了防前视。审计用的「未来收益」必须从 t+1t+1 起算、「日 K 信息」必须只用 tt 及之前——审计本身也是回测,第 1 章的未来函数在这里同样适用。
  3. 涨跌停只处理一边。买入排队模拟了、卖出冻结没模拟(或反过来)——牛市的回测和熊市的回测各错一半。两边都要有,且都从保守 side。
  4. 限价比例写死 10%。创业板 20%、ST 5% 全被当成「未封板」处理,拒单检测漏掉一半的板。按代码前缀分板块配置,写进测试用例。
  5. 复权只在价格层做。指标层 QFQ、账户层也顺手用 QFQ 价格 × 股数——每次除权账户错一截。事件表(股数、现金)必须和 BFQ 价格在同一层记账。

到这里,「研究者亲手做研究」的武器已经齐备:状态机、门禁、排序、无偏验证、信息审计——每一个结论都要能被数据证伪,每一分回测利润都要能扛住摩擦与规则再落地。但接下来的三章要面对一个新的现实:机器开始介入研究本身——机器在公式空间里自动挖因子、机器像研究员一样提假设跑实验,以及无论研究者是人还是机器都绕不开的原料质检:论文与工具怎么挑。