
衡量一只股票的流动性,最精确的方法是拿到完整的限价订单簿:盘口价差、各档深度、成交对价格的冲击函数。问题是订单簿数据贵、处理重,而且历史上大部分市场根本没有留存。2002 年 Amihud 提出了一个粗糙到近乎简陋的替代品——只用日收益和日成交额两列数据:
每一块钱成交额平均撬动了多少绝对收益。一只股票如果 1000 万成交额就能推动 2% 的价格变化,它显然比 10 亿成交额才动 2% 的股票难交易得多。ILLIQ 越大,越不流动。
这个指标粗糙——它分不清价格变化是被交易推动的还是信息驱动的,也不知道盘口价差多宽。但二十多年的实证检验下来,它和用高频数据算出来的精确价格冲击指标(Kyle’s lambda、有效价差)的横截面相关性稳定在 0.6 以上,而它只需要任何免费行情源都有的两列数。在”够用”和”精确”之间,ILLIQ 是量化史上性价比最高的妥协之一。
更重要的是 Amihud (2002) 的第二个发现:ILLIQ 高的股票有系统性更高的期望收益——非流动性溢价。市场为”难卖出”这件事付费。这篇文章用 800 只股票、15 年的合成横截面把这个因子完整跑一遍,然后重点讨论它最容易被忽视的一面:这笔溢价不是免费的 alpha,而是一份危险补偿。
ILLIQ 的横截面结构#
先构造市场。800 只股票,日均成交额服从对数正态分布(中位数约 5500 万元,跨度从几百万到几十亿——大致对应一个 A 股或美股中盘以下市场的形态)。ILLIQ 用滚动 12 个月的日度数据计算:
import numpy as np
def amihud_illiq(daily_ret, daily_dollar_vol):
"""
daily_ret: (n_days, n_stocks) 日收益
daily_dollar_vol: (n_days, n_stocks) 日成交额(百万元)
返回每只股票的 ILLIQ(|r| 每百万元成交额, x100 便于阅读)
"""
return np.mean(np.abs(daily_ret) / daily_dollar_vol, axis=0) * 1e2python真实实现中有三个细节不能省:
- 剔除零成交日——停牌或无成交时分母为零,直接除会污染整个均值;
- 窗口内要求最低有效天数(惯例是 200 天/年),否则新股和长期停牌股的 ILLIQ 是噪声;
- 对 ILLIQ 做截尾(winsorize)——这个指标的分布极度右偏,最不流动的几只股票的 ILLIQ 可以是中位数的几千倍,不截尾的话任何依赖均值的后续计算都会被极端值绑架。

横截面上 ILLIQ 与成交额在双对数轴下呈近似线性负相关,本文合成市场中 90 分位与 10 分位的 ILLIQ 相差 39 倍。真实市场中这个跨度更极端——这也是为什么用 ILLIQ 排序时永远用分位数分组,而不是用原始值。
分组回测:溢价存在,而且单调#
标准的因子检验流程:每月末用过去 12 个月数据计算 ILLIQ,按分位数把股票分成 5 组,等权持有一个月,下月末重新分组。为了模拟真实的流动性溢价,合成数据里植入了年化 2%~12% 的期望收益梯度(随 ILLIQ 排名上升),同时给非流动股票加上了一个关键的真实特征:市场下跌时它们跌得更狠(后面细说)。
warmup, n_groups = 12, 5
for t in range(warmup, n_months):
illiq = rolling_illiq(t, window=12) # 滚动12个月,只用t之前的数据
q = np.quantile(illiq, np.linspace(0, 1, n_groups + 1))
for g in range(n_groups):
mask = (illiq >= q[g]) & (illiq < q[g + 1])
group_rets[t, g] = ret[t, mask].mean() # 等权、月度再平衡
ls_ret[t] = group_rets[t, -1] - group_rets[t, 0] # G5 - G1python注意信号时点:第 月的分组只用 月之前的日度数据,收益取第 月——这是所有横截面回测防 look-ahead 的最低要求。
15 年下来五组年化收益分别是 14.4%、14.5%、17.1%、18.4%、20.9%——除 G1/G2 几乎持平外整体单调上升,最不流动组比最流动组高 6.5 个百分点。多空组合(做多 G5、做空 G1):

