传播子模型 Propagator:把每笔成交的冲击衰减写成核函数
Kyle 说冲击是永久的,平方根定律说冲击是凹的,传播子模型(Bouchaud 2004)说:都对,但你们少了时间维度。每笔成交的冲击不是一个数,是一条衰减曲线 G(ℓ)=G₀/(1+ℓ)^β——价格是所有历史成交冲击残留的叠加。模拟实测三条 β 曲线的执行实验:50 笔子单打完后,β=0.9 时残留只剩 5.5%(冲击几乎全是暂时的),β=0.2 时残留 55.5%(切碎不消失);实证 β≈0.4-0.6 恰好卡在中间。模型最深刻的预言是扩散性悖论的解:订单流符号自相关是幂律长记忆(本文模拟 C(ℓ)~ℓ^-0.6),价格却近似随机游走——唯一自洽的方式是核衰减恰好抵消订单流记忆,β≈(1-γ)/2 的临界关系不是巧合而是市场自组织的结果。60000 笔模拟数据用 80 阶滞后 OLS 反解核函数:对数斜率估出 -0.483 vs 真实 -0.5,G(1)/G(10)/G(50) 全部贴住真值。工程含义:执行成本模型必须区分『打单时的峰值冲击』和『打完后的残留冲击』,TWAP 拆单省的钱全部来自衰减段;反过来做冲击套利(跟着大单买)赚的是同一段衰减。诚实边界:核的平稳性假设在危机中失效、线性叠加忽略流动性反馈、日内与日间核形状不同(中阶)
传播子模型 Propagator:把每笔成交的冲击衰减写成核函数#
关于市场冲击,前面几篇文章已经给出两个看似矛盾的答案。Kyle (1985) 说:冲击是线性且永久的,λ 是信息的价格,切碎订单也不会消失。平方根冲击定律说:母单冲击是凹的,I≈Y·σ·√(Q/V),而且完成后价格会回落 1/3 到 1/2。
一个说永久,一个说回落。谁对?
Bouchaud、Gefen、Potters、Wyart 在 2004 年给出的传播子模型(propagator model)说:都对,但你们都少了一个维度——时间。每笔成交的冲击不是一个数字,而是一条随时间衰减的曲线。价格在任意时刻的位置,是所有历史成交留下的冲击残留的叠加。
这个视角一旦建立,“永久 vs 暂时”的争论就变成了一个可测量的参数:衰减指数 β。本文用模拟把这个模型的机制、预言和估计方法完整跑一遍。
一、模型:价格是历史冲击的卷积#
传播子模型把价格写成:
其中 是第 笔成交的方向(买 +1,卖 -1), 是成交量(,单笔冲击也是凹的),而 就是传播子核——一笔成交发生 步之后,它对价格的残留影响。
实证研究发现 是幂律衰减:

左图是线性坐标下三条不同 β 的核;右图换到对数坐标,幂律衰减变成直线。三条曲线代表三种市场性格:
- β=0.2(慢衰减):一笔成交的影响 200 步后还剩 35%,冲击近似永久,接近 Kyle 的世界
- β=0.5:中间地带,实证测得的股票市场大多在 β≈0.4-0.6
- β=0.9(快衰减):影响迅速消散,冲击几乎全是暂时的流动性效应
注意这个模型和 Kyle 的根本区别:Kyle 里冲击是一次性台阶(阶跃函数,永不回落),相当于 β=0 的特例。传播子模型允许台阶慢慢塌陷。
def power_kernel(lags, G0=1.0, beta=0.5, l0=1.0):
"""传播子核 G(l) = G0 / (l0 + l)^beta"""
return G0 / (l0 + np.asarray(lags, dtype=float)) ** beta
def simulate_price(signs, vols, G0, beta, sigma_noise=0.02):
"""价格 = 所有历史成交冲击残留的叠加 + 噪声"""
T = len(signs)
kern = power_kernel(np.arange(1, T + 1), G0, beta)
impact = signs * np.sqrt(vols) # 单笔冲击 ~ eps * v^0.5
p = np.zeros(T)
for t in range(1, T):
p[t] = np.sum(kern[t - 1 - np.arange(t)] * impact[:t])
return p + np.cumsum(rng.normal(0, sigma_noise, T))python二、扩散性悖论:这个模型为什么必须存在#
传播子模型不是为了调和 Kyle 和平方根定律而拍脑袋发明的。它解决的是微观结构里一个更根本的悖论。
实证事实一:订单流符号有超长记忆。买单后面更可能跟买单,这个自相关是幂律衰减的,,γ≈0.5-0.7,能延续几千笔成交。原因很朴素:大机构拆单,一张母单切成几百片子单,方向全部相同。
实证事实二:价格近似随机游走。收益率自相关在几笔成交之后就归零,否则就存在裸的统计套利。
这两件事放在一起是矛盾的:如果每笔成交都推动价格(方向持续为正),而成交方向又高度可预测,那价格应该是超扩散的(趋势性强到离谱)。但它不是。
传播子模型给出的答案:核的衰减恰好抵消了订单流的记忆。新来的同向成交不断把价格往上推,但旧成交的冲击同时在塌陷,两股力量在幂律指数上精确对消:
γ≈0.5 的订单流记忆对应 β≈0.25-0.5 的核衰减。这不是巧合,而是市场自组织到临界状态的结果——做市商的报价策略恰好把可预测的订单流”定价掉”了。
我用多尺度马尔可夫链叠加生成了带幂律记忆的订单流符号(40000 笔,滞后 1/10/100 的自相关分别为 0.365/0.104/0.018,近似 衰减),然后在三种 β 下模拟价格:

