Bollinger Basis (SMA20) vs EMA Crossovers — 1h Crypto Perps
- Universe (10): BTCUSDT, ETHUSDT, SOLUSDT, ZECUSDT, NEARUSDT, XRPUSDT, OGNUSDT, HYPEUSDT, BNBUSDT, DOGEUSDT
- Data: Binance USD-M perpetuals, 1h resampled from 1m; 2025-01-01 → 2026-10-01 (IS/OOS split 2026-01-01).
- Signal: EMA(n) crosses fixed SMA(20) (Bollinger middle); bands = SMA ± 2σ, σ = 20-bar sample std (ddof=1).
- Execution: signal at close t, fill at open t+1; 6.0 bps/side; funding=on; annualisation 8760 bars/yr.
- EMA periods: 5, 8, 10, 12, 15, 20, 25, 30, 40, 50, 75, 100, 150, 200.
Executive summary
Across 14 EMA periods × 3 sides, the best out-of-sample Sharpe was 1.38 (long, EMA(12), OOS return 36.78%). At least one side was OOS-positive, but long-only (best Sharpe 1.38) outperformed short-only (best Sharpe -0.47). The OOS window is a single regime, so these are not independent evidence of an edge.
The pre-registered reference EMA20/SMA20 long-short delivered OOS return -11.05% at Sharpe -0.14 (IS Sharpe -0.39), break-even ≈ 4.6 bps/side; bootstrap 95% CI on its OOS Sharpe includes zero ([-2.50, 2.21]).
Crucially, walk-forward selection (choose the EMA period on each train window, test on the next unseen window) is negative on every side — the best is long at Sharpe -0.33 (-21.88%, 25% positive folds). So the positive full-sample-OOS long-only result does not survive parameter selection, which is the outcome that matters.
See §10 for the point-by-point answers to the study's ten questions.
1. Environment & data
Reuses analytics.ema_backtest (engine/loader) from the previous EMA-crossover study; only the signal (EMA(n) vs fixed SMA(20)) and Bollinger filters are new. Datasets: OHLCV bars (1m + 1d), funding (8h), open interest. No native 1h bars — 1h is resampled from 1m (open=first, high=max, low=min, close=last, bucket labelled by open time).
| symbol | bars | start | end | dup ts | gaps | max gap (h) | BB warm-up | funding events |
|---|---|---|---|---|---|---|---|---|
| BTCUSDT | 15,312 | 2025-01-01 | 2026-09-30 | 0 | 0 | 1 | 19 | 1,914 |
| ETHUSDT | 15,312 | 2025-01-01 | 2026-09-30 | 0 | 0 | 1 | 19 | 1,914 |
| SOLUSDT | 15,312 | 2025-01-01 | 2026-09-30 | 0 | 0 | 1 | 19 | 1,914 |
| ZECUSDT | 15,312 | 2025-01-01 | 2026-09-30 | 0 | 0 | 1 | 19 | 1,914 |
| NEARUSDT | 15,312 | 2025-01-01 | 2026-09-30 | 0 | 0 | 1 | 19 | 1,914 |
| XRPUSDT | 15,312 | 2025-01-01 | 2026-09-30 | 0 | 0 | 1 | 19 | 1,914 |
| OGNUSDT | 15,312 | 2025-01-01 | 2026-09-30 | 0 | 0 | 1 | 19 | 2,567 |
| HYPEUSDT | 11,725 | 2025-05-30 | 2026-09-30 | 0 | 0 | 1 | 19 | 2,930 |
| BNBUSDT | 15,312 | 2025-01-01 | 2026-09-30 | 0 | 0 | 1 | 19 | 765 |
| DOGEUSDT | 15,312 | 2025-01-01 | 2026-09-30 | 0 | 0 | 1 | 19 | 1,914 |
Funding timestamps are truncated to the hour (jitter); warm-up: EMA(200) is only valid after 200 bars and signals require both the EMA and SMA(20) to be defined.
2. Experiment A — main comparison (EMA(n) vs SMA20)
Buy & hold over the same windows: IS -7.14% (Sharpe 0.25); OOS 42.29% (Sharpe 1.12, maxDD -39.57%). The no-trade (cash) baseline is 0%.
| side | EMA | IS ret | IS Sharpe | OOS ret | OOS Sharpe | OOS maxDD | trades | win | PF | avg trade | hold h | break-even (bps) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| both | 5 | -22.68% | -0.16 | -13.48% | -0.20 | -40.76% | 9703 | 30% | 0.99 | -0.007% | 15.4 | 4.4 |
| both | 8 | -21.15% | -0.12 | 0.78% | 0.25 | -37.94% | 8698 | 32% | 1.01 | 0.014% | 17.2 | 6.2 |
| both | 10 | -22.17% | -0.15 | 7.66% | 0.44 | -35.14% | 8616 | 32% | 1.02 | 0.020% | 17.3 | 7.0 |
| both | 12 | -26.45% | -0.25 | 16.09% | 0.67 | -35.61% | 8660 | 33% | 1.02 | 0.020% | 17.2 | 8.0 |
| both | 15 | -29.46% | -0.32 | 8.53% | 0.47 | -38.46% | 9142 | 34% | 1.00 | 0.004% | 16.3 | 7.1 |
| both | 20 | -32.13% | -0.39 | -11.05% | -0.14 | -43.90% | 9644 | 39% | 0.98 | -0.021% | 15.5 | 4.6 |
| both | 25 | -28.99% | -0.32 | 0.81% | 0.25 | -34.81% | 7647 | 46% | 0.98 | -0.020% | 19.5 | 6.2 |
| both | 30 | -28.63% | -0.29 | -34.59% | -1.02 | -45.20% | 5402 | 51% | 0.92 | -0.119% | 27.6 | ≤0 |
| both | 40 | -35.02% | -0.46 | -33.36% | -0.97 | -47.29% | 3648 | 59% | 0.88 | -0.197% | 40.9 | ≤0 |
| both | 50 | -26.58% | -0.25 | -37.57% | -1.17 | -47.10% | 3103 | 61% | 0.88 | -0.224% | 48.0 | ≤0 |
| both | 75 | 11.64% | 0.48 | -37.03% | -1.13 | -42.41% | 2422 | 67% | 0.94 | -0.121% | 61.4 | ≤0 |
| both | 100 | 4.49% | 0.36 | -31.68% | -0.90 | -39.87% | 2108 | 69% | 0.94 | -0.131% | 70.5 | ≤0 |
| both | 150 | 5.42% | 0.38 | -28.53% | -0.78 | -37.70% | 1713 | 70% | 0.94 | -0.142% | 86.4 | ≤0 |
| both | 200 | 0.03% | 0.28 | -39.27% | -1.27 | -45.42% | 1421 | 71% | 0.85 | -0.403% | 103.8 | ≤0 |
| long | 5 | -5.05% | 0.08 | 18.13% | 0.82 | -25.49% | 9702 | 29% | 1.06 | 0.062% | 15.4 | 9.9 |
| long | 8 | -4.23% | 0.10 | 27.49% | 1.12 | -23.18% | 8697 | 31% | 1.08 | 0.091% | 17.2 | 12.4 |
| long | 10 | -4.87% | 0.09 | 31.76% | 1.24 | -23.92% | 8615 | 32% | 1.08 | 0.098% | 17.3 | 13.3 |
| long | 12 | -7.61% | 0.02 | 36.78% | 1.38 | -23.01% | 8659 | 32% | 1.08 | 0.096% | 17.2 | 14.3 |
| long | 15 | -9.67% | -0.03 | 32.04% | 1.24 | -24.00% | 9141 | 34% | 1.07 | 0.076% | 16.4 | 12.9 |
| long | 20 | -11.75% | -0.08 | 19.03% | 0.82 | -26.74% | 9643 | 39% | 1.04 | 0.047% | 15.5 | 10.1 |
| long | 25 | -11.98% | -0.04 | 26.01% | 0.99 | -30.42% | 7646 | 45% | 1.05 | 0.064% | 19.7 | 13.0 |
| long | 30 | -13.14% | -0.04 | 1.51% | 0.25 | -33.46% | 5399 | 50% | 1.00 | -0.005% | 28.0 | 6.7 |
| long | 40 | -18.26% | -0.14 | 2.48% | 0.28 | -35.18% | 3640 | 57% | 0.98 | -0.035% | 41.9 | 7.5 |
| long | 50 | -13.21% | -0.02 | -0.89% | 0.16 | -35.39% | 3093 | 59% | 0.97 | -0.042% | 49.7 | 5.4 |
| long | 75 | 4.37% | 0.34 | -0.51% | 0.18 | -34.74% | 2412 | 65% | 1.05 | 0.100% | 64.4 | 5.5 |
| long | 100 | 0.36% | 0.27 | 3.60% | 0.32 | -34.74% | 2098 | 67% | 1.06 | 0.117% | 74.7 | 10.0 |
| long | 150 | 0.36% | 0.27 | 5.96% | 0.39 | -35.05% | 1703 | 69% | 1.08 | 0.155% | 92.5 | 14.0 |
| long | 200 | 3.56% | 0.33 | -2.24% | 0.12 | -35.30% | 1421 | 69% | 1.04 | 0.101% | 111.2 | 2.3 |
| short | 5 | -21.89% | -0.25 | -28.35% | -0.99 | -41.33% | 9694 | 31% | 0.93 | -0.075% | 15.4 | ≤0 |
| short | 8 | -21.08% | -0.23 | -22.71% | -0.72 | -38.11% | 8689 | 32% | 0.94 | -0.063% | 17.2 | ≤0 |
| short | 10 | -21.56% | -0.24 | -20.11% | -0.61 | -35.94% | 8607 | 33% | 0.95 | -0.057% | 17.3 | 0.1 |
| short | 12 | -23.72% | -0.30 | -17.00% | -0.47 | -33.93% | 8651 | 34% | 0.95 | -0.055% | 17.2 | 1.1 |
| short | 15 | -25.21% | -0.35 | -19.64% | -0.60 | -35.12% | 9133 | 34% | 0.94 | -0.068% | 16.3 | 0.6 |
| short | 20 | -26.34% | -0.39 | -27.03% | -1.01 | -41.03% | 9635 | 39% | 0.92 | -0.090% | 15.4 | ≤0 |
| short | 25 | -22.88% | -0.37 | -21.74% | -0.81 | -33.09% | 7638 | 47% | 0.92 | -0.103% | 19.3 | ≤0 |
| short | 30 | -21.09% | -0.35 | -36.93% | -1.68 | -40.95% | 5395 | 53% | 0.85 | -0.232% | 27.3 | ≤0 |
| short | 40 | -23.77% | -0.49 | -36.36% | -1.64 | -41.56% | 3646 | 61% | 0.80 | -0.358% | 39.9 | ≤0 |
| short | 50 | -18.88% | -0.34 | -38.38% | -1.78 | -42.18% | 3103 | 63% | 0.79 | -0.405% | 46.4 | ≤0 |
| short | 75 | 2.46% | 0.26 | -38.04% | -1.77 | -45.66% | 2422 | 68% | 0.85 | -0.341% | 58.4 | ≤0 |
| short | 100 | -0.32% | 0.18 | -35.48% | -1.62 | -44.50% | 2108 | 71% | 0.84 | -0.378% | 66.2 | ≤0 |
| short | 150 | 0.36% | 0.19 | -34.05% | -1.53 | -44.56% | 1713 | 72% | 0.83 | -0.438% | 80.4 | ≤0 |
| short | 200 | -7.82% | -0.05 | -39.28% | -1.84 | -47.54% | 1411 | 72% | 0.71 | -0.909% | 96.4 | ≤0 |
3. Experiment B — predictive diagnostics (before trading)
Direction-aligned forward returns at each crossover, pooled across symbols and sorted in time; CIs from a block bootstrap (block = max(horizon, 24) events) to respect overlap.
Unconditional baseline (per horizon):
| horizon | P(up) | mean return |
|---|---|---|
| 1h | 49.3% | 0.005% |
| 4h | 49.5% | 0.018% |
| 8h | 49.8% | 0.037% |
| 12h | 49.8% | 0.055% |
| 24h | 49.5% | 0.109% |
| 48h | 49.1% | 0.211% |
| 72h | 48.8% | 0.308% |
1h direction-aligned return by EMA period
| EMA | side | n | hit | hit 95% CI | mean | mean 95% CI | median | std |
|---|---|---|---|---|---|---|---|---|
| 5 | both | 9,703 | 46.6% | [45.5%, 47.7%] | -0.000% | [-0.024%, 0.023%] | -0.023% | 0.93% |
| 8 | both | 8,698 | 47.2% | [45.8%, 48.4%] | 0.006% | [-0.025%, 0.032%] | -0.018% | 0.94% |
| 10 | both | 8,616 | 47.4% | [46.3%, 48.6%] | 0.012% | [-0.013%, 0.034%] | -0.014% | 0.93% |
| 12 | both | 8,660 | 47.9% | [46.6%, 49.0%] | 0.014% | [-0.011%, 0.037%] | -0.006% | 0.91% |
| 15 | both | 9,142 | 47.8% | [46.5%, 49.0%] | 0.004% | [-0.018%, 0.025%] | -0.008% | 0.91% |
| 20 | both | 9,644 | 47.7% | [46.6%, 48.7%] | 0.003% | [-0.017%, 0.023%] | -0.007% | 0.92% |
| 25 | both | 7,647 | 49.0% | [47.8%, 50.3%] | 0.009% | [-0.011%, 0.032%] | 0.000% | 0.92% |
| 30 | both | 5,402 | 49.1% | [47.7%, 50.5%] | -0.011% | [-0.036%, 0.010%] | 0.000% | 0.84% |
| 40 | both | 3,648 | 49.9% | [48.3%, 52.0%] | 0.002% | [-0.026%, 0.030%] | 0.000% | 0.86% |
| 50 | both | 3,103 | 51.2% | [49.0%, 53.0%] | -0.015% | [-0.047%, 0.017%] | 0.016% | 0.87% |
| 75 | both | 2,422 | 51.7% | [49.8%, 53.3%] | -0.013% | [-0.050%, 0.024%] | 0.026% | 0.85% |
| 100 | both | 2,108 | 50.2% | [47.6%, 52.4%] | -0.030% | [-0.060%, 0.006%] | 0.003% | 0.85% |
| 150 | both | 1,713 | 48.8% | [46.5%, 51.0%] | -0.026% | [-0.075%, 0.029%] | 0.000% | 0.93% |
| 200 | both | 1,421 | 50.5% | [47.5%, 53.1%] | -0.014% | [-0.077%, 0.035%] | 0.008% | 0.91% |
| 5 | long | 4,853 | 47.1% | [45.4%, 48.5%] | 0.008% | [-0.032%, 0.050%] | -0.013% | 0.95% |
| 8 | long | 4,351 | 48.2% | [46.2%, 49.8%] | 0.023% | [-0.021%, 0.059%] | 0.000% | 0.91% |
| 10 | long | 4,311 | 48.6% | [46.7%, 50.1%] | 0.030% | [-0.007%, 0.072%] | 0.000% | 0.91% |
| 12 | long | 4,333 | 48.9% | [46.9%, 50.7%] | 0.027% | [-0.010%, 0.068%] | 0.000% | 0.90% |
| 15 | long | 4,574 | 48.5% | [46.3%, 49.7%] | 0.014% | [-0.016%, 0.038%] | 0.000% | 0.89% |
| 20 | long | 4,825 | 48.3% | [46.7%, 49.6%] | 0.013% | [-0.018%, 0.037%] | 0.000% | 0.91% |
| 25 | long | 3,825 | 48.4% | [46.7%, 50.1%] | 0.006% | [-0.025%, 0.044%] | 0.000% | 0.93% |
| 30 | long | 2,701 | 49.5% | [47.2%, 52.2%] | -0.003% | [-0.041%, 0.037%] | 0.000% | 0.81% |
| 40 | long | 1,822 | 49.0% | [46.4%, 50.8%] | -0.025% | [-0.064%, 0.006%] | 0.000% | 0.79% |
| 50 | long | 1,549 | 49.2% | [47.0%, 51.5%] | -0.023% | [-0.062%, 0.022%] | 0.000% | 0.77% |
| 75 | long | 1,209 | 50.4% | [47.8%, 53.1%] | -0.029% | [-0.084%, 0.025%] | 0.007% | 0.84% |
| 100 | long | 1,053 | 50.4% | [47.4%, 53.4%] | -0.031% | [-0.070%, 0.002%] | 0.005% | 0.77% |
| 150 | long | 854 | 50.4% | [47.0%, 53.8%] | -0.014% | [-0.078%, 0.037%] | 0.010% | 0.81% |
| 200 | long | 712 | 50.4% | [46.5%, 54.2%] | -0.011% | [-0.072%, 0.045%] | 0.017% | 0.77% |
| 5 | short | 4,850 | 46.1% | [44.5%, 47.9%] | -0.009% | [-0.047%, 0.022%] | -0.037% | 0.91% |
| 8 | short | 4,347 | 46.1% | [44.8%, 47.8%] | -0.010% | [-0.042%, 0.021%] | -0.034% | 0.97% |
| 10 | short | 4,305 | 46.3% | [44.9%, 48.1%] | -0.005% | [-0.036%, 0.032%] | -0.032% | 0.95% |
| 12 | short | 4,327 | 46.8% | [45.3%, 48.7%] | 0.001% | [-0.037%, 0.041%] | -0.024% | 0.93% |
| 15 | short | 4,568 | 47.1% | [45.7%, 49.0%] | -0.005% | [-0.043%, 0.027%] | -0.021% | 0.93% |
| 20 | short | 4,819 | 47.1% | [45.5%, 49.0%] | -0.007% | [-0.038%, 0.026%] | -0.022% | 0.93% |
| 25 | short | 3,822 | 49.6% | [47.6%, 51.4%] | 0.011% | [-0.019%, 0.044%] | 0.000% | 0.90% |
| 30 | short | 2,701 | 48.8% | [46.3%, 51.0%] | -0.018% | [-0.060%, 0.010%] | 0.000% | 0.86% |
| 40 | short | 1,826 | 50.9% | [48.0%, 54.3%] | 0.030% | [-0.009%, 0.075%] | 0.011% | 0.92% |
| 50 | short | 1,554 | 53.3% | [50.5%, 55.6%] | -0.008% | [-0.057%, 0.043%] | 0.040% | 0.96% |
| 75 | short | 1,213 | 52.9% | [50.4%, 55.8%] | 0.003% | [-0.044%, 0.055%] | 0.047% | 0.85% |
| 100 | short | 1,055 | 50.0% | [46.5%, 53.0%] | -0.029% | [-0.085%, 0.028%] | 0.000% | 0.92% |
| 150 | short | 859 | 47.3% | [44.8%, 51.1%] | -0.038% | [-0.107%, 0.026%] | -0.005% | 1.04% |
| 200 | short | 709 | 50.5% | [47.0%, 54.4%] | -0.017% | [-0.112%, 0.074%] | 0.005% | 1.03% |
4h direction-aligned return by EMA period
| EMA | side | n | hit | hit 95% CI | mean | mean 95% CI | median | std |
|---|---|---|---|---|---|---|---|---|
| 5 | both | 9,700 | 48.0% | [46.6%, 49.2%] | 0.014% | [-0.033%, 0.059%] | -0.026% | 1.84% |
| 8 | both | 8,695 | 48.1% | [46.7%, 49.5%] | 0.012% | [-0.030%, 0.072%] | -0.026% | 1.82% |
| 10 | both | 8,615 | 48.1% | [46.6%, 49.3%] | 0.011% | [-0.040%, 0.055%] | -0.027% | 1.80% |
| 12 | both | 8,659 | 48.3% | [46.8%, 49.8%] | 0.003% | [-0.049%, 0.050%] | -0.020% | 1.76% |
| 15 | both | 9,140 | 48.5% | [47.2%, 49.9%] | -0.003% | [-0.055%, 0.043%] | -0.017% | 1.74% |
| 20 | both | 9,642 | 49.5% | [48.0%, 50.7%] | -0.004% | [-0.067%, 0.043%] | 0.000% | 1.74% |
| 25 | both | 7,643 | 49.9% | [48.2%, 51.4%] | -0.004% | [-0.058%, 0.058%] | 0.000% | 1.80% |
| 30 | both | 5,399 | 50.6% | [48.9%, 52.0%] | -0.016% | [-0.082%, 0.041%] | 0.020% | 1.73% |
| 40 | both | 3,644 | 51.6% | [49.9%, 53.7%] | 0.003% | [-0.063%, 0.069%] | 0.042% | 1.62% |
| 50 | both | 3,101 | 51.3% | [49.3%, 53.2%] | -0.014% | [-0.092%, 0.059%] | 0.041% | 1.64% |
| 75 | both | 2,420 | 51.9% | [49.6%, 53.9%] | 0.009% | [-0.061%, 0.085%] | 0.048% | 1.63% |
| 100 | both | 2,108 | 50.5% | [47.9%, 53.0%] | -0.047% | [-0.148%, 0.053%] | 0.023% | 1.72% |
| 150 | both | 1,712 | 52.3% | [49.7%, 55.1%] | -0.028% | [-0.118%, 0.062%] | 0.054% | 1.64% |
| 200 | both | 1,421 | 50.9% | [47.6%, 53.8%] | -0.011% | [-0.117%, 0.070%] | 0.024% | 1.59% |
| 5 | long | 4,853 | 48.0% | [46.2%, 50.1%] | 0.060% | [-0.024%, 0.139%] | -0.026% | 1.86% |
| 8 | long | 4,351 | 48.7% | [46.7%, 50.7%] | 0.068% | [-0.016%, 0.153%] | -0.019% | 1.87% |
| 10 | long | 4,311 | 48.4% | [46.4%, 50.5%] | 0.054% | [-0.035%, 0.148%] | -0.024% | 1.86% |
| 12 | long | 4,333 | 49.2% | [47.0%, 51.2%] | 0.050% | [-0.038%, 0.156%] | 0.000% | 1.80% |
| 15 | long | 4,574 | 49.4% | [47.2%, 51.3%] | 0.063% | [-0.011%, 0.131%] | 0.000% | 1.75% |
| 20 | long | 4,825 | 50.3% | [48.3%, 52.6%] | 0.031% | [-0.051%, 0.090%] | 0.014% | 1.72% |
| 25 | long | 3,825 | 50.0% | [47.2%, 52.0%] | -0.001% | [-0.084%, 0.070%] | 0.002% | 1.68% |
| 30 | long | 2,701 | 49.8% | [47.1%, 52.3%] | -0.030% | [-0.121%, 0.032%] | 0.000% | 1.61% |
| 40 | long | 1,821 | 50.1% | [46.6%, 53.2%] | -0.031% | [-0.117%, 0.055%] | 0.004% | 1.58% |
| 50 | long | 1,549 | 49.8% | [47.1%, 52.7%] | -0.037% | [-0.133%, 0.060%] | 0.000% | 1.56% |
| 75 | long | 1,209 | 52.1% | [49.5%, 55.5%] | 0.008% | [-0.083%, 0.123%] | 0.051% | 1.60% |
| 100 | long | 1,053 | 48.6% | [45.6%, 51.6%] | -0.068% | [-0.191%, 0.066%] | -0.013% | 1.63% |
| 150 | long | 854 | 52.1% | [48.8%, 55.2%] | -0.031% | [-0.150%, 0.081%] | 0.058% | 1.60% |
| 200 | long | 712 | 51.4% | [47.2%, 55.6%] | -0.005% | [-0.161%, 0.106%] | 0.047% | 1.52% |
| 5 | short | 4,847 | 47.9% | [45.9%, 49.8%] | -0.033% | [-0.113%, 0.036%] | -0.027% | 1.81% |
| 8 | short | 4,344 | 47.5% | [45.8%, 49.9%] | -0.044% | [-0.114%, 0.043%] | -0.035% | 1.78% |
| 10 | short | 4,304 | 47.7% | [45.9%, 49.7%] | -0.032% | [-0.113%, 0.044%] | -0.030% | 1.74% |
| 12 | short | 4,326 | 47.4% | [45.4%, 49.7%] | -0.043% | [-0.112%, 0.055%] | -0.036% | 1.72% |
| 15 | short | 4,566 | 47.7% | [45.8%, 49.7%] | -0.069% | [-0.147%, 0.016%] | -0.038% | 1.73% |
| 20 | short | 4,817 | 48.6% | [46.3%, 50.7%] | -0.039% | [-0.125%, 0.039%] | -0.029% | 1.77% |
| 25 | short | 3,818 | 49.8% | [47.7%, 52.1%] | -0.007% | [-0.085%, 0.071%] | 0.000% | 1.91% |
| 30 | short | 2,698 | 51.4% | [49.4%, 54.2%] | -0.003% | [-0.080%, 0.079%] | 0.035% | 1.85% |
| 40 | short | 1,823 | 53.2% | [50.5%, 55.7%] | 0.037% | [-0.046%, 0.121%] | 0.074% | 1.66% |
| 50 | short | 1,552 | 52.8% | [49.8%, 56.0%] | 0.009% | [-0.102%, 0.112%] | 0.072% | 1.71% |
| 75 | short | 1,211 | 51.7% | [48.9%, 54.8%] | 0.011% | [-0.078%, 0.121%] | 0.047% | 1.65% |
| 100 | short | 1,055 | 52.4% | [48.8%, 55.9%] | -0.026% | [-0.160%, 0.098%] | 0.070% | 1.81% |
| 150 | short | 858 | 52.6% | [48.6%, 57.0%] | -0.026% | [-0.114%, 0.104%] | 0.050% | 1.67% |
| 200 | short | 709 | 50.4% | [46.7%, 54.4%] | -0.017% | [-0.144%, 0.123%] | 0.015% | 1.65% |
24h direction-aligned return by EMA period
| EMA | side | n | hit | hit 95% CI | mean | mean 95% CI | median | std |
|---|---|---|---|---|---|---|---|---|
| 5 | both | 9,682 | 49.6% | [48.3%, 50.9%] | 0.002% | [-0.083%, 0.103%] | -0.006% | 4.32% |
| 8 | both | 8,681 | 49.7% | [48.6%, 51.1%] | 0.018% | [-0.082%, 0.117%] | 0.000% | 4.36% |
| 10 | both | 8,600 | 49.6% | [48.3%, 51.0%] | 0.021% | [-0.084%, 0.120%] | -0.019% | 4.30% |
| 12 | both | 8,644 | 49.5% | [48.2%, 50.7%] | 0.019% | [-0.092%, 0.117%] | -0.018% | 4.33% |
| 15 | both | 9,127 | 49.8% | [48.7%, 51.3%] | 0.015% | [-0.091%, 0.112%] | 0.000% | 4.36% |
| 20 | both | 9,631 | 49.9% | [48.6%, 51.4%] | -0.007% | [-0.103%, 0.113%] | 0.000% | 4.35% |
| 25 | both | 7,631 | 50.2% | [48.5%, 51.6%] | -0.001% | [-0.154%, 0.116%] | 0.017% | 4.65% |
| 30 | both | 5,389 | 50.3% | [48.5%, 52.1%] | -0.002% | [-0.150%, 0.137%] | 0.024% | 4.26% |
| 40 | both | 3,632 | 50.5% | [47.8%, 52.3%] | -0.033% | [-0.248%, 0.160%] | 0.033% | 4.25% |
| 50 | both | 3,091 | 50.2% | [47.6%, 52.7%] | -0.068% | [-0.254%, 0.154%] | 0.014% | 4.32% |
| 75 | both | 2,417 | 51.5% | [48.3%, 54.3%] | -0.011% | [-0.255%, 0.212%] | 0.107% | 4.41% |
| 100 | both | 2,103 | 51.6% | [48.6%, 54.6%] | 0.024% | [-0.235%, 0.250%] | 0.090% | 4.32% |
| 150 | both | 1,707 | 52.2% | [49.2%, 54.7%] | 0.006% | [-0.262%, 0.236%] | 0.148% | 4.39% |
| 200 | both | 1,415 | 52.4% | [49.1%, 55.1%] | -0.062% | [-0.367%, 0.228%] | 0.188% | 4.41% |
| 5 | long | 4,842 | 48.8% | [46.3%, 51.4%] | -0.010% | [-0.322%, 0.214%] | -0.060% | 4.41% |
| 8 | long | 4,341 | 49.0% | [46.6%, 51.9%] | 0.021% | [-0.258%, 0.291%] | -0.056% | 4.49% |
| 10 | long | 4,301 | 48.7% | [46.0%, 51.3%] | 0.027% | [-0.298%, 0.268%] | -0.085% | 4.44% |
| 12 | long | 4,323 | 48.8% | [46.3%, 51.7%] | 0.057% | [-0.256%, 0.341%] | -0.073% | 4.46% |
| 15 | long | 4,564 | 49.6% | [47.0%, 52.3%] | 0.126% | [-0.176%, 0.362%] | -0.018% | 4.47% |
| 20 | long | 4,816 | 50.3% | [47.3%, 53.3%] | 0.119% | [-0.136%, 0.350%] | 0.021% | 4.44% |
| 25 | long | 3,816 | 49.6% | [46.3%, 52.9%] | 0.064% | [-0.226%, 0.294%] | 0.000% | 4.65% |
| 30 | long | 2,695 | 49.2% | [45.8%, 53.1%] | 0.045% | [-0.266%, 0.356%] | -0.036% | 4.37% |
| 40 | long | 1,815 | 49.5% | [45.3%, 53.3%] | 0.041% | [-0.313%, 0.368%] | -0.065% | 4.38% |
| 50 | long | 1,544 | 48.6% | [44.1%, 52.7%] | -0.036% | [-0.451%, 0.364%] | -0.107% | 4.36% |
| 75 | long | 1,208 | 50.8% | [45.9%, 54.7%] | 0.067% | [-0.363%, 0.445%] | 0.050% | 4.32% |
| 100 | long | 1,051 | 50.6% | [45.5%, 54.7%] | 0.118% | [-0.291%, 0.590%] | 0.040% | 4.23% |
| 150 | long | 852 | 50.5% | [45.3%, 55.9%] | -0.025% | [-0.437%, 0.383%] | 0.039% | 4.22% |
| 200 | long | 709 | 50.6% | [45.4%, 54.9%] | -0.096% | [-0.585%, 0.299%] | 0.053% | 4.08% |
| 5 | short | 4,840 | 50.4% | [47.7%, 53.4%] | 0.015% | [-0.190%, 0.310%] | 0.025% | 4.22% |
| 8 | short | 4,340 | 50.4% | [47.7%, 53.5%] | 0.015% | [-0.212%, 0.269%] | 0.025% | 4.23% |
| 10 | short | 4,299 | 50.5% | [47.5%, 53.2%] | 0.016% | [-0.220%, 0.246%] | 0.031% | 4.16% |
| 12 | short | 4,321 | 50.3% | [47.6%, 53.0%] | -0.018% | [-0.250%, 0.230%] | 0.022% | 4.19% |
| 15 | short | 4,563 | 50.0% | [47.2%, 52.5%] | -0.095% | [-0.328%, 0.197%] | 0.000% | 4.25% |
| 20 | short | 4,815 | 49.5% | [46.5%, 52.3%] | -0.133% | [-0.359%, 0.094%] | -0.008% | 4.25% |
| 25 | short | 3,815 | 50.8% | [47.8%, 53.8%] | -0.067% | [-0.316%, 0.213%] | 0.060% | 4.66% |
| 30 | short | 2,694 | 51.4% | [47.7%, 54.8%] | -0.048% | [-0.309%, 0.187%] | 0.100% | 4.16% |
| 40 | short | 1,817 | 51.5% | [47.8%, 55.1%] | -0.107% | [-0.355%, 0.124%] | 0.073% | 4.12% |
| 50 | short | 1,547 | 51.8% | [48.3%, 55.3%] | -0.101% | [-0.352%, 0.193%] | 0.141% | 4.28% |
| 75 | short | 1,209 | 52.2% | [47.1%, 56.4%] | -0.089% | [-0.357%, 0.242%] | 0.174% | 4.49% |
| 100 | short | 1,052 | 52.7% | [48.9%, 57.3%] | -0.070% | [-0.411%, 0.326%] | 0.223% | 4.41% |
| 150 | short | 855 | 53.9% | [50.2%, 57.9%] | 0.037% | [-0.313%, 0.406%] | 0.242% | 4.55% |
| 200 | short | 706 | 54.2% | [50.3%, 59.1%] | -0.028% | [-0.382%, 0.508%] | 0.271% | 4.72% |
72h direction-aligned return by EMA period
| EMA | side | n | hit | hit 95% CI | mean | mean 95% CI | median | std |
|---|---|---|---|---|---|---|---|---|
| 5 | both | 9,642 | 50.2% | [49.4%, 51.0%] | 0.058% | [-0.041%, 0.158%] | 0.019% | 7.82% |
| 8 | both | 8,648 | 50.3% | [49.4%, 51.3%] | 0.067% | [-0.044%, 0.192%] | 0.053% | 7.88% |
| 10 | both | 8,568 | 50.3% | [49.4%, 51.2%] | 0.069% | [-0.035%, 0.178%] | 0.053% | 7.82% |
| 12 | both | 8,608 | 50.3% | [49.4%, 51.3%] | 0.067% | [-0.048%, 0.179%] | 0.056% | 7.97% |
| 15 | both | 9,095 | 50.6% | [49.7%, 51.4%] | 0.047% | [-0.054%, 0.155%] | 0.082% | 7.76% |
| 20 | both | 9,600 | 50.3% | [49.4%, 51.1%] | 0.016% | [-0.102%, 0.099%] | 0.037% | 7.68% |
| 25 | both | 7,605 | 50.5% | [49.5%, 51.9%] | 0.026% | [-0.109%, 0.156%] | 0.048% | 7.96% |
| 30 | both | 5,369 | 50.0% | [48.6%, 51.7%] | 0.030% | [-0.161%, 0.214%] | 0.008% | 7.95% |
| 40 | both | 3,619 | 50.1% | [48.3%, 52.2%] | -0.037% | [-0.272%, 0.208%] | 0.014% | 8.02% |
| 50 | both | 3,079 | 49.8% | [47.7%, 51.9%] | -0.075% | [-0.280%, 0.224%] | -0.014% | 8.08% |
| 75 | both | 2,408 | 51.0% | [48.9%, 53.4%] | -0.071% | [-0.413%, 0.282%] | 0.157% | 8.05% |
| 100 | both | 2,094 | 51.1% | [48.6%, 53.4%] | -0.043% | [-0.379%, 0.316%] | 0.145% | 8.11% |
| 150 | both | 1,696 | 52.8% | [49.2%, 56.4%] | 0.020% | [-0.395%, 0.424%] | 0.285% | 8.46% |
| 200 | both | 1,402 | 51.6% | [47.8%, 55.2%] | -0.125% | [-0.554%, 0.368%] | 0.226% | 8.14% |
| 5 | long | 4,822 | 47.4% | [43.1%, 51.9%] | 0.086% | [-0.497%, 0.761%] | -0.246% | 7.96% |
| 8 | long | 4,325 | 47.4% | [43.2%, 51.7%] | 0.090% | [-0.521%, 0.777%] | -0.259% | 8.04% |
| 10 | long | 4,285 | 47.3% | [43.0%, 52.1%] | 0.092% | [-0.574%, 0.792%] | -0.255% | 7.98% |
| 12 | long | 4,305 | 47.5% | [43.3%, 52.2%] | 0.206% | [-0.413%, 0.878%] | -0.241% | 8.10% |
| 15 | long | 4,548 | 48.7% | [44.1%, 52.2%] | 0.242% | [-0.333%, 0.951%] | -0.125% | 7.85% |
| 20 | long | 4,800 | 48.9% | [44.4%, 52.9%] | 0.225% | [-0.340%, 0.889%] | -0.119% | 7.72% |
| 25 | long | 3,803 | 48.6% | [43.8%, 52.7%] | 0.233% | [-0.425%, 0.886%] | -0.160% | 7.93% |
| 30 | long | 2,684 | 46.9% | [42.7%, 51.5%] | 0.142% | [-0.571%, 0.864%] | -0.353% | 7.97% |
| 40 | long | 1,806 | 46.8% | [42.0%, 51.2%] | 0.038% | [-0.848%, 0.751%] | -0.367% | 7.96% |
| 50 | long | 1,535 | 45.0% | [40.2%, 49.5%] | 0.006% | [-0.999%, 0.834%] | -0.535% | 7.99% |
| 75 | long | 1,200 | 47.8% | [42.8%, 52.8%] | 0.131% | [-0.701%, 0.884%] | -0.249% | 7.85% |
| 100 | long | 1,043 | 47.7% | [43.2%, 53.8%] | 0.139% | [-0.692%, 0.856%] | -0.212% | 7.83% |
| 150 | long | 843 | 48.6% | [42.7%, 54.6%] | -0.065% | [-0.886%, 0.683%] | -0.175% | 8.06% |
| 200 | long | 701 | 47.9% | [42.9%, 51.5%] | -0.110% | [-1.206%, 0.621%] | -0.360% | 7.70% |
| 5 | short | 4,820 | 52.9% | [48.4%, 57.3%] | 0.031% | [-0.620%, 0.619%] | 0.329% | 7.68% |
| 8 | short | 4,323 | 53.3% | [48.7%, 57.7%] | 0.045% | [-0.637%, 0.685%] | 0.406% | 7.71% |
| 10 | short | 4,283 | 53.4% | [49.4%, 57.7%] | 0.046% | [-0.612%, 0.699%] | 0.422% | 7.67% |
| 12 | short | 4,303 | 53.1% | [48.9%, 57.4%] | -0.072% | [-0.739%, 0.534%] | 0.413% | 7.83% |
| 15 | short | 4,547 | 52.5% | [48.5%, 56.9%] | -0.148% | [-0.845%, 0.518%] | 0.285% | 7.66% |
| 20 | short | 4,800 | 51.6% | [47.5%, 55.5%] | -0.193% | [-0.860%, 0.449%] | 0.192% | 7.63% |
| 25 | short | 3,802 | 52.4% | [47.8%, 56.5%] | -0.181% | [-0.869%, 0.489%] | 0.264% | 7.99% |
| 30 | short | 2,685 | 53.2% | [49.0%, 57.6%] | -0.082% | [-0.932%, 0.556%] | 0.409% | 7.92% |
| 40 | short | 1,813 | 53.4% | [49.2%, 58.4%] | -0.112% | [-0.772%, 0.600%] | 0.438% | 8.08% |
| 50 | short | 1,544 | 54.6% | [49.7%, 59.5%] | -0.156% | [-0.830%, 0.666%] | 0.662% | 8.16% |
| 75 | short | 1,208 | 54.2% | [50.3%, 59.9%] | -0.273% | [-1.014%, 0.697%] | 0.504% | 8.23% |
| 100 | short | 1,051 | 54.4% | [49.2%, 58.7%] | -0.223% | [-1.001%, 0.510%] | 0.493% | 8.39% |
| 150 | short | 853 | 57.0% | [52.4%, 60.6%] | 0.104% | [-0.600%, 0.988%] | 0.772% | 8.84% |
| 200 | short | 701 | 55.2% | [51.0%, 60.4%] | -0.140% | [-0.750%, 0.998%] | 0.719% | 8.56% |
4. Experiment C — Bollinger bandwidth / price-position filters
Each filter applied one at a time to a baseline EMA(10), EMA(20) and EMA(50) crossover; entry gates the cross (blocked cross = flat until the next cross), hold flattens while the filter disallows the side. Δ is OOS Sharpe vs that period's unfiltered baseline.
| side | EMA | filter | mode | OOS Sharpe | Δ Sharpe | OOS ret | OOS maxDD | trades | exposure |
|---|---|---|---|---|---|---|---|---|---|
| both | 10 | bw_contracting | entry | 0.33 | -0.12 | 4.01% | -32.89% | 7158 | 54% |
| both | 10 | bw_contracting | hold | -4.89 | -5.33 | -61.88% | -63.27% | 39523 | 51% |
| both | 10 | bw_expanding | entry | 0.38 | -0.07 | 5.03% | -22.29% | 5847 | 45% |
| both | 10 | bw_expanding | hold | -2.63 | -3.07 | -49.09% | -52.86% | 36773 | 49% |
| both | 10 | bw_high | entry | -0.38 | -0.83 | -7.55% | -23.25% | 3265 | 27% |
| both | 10 | bw_high | hold | 0.72 | 0.28 | 15.28% | -28.17% | 9603 | 49% |
| both | 10 | bw_low | entry | 0.82 | 0.37 | 18.05% | -27.22% | 7717 | 73% |
| both | 10 | bw_low | hold | -2.52 | -2.97 | -35.82% | -41.71% | 13940 | 51% |
| both | 10 | none | entry | 0.44 | 0.00 | 7.66% | -35.14% | 8616 | 100% |
| both | 10 | price_above_sma | entry | 0.58 | 0.14 | 12.78% | -34.22% | 8610 | 97% |
| both | 10 | price_above_sma | hold | -0.67 | -1.11 | -24.82% | -46.36% | 24498 | 87% |
| both | 10 | squeeze_breakout | entry | -0.13 | -0.58 | -3.29% | -18.16% | 4368 | 32% |
| both | 10 | squeeze_breakout | hold | -3.85 | -4.29 | -46.41% | -48.30% | 23650 | 32% |
| both | 20 | bw_contracting | entry | 0.24 | 0.38 | 1.59% | -39.82% | 9076 | 72% |
| both | 20 | bw_contracting | hold | -6.70 | -6.56 | -71.98% | -74.52% | 40767 | 51% |
| both | 20 | bw_expanding | entry | -0.93 | -0.79 | -15.15% | -26.03% | 6105 | 27% |
| both | 20 | bw_expanding | hold | -2.38 | -2.24 | -44.54% | -49.05% | 37456 | 49% |
| both | 20 | bw_high | entry | -0.42 | -0.29 | -12.24% | -30.25% | 5719 | 48% |
| both | 20 | bw_high | hold | -0.06 | 0.07 | -5.35% | -30.27% | 11560 | 49% |
| both | 20 | bw_low | entry | 0.27 | 0.40 | 2.69% | -25.22% | 7050 | 51% |
| both | 20 | bw_low | hold | -2.17 | -2.03 | -34.72% | -45.09% | 12807 | 51% |
| both | 20 | none | entry | -0.14 | 0.00 | -11.05% | -43.90% | 9644 | 100% |
| both | 20 | price_above_sma | entry | -0.61 | -0.47 | -16.06% | -30.78% | 8931 | 59% |
| both | 20 | price_above_sma | hold | -1.04 | -0.91 | -30.60% | -45.75% | 25602 | 76% |
| both | 20 | squeeze_breakout | entry | -2.27 | -2.14 | -21.99% | -25.88% | 4251 | 20% |
| both | 20 | squeeze_breakout | hold | -3.90 | -3.77 | -45.94% | -48.38% | 24074 | 32% |
| both | 50 | bw_contracting | entry | 0.63 | 1.80 | 9.63% | -19.36% | 2549 | 49% |
| both | 50 | bw_contracting | hold | -5.86 | -4.69 | -70.82% | -71.61% | 36407 | 51% |
| both | 50 | bw_expanding | entry | -2.31 | -1.14 | -41.70% | -45.28% | 2063 | 51% |
| both | 50 | bw_expanding | hold | -4.54 | -3.37 | -64.39% | -65.03% | 36174 | 49% |
| both | 50 | bw_high | entry | -1.61 | -0.45 | -36.69% | -43.43% | 2352 | 63% |
| both | 50 | bw_high | hold | -2.94 | -1.77 | -54.17% | -55.60% | 9392 | 49% |
| both | 50 | bw_low | entry | 0.13 | 1.30 | 0.45% | -15.45% | 2049 | 36% |
| both | 50 | bw_low | hold | -0.33 | 0.84 | -8.15% | -24.50% | 9033 | 51% |
| both | 50 | none | entry | -1.17 | 0.00 | -37.57% | -47.10% | 3103 | 100% |
| both | 50 | price_above_sma | entry | -0.75 | 0.42 | -4.03% | -8.53% | 1027 | 7% |
| both | 50 | price_above_sma | hold | -2.50 | -1.33 | -40.33% | -45.36% | 20659 | 44% |
| both | 50 | squeeze_breakout | entry | -2.17 | -1.00 | -31.04% | -34.12% | 1523 | 35% |
| both | 50 | squeeze_breakout | hold | -3.90 | -2.73 | -42.93% | -44.03% | 23208 | 32% |
| long | 10 | bw_contracting | entry | 0.84 | -0.40 | 11.85% | -18.65% | 5011 | 28% |
| long | 10 | bw_contracting | hold | -3.13 | -4.38 | -37.84% | -44.94% | 22226 | 26% |
| long | 10 | bw_expanding | entry | 1.22 | -0.02 | 19.10% | -18.49% | 3538 | 22% |
| long | 10 | bw_expanding | hold | -0.35 | -1.59 | -7.80% | -23.82% | 19413 | 24% |
| long | 10 | bw_high | entry | -0.96 | -2.21 | -10.26% | -16.60% | 2067 | 13% |
| long | 10 | bw_high | hold | 1.36 | 0.11 | 25.90% | -17.46% | 5678 | 24% |
| long | 10 | bw_low | entry | 2.02 | 0.77 | 47.96% | -17.66% | 6512 | 36% |
| long | 10 | bw_low | hold | -0.87 | -2.11 | -12.06% | -23.58% | 10027 | 26% |
| long | 10 | none | entry | 1.24 | 0.00 | 31.76% | -23.92% | 8615 | 50% |
| long | 10 | price_above_sma | entry | 1.37 | 0.13 | 35.62% | -23.05% | 8255 | 49% |
| long | 10 | price_above_sma | hold | 0.72 | -0.52 | 14.27% | -25.93% | 13103 | 44% |
| long | 10 | squeeze_breakout | entry | 0.72 | -0.52 | 7.62% | -13.49% | 2651 | 16% |
| long | 10 | squeeze_breakout | hold | -1.13 | -2.38 | -13.48% | -21.27% | 12617 | 16% |
| long | 20 | bw_contracting | entry | 0.91 | 0.09 | 18.40% | -23.51% | 6338 | 37% |
| long | 20 | bw_contracting | hold | -3.97 | -4.80 | -47.50% | -53.12% | 23314 | 26% |
| long | 20 | bw_expanding | entry | -0.16 | -0.99 | -2.60% | -12.25% | 3263 | 13% |
| long | 20 | bw_expanding | hold | -0.18 | -1.00 | -5.16% | -21.95% | 19989 | 24% |
| long | 20 | bw_high | entry | 0.01 | -0.82 | -2.16% | -20.71% | 4174 | 25% |
| long | 20 | bw_high | hold | 0.78 | -0.04 | 13.16% | -17.85% | 7642 | 24% |
| long | 20 | bw_low | entry | 1.44 | 0.62 | 22.91% | -14.24% | 5441 | 25% |
| long | 20 | bw_low | hold | -0.73 | -1.55 | -12.04% | -26.98% | 8879 | 26% |
| long | 20 | none | entry | 0.82 | 0.00 | 19.03% | -26.74% | 9643 | 50% |
| long | 20 | price_above_sma | entry | 0.08 | -0.74 | -0.48% | -20.29% | 6183 | 29% |
| long | 20 | price_above_sma | hold | 0.31 | -0.51 | 3.76% | -28.99% | 13585 | 38% |
| long | 20 | squeeze_breakout | entry | -0.66 | -1.48 | -5.39% | -10.41% | 2371 | 10% |
| long | 20 | squeeze_breakout | hold | -1.13 | -1.96 | -13.75% | -21.71% | 12849 | 16% |
| long | 50 | bw_contracting | entry | 0.73 | 0.56 | 10.56% | -19.74% | 1805 | 26% |
| long | 50 | bw_contracting | hold | -3.64 | -3.80 | -47.16% | -50.28% | 19564 | 26% |
| long | 50 | bw_expanding | entry | -0.41 | -0.58 | -8.39% | -24.15% | 1286 | 26% |
| long | 50 | bw_expanding | hold | -1.41 | -1.58 | -25.43% | -31.93% | 19341 | 25% |
| long | 50 | bw_high | entry | -0.41 | -0.58 | -11.49% | -31.71% | 1699 | 33% |
| long | 50 | bw_high | hold | -1.03 | -1.19 | -21.55% | -29.16% | 5559 | 25% |
| long | 50 | bw_low | entry | 1.16 | 1.00 | 13.75% | -8.37% | 1390 | 18% |
| long | 50 | bw_low | hold | 0.37 | 0.21 | 4.36% | -24.21% | 5192 | 27% |
| long | 50 | none | entry | 0.16 | 0.00 | -0.89% | -35.39% | 3093 | 51% |
| long | 50 | price_above_sma | entry | -1.02 | -1.19 | -4.04% | -7.33% | 570 | 4% |
| long | 50 | price_above_sma | hold | -1.46 | -1.63 | -21.53% | -27.97% | 10843 | 23% |
| long | 50 | squeeze_breakout | entry | -0.49 | -0.65 | -6.62% | -18.55% | 899 | 18% |
| long | 50 | squeeze_breakout | hold | -1.05 | -1.22 | -13.03% | -20.85% | 12295 | 16% |
5. Walk-forward validation
Per fold the EMA period with the best train Sharpe is frozen and evaluated on the next unseen test window; test windows are stitched for the aggregate.
| side | folds | WF OOS ret | WF OOS Sharpe | WF OOS maxDD | folds positive |
|---|---|---|---|---|---|
| long | 4 | -21.88% | -0.33 | -42.50% | 25% |
| short | 4 | -38.72% | -1.33 | -43.65% | 25% |
| both | 4 | -51.37% | -1.25 | -57.75% | 25% |
| side | fold | train | test | chosen EMA | train Sharpe | val Sharpe | test Sharpe | test return |
|---|---|---|---|---|---|---|---|---|
| both | 0 | 2025-01-01→2025-07-01 | 2025-09-01→2025-12-01 | 150 | 0.60 | 2.52 | -2.69 | -33.20% |
| both | 1 | 2025-04-01→2025-10-01 | 2025-12-01→2026-03-01 | 75 | 1.11 | -2.08 | 0.34 | 0.96% |
| both | 2 | 2025-07-01→2026-01-01 | 2026-03-01→2026-06-01 | 75 | 0.69 | -1.34 | -0.57 | -6.50% |
| both | 3 | 2025-10-01→2026-04-01 | 2026-06-01→2026-09-01 | 100 | -0.11 | -0.69 | -1.89 | -22.88% |
| long | 0 | 2025-01-01→2025-07-01 | 2025-09-01→2025-12-01 | 200 | 0.16 | 3.52 | -0.87 | -13.82% |
| long | 1 | 2025-04-01→2025-10-01 | 2025-12-01→2026-03-01 | 75 | 1.99 | -1.12 | -1.09 | -15.93% |
| long | 2 | 2025-07-01→2026-01-01 | 2026-03-01→2026-06-01 | 75 | 0.97 | -2.14 | 2.13 | 15.28% |
| long | 3 | 2025-10-01→2026-04-01 | 2026-06-01→2026-09-01 | 100 | -0.55 | 3.11 | -0.46 | -6.45% |
| short | 0 | 2025-01-01→2025-07-01 | 2025-09-01→2025-12-01 | 150 | 1.06 | -0.28 | -2.62 | -22.04% |
| short | 1 | 2025-04-01→2025-10-01 | 2025-12-01→2026-03-01 | 75 | -0.74 | -1.44 | 2.78 | 19.15% |
| short | 2 | 2025-07-01→2026-01-01 | 2026-03-01→2026-06-01 | 75 | -0.26 | 1.56 | -2.53 | -19.46% |
| short | 3 | 2025-10-01→2026-04-01 | 2026-06-01→2026-09-01 | 100 | 0.69 | -3.16 | -2.06 | -18.10% |
6. Costs & break-even
| side | EMA | scenario | bps/side | OOS ret | OOS Sharpe | OOS maxDD | fees | funding |
|---|---|---|---|---|---|---|---|---|
| long | 12 | zero | 0 | 71.86% | 2.27 | -20.41% | 0.00% | -0.30% |
| long | 12 | low | 3 | 53.32% | 1.83 | -21.72% | 25.98% | -0.30% |
| long | 12 | base | 6 | 36.78% | 1.38 | -23.01% | 51.95% | -0.30% |
| long | 12 | high | 12 | 8.86% | 0.50 | -29.23% | 103.91% | -0.30% |
| long | 12 | extreme | 20 | -19.72% | -0.68 | -45.13% | 173.18% | -0.30% |
| short | 12 | zero | 0 | 4.29% | 0.34 | -27.13% | 0.00% | 1.11% |
| short | 12 | low | 3 | -6.96% | -0.07 | -30.61% | 25.95% | 1.11% |
| short | 12 | base | 6 | -17.00% | -0.47 | -33.93% | 51.91% | 1.11% |
| short | 12 | high | 12 | -33.95% | -1.28 | -45.69% | 103.81% | 1.11% |
| short | 12 | extreme | 20 | -51.29% | -2.36 | -58.26% | 173.02% | 1.11% |
| both | 12 | zero | 0 | 83.29% | 2.03 | -26.68% | 0.00% | 0.81% |
| both | 12 | low | 3 | 45.88% | 1.35 | -31.29% | 51.93% | 0.81% |
| both | 12 | base | 6 | 16.09% | 0.67 | -35.61% | 103.86% | 0.81% |
| both | 12 | high | 12 | -26.48% | -0.69 | -46.70% | 207.72% | 0.81% |
| both | 12 | extreme | 20 | -60.02% | -2.50 | -65.56% | 346.20% | 0.81% |
Break-even cost (bps/side) by period and side:
| EMA | long | short | long-short |
|---|---|---|---|
| 5 | 9.9 | ≤0 | 4.4 |
| 8 | 12.4 | ≤0 | 6.2 |
| 10 | 13.3 | 0.1 | 7.0 |
| 12 | 14.3 | 1.1 | 8.0 |
| 15 | 12.9 | 0.6 | 7.1 |
| 20 | 10.1 | ≤0 | 4.6 |
| 25 | 13.0 | ≤0 | 6.2 |
| 30 | 6.7 | ≤0 | ≤0 |
| 40 | 7.5 | ≤0 | ≤0 |
| 50 | 5.4 | ≤0 | ≤0 |
| 75 | 5.5 | ≤0 | ≤0 |
| 100 | 10.0 | ≤0 | ≤0 |
| 150 | 14.0 | ≤0 | ≤0 |
| 200 | 2.3 | ≤0 | ≤0 |
7. Experiment D — regime analysis (reference config)
Reference: EMA20/SMA20 long-short, OOS only. Causal regime labels (trend = volatility-normalised trailing 24h move, ±1σ; vol = realised vol vs trailing median).
| regime | bars | mean symbol return | median | Sharpe | % positive symbols |
|---|---|---|---|---|---|
| up_highvol | 5,405 | 17.92% | 8.44% | 2.49 | 60% |
| range_lowvol | 23,615 | -0.07% | -3.72% | -0.00 | 40% |
| down_lowvol | 5,701 | -3.88% | -6.80% | -0.96 | 40% |
| range_highvol | 21,130 | -4.23% | 7.25% | -0.21 | 60% |
| up_lowvol | 4,721 | -6.88% | -10.05% | -1.88 | 30% |
| down_highvol | 4,948 | -7.32% | -7.13% | -1.30 | 20% |
| calendar year (full sample) | return | Sharpe |
|---|---|---|
| 2025 | -32.13% | -0.39 |
| 2026 | -11.05% | -0.14 |
Regime labels are computed causally and shifted one bar; no future information enters.
8. Robustness
Neighbouring EMA periods around the reference (OOS):
| EMA | OOS Sharpe | OOS return |
|---|---|---|
| 10 | 0.44 | 7.66% |
| 12 | 0.67 | 16.09% |
| 15 | 0.47 | 8.53% |
| 20 | -0.14 | -11.05% |
| 25 | 0.25 | 0.81% |
| 30 | -1.02 | -34.59% |
| 40 | -0.97 | -33.36% |
Bootstrap (block=72h, 1000 resamples) on the reference OOS returns: Sharpe 95% CI [-2.50, 2.21]; total-return 95% CI [-59.58%, 88.37%].
Profit concentration (reference pooled trades): 9644 trades; top 5% = 45% of gross profit; best 102.05%, worst -17.46%.
Per-symbol OOS (reference config)
| symbol | OOS return | OOS Sharpe | OOS maxDD | trades | win | PF |
|---|---|---|---|---|---|---|
| NEARUSDT | 54.14% | 1.08 | -63.84% | 971 | 42% | 1.03 |
| XRPUSDT | 24.17% | 0.77 | -53.44% | 990 | 41% | 1.14 |
| ZECUSDT | 15.36% | 0.75 | -66.86% | 989 | 40% | 1.07 |
| BNBUSDT | -10.29% | -0.12 | -40.81% | 973 | 39% | 0.98 |
| HYPEUSDT | -32.48% | -0.12 | -75.43% | 778 | 38% | 0.79 |
| ETHUSDT | -32.93% | -0.64 | -52.20% | 975 | 39% | 1.03 |
| BTCUSDT | -34.48% | -1.09 | -50.58% | 1005 | 36% | 0.84 |
| DOGEUSDT | -42.81% | -0.80 | -73.32% | 971 | 39% | 0.94 |
| SOLUSDT | -43.74% | -0.91 | -66.09% | 988 | 40% | 0.93 |
| OGNUSDT | -65.56% | -0.99 | -78.53% | 1004 | 40% | 1.00 |
9. Limitations
- The study window (2025 → 2026-09) contains only two calendar blocks, and the OOS window (2026) is a single predominantly bullish/trending regime; OOS results are not independent evidence.
- Cost model is fee+slippage per side with next-open fills; no order-book, latency or market impact.
- Funding is applied on held notional at hourly-aligned funding stamps — a drag approximation, not a full cash-flow ledger (same as the prior study).
- The universe is today's top-10 liquids (survivorship bias); an equal-weight pooled book is assumed.
- Overlapping forward-return windows are handled with a block bootstrap, but multiple testing across 14 EMA periods × 3 sides × 6 filters × 2 modes is only qualitatively accounted for.
10. Answers to the study's questions
- Predictive information beyond unconditional? Weak. Bullish-cross hit rates hover near the ~50% unconditional baseline, and only 1% of (period, side, horizon) cells have a mean direction-aligned return whose 95% CI lies entirely above zero (§3).
- Which EMA periods? The best OOS result was EMA(12) on the long side (Sharpe 1.38); neighbouring periods diverge materially (§8), so this is not a stable region, and it is not consistent across symbols (§8).
- Long, short, or both? Long-only best OOS Sharpe 1.38 vs short-only -0.47 and long-short 0.67; long signals were the more useful of the two.
- EMA(20) vs SMA(20) special case? It is the busiest equal-period construction (9644 OOS trades, grid max 9703) with OOS Sharpe -0.14; the exponential-vs-simple distinction at equal nominal period is not materially special.
- Does bandwidth help? Best single bandwidth/squeeze variant is
bw_contracting(entry on both EMA50) with Δ Sharpe 1.80 (OOS Sharpe 0.63), but the sign of Δ varies across periods and modes — no consistent improvement. - Does price relative to basis help? The
price_above_smafilter moves results (it is partly collinear with the crossover state) but does not deliver a robust incremental edge on either side. - Regime-dependent? Yes. The reference config's OOS PnL is best in
up_highvol(17.92%) and worst indown_highvol(-7.32%); no single regime is favourable across both calendar years (§7). - Survives costs & funding? 16 of 42 period/side combinations have a break-even above the 6 bps base cost (highest 14.3 bps). See the break-even grid in §6.
- Robust across periods, symbols, folds? No. Only 25% of walk-forward test folds were positive, neighbourhood OOS Sharpe spans [-1.02, 0.67], and per-symbol dispersion is large (§5, §8).
- Verdict? The evidence does not establish a reliable edge — the best OOS Sharpe across the grid is 1.38 (EMA(12), long), the reference config's Sharpe CI includes zero, and results flip across folds/periods (§5, §8). Treat the EMA/SMA(20) crossover as a rejected standalone signal rather than a proven strategy.
Reproduce: python scripts/ema_sma_cross_study.py (engine: quant_lab.analytics.ema_backtest; signals: quant_lab.analytics.bollinger_cross). Artefacts: experiments/reports/ema_sma_cross.