18、订单流与量化策略:基于Delta的策略设计、基于成交量分布的策略设计、订单流策略的回测框架
聊到订单流和量化策略的结合,我其实挺有感触的。早年做传统量化的时候,用的都是收盘价、均线这些滞后指标。后来接触了订单流,才发现——原来市场每分钟的博弈,都写在挂单和成交里了。
这一章,我们就来拆解三件事:怎么用Delta设计策略、怎么用成交量分布做决策、以及订单流策略的回测框架该怎么搭。嗯,都是实战中反复打磨出来的东西。
一、基于Delta的策略设计
Delta,说白了就是主动买卖的净差值。我习惯把它理解成「聪明钱的方向」。你想想看,如果大单一直在吃卖一,Delta肯定持续为正,那价格大概率要往上走。
但这里有个坑——单看Delta绝对值容易误判。我曾经在实盘里吃过亏,看到Delta飙到+5000就追进去,结果被挂单砸了个正着。后来才明白,Delta要和成交量、挂单厚度结合起来看。
1.1 Delta背离策略
这是我个人最常用的一个模式。价格创了新高,但Delta却走低了。这说明什么?说明上涨的动能其实在衰减,主动买盘跟不上了。
举个例子:
# 伪代码示例:Delta背离检测
if price > price_previous_high and delta < delta_previous_high:
signal = "空头信号"
# 准备做空
elif price < price_previous_low and delta > delta_previous_low:
signal = "多头信号"
# 准备做多
我在项目中遇到过好几次,这种背离信号在震荡市里特别准。但要注意——单边行情中背离可能持续钝化,别急着反向开仓。
1.2 Delta累积策略
另一种思路是看Delta的累积值。比如,开盘后30分钟累积Delta为正,且持续放大,那今天大概率是多头主导。
| 时间段 | 累积Delta | 策略动作 |
|---|---|---|
| 开盘前15分钟 | +1200 | 观察,不操作 |
| 开盘后30分钟 | +3500 | 轻仓做多 |
| 累积Delta回落 | 从+3500降到+2000 | 减仓或平仓 |
二、基于成交量分布的策略设计
成交量分布(Volume Profile),说白了就是看哪个价格区间成交最多。我个人觉得,这是订单流里最直观的工具——谁在哪个位置打架,一目了然。
2.1 价值区域策略
价值区域(VA,Value Area)是成交量分布的核心。通常包含70%的成交量。价格在VA内运行时,我一般不做方向性交易,只做高抛低吸。
但价格突破VA上沿或下沿时,机会就来了。我记得有一次,价格突破VA上沿后,成交量没有放大,反而萎缩了。这就是典型的「假突破」。我当时果断反向开仓,吃了波回调。
# 伪代码:价值区域突破策略
va_high = get_value_area_high()
va_low = get_value_area_low()
if price > va_high and volume < avg_volume:
signal = "假突破,反向做空"
elif price < va_low and volume < avg_volume:
signal = "假跌破,反向做多"
2.2 控制点策略
控制点(POC,Point of Control)是成交量最大的那个价格。它就像磁铁一样,价格远离POC时,总会被拉回来。
我常用的一个策略是:价格偏离POC超过2个标准差时,做回归交易。止损设在POC的另一侧。这个策略在股指期货上表现不错,但个股上要小心——流动性差的票,POC可能失真。
三、订单流策略的回测框架
回测订单流策略,和传统回测不太一样。你不能只用OHLC数据,得把逐笔成交、挂单快照都纳入进来。嗯,这里我踩过不少坑。
3.1 数据准备
订单流回测需要的数据,至少包括:
- 逐笔成交数据:时间、价格、成交量、买卖方向
- 挂单快照数据:每档价位的挂单量、挂单变化
- Level 2数据:如果有,更好
我建议用CSV或Parquet格式存储,按日期分文件。回测时按时间顺序逐笔回放。
3.2 回测引擎设计
核心逻辑其实不复杂:
class OrderFlowBacktester:
def __init__(self, tick_data, orderbook_snapshots):
self.tick_data = tick_data
self.orderbook = orderbook_snapshots
self.position = 0
self.cash = 1000000
def on_tick(self, tick):
# 更新订单簿
self.update_orderbook(tick)
# 计算Delta、成交量分布等指标
delta = self.calculate_delta(tick)
# 策略逻辑
signal = self.strategy(delta, self.orderbook)
# 执行交易
if signal == "buy":
self.buy(tick.price, 100)
elif signal == "sell":
self.sell(tick.price, 100)
def run(self):
for tick in self.tick_data:
self.on_tick(tick)
3.3 常见坑与避坑指南
- 未来函数:回测时用了未来的挂单数据。我曾经犯过这个错,回测曲线漂亮得不行,实盘一跑就崩。
- 数据对齐:成交数据和挂单数据的时间戳要对齐。差1毫秒,结果可能天差地别。
- 流动性过滤:订单流策略在流动性差的品种上容易失效。我习惯在回测中加入最小成交量过滤。
知识体系总览
下面这张图,是我自己梳理的订单流策略设计框架。你可以把它当作一个检查清单:
嗯,这张图基本概括了订单流策略设计的三个核心方向。我个人觉得,最难的不是策略本身,而是回测框架的搭建。数据清洗、对齐、回放,每一步都可能出问题。
最后说一句:订单流策略不是万能药。它适合高频、日内交易,但中长线持仓的话,还是得结合基本面。我见过太多人把订单流当圣杯,结果亏得底朝天。记住——工具再好,也得看用的人。