基于外汇 Tick 数据构建分钟盘口失衡度与实时生产

用户头像sh_****559rtx
2026-07-28 发布

场景切入 在做外汇量化策略的这些年里,我一直试图从更短的时间尺度上提取有效因子。传统的 OHLC 统计在分钟级别上看似简洁,却把每根 K 线内部的订单流信息全部“压缩”掉了。有一次在实盘监控中,我发现 EUR/USD 一分钟阳线涨幅可观,但顺势开仓后立即被打回,复盘才发现当时卖方力量远大于买方。这个经历促使我系统性地将 Tick 级盘口失衡度纳入因子库。

客户需求:跨境外汇策略需要灵敏刻画短周期资金流向

对于我们这些用模型在跨境市场跑短线的量化交易者而言,因子的反应速度和信息含量决定了策略的竞争优势。我需要构建一类能够敏锐反映市场瞬间买卖力量对比的因子,弥补传统动量、成交量因子在分钟级别上的钝化问题。换言之,策略必须能感知到这一分钟内,到底是买方还是卖方在主动驱动价格。

投顾痛点:传统量价因子无法揭示盘口内部的主动方向

许多现成的量化因子依赖分钟 K 线的收盘价、成交量或者成交额,但这些都是在窗口结束后形成的聚合值。假设一分钟内先放量下跌再快速回升,最终收阳,传统因子可能会解读为偏多信号,完全忽略了其中的多空激烈拉锯。这种信息丢失,会导致策略在震荡和高频波动中出现严重的误判。

数据支撑:利用 Tick 数据实现分钟级的买卖力量统计

盘口失衡度(Order Imbalance)因子定义为: Imbalance = (Buy Volume - Sell Volume) / (Buy Volume + Sell Volume)

它的取值在 -1 到 1 之间,直观反映买卖双方的相对强弱。例如一分钟内的统计:

类型 成交量
买方成交量 800
卖方成交量 500

得到失衡度为 0.23,显示买方主导。当连续若干个一分钟窗口的失衡度由负转正时,往往预示着短线资金态度已经发生了实质性的转变,这就是策略可以捕捉的边际信号。

原始外汇 Tick 数据不含买卖标志,因子的构建依赖规则推导:将当前成交价格与上一笔比较,上涨归为买方量,下跌归为卖方量。例如:

时间 价格 判断
10:00:01 1.0860 -
10:00:04 1.0862 买方
10:00:08 1.0858 卖方

基于上述规则,即可在分钟窗口内累加得出计算所需的 Buy Volume 与 Sell Volume。

服务升级:从离线回测延伸到实时因子生产管道

策略因子的有效性建立在数据源持续、可靠的基础上。为了让盘口失衡度因子能够实时参与交易决策,我通过 WebSocket 接入 AllTick 的实时行情推送,将流式 Tick 数据缓存后按分钟聚合,稳定地输出因子值。这样一来,因子不再只是回测曲线上的一个数字,而成了实盘中动态演化的市场情绪仪表。

数据接入部分的代码,负责持续拉取 Tick 流:

import websocket
import json

def on_message(ws, message):
    data = json.loads(message)

    print(
        data["symbol"],
        data["price"],
        data["volume"]
    )

def on_open(ws):
    request = {
        "symbol": "EURUSD",
        "type": "tick"
    }

    ws.send(json.dumps(request))


ws = websocket.WebSocketApp(
    "wss://api.alltick.co/ws",
    on_open=on_open,
    on_message=on_message
)

ws.run_forever()

因子值计算的核心累加逻辑如下:

ticks = [
    {"price": 1.0860, "volume": 100},
    {"price": 1.0862, "volume": 180},
    {"price": 1.0858, "volume": 120}
]

buy_volume = 0
sell_volume = 0

for i in range(1, len(ticks)):
    if ticks[i]["price"] > ticks[i-1]["price"]:
        buy_volume += ticks[i]["volume"]
    else:
        sell_volume += ticks[i]["volume"]

imbalance = (
    buy_volume - sell_volume
) / (buy_volume + sell_volume)

print(imbalance)

在实盘生产环节,还需要增加严格的时钟对齐与窗口关闭机制,防止因数据延迟导致因子值跳动。我将其与波动率、成交量分位等辅助因子组合使用,策略的稳定性得到了肉眼可见的提升。对于仍在打磨短周期外汇策略的量化同好,真心建议把这个因子加入自己的候选池。

db18d5467dc6815c70029e9054606fdd.jpg

评论