Skip to content

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ínhGiá trị
Phân loạiMarket Microstructure
Khung thời gian1–15 phút
Paper gốcHasbrouck (1991); Cont, Kukanov & Stoikov (2014)
Loại dữ liệuTick / Trade-by-trade với side classification
Hướng giao dịchMean Reversion
CapacityThấ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.

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 signals

QuantConnect 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.

Powered by dautu.tech