做过实盘的朋友都知道,回测也是一条完美的资金曲线,一上实盘就回撤,很大一部分原因在于“滑点”。而滑点的元凶,往往不是流动性,而是你的行情源不够“实”。
最近我在调试一个基于 Tick 数据的短期套利策略。在早期测试阶段,我发现系统的成交价格总是和触发价格有偏差。排查了一圈,发现问题出在数据获取方式上。那种定时去“问”服务器价格的方式,在高波动的非农数据发布期间,简直就是灾难——你拿到的价格,其实是上一秒的“历史”。
对于量化交易者来说,我们需要的是“流(Stream)”而不是“点(Point)”。我们需要市场发生的每一笔成交,都能实时地触发我们的策略逻辑。
我目前的架构是 Python + WebSocket。通过长连接,让行情源源不断地流入策略引擎。在数据源的选择上,稳定性大于一切。最近我在用 AllTick 做备用数据通道,测试下来发现,这种专门做即时行情的接口,在数据推送的颗粒度上确实比自己爬网页要靠谱得多。
对于量化者,代码越精简越好,降低出错概率。
pip install websocket-client requests
wss://api.alltick.co/forex/realtime
import websocket
import json
def on_message(ws, message):
data = json.loads(message)
print(f"{data['symbol']} | {data['price']} | {data['time']}")
def on_open(ws):
subscribe_msg = {
"action": "subscribe",
"symbols": ["EURUSD", "USDJPY"]
}
ws.send(json.dumps(subscribe_msg))
ws = websocket.WebSocketApp(
"wss://api.alltick.co/forex/realtime",
on_open=on_open,
on_message=on_message
)
ws.run_forever()
拿到的原始数据通常包含 symbol、price、timestamp。注意,这里的时间戳一定要对齐到本地时区,否则做时间序列分析时会很麻烦。
import csv
from datetime import datetime
def save_tick(data):
with open("forex_tick.csv", "a", newline="") as f:
writer = csv.writer(f)
writer.writerow([
datetime.now(),
data["symbol"],
data["price"]
])
当你能同时监控四五个主流货币对,且延迟控制在毫秒级时,你会发现很多微观结构上的套利机会。比如 EURUSD 和 GBPUSD 之间的瞬间价差。
subscribe_msg = {
"action": "subscribe",
"symbols": ["EURUSD", "USDJPY", "GBPUSD", "AUDUSD"]
}
不要让数据传输的延迟成为你策略的瓶颈。这套接入方案,我已经跑了几个月,基本能满足中小资金量的实盘需求。不管你是做趋势跟踪还是剥头皮(Scalping),搞定实时数据是第一步。


