Signal architecture
Three independent signal layers feed a final composite score. Each layer is explainable, testable, and can be toggled independently in production.
Regime detection
The regime layer classifies each asset into one of three states: trend, mean-reversion, or neutral. The classification drives which momentum parameters and entry rules are active.
| Input | Parameter | Interpretation |
|---|---|---|
| ADX(14) | > 25 | Trending regime. Momentum signals get wider stops and longer holding periods. |
| ADX(14) | < 20 and Hurst < 0.45 | Mean-reverting regime. Favour short-term reversals and tighter stops. |
| Neither | Fallback | Neutral. Reduce size, raise confirmation threshold, or stay flat. |
| Realised volatility percentile | > 80 | Volatility expansion. Tighten risk, widen entry ranges, avoid new breakouts. |
The Hurst exponent is estimated using the rescaled range method over a 100-day rolling window. It is robust to non-stationary variance and works well alongside ADX as a second opinion.
Momentum scoring
The momentum score ranks assets by recent performance, adjusted by volume and volatility. It is direction-aware and normalised across the universe.
Composite momentum score
score = 0.40 * roc_20
+ 0.30 * roc_60
+ 0.20 * volume_weighted_momentum
- 0.10 * volatility_penalty
where volume_weighted_momentum = roc_20 * (volume_20d / volume_60d)
volatility_penalty = max(0, realised_vol_20d - target_vol_10pct)
roc_20 and roc_60 are simple percentage changes over 20 and 60 trading days. The volume weighting rewards moves backed by sustained turnover. The volatility penalty reduces scores when recent volatility materially exceeds the 10% annualised target.
Order-flow confirmation
This is the TradeDNA layer. It ingests intraday tick data and produces a behavioural confirmation score. The score answers one question: is the current move supported by abnormal but non-exhaustive order flow?
| Signal | Description | Weight |
|---|---|---|
| Volume cluster | Intraday volume exceeds 2 standard deviations above the 20-day average for the same time bucket. | 25% |
| VWAP deviation | Price sits more than 0.5 ATR above/below VWAP in the direction of the signal. | 25% |
| Tape momentum | More than 60% of intraday volume prints on the same side of the signal for at least two consecutive hours. | 25% |
| Exhaustion check | No climactic wick or volume spike suggesting immediate reversal. | 25% |
The confirmation score ranges from 0 to 1. A score above 0.6 is required to enter a position. Above 0.8, the position size can be scaled up subject to risk limits.
Final signal score
final_score = regime_weight * momentum_score
+ confirmation_weight * trade_dna_score
if regime == TREND:
regime_weight = 0.60; confirmation_weight = 0.40
elif regime == MEAN_REVERSION:
regime_weight = 0.40; confirmation_weight = 0.60
else:
final_score = 0 # neutral: no new positions
Mean-reversion puts more weight on confirmation because reversals are often short-lived and need immediate behavioural support. Trending regimes put more weight on sustained momentum because the move has more room to run.
When to trade
Signals are evaluated after market close. An order is placed for the next open if all three conditions are met:
- Final score > 0.65 for trend, > 0.70 for mean-reversion.
- The asset is not already at maximum position size.
- Portfolio exposure, after the new position, stays under the regime-adjusted cap.
Intraday confirmation is checked in the first hour. If the confirmation score drops below 0.5 by 11:00 a.m., the order is cancelled and the signal is discarded.