Madhavan-Richardson-Roomans 微观结构模型:拆解成交价里的信息与流动性成分
每一笔成交价的变动里都混着两种完全不同的东西:一部分是市场真的学到了新信息(永久冲击),另一部分只是买卖价差的弹跳(暂时冲击)。MRR (1997) 模型用一条结构方程把两者干净地拆开:信息成分 θ 度量逆向选择,流动性成分 φ 度量订单处理与库存补偿,副产品还包括订单流自相关 ρ。本文从模型设定推到矩条件估计,用可复现 Python 生成 2 万笔模拟成交并把参数估回来(θ、φ 误差在 1% 以内),展示估计精度按 1/√N 收敛、不同股票的成分占比差异、以及信息成分的日内衰减模式。最后诚实拆解:交易方向标注错误的偏差、参数非平稳性、以及它对执行成本归因的实际价值(中阶)。
同样的价差,完全不同的含义#
两只股票,有效价差都是 3 分钱。是不是意味着交易成本一样?
不是。价差是补偿做市商的,但补偿的理由可以完全不同:
- 理由一:逆向选择。 和你成交的对手方可能比你知道得多。做市商每次被知情交易者吃掉一笔,都在真实亏钱——他挂的价差里必须有一块用来覆盖这个”被割”的期望损失。这部分冲击是永久的:知情买单成交后,价格中枢真的上移了,回不来。
- 理由二:订单处理与库存。 系统、清算、资本占用、库存风险的补偿。这部分冲击是暂时的:价格被一笔买单顶上去半个价差,下一笔卖单又弹回来——即所谓 bid-ask bounce。
同样 3 分钱的价差,如果一只股票 80% 是逆向选择、另一只 80% 是订单处理,对交易者的含义天差地别:前者意味着你的订单流会持续推动价格朝不利方向走(冲击不可逆),后者意味着耐心用被动单就能把大部分成本省回来(冲击会弹回)。
Madhavan、Richardson 和 Roomans 在 1997 年给出了一个可以用成交数据直接估计的结构模型,把这两块干净拆开。它至今仍是执行成本归因和微观结构研究的基准工具之一。
模型:两个方程讲完#
设定#
记第 笔成交的方向为 (买方发起 = +1,卖方发起 = −1),订单流有自相关:(大单拆分、跟风交易都会让 )。
方程一:有效价格(信息)
有效价格 是做市商对真实价值的最优估计。它只对订单流中的意外部分 反应——如果上一笔是买单、这一笔又是买单,那在 的世界里这本来就是大概率事件,没什么新信息;只有偏离预期的部分才更新信念。 就是信息成分:一笔意外买单让价格中枢永久上移 。 是公共信息(新闻、公告)带来的更新。
方程二:成交价(信息 + 流动性)
成交价在有效价格上叠加 :买单成交在中枢上方 处,卖单在下方 处。 就是流动性成分——纯粹的价差弹跳,下一笔反向成交就消失。

图里能直接看到两层结构:黑线(有效价格)平滑地随订单流意外移动,蓝色阶梯线(成交价)围绕它上下弹跳,红色三角(买)永远在黑线上方、绿色三角(卖)在下方。
两式合并得到可估计的价格变动方程:
这条方程有个漂亮的性质:右边只有可观测量(、、),三个结构参数 恰好被三个矩条件识别。
Python 实现:模拟 + 估计闭环#
科学的做法是先在已知真值的模拟数据上验证估计器,再谈上实盘数据。
模拟器#
import numpy as np
def simulate_mrr(n, theta, phi, rho, sigma_u=0.005, seed=11):
rng = np.random.default_rng(seed)
# 生成自相关的交易方向序列:P(x_t = x_{t-1}) = (1+rho)/2
x = np.empty(n); x[0] = 1
for t in range(1, n):
x[t] = x[t-1] if rng.random() < (1 + rho) / 2 else -x[t-1]
u = rng.normal(0, sigma_u, n)
m = np.empty(n); m[0] = 10.0
for t in range(1, n):
surprise = x[t] - rho * x[t-1] # 订单流意外
m[t] = m[t-1] + theta * surprise + u[t]
p = m + phi * x # 成交价 = 中枢 + 弹跳
return p, m, x
p, m, x = simulate_mrr(20000, theta=0.010, phi=0.015, rho=0.35)python矩条件估计#
对价格变动方程做两步:先用 的样本自相关估 ,再把 对 回归,回归系数 、,两条方程解出两个未知数:
def estimate_mrr(p, x):
dp = np.diff(p)
rho_hat = np.corrcoef(x[1:], x[:-1])[0, 1]
X = np.column_stack([x[1:], x[:-1]])
(b1, b2), *_ = np.linalg.lstsq(X, dp, rcond=None)
phi_hat = (-b2 - rho_hat * b1) / (1 - rho_hat)
theta_hat = b1 - phi_hat
return theta_hat, phi_hat, rho_hat
theta_hat, phi_hat, rho_hat = estimate_mrr(p, x)
# 真值 θ=0.010, φ=0.015, ρ=0.35
# 估计 θ=0.0100, φ=0.0150, ρ=0.356python2 万笔成交下, 和 的估计误差都在 1% 以内。这不是运气——蒙特卡洛显示标准误严格按 收敛:

