Results12 Oct 2026ema_sma_cross_results.md

Bollinger Basis (SMA20) vs EMA Crossovers — 1h Crypto Perps

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

10. Answers to the study's questions

  1. 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).
  2. 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).
  3. 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.
  4. 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.
  5. 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.
  6. Does price relative to basis help? The price_above_sma filter moves results (it is partly collinear with the crossover state) but does not deliver a robust incremental edge on either side.
  7. Regime-dependent? Yes. The reference config's OOS PnL is best in up_highvol (17.92%) and worst in down_highvol (-7.32%); no single regime is favourable across both calendar years (§7).
  8. 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.
  9. 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).
  10. 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.

← All reports · source (.md)