vnpy BarGenerator 合成原理 · tick to bar aggregation
EVENT_BAR。策略只订阅 bar 事件,不用管 tick。tick 是原料,bar 是策略能用的砖。
tick 是"刚刚成交了一笔,价格 100.3,量 5 手"——一笔就是一个 tick,一天几十万笔。bar 是"这一分钟开盘 100.0、最高 100.5、最低 99.8、收盘 100.3"——把一堆 tick 压缩成 4 个数。
策略为什么用 bar 不用 tick?因为 tick 太碎、噪声太大,且大多数策略的逻辑是"看趋势"不是"看每一笔"。1 分钟 bar 把 60000 个 tick 压成 1 根 K 线,信号清晰、计算量小。但高频做市策略反过来——它们要 tick,甚至要 orderbook 深度。
vnpy 的 BarGenerator 就是这个转换器。它有两个模式:按时间合成(默认,每 N 分钟一根)和按成交量合成(每累计 N 手一根,适合做 VWAP)。下面演示的是时间合成。
下面模拟 BarGenerator。选合成周期,点"跑"看 tick 一笔笔进来,当前 bar 的 OHLC 实时更新,到点(如 1 分钟)就封口、推一根新 K 线。注意第一笔 tick 决定 open,之后每笔更新 high/low,最后一笔决定 close。
BarGenerator 的核心逻辑其实就 4 步,每来一个 tick:
关键细节:open 是窗口内第一笔 tick 的价格,不是窗口开始时刻的价格——因为可能那时刻没成交。close 是最后一笔,不是窗口结束时刻。high/low 是窗口内所有 tick 的极值。成交量是窗口内所有 tick 量的累加。
另一个坑:跨周期合成。vnpy 支持用 1 分钟 bar 合成 5 分钟、15 分钟 bar——叫 update_bar。原理一样,只是输入从 tick 换成 1 分钟 bar。但要注意时区对齐:5 分钟 bar 的起点要对齐到 0/5/10/15 分,不能从你启动那一刻开始算,否则 K 线和别人的对不上。