Monte-Neo strategy verdict REJECT
Certificate 90b86e297855b9d6 · engine v0.43.0 · 2026-09-30T08:39:54+00:00
Summary
Equity
Per-bar returns after warm-up, bars with a change only.
Annualized, trailing window of 293 bars.
Net return as the per-side trading cost grows.
Trades
What to fix
- The signal at bar t changes when later bars are removed: compute features only from rows <= t (no shift(-k), centered windows, bfill or full-sample stats).
- Past signals change when the future is rewritten: remove whole-series statistics (mean/std/min/max over all rows) and future-dependent fills.
- Fix the flagged source lines (negative shift, center=True, backward fill) and re-run verify. Lines: 7.
- Next-bar hit rate is too high to be real: look for leakage of the next bar's close/open into the signal.
- The strategy loses money after costs: reduce turnover or find a stronger edge.
- Sharpe does not survive the number of variants tried: test out-of-sample or reduce the search space.
Evidence
fail lookahead_truncation
- cut after bar 300: the signal at bar 300 was 1, then 0
- cut after bar 301: the signal at bar 301 was -1, then 0
- cut after bar 417: the signal at bar 417 was 1, then 0
- cut after bar 425: the signal at bar 425 was 1, then 0
fail lookahead_perturbation
- future rewritten after bar 300: the signal changed from bar 300
- future rewritten after bar 839: the signal changed from bar 839
- future rewritten after bar 1379: the signal changed from bar 1379
- future rewritten after bar 1918: the signal changed from bar 1918
fail lookahead_static_lint
- line 7 negative_shift: shift with a negative period reads future bars
return np.sign(df["close"].shift(-1) - df["close"])
fail implausible_accuracy
- next-bar hit rate 1.000 over 2999 bars (z 54.8); a real edge rarely exceeds 0.70
Checks
| check | category | status | summary |
|---|---|---|---|
| data_integrity | integrity | pass | OHLCV is clean |
| data_quality | integrity | pass | no spikes, frozen prices, split jumps or gaps |
| determinism | integrity | pass | signal() is deterministic |
| lookahead_truncation | lookahead | fail | truncation probe: LEAK DETECTED |
| lookahead_perturbation | lookahead | fail | future-perturbation probe: LEAK DETECTED |
| external_data | lookahead | pass | outside data: none read (df only) |
| lookahead_static_lint | lookahead | fail | static lint: negative_shift |
| implausible_accuracy | lookahead | fail | next-bar hit rate 1.000 over 2999 bars (z 54.8) |
| costs_modeled | economics | pass | 10.00 bps per side modeled |
| net_profitability | economics | fail | net total return -64.97% after costs |
| cost_margin | economics | skip | not profitable after costs |
| delay_sensitivity | economics | skip | not profitable after costs |
| timing_significance | statistics | skip | not profitable after costs |
| sample_size | statistics | pass | 1492 closed trades (min 30) |
| deflated_sharpe | statistics | fail | deflated Sharpe 0.000 over 40 trial(s) |
| trials_disclosed | statistics | pass | n_trials declared |
| holdout_consistency | statistics | pass | Sharpe/bar train -0.3171 vs holdout -0.3292 |
| period_consistency | statistics | skip | not profitable after costs |
| walk_forward_stability | statistics | info | 0 of 6 equal windows (490 bars each) made money; worst -17.9%, best -11.6% |
| sharpe_confidence | statistics | info | Sharpe 95% interval -259.89 to -206.61 (return -68.7% to -60.6%); 0% of resamples have a positive Sharpe |
| track_record | statistics | info | the Sharpe is not positive: no history length makes it significant |
| benchmark | statistics | info | buy & hold -1.76% (Sharpe -5.01) vs strategy -64.97% (Sharpe -232.58) |
| spread_estimate | economics | info | rough spread estimate from high and low: about 10.43 bps (5.22 bps per side); the model charges 5 bps slippage per side |
| capacity | economics | info | capital that keeps 90% of 1,492 fills within a share of the bar's volume: 1%: 2.6K, 5%: 13K, 10%: 26K (median bar trades 2.4M) |
By period (segment)
| period | bars | return | buy & hold | Sharpe | exposure |
|---|---|---|---|---|---|
| bars 60-794 | 735 | -18.72% | -2.05% | -183.71 | 100% |
| bars 795-1529 | 735 | -25.75% | -1.75% | -265.99 | 100% |
| bars 1530-2264 | 735 | -25.32% | +0.59% | -255.26 | 100% |
| bars 2265-2999 | 735 | -22.28% | +1.47% | -225.71 | 100% |
By market regime
| market regime | share of bars | strategy | market | Sharpe |
|---|---|---|---|---|
| rising | 54% | -44.28% | -1.06% | -249.02 |
| falling | 46% | -36.51% | +1.53% | -225.95 |
| calm | 50% | -38.52% | +1.12% | -222.98 |
| volatile | 50% | -42.46% | -0.66% | -253.85 |
Regime of a bar: the market's trailing return and volatility over the previous 150 bars.
Reproduce
Costs: 5.00 bps commission + 5.00 bps slippage per side; fills at the next bar's open; long_short; warm-up 60 bars; n_trials 40; min_trades 30.
data f027f3d330505a357cb91cb7e31f49dd8b02f727f9db7ef9e4dafb0879384e2c
signals 45b3a6f9d973ea59894be14d75d67b1c5546b05091273887b0e6aa6d25d02235
source a86ca8eacaec7c18926b6d34f116bf4438b031bf18d95e84dfb56e99fde3cac1
Re-run with the same data and code: monte-neo verify --recheck CERT --ohlcv DATA --strategy STRATEGY.py
Checks backtest methodology (look-ahead, costs, selection bias), not future profit. Not investment advice.