Signed Trade Imbalance
Quick Reference
| Property | Value |
|---|---|
| Dimension | signal |
| Category | flow |
| Version | v1.0 |
| Output Column | signed_trade_imbalance |
Sum of signed volume over a time window, normalized by total volume
Formula
rolling_sum(signed_volume, window_seconds) / (rolling_sum(trade_size, window_seconds) + 1e-10)
CDM Inputs
| Column | CDM Table | Description |
|---|---|---|
signed_volume | cdm_trade_enriched | Trade data enriched with bar context — price, volume, side, trade type |
trade_size | cdm_trade_enriched | Trade data enriched with bar context — price, volume, side, trade type |
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
window_seconds | integer [1, 3600] | 30 | Aggregation window in seconds |
signed_column | string | signed_volume | Column name for signed volume |
Output
Column: signed_trade_imbalance
Normalized signed flow over the window
Market Intuition & Trading Rationale
Signed trade imbalance measures the net directional flow normalized by total volume over a short time window: sum(signed_volume) / sum(trade_size). The result ranges from -1 (all volume was sell-initiated) to +1 (all volume was buy-initiated). A value of zero means perfectly balanced flow — equal buying and selling pressure. This normalization makes the feature comparable across instruments and time periods regardless of absolute volume levels.
The normalization is the key innovation over raw cumulative delta. A cumulative delta of +10,000 shares means very different things for Apple (10,000 shares is routine) versus a small-cap stock (10,000 shares might be a large fraction of daily volume). Signed trade imbalance solves this by scaling the imbalance by total volume, producing a unitless ratio that is directly comparable across the entire universe. A value of +0.3 means the same directional pressure regardless of instrument.
The short default window of 30 seconds reflects the rapid decay of flow imbalance signals. At intraday frequencies, order flow imbalances are weakly persistent — a buying burst that lasts 30 seconds is likely followed by a pause or reversal in the next 30 seconds. This makes signed_trade_imbalance a natural mean-reversion signal: extreme values in either direction suggest the flow is stretched and due for a snap-back. The 30-second window captures this transient imbalance without diluting it over longer periods.
However, the feature is also effective at longer windows with different interpretations. At 300–600 seconds, signed_trade_imbalance captures sustained institutional flow and acts as a trend-following signal. At 3600 seconds (one hour), it measures the session's directional bias. Multi-window analysis — comparing signed_trade_imbalance at 30s, 300s, and 3600s simultaneously — provides a complete picture of flow across time horizons.
Usage Cases
- Short-term mean reversion: Extreme signed_trade_imbalance values (> |0.7|) over 30s windows signal stretched flow. Enter mean-reversion trades expecting the imbalance to revert toward zero within the next 30–60 seconds.
- Trend confirmation: Sustained signed_trade_imbalance > 0.3 over 300s+ windows confirms a directional trend. Use as a filter to only take trend-following entries when flow confirms the price direction.
- Divergence with price: Price making new highs while signed_trade_imbalance is declining = bearish divergence (less buying participation at higher prices). The opposite holds for bullish divergence.
- VWAP deviation context: Combine with vwap_deviation_signal. When price is above VWAP and signed_trade_imbalance is positive, the move has flow confirmation. When they disagree, the move is suspect.
YAML Definition
name: signed_trade_imbalance
description: Sum of signed volume over a time window, normalized by total volume
category: flow
version: v0.9.0 (Beta)
dimension: signal
required_inputs:
- cdm_trade_enriched.signed_volume
- cdm_trade_enriched.trade_size
output_column: signed_trade_imbalance
output_description: Normalized signed flow over the window
tags:
- flow
- imbalance
- signal
- signed_volume
parameters:
window_seconds:
type: integer
description: Aggregation window in seconds
required: false
default: 30
constraints:
min: 1
max: 3600
signed_column:
type: string
description: Column name for signed volume
required: false
default: signed_volume
formula: rolling_sum(signed_volume, window_seconds) / (rolling_sum(trade_size, window_seconds)
+ 1e-10)