Signal 1 — Order Flow Imbalance (OFI)
Cảnh báo Slippage và Thực thi
Mã nguồn dưới đây là template tham khảo cho mục đích nghiên cứu, chưa tính đầy đủ slippage, commission, market impact, và partial fill. Luôn paper trade ít nhất 1–3 tháng và hiệu chỉnh slippage model trước khi đưa vào live. Đặc biệt cẩn trọng với signal tần suất cao — nếu latency hệ thống > 100ms, edge có thể đã biến mất khi lệnh được gửi.
| Thuộc tính | Giá trị |
|---|---|
| Phân loại | Market Microstructure |
| Khung thời gian | 1–15 phút |
| Paper gốc | Hasbrouck (1991); Cont, Kukanov & Stoikov (2014) |
| Loại dữ liệu | Tick / Trade-by-trade với side classification |
| Hướng giao dịch | Mean Reversion |
| Capacity | Thấp — nhạy với latency |
Logic. Tính z-score của OFI trên cửa sổ trượt. Khi OFI_z > 2 (buy pressure cực đoan), giá có xu hướng mean reversion ngắn hạn → SELL. Khi OFI_z < -2 (sell pressure cực đoan), BUY. Đóng vị thế khi z-score quay về vùng [-0.5, 0.5] hoặc đạt time-stop 15 phút.
Công thức.OFI(t) = Σ(V_buy × I_buy) − Σ(V_sell × I_sell)OFI_z(t) = (OFI(t) − μ_lookback) / σ_lookback
Code Python.
import numpy as np
import pandas as pd
def calculate_ofi(trades_df, lookback=20):
"""trades_df cần có cột: timestamp (index), side ('buy'/'sell'), volume."""
trades_df['ofi_contrib'] = np.where(
trades_df['side'] == 'buy',
trades_df['volume'],
-trades_df['volume']
)
ofi = trades_df.groupby(pd.Grouper(freq='1min'))['ofi_contrib'].sum()
mu = ofi.rolling(lookback).mean()
sigma = ofi.rolling(lookback).std()
ofi_z = (ofi - mu) / sigma
return ofi_z
def generate_signals(ofi_z, entry=2.0, exit_band=0.5):
signals = pd.Series(0, index=ofi_z.index)
signals[ofi_z > entry] = -1 # short
signals[ofi_z < -entry] = 1 # long
return signalsQuantConnect setup. Subscribe trade ticks qua AddEquity(...).SetDataNormalizationMode(DataNormalizationMode.Raw). Trong OnData, classify side bằng Lee-Ready (so sánh trade price với mid quote). Tính OFI mỗi phút trong Schedule.On(TimeRules.Every(TimeSpan.FromMinutes(1))). Đặt limit order thay vì market để giảm slippage; sử dụng LimitOrder với offset = 1 tick từ best quote.