Run Bars 采样:用连续同向成交的长度定义信息事件
失衡 Bar 数净额,Run Bar 数连续性:知情机构能用交替扫单把净失衡做平,但藏不住更长的同向 run——只要必须在信息失效前建完仓,它就必须持续单向交易。12 万笔受控模拟(中段植入 p_buy=0.67)实测:买方 run 均值 2.35→3.96 笔、p95 从 6 到 11;阈值版 Run Bar(run≥10 触发)知情段采样密度自动加密 4.6 倍,bar 长度中位数 237→54 tick——bar 长度本身是免费的知情强度指标,而等 tick Bar 完全无感。bar 内买单占比分布双极化(标准差 0.158 vs 0.089),样本信息密度更高。诚实交代 AFML 原版 EWMA 自举阈值的退化陷阱:实测切出 15245 根中位数 2 tick 的碎 bar,生产级应用固定分位数阈值+保险丝。A 股 Level-2 可跳过 tick rule 直接数 run,但 T+1 下它是特征时钟而非交易时钟(高阶)
一句话版本#
失衡 Bar 数的是净额:买单减卖单偏离了多少。Run Bar 数的是连续性:同一个方向连着来了多少笔。一个知情机构可以用「买三笔停一笔」的节奏把净失衡做得不显眼,但它做不到不留下更长的 run——run 长度是订单流里最难伪装的知情签名之一。
失衡 Bar 的盲区:交替扫单#
信息驱动采样系列走到 Tick 失衡 Bar(TIB)之后,看起来问题已经解决了:对逐笔方向 ±1 累加,失衡够大就切 bar,知情交易段自动加密采样。还需要 Run Bar 干什么?
考虑两段各 100 笔的订单流:
- A 段:60 买 40 卖,买卖随机穿插。净失衡 +20。
- B 段:50 买 50 卖,但排列是「10 连买、10 连卖」交替五轮。净失衡 0。
失衡 Bar 对 A 段敏感、对 B 段彻底失明——B 段净失衡为零,累加器根本不动。但 B 段的微观结构含义可能更值得警觉:10 连买是典型的**扫单(sweep)**形态,大单在吃掉一层层卖单;随后的 10 连卖可能是做市商的存货再平衡。这种「单边持续吃单」的片段,无论净额如何,都对应着高冲击成本和高信息含量的时段。
Run Bar 的设计正是为了捕捉这个维度。定义很朴素:run = 连续同向成交的长度。「买买买卖」里有一个长度 3 的买方 run。AFML 第二章把 run 和失衡并列为两种信息驱动 bar 的触发统计量,不是冗余设计——失衡度量方向的总量偏移,run 度量方向的顽固程度,两者在数学上不可互相导出。
理论支点:知情者藏得住净额,藏不住连续性#
Easley-O’Hara 框架里,知情交易者的最优执行是把大单拆小、混进背景流。拆单可以控制单笔规模,algo 可以控制参与率,但有一个东西极难控制:在信息失效前必须完成建仓。时间压力迫使知情流保持方向一致性——它可以慢,但不能反向。于是背景流是 p=0.5 的硬币序列,知情期的混合流变成 p>0.5 的有偏硬币,而有偏硬币的 run 长度分布是可以精确算的:延续概率越高,长 run 的概率按几何级数放大。
数学上:iid 有偏序列中,方向 的 run 长度服从几何分布,均值 。 从 0.50 升到 0.67,买方 run 均值从 2.0 升到 3.0——放大 50%;而 p95 之外的长尾放大得更凶,这是我们可以利用的统计杠杆。
受控实验:12 万笔,中段植入持续买压#
模拟 120,000 笔逐笔成交:全程带轻微短程延续(模拟拆单造成的自相关),在第 50,000-74,000 笔植入知情段——买方概率抬到 0.67,每笔波动同步放大(知情交易伴随价格发现加速)。
先验证理论:知情段的买方 run 分布是否真的右移?

对数轴下两个分布的差异一目了然:买方 run 均值从平静段 2.35 笔升到知情段 3.96 笔,p95 从 6 笔到 11 笔。注意尾部——知情段 15 笔以上的 run 密度高出平静段一个数量级。run 长度分布的尾部右移,就是知情者无法隐藏的脚印。
Run Bar 构造:run 越长,bar 越密#
实现一个阈值版 Run Bar:跟踪当前 run 长度,一旦 run 达到阈值 就切一根 bar(配一个最大长度保险丝防止 bar 无限拉长):
def build_run_bars(signs, h=10, max_len=4000):
"""signs: +1/-1 逐笔方向序列。run >= h 或长度超限即切 bar"""
bars, start, cur_run, n_buy = [], 0, 1, int(signs[0] > 0)
for t in range(1, len(signs)):
n_buy += int(signs[t] > 0)
cur_run = cur_run + 1 if signs[t] == signs[t-1] else 1
n_ticks = t - start + 1
if cur_run >= h or n_ticks >= max_len:
bars.append((t, n_ticks, n_buy)) # 结束位置 / bar 长度 / 买单数
start, cur_run, n_buy = t + 1, 0, 0
return barspython逻辑与失衡 Bar 同构:把「日历时间够了就切」换成「信息事件发生了就切」,只是信息事件的定义从「净失衡越阈」换成「出现了统计上罕见的长 run」。阈值 h=10 的含义:p=0.5 背景下 10 连单向的概率约 0.1%,这种事件密集出现本身就是机制变化的证据。
对 12 万笔数据跑下来切出 592 根 bar,全部由 run 触发(保险丝未启用)。与等 tick Bar(相同总根数)对比采样行为:

