Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when running, interpreting, or designing backtests on Superior Trade — anything about backtest windows, trade-count thresholds, exit-reason mix, parameter sweeps, walk-forward validation, zero-trade diagnosis, compute-cost estimation, or "is this backtest result trustworthy?". Pair with the relevant strategy template from `strategies/`.
.claude/skills/superior-trade-backtesting/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 92% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 129% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 88% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 53% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 82% | 0% |
Use the Unified API first: discover support with GET /runtime/frameworks, then create with POST /runtime/backtests and inspect with GET /runtime/backtests/{id} plus GET /runtime/backtests/{id}/logs. Read ../../references/unified-runtime.md for the compatibility rule. Use a venue's legacy backtest route only when the Unified contract does not support the selected framework or venue.
The mechanics of submitting a backtest are in the hyperliquid skill under "Backtest Workflow" (Polymarket backtests are in the polymarket skill). This page is about the judgment calls — picking a window that means something, telling signal from noise in the result, and knowing when to give up vs. iterate.
Trade count is the single most important number on a result page. Look at it before PnL, before Sharpe, before win rate.
| Trade count | Verdict | | ----------- | ---------------------------------------------------------------------------------------- | | < 30 | Coincidence, not a strategy. Don't promise anything; widen entries or extend window. | | 30-50 | Marginal. Sharpe is noisy. Treat results as directional, not numeric. | | 50-200 | Useful. Sharpe / profit factor start to mean something. | | 200+ | Statistical confidence. Now you can compare variants on micro-differences. |
Watch for the trap: backtests with 5-10 trades and a 100% win rate. They look like world-beaters and almost always disintegrate live. The strategy is too selective — every signal is a coin flip you've cherry-picked, not a repeatable edge. Widen the entry threshold, lengthen the window, or accept that there's no statistical signal here.
> A great backtest over the wrong window is a great fiction.
The window should answer: _"if I had deployed this strategy on day one of this window, what would have happened?"_ — not _"what's the prettiest curve I can fit?"_
Pure bull, pure bear, sideways chop — your window should include at least two of the three. A 90-day backtest in a one-direction market is a 90-day cherry-pick. A momentum strategy that prints +50% over a +60% trending window has told you nothing about itself; it's just measured beta.
Less than that and you're really looking at noise. More than that and Hyperliquid's history may not cover the pair (HL was launched in 2023; many alts have < 12mo of data).
Some HIP3 / new-listing pairs only have a few weeks of data. Two pragmatic responses:
BTC if BTC-AAPL is too new), then assume the result transfers ±20%.If you tune parameters and validate on the same window, your backtest is a souvenir, not a forecast. This is the single most common reason strategies that look brilliant on paper die in the first week of live trading.
The honest workflow:
If you do sweep, walk forward to a different period or pair before promoting the winner. A parameter that wins on Q1 BTC and also wins on Q1 ETH (out-of-sample for the second pair) is real. A parameter that wins on Q1 BTC and gets re-validated on Q1 BTC is theatre.
If the user's "strategy" started as a 5-variant sweep and now they want to deploy the winner — the result on the test window is overstated. Tell them to either run an out-of-sample check or accept they're deploying on optimistic numbers.
When the user wants to find the right parameter (e.g. RSI threshold, ATR multiplier, lookback length), run 3 variants in one batch, not iterative single backtests. The shape of the 3-result table tells you what to do:
| Variant | Config | PnL% | Trades | Sharpe | Max DD | | ------- | -------- | ---- | ------ | ------ | ------ | | A | RSI < 25 | … | … | … | … | | B | RSI < 30 | … | … | … | … | | C | RSI < 35 | … | … | … | … |
Read the shape:
After the backtest completes, look at the breakdown of how trades ended. A healthy strategy ends through a mix of:
minimal_roipopulate_exit_trend)custom_exit)Each one tells a different story. Distortions diagnose specific bugs:
| Distortion | Meaning | | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | 90% stoploss hits | Stop is too tight relative to the strategy's natural noise. Widen, or accept this strategy is in the wrong volatility regime for this pair. | | 90% time-based timeouts | Exit signal does nothing. Either the exit conditions are too restrictive, or there's no real edge — you're just holding until the timer rings. | | 100% take-profit hits | minimal_roi is the strategy. The exit signal isn't earning its keep — could be removed or tightened. | | 50/50 stop vs profit | Healthy. Strategy is choosing actively in both directions. |
Zero trades from a backtest means the entry condition never fired. Five common causes, in order of likelihood:
RSI < 30 rarely triggers on BTC 15m).startup_candle_count larger than available data — the indicator stays NaN forever.BTC/USDC for futures will silently produce no fills).false AND false — each condition individually rare, joined by AND rarer still.Backtest run time scales with candle count. Estimate before submitting so you can set the user's expectations:
candles ≈ (days × 24) / timeframe_hours × number_of_pairs| Candle count | Behavior | | ------------ | ------------------------------------------------------------ | | < 100K | Submit normally, poll every 10s. | | 100K–500K | Warn user "may take a few minutes", use exponential polling. | | > 500K | Warn user "could take 10+ minutes", longer poll intervals. |
Reference points:
Always allow the user to proceed. Just set expectations. Don't block on size.
When polling backtest_status on long runs:
This prevents hitting the 20-step tool limit on million-candle backtests.
| Metric | Trust at | Notes | | ------------------ | --------------------------------------------------------- | --------------------------------------------------------------------------------- | | Total trades | Always look first. | Below 30 = ignore everything else. | | Total profit % | Useful for ranking, weak for forecasting. | Large windows + small per-trade edge can produce big PnL from luck. | | Win rate | OK above 50 trades. | A 60% WR on 8 trades is one good week, not an edge. | | Sharpe ratio | Above 1.0 = good, above 2.0 = excellent. | But fragile under 50 trades; don't quote "Sharpe 2.0" off a 12-trade run. | | Profit factor | Gross gains / gross losses. > 1.3 is the practical floor. | Penalizes hidden tail losses better than Sharpe. | | Max drawdown | > 20% is risky for retail-sized accounts. | A 5% Sharpe-1 strategy with 30% DD is unrunnable for most users. | | Avg holding | Sanity check — does it match the strategy's intent? | A "scalp" with 12h avg holding is misnamed; a "swing" with 5min holding likewise. |
Before recommending live deployment, run the strategy on out-of-sample data at least once:
ETH if you tuned on BTC). Allow ±30% degradation; anything beyond that means the parameters were pair-specific not regime-specific.If both walk-forwards survive, you have a defensible recommendation. If either falls apart, you have a backtest, not a strategy.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-11 | fail→pass | 19,548 | 13,714 | -30% | 1 | 1 | 0% | 2,200 | 4,213 | +92% | 0 | 0 | — |
case-01 | fail→pass | 24,005 | 41,868 | +74% | 1 | 1 | 0% | 3,425 | 7,857 | +129% | 0 | 0 | — |
case-02 | fail→pass | 38,050 | 17,193 | -55% | 1 | 1 | 0% | 2,547 | 4,781 | +88% | 0 | 0 | — |
case-03 | fail→pass | 15,586 | 17,696 | +14% | 1 | 1 | 0% | 3,408 | 5,218 | +53% | 0 | 0 | — |
case-04 | fail→pass | 14,314 | 10,626 | -26% | 1 | 1 | 0% | 2,495 | 4,535 | +82% | 0 | 0 | — |
case-05 | fail→fail | 21,734 | 19,440 | -11% | 1 | 1 | 0% | 2,431 | 4,673 | +92% | 0 | 0 | — |
case-06 | pass→pass | 18,860 | 9,872 | -48% | 1 | 1 | 0% | 2,184 | 4,448 | +104% | 0 | 0 | — |
case-07 | fail→pass | 26,018 | 14,489 | -44% | 1 | 1 | 0% | 3,348 | 4,495 | +34% | 0 | 0 | — |
case-08 | fail→pass | 14,280 | 7,215 | -49% | 1 | 1 | 0% | 2,114 | 3,988 | +89% | 0 | 0 | — |
case-09 | fail→fail | 16,327 | 14,333 | -12% | 1 | 1 | 0% | 2,504 | 4,388 | +75% | 0 | 0 | — |
case-10 | fail→fail | 14,068 | 9,657 | -31% | 1 | 1 | 0% | 2,384 | 4,454 | +87% | 0 | 0 | — |
case-12 | pass→pass | 19,424 | 18,480 | -5% | 1 | 1 | 0% | 2,208 | 4,812 | +118% | 0 | 0 | — |
case-13 | fail→pass | 15,587 | 14,419 | -7% | 1 | 1 | 0% | 2,535 | 4,306 | +70% | 0 | 0 | — |
case-14 | fail→pass | 13,943 | 13,239 | -5% | 1 | 1 | 0% | 2,164 | 4,266 | +97% | 0 | 0 | — |
case-15 | fail→pass | 13,110 | 7,904 | -40% | 1 | 1 | 0% | 2,277 | 4,173 | +83% | 0 | 0 | — |
case-16 | fail→pass | 13,669 | 7,524 | -45% | 1 | 1 | 0% | 2,637 | 4,016 | +52% | 0 | 0 | — |
case-17 | pass→pass | 19,162 | 9,914 | -48% | 1 | 1 | 0% | 2,460 | 3,710 | +51% | 0 | 0 | — |
case-18 | pass→pass | 21,161 | 11,414 | -46% | 1 | 1 | 0% | 2,521 | 4,638 | +84% | 0 | 0 | — |
case-19 | fail→fail | 24,309 | 17,446 | -28% | 1 | 1 | 0% | 3,054 | 4,753 | +56% | 0 | 0 | — |
case-20 | fail→fail | 16,114 | 13,253 | -18% | 1 | 1 | 0% | 2,548 | 4,109 | +61% | 0 | 0 | — |
case-21 | fail→fail | 24,558 | 14,861 | -39% | 1 | 1 | 0% | 2,331 | 5,204 | +123% | 0 | 0 | — |
case-22 | pass→pass | 19,601 | 17,996 | -8% | 1 | 1 | 0% | 3,274 | 5,831 | +78% | 0 | 0 | — |
case-23 | pass→pass | 36,073 | 30,225 | -16% | 1 | 1 | 0% | 4,192 | 7,184 | +71% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +48 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/28/2026 | +43% |
Other measured skills in the registry, with their headline benchmark lift.