右图的响应函数 是这场对抗的记分牌——它测量”一笔买单之后 ℓ 步,价格平均高了多少”:
- β=0.2(衰减太慢):R(ℓ) 单调上涨不回头。旧冲击不塌陷,新同向单继续推,价格超扩散——这样的市场里跟单策略稳赚,不可持续
- β=0.6(近临界):R(ℓ) 先升后趋平。两股力量接近平衡,价格近似扩散——这是真实市场的形态
- β=0.9(衰减太快):R(ℓ) 冲高后回落。冲击塌陷快过新单补充,价格均值回归——这样的市场里反着做稳赚
真实市场只能活在中间那条线上。**β 不是自由参数,它被无套利条件钉死在临界值附近。**这是传播子模型最深刻的洞察。
三、执行实验:切碎的订单到底省不省钱#
把模型对准最实际的问题:一张母单切成 50 笔子单连续打出去,价格路径长什么样?

三条曲线的形状差异就是”永久 vs 暂时”之争的定量答案:
| β | 执行结束时峰值冲击 | 400 步后残留 | 残留/峰值 |
|---|---|---|---|
| 0.2(慢衰减) | 0.551 | 0.306 | 55.5% |
| 0.5 | 0.238 | 0.052 | 21.7% |
| 0.9(快衰减) | 0.088 | 0.005 | 5.5% |
三个直接推论:
第一,执行成本要拆成两笔账。 你在执行期间支付的是沿途价格(被自己前面的子单推高),这部分由峰值段决定;执行完成后组合的持仓成本则锚定残留段。β=0.5 时残留只有峰值的 22%——你付出的冲击成本里近八成会”还给你”(浮亏收窄),但前提是你是长期持有者。高换手策略等不到冲击塌陷就要反向平仓,等于峰值买入、峰值卖出,两头挨打。
第二,拆单省钱的机制现在有了精确刻画。 平方根定律那篇文章里的传播子拆单实验(β=0.9 拆 64 片省一半、β=0.2 切碎不消失)就是这张图的直接推论:拆单省的钱全部来自衰减段——前面子单的冲击在你打后面子单时已经塌陷了一部分。β 越大塌陷越快,拆单越划算;β→0 退化回 Kyle,切碎无用。
第三,冲击套利的利润也写在这条曲线里。 如果你能识别别人的母单正在执行(订单流长记忆使这成为可能),跟着买、在峰值附近卖,赚的正是”峰值 − 残留”这段塌陷。这也是为什么实盘算法要做子单随机化——你的执行痕迹就是别人的信号。
四、从数据反解核函数:一个可复现的估计流程#
模型好看,但 G(ℓ) 能从数据里估出来吗?这里有个新手必踩的坑:不能直接用响应函数 R(ℓ) 当核。因为订单流有自相关,R(ℓ) 混合了”这笔单自己的冲击”和”它的同伙们的冲击”,直接读数会高估核的持久性。
正确做法是把价格增量对滞后冲击做多元回归。模型的差分形式是:
对 80 阶滞后做 OLS,系数的累积和就是核本身。多元回归自动处理了回归元之间的自相关——这正是它比”直接读响应函数”高明的地方:
# 80 阶滞后 OLS:Delta_p 对历史冲击回归,系数累加还原 G
imp = signs * np.sqrt(vols)
dp = np.diff(prices)
X = np.column_stack([imp[Lmax-k : Lmax-k+rows] for k in range(Lmax+1)])
coef, *_ = np.linalg.lstsq(X, dp[Lmax:], rcond=None)
G_est = np.cumsum(coef) # G(1), G(2), ..., G(Lmax+1)python60000 笔模拟成交(真实 β=0.5,带长记忆订单流 + 噪声)的估计结果:

