halo 的技术博客

返回

一句话版本#

在价格翻了 3 倍的市场里,「每 100 万手切一根 K 线」的时钟本身在贬值——同样的股数代表的经济规模变了 3 倍。美元 Bar 把时钟单位从「股数」换成「成交额」,让每根 bar 对应大致等量的经济活动,这是信息驱动采样家族里对时间跨度最稳健的成员。


一、从成交量时钟说起:还差最后一步#

上一篇验证了成交量时钟的核心命题:按累计成交量切 bar,收益的肥尾和波动聚集大幅收敛,因为采样节奏跟上了信息到达的节奏。

但成交量时钟有个残留缺陷:股数是名义单位,不是经济单位。

考虑一只股票从 20 元涨到 60 元。100 手成交在 20 元时代表 20 万元的经济活动,在 60 元时代表 60 万元。如果「每根 bar 等量信息」的理想以经济规模衡量,固定股数阈值的 bar 在价格上涨后携带的信息量悄悄变成了原来的 3 倍——时钟本身在漂移。

除此之外,股数时钟还有两个离散性硬伤:

  • 公司行为:10 送 10 之后流通股本翻倍,同样的经济活动对应两倍股数,股数阈值一夜之间语义减半。美元成交额对送转股完全无感;
  • 跨标的不可比:贵州茅台一手 ≈ 17 万元,一只 3 元的小盘股一手 300 元。用统一的股数阈值跨标的建 bar 毫无意义,而「每 5000 万元成交额」在任何标的上语义一致。

于是信息驱动采样家族的完整谱系是:

Bar 类型时钟单位主要弱点
时间 Bar日历秒无视信息到达节奏(家族外的基准)
Tick Bar成交笔数拆单 / 算法交易使计数通胀
成交量 Bar成交股数价格漂移 + 送转股使经济语义漂移
美元 Bar成交金额阈值需动态化(见第四节)

López de Prado 在 AFML 里的排序很明确:美元 Bar 通常是「更有趣」的选择,理由正是上述稳健性阶梯。

二、实现:三行核心逻辑#

美元 Bar 的实现和成交量 Bar 只差一个乘法:

def dollar_bars(price, volume, bar_dollar):
    """每累计 bar_dollar 元成交额,切一根 bar"""
    closes, cum = [], 0.0
    for i in range(len(price)):
        cum += volume[i] * price[i]       # 唯一区别:股数 → 金额
        if cum >= bar_dollar:
            closes.append(price[i])
            cum = 0.0
    return np.array(closes)
python

生产级实现会同时记录 OHLC、VWAP、买卖失衡等 bar 内统计,并用向量化的 cumsum + searchsorted 代替循环,但逻辑内核就这三行。阈值的初始定标同样简单:目标每天 kk 根,则 bar_dollar = 近期日均成交额 / k

三、实验一:四种时钟同场竞技#

沿用上一篇的受控模拟(每笔收益 iid 正态、活动强度 AR(1) 持续 + 日内 U 型 + 随机爆发,120 日 21.6 万笔),这次把四种 bar 全部切出来、对齐数量(各约 950 根),比较三个统计量:

四种采样时钟的统计性质对比

时间 BarTick Bar成交量 Bar美元 Bar
超额峰度3.52-0.060.040.02
Jarque-Bera496001
平方收益 ACF(1-10 阶均值)0.132-0.020-0.002-0.004

两个读法:

  1. 家族 vs 时间时钟的差异是悬崖式的。时间 Bar 独自扛着全部肥尾和波动聚集,三种信息驱动 bar 全部把收益还原成白噪声正态——采样时钟从「日历」换成「活动」这一步贡献了几乎全部收益;
  2. 家族内部在这个短窗口里几乎无差别。120 天内价格漂移有限、无拆单结构变化,三种活动时钟高度相关。美元 Bar 的优势不在这种短窗平稳环境里,而在长周期、大漂移、结构变化的环境里——这正是下一个实验。

四、实验二:长周期下的阈值漂移——美元 Bar 的特性与负担#

换一个 1000 交易日(约 4 年)的模拟:价格从 20 元涨到 50 元(约 3 倍,牛市成长股的常见轨迹),日均成交笔数线性增长 1.5 倍(市场扩容),中段插入一次 120 天的高波动区制。

前 100 天的数据校准三种阈值,都定为「每天 6 根」,然后固定不动,看每日 bar 数如何漂移:

固定阈值下每日 bar 数的漂移

到模拟末期:

  • Tick Bar / 成交量 Bar:日均 13.4 根——被活动增长推着漂了一倍多;
  • 美元 Bar:日均 27.7 根——被「活动增长 × 价格上涨」双重推动,漂得最凶。