知情段 Run Bar 密度 64.6 根/5000 笔,平静段 14.2 根——自动加密 4.6 倍,且加密区间与植入的知情段精确重合。等 tick Bar 的密度纹丝不动(24.8 vs 24.7):对它来说 5000 笔就是 5000 笔,里面藏着什么它不关心。
bar 长度序列是同一枚硬币的另一面:

平静段 bar 长度中位数 237 tick,知情段压缩到 54 tick。和 TIB 一样,bar 长度序列本身就是一个免费的知情强度指标——不需要额外计算,构造 bar 的过程顺手就产出了一条「市场单边压力」的时间序列,可以直接进特征矩阵。
Run Bar 的样本更「纯」:买单占比双极化#
Run Bar 相对失衡 Bar 的独特产出,要看 bar 内部的成分:

等 tick Bar 的买单占比挤在 0.5 附近(标准差 0.089)——每根 bar 都是买卖混合的温吞水。Run Bar 的占比分布显著更分散(标准差 0.158,接近两倍):因为切分点由长 run 触发,每根 bar 天然以一段单边主导的行情收尾,样本在「买方主导 / 卖方主导」两个方向上被拉开。
这对下游 ML 是实质利好:标签(未来收益)与特征(bar 内订单流状态)的关联在混合样本里被稀释,在极化样本里被保留。Run Bar 不只是换了个采样节奏,它切出来的每个样本信息密度更高——这正是元标注管线想要的输入。
诚实交代:AFML 原版实现是个陷阱#
AFML 书里的 Run Bar 定义比上面的阈值版精巧:用 EWMA 动态估计期望 bar 长度 和买单概率 ,触发条件是 。理论上更自适应,实践里有一个著名的退化问题:阈值的自举反馈是不稳定的——bar 切得短 → 的 EWMA 被拉低 → 阈值更低 → bar 更短。同一份数据上跑原版定义,实测切出 15,245 根 bar,长度中位数 2 tick——退化成逐笔噪声流,采样功能完全丧失。
这不是实现 bug,是公开讨论多年的结构性问题(各开源复现的 issue 区常客)。生产建议:
- 阈值用固定分位数校准:用一段 burn-in 数据算出 run 长度的 99.9% 分位,作为固定阈值 h,定期(如每月)重校准,而不是逐 bar 自举
- 永远配最大长度保险丝,防止死水期一根 bar 吞掉半天数据
- 监控 bar 长度分布的漂移:中位数掉到个位数就是退化警报
边界与 A 股注记#
方向判定依赖 tick rule 的市场要打折扣:run 对方向误判比失衡更敏感——一笔方向标错就打断一个 run,长 run 统计被系统性低估。美股 TAQ 数据用 Lee-Ready 规则误判率约 7-15%,对 run 统计的污染不可忽略。A 股 Level-2 逐笔数据自带主动买卖标志,可以跳过 tick rule 直接数 run——数据条件上 A 股再次占优。
T+1 定位:与 TIB 相同的结论——A 股日内不能回转,Run Bar 加密出的日内样本不能直接映射成交易时钟,它的角色是特征时钟:在 Run Bar 时钟上计算的订单流特征(bar 长度、run 强度、买单占比),聚合到日频喂给隔日决策的模型。
与失衡 Bar 的取舍:不是二选一。AFML 的原意就是两者并列——失衡 Bar 捕捉净压力,Run Bar 捕捉持续性,两者探测知情交易的不同投影。算力允许时同时构造两套 bar,让特征重要性分析(MDI/MDA 那一篇的工具)来裁决哪个投影在你的标的上信息量更大。
结语#
Run Bar 是信息驱动采样系列的收官一块拼图:时间 Bar 数日历,成交量/美元 Bar 数活动,失衡 Bar 数净方向,Run Bar 数方向的顽固程度。四代时钟背后是同一个世界观的逐步逼近——市场的信息到达不均匀,采样就不该均匀。知情者可以拆单、可以控制参与率、可以做平净失衡,但只要它必须在信息失效前完成建仓,它就必须持续朝一个方向交易——而 Run Bar 正守在这条它绕不开的路上。
参考文献:
- López de Prado, M. (2018). Advances in Financial Machine Learning, Chapter 2: Financial Data Structures. Wiley.
- Easley, D., López de Prado, M., & O’Hara, M. (2012). Flow Toxicity and Liquidity in a High-frequency World. Review of Financial Studies.
- Lee, C. & Ready, M. (1991). Inferring Trade Direction from Intraday Data. Journal of Finance.