Mean Reversion Strategy on Hyperliquid
Does mean reversion work on crypto perps? Backtested on real Hyperliquid perps from 2024-08-15 to 2026-07-05, the default settings earned a Sharpe of 1.56 — +145.7% total return with a 20.6% worst drawdown across 1,238 trades, net of fees, slippage, and funding.
2024-08-15 → 2026-07-05 · net of fees, slippage, and funding · price-only Sharpe 1.50 · these are the default settings, not a hand-picked best case.
At $1,000, this strategy’s worst historical dip was about $206. Free account, your own Hyperliquid keys — Keel only trades.
How it works
How it works
Crypto perpetuals overshoot on forced liquidations and panic, then snap back toward their recent average. This strategy buys that snap-back. Each hour it scans the top-20 Hyperliquid perpetuals for washed-out large-caps: price has pierced below its lower Bollinger band (20, 2.0) and a 2-period RSI is deeply oversold — but only if the coin is still above its long-term trend line, so it buys dips inside uptrends rather than catching falling knives. Positions are equal-weight, 1x gross, long-only, and exit as the oversold condition clears.
When it works best
Choppy, range-bound markets with frequent small reversals, and on the one-hour timeframe, where these brief oversold snaps happen often enough to trade. The trend filter keeps it on the long side of coins that are still structurally rising. Over 2024-08-15 to 2026-07-05 the default one-hour settings returned +145.7% with a Sharpe of 1.56 and a maximum drawdown of −20.6%, net of fees, slippage, and funding, across 1,238 trades.
When it struggles
Sustained one-way selloffs and breakouts, where an oversold reading just gets more oversold and the bounce never comes. The strict entry conditions also fire rarely, so there are long stretches with no trades — on slower timeframes they barely co-occur at all, which is why it runs on one-hour bars. It needs a broad enough universe, too: concentrating on too few coins removes the diversification the approach depends on.
How it’s built
The exact strategy behind this backtest — no black box. Switch to code to see or copy the full definition.
Configuration
Factories
Globals(target_timeframe="1h")Universe(mode="top_volume", top_n=20, market="perp", resolved=[], resolved_at="")Execution( rebalance="buffered", buffer_threshold=0.1, buffer_mode="relative", rebalance_method="to_edge",)trend_vs_200 = Pipeline([ { "px": [EWMA(window=2)], "trend": [EWMA(window=200)], }, Crossover(fast_key="px", slow_key="trend"),], name="trend_vs_200")Pipeline([ PriceDataLoader(timeframe="15min"), TargetTimeframeResampler(), Store("ohlcv_1h"), { "entries": [ Pipeline([ { "const": [ConstantForecast(value=1.0)], "setup": [ Pipeline([ { "oversold": [BollingerBands(period=20, num_std=2.0), BelowThresholdFilter(threshold=0.05, inclusive=True)], "rsi_washed": [RSI(period=2), BelowThresholdFilter(threshold=10.0, inclusive=True)], "uptrend": [trend_vs_200, AboveThresholdFilter(threshold=0.0)], }, MaskAnd(), ], name="setup"), ], }, ApplyMask(score_signal="const", filter_signal="setup"), Store("mr_entry"), ], name="entries"), ], "exits": [MeanReversionDistance(sma_period=20, atr_period=14), ThresholdCross(upper=0.0, lower=-3.0), Clip(lower=0.0, upper=1.0), Store("mr_exit")], }, PositionStateMachine(entry_slot="mr_entry", exit_slot="mr_exit"), EqualWeightSizer(target_leverage=1.0, max_weight=0.2),], name="mean_reversion_hyperliquid")Explore the settings
precomputed · updates instantlyAdjust a setting to see the exact backtested result — including the ones that lost money.
At $1,000, these settings' worst historical dip was about $206. You land in the editor with this exact setup. Free account, your own keys.
Compare all 9 settings
| Settings | Sharpe | Return | Worst DD | Trades |
|---|---|---|---|---|
| buffer 0.1 · Max 0.1 · rsi2 25 · Universe 20 | 1.28 | 115.0% | −28.4% | 1,687 |
| buffer 0.1 · Max 0.05 · rsi2 25 · Universe 20 | 1.51 | 144.6% | −23.9% | 1,453 |
| buffer 0.1 · Max 0.2 · rsi2 25 · Universe 20 | 1.01 | 82.7% | −31.7% | 2,227 |
| buffer 0.1 · Max 0.1 · rsi2 10 · Universe 20 | 1.35 | 118.8% | −23.5% | 1,417 |
| buffer 0.1 · Max 0.1 · rsi2 25 · Universe 10 | 0.12 | 1.1% | −24.4% | 455 |
| buffer 0.1 · Max 0.1 · rsi2 25 · Universe 30 | 1.08 | 95.6% | −38.5% | 3,176 |
| buffer 0.2 · Max 0.1 · rsi2 25 · Universe 20 | 1.35 | 118.8% | −26.2% | 1,339 |
| buffer 0.1 · Max 0.03 · rsi2 25 · Universe 20 | 1.48 | 138.0% | −23.4% | 1,330 |
| buffer 0.1 · Max 0.05 · rsi2 10 · Universe 20default | 1.56 | 145.7% | −20.6% | 1,238 |
The data
Monthly returns
| Month | Return |
|---|---|
| 2024-08 | 0.0% |
| 2024-09 | +3.0% |
| 2024-10 | +4.7% |
| 2024-11 | +30.3% |
| 2024-12 | +4.3% |
| 2025-01 | +12.0% |
| 2025-02 | -8.9% |
| 2025-03 | -6.6% |
| 2025-04 | +12.1% |
| 2025-05 | -5.2% |
| 2025-06 | +2.3% |
| 2025-07 | -1.3% |
| 2025-08 | +4.9% |
| 2025-09 | -9.3% |
| 2025-10 | +11.4% |
| 2025-11 | -10.1% |
| 2025-12 | +11.8% |
| 2026-01 | +5.1% |
| 2026-02 | +28.8% |
| 2026-03 | -0.4% |
| 2026-04 | +7.3% |
| 2026-05 | +19.8% |
| 2026-06 | -6.7% |
| 2026-07 | -0.1% |
Which assets it traded
| Avg allocation | Days held | % of time held | Asset |
|---|---|---|---|
| 0.2 | 11425 | 69.09 | VVV |
| 0.2 | 702 | 4.25 | ZEC |
| 0.1746 | 584 | 3.53 | BNB |
| 0.1721 | 583 | 3.53 | LINK |
| 0.173 | 577 | 3.49 | BTC |
| 0.1777 | 558 | 3.37 | SUI |
| 0.2 | 557 | 3.37 | PUMP |
| 0.169 | 544 | 3.29 | ETH |
| 0.1771 | 541 | 3.27 | XRP |
| 0.1657 | 532 | 3.22 | kPEPE |
| 0.1656 | 531 | 3.21 | WLD |
| 0.1647 | 509 | 3.08 | DOGE |
| 0.1725 | 496 | 3 | SOL |
| 0.2 | 402 | 2.43 | XPL |
| 0.1618 | 358 | 2.16 | kBONK |
| 0.1548 | 333 | 2.01 | NEAR |
| 0.2 | 220 | 1.33 | LIT |
| 0.1984 | 183 | 1.11 | HYPE |
| 0.1818 | 78 | 0.47 | FARTCOIN |
| 0 | 0 | 0 | GRAM |
What this is: a historical backtest on real Hyperliquid market data, net of fees, slippage, and funding. Its worst historical drawdown was 20.6% — expect drawdowns of that order or worse. Past performance does not predict future results, and this is not investment advice. Size your account so a full drawdown is survivable.