halo 的技术博客

返回

问题:日收益被三个时段瓜分,功劳簿怎么记#

一只在多个时段(或多个市场)交易的股票,从昨天收盘到今天收盘涨了 2%。这 2% 是什么时候「发现」的?

  • 盘前集合竞价里,一条隔夜财报消息把价格顶高了 0.4%;
  • 连续竞价的六个半小时里,价格在多空拉锯中又涨了 1.3%;
  • 盘后交易时段,一笔机构大单再推了 0.3%。

直觉的记账方式很简单:每个时段的收益除以全天收益,就是它的「贡献份额」。盘前 0.4/2.0 = 20%,盘中 65%,盘后 15%,加起来正好 100%。数学上无懈可击。

问题出在加总多天的时候。今天全天涨 2%,这个除法很稳;但下周三如果全天只涨 0.02%——盘中涨 0.5%、盘后跌 0.48%,两段几乎抵消——那么盘中的「贡献比」就是 0.5/0.02 = 2500%,盘后是 -2400%。一个几乎没有信息的日子,产生了两个天文数字的贡献比。把这种日子和正常日子简单平均,结果就是垃圾。

一天的价格路径

Barclay 和 Hendershott(2003)在研究美股盘前盘后交易时给出的解法朴素到近乎狡猾:按日收益的绝对值加权平均。信息稀薄的日子权重自动趋近于零,它再疯狂的贡献比也掀不起浪。这个统计量就是加权价格贡献(Weighted Price Contribution, WPC)。

定义:两行公式#

把第 (t) 天切成 (K) 个时段,时段 (k) 的对数收益是 (r_{k,t}),全天收益 (r_t = \sum_k r_{k,t})。时段 (k) 的 WPC 定义为:

WPCk=t=1Trts=1Trs权重:这天有多少信息×rk,trt这天时段 k 的份额\mathrm{WPC}_k = \sum_{t=1}^{T} \underbrace{\frac{|r_t|}{\sum_{s=1}^{T} |r_s|}}_{\text{权重:这天有多少信息}} \times \underbrace{\frac{r_{k,t}}{r_t}}_{\text{这天时段 } k \text{ 的份额}}

两个乘数各司其职:右边是单日贡献比(可以疯狂),左边是这一天在整个样本里的信息权重(疯狂的日子权重小)。所有时段的 WPC 加总恒等于 1,这是它比很多价格发现度量优雅的地方——份额天然可加、可比。

直觉上,WPC 回答的问题是:「在那些价格真正动了的日子里,价格主要是在哪个时段动的?

模拟:WPC 贴住真相,不加权平均给出荒谬答案#

构造一个知道标准答案的世界:1000 个交易日,每天的信息总量随机(25% 的日子是大信息日,其余日子信息稀薄),真实信息份额固定为盘前 15% / 盘中 70% / 盘后 15%,每个时段再叠加微观结构噪声(盘前盘后流动性差,噪声更大),且相邻时段噪声部分回吐(模拟 bid-ask bounce)。

import numpy as np

def wpc(sess_ret, day_ret):
    """加权价格贡献:sess_ret (T,K),day_ret (T,)"""
    w = np.abs(day_ret) / np.abs(day_ret).sum()      # 每日权重
    ratio = sess_ret / day_ret[:, None]              # 单日贡献比
    return (w[:, None] * ratio).sum(axis=0)          # 加权求和

def naive_share(sess_ret, day_ret, eps=1e-6):
    """不加权:直接对每日贡献比取平均(错误示范)"""
    mask = np.abs(day_ret) > eps
    return (sess_ret[mask] / day_ret[mask, None]).mean(axis=0)
python

1000 天跑下来:

时段真实份额WPC不加权平均
盘前0.1500.1560.317
连续竞价0.7000.6820.268
盘后0.1500.1620.414

WPC 三个份额全部贴在真实值 ±0.02 以内。不加权平均则完全崩坏:盘中真实份额 70%,它估出 27%;盘后真实 15%,它估出 41%——方向都是反的。原因就是右图那个喇叭口:

WPC vs 不加权平均

日收益绝对值越小,单日贡献比的散布越疯狂(图中纵轴已经截断在 ±8,实际有到几百的点)。盘前盘后噪声大,在小收益日里它们的伪贡献恰好最容易爆表——不加权平均就是被这些日子绑架的。加权不是锦上添花,是这个估计量能用的前提。

