Amivest 流动性比率:用成交额换价格变动衡量市场深度
「推动 1% 的价格变动需要多少成交额?」Amivest 比率把这个问题直接做成指标:L = 平均(成交额 / |收益|),数值越大市场越深。它是 Amihud 非流动性比率的镜像前辈——一个除法方向相反的孪生兄弟,但两者在 log-log 空间的相关只有约 -0.47,并非简单倒数:取平均的顺序不同,对极端日的敏感度就完全不同。三年日线模拟实测:大盘蓝筹、中盘、小盘的 Amivest 比率相差整整两个数量级,横截面区分度极强;流动性危机情景里比率中位数坍缩到平时的 40%,与价格暴跌同步——它是危机的同期指标而非领先指标。最隐蔽的坑是零收益日:僵尸股大量「价格不动」的日子,丢弃处理让比率虚高 2.4 倍,下限处理又偏悲观——处理方式本身就是结论的一部分。诚实边界:日线粒度看不见盘口、成交额与波动的因果纠缠、跨市场比较要先对齐货币与交易制度(中阶)。
问题:怎么用日线数据回答「这个市场有多深」#
流动性有很多维度:价差多宽(紧度)、挂单多厚(深度)、大单砸下去多久恢复(弹性)。最理想的度量当然来自盘口和逐笔数据——但研究 20 年历史、覆盖几千只股票、或者看数据条件糟糕的市场时,你手里往往只有日线:收盘价和成交额。
Amivest 流动性比率(上世纪 70 年代由 Amivest 公司提出,后被大量学术研究采用)用一个除法回答这个问题:
其中 是股票 第 天的成交额, 是当天收益的绝对值。含义直白到不需要翻译:平均而言,每承受一个单位的价格变动,这个市场消化了多少成交额。分子是「进了多少货」,分母是「价格动了多少」——比率越大,说明同样的交易量对价格的扰动越小,市场越深。
如果你读过 Amihud (2002),会立刻认出这是个熟面孔:Amihud 非流动性比率 就是把这个除法倒过来。事实上 Amivest 比率是前辈——Amihud 那篇著名论文里明确提到自己的指标与 Amivest 比率的血缘关系。但「倒过来再平均」和「平均再倒过来」不是一回事,这个差别后面会专门量化。
实现:20 行代码#
import numpy as np
def amivest(volume, ret, window=20, eps=1e-6):
"""滚动 Amivest 流动性比率
volume: 日成交额序列; ret: 日收益序列
window: 滚动窗口; eps: 零收益日剔除阈值
"""
av = np.full(len(ret), np.nan)
for t in range(window, len(ret)):
v = volume[t-window:t]
r = np.abs(ret[t-window:t])
mask = r > eps # 零收益日的处理 —— 注意,这是个决定
if mask.sum() > 5:
av[t] = (v[mask] / r[mask]).mean()
return avpython注意第 10 行那个 mask:零收益日会让 除零爆炸,必须处理。这里选择了「丢弃」——这个看似无害的技术细节,是本文后面要单独批判的对象。
实验一:横截面区分度是数量级级别的#
模拟三只风格股票,三年日线(750 天)。生成机制刻意贴近真实结构:日收益 = 成交冲击/市场深度 + 基础波动,深度参数按「大盘蓝筹 : 中盘 : 小盘 = 80 : 10 : 1」设置:
rng = np.random.default_rng(7)
def simulate_stock(depth, adv, sigma_base, n_days=750):
volume = adv * np.exp(0.35 * rng.standard_normal(n_days))
ret = (volume / depth) * rng.standard_normal(n_days) * 0.5 \
+ sigma_base * rng.standard_normal(n_days)
return volume, ret
stocks = {
"大盘蓝筹": simulate_stock(depth=2.0e12, adv=8e9, sigma_base=0.012),
"中盘": simulate_stock(depth=2.5e11, adv=1.2e9, sigma_base=0.018),
"小盘": simulate_stock(depth=2.5e10, adv=1.5e8, sigma_base=0.028),
}python
注意纵轴是对数轴:三条曲线相隔大约一个数量级——大盘蓝筹每单位|收益|吸收的成交额是小盘股的百倍以上。这是 Amivest 比率最强的能力:横截面排序。它对「谁比谁更流动」的区分极其鲁棒,因为数量级的差距远大于估计噪声。学术研究里它最常见的用法正是如此:按流动性给股票分组,检验流动性溢价。
实验二:危机时比率坍缩——但它是同期指标#
流动性最被关心的时刻是它消失的时刻。给中盘股加一段危机:第 400-480 天,市场深度砍到 15%、基础波动放大 2.5 倍——模拟 2015 年式的流动性挤兑:

上图是净值:危机段剧烈震荡下挫。下图是滚动 Amivest 比率:危机期中位数只有平时的约 40%(2.5e11 → 1.0e11),坍缩清晰可见。
但要诚实地读这张图:比率的下跌和价格的暴跌是同步发生的——Amivest 是流动性的温度计,不是天气预报。它用 20 天窗口滚动,天然滞后于事件本身。用它做风控的正确姿势不是「预测危机」,而是「确认状态」:当组合持仓的 Amivest 比率整体下移一个台阶时,你此刻的清仓成本已经不是上个月的清仓成本了——仓位限额和压力测试参数应该跟着调。
实验三:它和 Amihud 不是简单倒数#
和 看起来互为倒数,实际上 和 (算术平均与调和平均)之间隔着 Jensen 不等式。对中盘股同时计算两者,在 log-log 空间看散点:

相关系数只有 -0.47——方向相反没错,但远不是完美负相关。差异来自对极端日的敏感度:
- Amivest 对「巨量成交但价格没动」的日子敏感——这种日子 巨大,把平均值拉高。它天然强调市场最深的时刻;
- Amihud 对「缩量但价格暴动」的日子敏感——这种日子 巨大。它天然强调市场最脆的时刻。
做风控该用 Amihud(你关心的是最坏情况),做流动性溢价研究两者常常都要跑一遍看稳健性。把它们当同一个指标的正负号版本,是最常见的误用。
实验四:零收益日——藏在分母里的决定#
最隐蔽的坑给僵尸股准备。构造一只 55% 的交易日零成交、零收益的股票,对比两种处理:
- 丢弃零收益日(本文实现的默认):只在「有行情」的日子里算比率;
- 零收益日按下限收益计入:把 下限设为 1bp,零成交日的 也计入平均。

两种处理的中位数相差 2.4 倍。丢弃法是幸存者视角:只统计这只股票「醒着」的日子,得出的流动性偏乐观——但一只一半时间没有成交的股票,「没有成交」本身就是流动性差的最强证据,把这些日子扔掉等于把病历里所有异常指标撕掉再宣布健康。下限法把零成交日压进平均,更接近「随时想卖能不能卖掉」的真实体验。
没有标准答案,但有标准要求:报告 Amivest 比率时必须声明零收益日的处理方式,横截面比较时全样本必须用同一种。A 股场景还要叠加涨跌停——封板日成交额萎缩、价格被钉死, 的分子分母同时失真,稳妥做法是连同停牌日一起剔除并披露剔除比例。
诚实边界#
日线粒度看不见盘口。Amivest 度量的是「日频价格对日频成交额的响应」,与盘口深度、价差只有间接关系。两只 Amivest 比率相同的股票,一只可能价差极窄但盘口薄,另一只价差宽但挂单厚——执行层面的体验完全不同。它是望远镜,不是显微镜。
因果是纠缠的。比率隐含「成交额驱动价格变动」的读法,但现实中信息可以在没有成交的情况下移动价格(隔夜新闻直接跳空),高波动本身也会吸引成交量。 和 互为因果,比率是两者的均衡快照而非因果参数——别把它当成「我砸 X 元预期推动 Y%」的执行成本公式,那是价格冲击模型的工作。
跨市场比较要先对齐口径。分子是成交额,直接带着货币单位和市场制度:换手率习惯、涨跌停、T+1、做市商制度都会系统性改变比率的量级。跨市场比较前不做标准化(比如除以流通市值),得到的差异里制度噪声比流动性信号多。
Amivest 比率是流动性度量谱系里「便宜端」的代表:只要日线、一行除法、跑几千只股票几十年毫无压力。它换来的是横截面排序的鲁棒和时序状态的确认,放弃的是盘口细节和因果解释。知道自己在谱系的哪个位置,比指标本身更重要。