← All graded classics

Rate-of-Change Momentum

Pure, unfiltered momentum: if it moved, follow it.

F

The claim

If price gained more than 2% over the last 12 hours, buy the strength; if it lost more than 2%, short the weakness. Momentum in its rawest expressible form.

Where it comes from

Cross-sectional and time-series momentum are among the most-documented effects in academic finance (Jegadeesh & Titman 1993; Moskowitz, Ooi & Pedersen 2012). This is the simple time-series variant.

The exact rule we graded

Long while ROC(12) > +2%, short while ROC(12) < −2%, on 1-hour candles. Exits: 3-ATR trailing stop, 100-bar time exit.

The honest verdict

FAILS the gate
Net expectancy
+1.6bp
OOS trades
5,944
Win rate
36.6%
Reward:risk
1.75
  • OOS net expectancy > 0
  • Clears the cost hurdle
  • Robust, not lucky
  • Survivable drawdown
  • Not overfit
Per-asset OOS expectancy
XRP
+13.3bp
DOGE
+11.0bp
ETH
+10.0bp
AVAX
+5.0bp
SOL
+2.1bp
BTC
-10.0bp
LINK
-10.3bp
BNB
-13.8bp
Permanent verification record →Verified — run on our engine + data

Live forward test

since 2026-07-11 — win or lose

The backtest above is history. Since publication, this exact spec also runs in our nightly forward-test harness (the same one behind /forward-tests): only trades entered after publication count, open positions are never force-closed, and the record publishes either way.

No closed forward trades recorded yet — the record accrues nightly as trades complete their full exit windows.

Honest port notes

  • Academic momentum is usually monthly with cross-sectional ranking; this is the intraday time-series folklore version traders actually run on crypto.
The exact spec, as graded (JSON)
{
  "name": "Rate-of-Change Momentum",
  "universe": [
    "BTC/USDT:USDT",
    "ETH/USDT:USDT",
    "SOL/USDT:USDT",
    "BNB/USDT:USDT",
    "XRP/USDT:USDT",
    "DOGE/USDT:USDT",
    "LINK/USDT:USDT",
    "AVAX/USDT:USDT"
  ],
  "risk": {
    "risk_per_trade_pct": 1,
    "leverage_cap": 3,
    "max_daily_loss_pct": 5,
    "max_dd_halt_pct": 25
  },
  "sleeves": [
    {
      "name": "main",
      "timeframe": "1h",
      "entry": {
        "type": "rule",
        "logic": "all",
        "long": [
          {
            "indicator": "roc",
            "period": 12,
            "op": ">",
            "value": 2
          }
        ],
        "short": [
          {
            "indicator": "roc",
            "period": 12,
            "op": "<",
            "value": -2
          }
        ]
      },
      "exit": {
        "trail_atr": 3,
        "time_exit_bars": 100
      }
    }
  ]
}

Every strategy graded on identical terms: 1-hour candles, 8 liquid USDT perpetuals (BTC, ETH, SOL, BNB, XRP, DOGE, LINK, AVAX), ~6 years of data with a chronological train/test split, real cost hurdle, 1% risk-per-trade sizing, 3x leverage cap. All numbers are out-of-sample (test window only).

Run YOUR version of this strategy
Different thresholds, timeframe, or filter? Paste your exact rules or code and see if your variant survives the same gates.
Grade it free →

A Grade is a historical, out-of-sample statistical measurement — not investment advice, a prediction, or a guarantee. Most strategies fail; a passing grade can stop working as markets change. Risk disclosure