年化 6.0%,月均 0.49%(t = 6.41,168 个月),最大回撤 -3.4%,Sharpe 1.71。
先泼一盆冷水:这个 Sharpe 是合成数据的产物,真实市场里拿不到。 本文的合成横截面里,特异波动是独立的,分散化把它洗得干干净净;真实市场中非流动小盘股的收益高度相关(共同暴露于流动性冲击、风格轮动、壳价值波动),多空组合的实际 Sharpe 通常在 0.3~0.6 之间,回撤深得多。合成回测的价值在于验证方法论管道——分组是否单调、t 值结构是否合理——而不是预告实盘收益。
溢价的阴暗面:这是危险补偿,不是免费午餐#
如果非流动性溢价是纯粹的错误定价,套利者早就把它抹平了。它能持续存在二十年,是因为拿这笔钱的人在承担一种特定的痛苦:流动性在你最需要它的时候消失。
把多空组合的月收益对市场收益画散点,分上涨月和下跌月分别回归:

上涨月里多空组合的市场 beta 只有 0.07——几乎中性;下跌月里 beta 跳到 0.19,接近三倍。这就是 Acharya-Pedersen (2005) 流动性调整 CAPM 里的核心机制:非流动资产的流动性会在市场承压时进一步恶化,持有者被迫在最差的时点面对最宽的价差和最深的冲击。2008 年 10 月、2015 年 A 股去杠杆、2020 年 3 月,非流动性组合的表现全都显著差于其平时的 beta 所预示的水平。
换句话说:ILLIQ 多头赚的 6 个点年化,是给”危机时你是那个接不到盘的人”这一角色开的工资。 这笔工资该不该赚取决于你的负债端——一个有十年锁定期的主权基金可以大胆赚,一个随时面对赎回的公募基金赚这笔钱等于在给自己埋雷。
实务清单:ILLIQ 因子容易踩的四个坑#
坑一:溢价大头在你买不进去的地方。 按 ILLIQ 排序后收益最高的 G5 组,恰恰是成交额最低的 20%。纸面上的等权组合假设你能按收盘价无冲击地买入几百只日成交几百万的股票——而 ILLIQ 高这个事实本身就在告诉你做不到。用因子自己的定义反驳因子的可实现性,非流动性因子是最典型的案例。认真做的话要把建仓冲击成本(可以直接用 ILLIQ 估算:预期冲击 ≈ ILLIQ × 下单金额)从纸面收益里扣掉,扣完之后 G5 的超额通常缩水一半以上。
坑二:和规模因子高度纠缠。 ILLIQ 与市值的相关性极高(小市值≈低成交额≈高 ILLIQ)。不做正交化的话,你以为在赚流动性溢价,实际上大部分是 size 暴露。标准做法是在每个市值分组内部再按 ILLIQ 排序(double sort),或者对市值回归取残差。文献里的结论是:控制 size 后非流动性溢价仍然显著,但幅度砍掉约一半。
坑三:ILLIQ 的时序变化比横截面排名重要。 单只股票的 ILLIQ 排名很稳定(今年不流动的股票明年大概率还是不流动),但全市场的平均 ILLIQ 波动剧烈。Amihud (2002) 原文的第二个结果常被忽略:市场层面的 ILLIQ 上升预测未来超额收益上升——流动性恶化本身是定价状态变量。这意味着 ILLIQ 除了做横截面选股,还能做整体仓位的风险开关。
坑四:涨跌停和 ILLIQ 的相互污染(A 股特有)。 涨停板上成交额萎缩但 |r| 被钉在 10%,会把 ILLIQ 推高一个数量级;跌停打开当天则相反。在 A 股用 ILLIQ 必须剔除触板日,否则高 ILLIQ 组会系统性富集刚经历连续涨跌停的妖股——那不是流动性溢价,是彩票偏好的反面。
结语#
Amihud ILLIQ 是那种”简单到你怀疑它不该有效”的指标:两列数据、一行公式,却在过去二十年横扫了几乎所有市场的横截面检验。它教科书式地展示了因子研究的两条基本纪律——溢价的存在性(分组单调、t 值显著)和溢价的来源(危险补偿还是错误定价)必须分开论证。前者本文的合成管道半小时就能验证;后者决定了这笔钱你到底该不该赚、能不能赚到。流动性溢价两者都有答案,而答案是:钱是真的,但它是工资,不是彩票。
参考文献#
- Amihud, Y. (2002). Illiquidity and Stock Returns: Cross-Section and Time-Series Effects. Journal of Financial Markets, 5(1), 31-56.
- Acharya, V. V., & Pedersen, L. H. (2005). Asset Pricing with Liquidity Risk. Journal of Financial Economics, 77(2), 375-410.
- Pastor, L., & Stambaugh, R. F. (2003). Liquidity Risk and Expected Stock Returns. Journal of Political Economy, 111(3), 642-685.