这个结果值得诚实地正视:美元 Bar 对价格水平的敏感是双刃剑。 它让 bar 的经济语义跨价格档一致(特性),也让固定阈值在趋势市里漂移得最快(负担)。「美元 Bar 更稳健」的教科书说法,指的是语义稳健(每根 bar 的经济含量),不是阈值免维护

解法是动态阈值:用 EWMA 跟踪日均成交额,阈值 = EWMA / 目标根数,只用过去数据滚动更新:

# EWMA 动态阈值(span=50 日),严格只用截至昨日的数据
ewma[i] = alpha * daily_dollar[i-1] + (1 - alpha) * ewma[i-1]
threshold_today = ewma[i] / target_bars_per_day
python

效果:

价格路径与美元 Bar 采样密度

固定阈值的美元 Bar 随价格上涨持续加密(红线,纯漂移,不携带信息);EWMA 动态阈值的美元 Bar(蓝线)日常稳定在 6 根附近,只在高波动区制里短暂加密后被 EWMA 追上——把趋势性漂移滤掉,只保留「信息爆发时多采样」这个真正想要的性质

一个必须显式说明的细节:EWMA 只能用过去的成交额。用全样本日均成交额定阈值,等于让 bar 的边界依赖未来信息——这是信息驱动采样实务里最隐蔽的前视偏差,它不会让单根 bar 的价格错位,但会让「bar 数密度」这个隐变量泄漏未来的活动水平。

五、终点站:美元时钟与 VPIN 的同构#

信息驱动采样不止是数据预处理技巧,它连着一条更深的研究线。

Easley、López de Prado 和 O’Hara 的 VPIN(成交量同步知情交易概率,详见这篇)的第一步就是把时间轴换成活动时钟:等量成交桶内计算买卖失衡。他们的论文标题直接叫 The Volume Clock——采样方式与知情交易度量共享同一个世界观:

市场的自然节拍是交易活动,不是格林尼治时间。 知情交易者带着体量进场时,活动时钟自动加速;度量、采样、风控都应该在这个时钟上运行。

这个视角下,美元 Bar 是「让数据结构与市场机制同构」的第一块砖:往上可以叠 imbalance bars(按买卖失衡的累计意外程度切分,采样节奏进一步逼近「信息」本身而不只是「活动」)、run bars 等更激进的家族成员。它们超出本文范围,但方向一致:采样规则越贴近信息到达机制,下游模型看到的世界越干净。

六、A 股落地注记#

三点本地化差异:

  1. 手数制度弱化了短期差异。A 股一手恒定 100 股,无碎股连续竞价,同一标的短窗口内成交量时钟与美元时钟高度相关。美元 Bar 的优势场景在 A 股具体化为:跨长周期回测(价格档变化大)、跨标的统一建 bar(高价股 vs 低价股)、送转股频繁的标的;
  2. 拆单通胀同样存在。A 股算法拆单近年快速普及,tick bar 的跨年语义漂移问题一样严重,不要因为「A 股散户多」就假设逐笔计数稳定;
  3. 午休与集合竞价的处理同成交量 Bar:跨午休累计在统计上是特性,开盘集合竞价的批量成交建议单独标记。

七、诚实的边界#

  1. 本文全部证据来自受控模拟。模拟的价值是把因果钉死(底层收益构造上 iid 正态,一切统计差异归因于时钟),代价是幅度不可外推——真实市场中成交额与信息到达之间有噪声缝隙(无信息的指数调仓贡献成交额但不贡献信息),正态化效果会打折扣。真实数据上的系统比较可参考 AFML 第 2 章与后续文献,方向一致、幅度更温和;
  2. 美元 Bar 不产生 alpha。它改善训练样本的分布性质、降低模型学伪结构的机会,是 ML 管线的地基工程。地基不直接赚钱,但烂地基上的一切都在赔钱;
  3. 低频策略可以无视这一切。月频调仓、财报驱动的策略在 bar 层面的微观结构差异会被持仓周期平均掉。信息驱动采样的受益者是日内到数日的中高频策略,以及一切以逐 bar 样本训练的机器学习管线。

本文实验为受控模拟,参数为教学目的设定,用于隔离验证时钟单位对采样稳定性与统计性质的影响。真实市场效果幅度会打折扣。本文不构成投资建议。

美元 Bar 与信息驱动采样:让每根 K 线携带等量信息
https://blog.halo26812.eu.org/blog/dollar-bars-information-sampling
Author halo
Published at 2026年7月30日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