实务上的换算:一只日均 4000 笔成交的股票,一周数据就有 2 万笔,足够把 估到两位有效数字。反过来说,用一天数据估 MRR 是不够的——500 笔样本下 的标准误和真值同量级,估出来的数字基本是噪声。
三个可以直接落地的读法#
读法一:横截面比较——哪些股票”有毒”#
信息占比 是逆向选择强度的直接度量:

典型的横截面模式(与 MRR 原文对 NYSE 股票的实证一致):大盘蓝筹信息占比低(分析师覆盖充分、私有信息少),小盘股信息占比高,财报公告日信息占比进一步跳升。对执行的直接含义:信息占比高的股票,冲击成本主要是永久的,拖慢执行速度省不回来多少钱;信息占比低的股票,用被动单和耐心能实实在在把 那一块赚回来。
读法二:日内模式——什么时候市场在”学习”#
把每 30 分钟的成交切开分别估计,得到成分的日内曲线:

在开盘后最高然后快速衰减——隔夜积累的私有信息在开盘后一两个小时内被交易消化掉; 则近似平稳。这是 MRR 原文的标志性实证发现,也解释了为什么很多执行算法把订单往午盘挪:不是流动性更好(午盘深度往往更差),而是逆向选择更便宜。
读法三:执行成本归因#
拿自己的成交回执,把每笔子单的价格冲击分解为 (永久)和 (暂时)两部分,可以回答一个 TCA 报告里最值钱的问题:我的冲击成本里有多少是”信息泄露”(订单流被市场读出来了, 部分持续放大),有多少只是价差成本( 部分,换更被动的下单方式就能压缩)。前者要改的是拆单节奏和随机化,后者要改的是订单类型选择。
诚实的边界#
第一,交易方向 是估计出来的,不是观测到的。 实盘数据要用 Lee-Ready 之类的算法从报价和成交推断买卖方向,A 股逐笔数据自带方向标志相对好些,但美股 TAQ 数据的标注错误率可达 10-15%。方向标错会同时把 和 往下拉(衰减偏差),横截面比较时如果两组股票的标注错误率不同,结论可能整个反过来。
第二,参数不平稳。 上面日内图已经展示了 的系统性日内变化;财报季、指数调整日、宏观事件日的参数和平常也完全不同。用一个月数据估出一组”全局参数”然后到处用,等于把开盘的逆向选择强度平均到午盘——正确做法是分时段、分状态估计,并接受每个子样本更宽的置信区间。
第三,模型假设订单流影响是线性的、方向是 ±1 的。 真实市场里 1 万股买单和 100 股买单的信息含量不同,MRR 把它们同等对待。扩展版本用签名成交量代替方向、或按订单规模分桶估计,代价是需要更多数据。基础版 MRR 适合作为第一刀粗分解,不适合作为最后一位小数的定价工具。
收尾#
MRR 模型用两个方程回答了一个交易者天天面对却很少量化的问题:我付出的价差里,多少是在补偿对手方的成本,多少是在为自己的信息劣势买单。 模拟验证了它的估计器干净可靠(2 万笔成交、误差 1% 以内、按 收敛),三个落地读法——横截面毒性比较、日内逆向选择曲线、执行成本归因——都不需要任何额外数据,只要成交明细。
在微观结构的模型谱系里,它站在 Ho-Stoll(纯库存)和 Glosten-Milgrom / Kyle(纯信息)之间,是少数能用日常数据直接估计的结构模型。如果你只打算给微观结构工具箱装一件测量仪器,MRR 是性价比最高的候选之一。
参考文献#
- Madhavan, A., Richardson, M., & Roomans, M. (1997). Why do security prices change? A transaction-level analysis of NYSE stocks. Review of Financial Studies, 10(4), 1035-1064.
- Glosten, L. R., & Milgrom, P. R. (1985). Bid, ask and transaction prices in a specialist market with heterogeneously informed traders. Journal of Financial Economics, 14(1), 71-100.
- Lee, C. M. C., & Ready, M. J. (1991). Inferring trade direction from intraday data. Journal of Finance, 46(2), 733-746.