估计质量:对数斜率 -0.483 vs 真实 -0.5;逐点看 G(1)=0.708 vs 0.707、G(10)=0.301 vs 0.302、G(50)=0.131 vs 0.140。前 30 步几乎完美,尾部因样本中长滞后信噪比下降而略有低估——这也是实证文献里核尾部估计普遍最吵的原因。
实操中你需要的数据是逐笔成交的方向标记(Lee-Ready 算法从报价推断,或直接用交易所的主动买卖标识)加成交量。对 A 股,Level-2 逐笔成交自带买卖方向,是做这类估计的合格原料。
五、放进工具箱:它和邻居们的关系#
至此微观结构系列的冲击模型可以画一张完整地图:
| 模型 | 冲击形状 | 时间维度 | 适用场景 |
|---|---|---|---|
| Kyle λ | 线性、永久 | 无(单期) | 信息不对称定价、日频 Amihud 代理 |
| 平方根定律 | 凹(√Q)、部分回落 | 母单级粗粒度 | 成本预估、容量计算 |
| 传播子 | 单笔凹 + 幂律衰减核 | 逐笔完整刻画 | 执行调度、冲击归因、拆单优化 |
三者不是竞争关系而是分辨率关系:传播子是显微镜,平方根是肉眼,Kyle 是漫画。日常成本预估用平方根足够;但要回答”这 50 笔子单应该打多快、间隔多久”,只有传播子模型给得出答案——最优间隔取决于前一笔冲击塌陷的速度,也就是 β。
Almgren-Chriss 框架里那个”暂时冲击 + 永久冲击”的二分法,在传播子视角下是把幂律核粗暴近似成”一个 δ 函数 + 一个常数”。对衰减快的市场这个近似还行,对 β 小的市场会系统性低估拆单的残留成本。
六、诚实边界#
核不平稳。 G₀ 和 β 都随市场状态漂移:危机中流动性撤退,G₀ 放大、β 变小(冲击更持久)。用平静期估的核去调度危机中的执行,会严重低估成本。滚动重估是必须的。
线性叠加是近似。 模型假设各笔冲击独立叠加,但真实市场有流动性反馈:连续大买单会吓跑做市商,后续冲击边际放大。高参与率(>20% ADV)下线性叠加失效,这也是平方根定律那篇说 >50% ADV 外推无效的微观原因。
日内核与日间核不是一条曲线。 本文模拟的是逐笔尺度;跨日之后隔夜信息重置了一部分冲击记忆,日间衰减不能简单外推日内的 β。实证上隔夜段有独立的跳变结构。
方向标记有噪声。 Lee-Ready 推断的买卖方向错误率约 10-15%,方向噪声会让估出的核整体偏低(衰减显得更快)。有交易所原生标识时永远优先用原生标识。
模型的定位一句话:传播子模型是执行研究的显微镜——它不告诉你买什么,但精确告诉你买入这个动作本身如何在时间轴上花钱、以及花掉的钱有多少会流回来。
参考文献#
- Bouchaud, J.-P., Gefen, Y., Potters, M., & Wyart, M. (2004). Fluctuations and response in financial markets: the subtle nature of ‘random’ price changes. Quantitative Finance, 4(2), 176-190.
- Bouchaud, J.-P., Farmer, J. D., & Lillo, F. (2009). How markets slowly digest changes in supply and demand. Handbook of Financial Markets: Dynamics and Evolution.
- Lillo, F., & Farmer, J. D. (2004). The long memory of the efficient market. Studies in Nonlinear Dynamics & Econometrics, 8(3).