多少天才够:60 天窗口是噪声制造机#

WPC 是一个样本统计量,样本短了照样飘。对每个窗口长度做 400 次独立模拟,看盘后 WPC(真实值 0.15)的抽样分布:

WPC 收敛性

  • 60 天:四分位距约 ±0.05,极端样本能偏到 0.05 或 0.28——差出接近两倍;
  • 250 天(一年):分布明显收紧,中位数贴住 0.15;
  • 500 天以上:基本稳定。

实务含义直接:用 WPC 比较两个时段/市场的价格发现能力,窗口短于一年时差异很可能只是噪声。论文里常见的「XX 时段 WPC 从 12% 上升到 18%」这种结论,如果窗口只有一个季度,先查显著性再信。

滚动 WPC:看见价格发现的迁移#

WPC 最有生产力的用法不是算一个静态数字,而是滚动着算,监测价格发现的结构性迁移。模拟一次制度变化:前 500 天盘后份额 15%,后 500 天盘后交易活跃化、份额升到 40%(对应现实里美股盘后交易量近十年的持续增长,或 A 股若引入盘后固定价格交易的场景):

滚动 WPC

250 日滚动窗口下,三条 WPC 曲线在断点后开始移动,约一个窗口长度后完全反映新均衡——盘中从 0.70 滑向 0.50,盘后从 0.15 爬到 0.40。这类图直接回答的问题包括:

  • 新交易时段(盘后固定价格、科创板做市)上线后,有没有真的承接价格发现,还是只是搬运噪声;
  • 同一只股票 A+H 两地上市,价格发现的重心在向哪边漂移;
  • 期货 vs 现货、ETF vs 成份股,谁在引领。

与 Hasbrouck 信息份额的分工#

价格发现度量这条线上,WPC 经常和 Hasbrouck 信息份额(Information Share, IS)放在一起比。分工其实很清楚:

WPCHasbrouck IS
数据要求各时段/市场的收益切片多市场同步高频报价
方法加权平均,两行代码VECM + 方差分解
输出份额,加总恒为 1份额区间(上下界)
适用时段拆分、粗粒度市场对比严格同时交易的多市场

WPC 的本质是把日收益在时间轴上做归因,不需要两个市场同时报价——盘前和盘中根本不重叠,IS 类方法直接失效,WPC 却天然适用。代价是它更粗糙:只看收益切片,不建模价格之间的引领滞后关系。经验法则:时段互斥用 WPC,市场并行用 IS

诚实边界#

第一,微观结构噪声不满足鞅假设时有偏。 WPC 隐含假设各时段收益是「信息 + 均值为零的噪声」。如果盘前价格系统性过度反应、盘中回吐(动量-反转结构),WPC 会把盘前的过度反应记成盘前的「价格发现」,把盘中的纠错记成负贡献。模拟里相邻时段噪声回吐 50% 的设定已经让估计有 1-2 个百分点的偏差;现实中隔夜-日内的系统性反转(参考隔夜收益异象的文献)会更严重。WPC 度量的是「价格在哪动」,不完全等于「信息在哪进」。

第二,时段划分本身就是结论的一部分。 盘前算到几点、集合竞价算独立时段还是并入盘中,不同划分给出不同份额。跨研究比较 WPC 数字前,先对齐切法——这和收盘集合竞价失衡一文里「收盘价语义取决于机制」是同一类问题。

第三,无法区分「先动」与「动得对」。 某时段份额高,可能因为它信息效率高,也可能只是因为它恰好排在信息发布日程(财报、宏观数据)之后。想说因果,要控制信息到达时点,或者用制度变化做自然实验——WPC 本身只是记账,不是归因。

归宿#

WPC 是价格发现工具箱里的粗粒度速写笔:两行代码、只要收益切片、份额天然可加。用它做时段拆分、监测价格发现迁移、给制度变化做前后对比,都是本职工作;要更精细的多市场引领关系,交给 IS/VECM 那条线。记住两条铁律:必须加权(否则被小收益日炸飞),窗口至少一年(否则差异是噪声)。

加权价格贡献 WPC:多市场交易时谁贡献了价格发现
https://blog.halo26812.eu.org/blog/weighted-price-contribution
Author halo
Published at 2026年7月27日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