Trend Study Report
Full source: D:\code\BTC-Momentum-Trader, trend_study/. This page mirrors that project's TREND_STUDY_RESULTS.md. All 10 tests complete.
The question
Is there real, exploitable edge in an 8-hour-hold BTC momentum mechanic (pyramiding, volume confirmation, 2x leverage) layered on top of a simple slow trend-following base -- or does it just look good because it's mimicking leveraged directional exposure during bull windows? Ten pre-committed tests, full 2017-2026 BTCUSDT archive, one decision rule written before each test ran, buy-and-hold as the standing benchmark on every table (CAGR 37.7%, max drawdown -83.2%, Calmar 0.45 over the full archive).
Is it actually profitable? Yes -- but only below roughly 12-15bps of per-side trading cost.
| per-side cost | venue this matches | overlay CAGR% | overlay Calmar | verdict |
|---|---|---|---|---|
| 2 bps | cheap spot exchange, maker | 84.6 | 1.36 | profitable, comfortably |
| 5 bps | typical spot exchange, taker | 75.5 | 1.17 | profitable |
| 8 bps | this study's realistic default | 66.8 | 1.00 | profitable |
| 15 bps | CFD-style, one-way | 48.6 | 0.68 | marginal -- CAGR still positive, but the overlay's edge over the plain base has mostly evaporated here |
| 30 bps | CFD-style, poor execution | 15.5 | 0.19 | not worth the mechanism's complexity |
| 60 bps | bad slippage / urgency | -29.5 | -0.30 | unprofitable |
The overlay's own Calmar crosses below the plain (no-overlay) base's Calmar at roughly 12 bps per side -- above that, you'd have been better off holding the simpler base alone. This project's own convention for realistic costs: 6-8bps one-way on a Plus500-style CFD, 12-16bps round trip; less on a crypto-native spot exchange. Net: this is a spot-exchange strategy. It clears its own bar comfortably at spot-exchange costs (2-8bps) and at this study's realistic 8bps default, gets thin fast past that, and is not a CFD-viable mechanism once cost realistically reaches the mid-teens of bps per side.
Bottom line
The slow trend base (EMA-50 entry, long/flat, exit on a close below the 50-day EMA) shows a real, walk-forward-verified edge over buy-and-hold on a risk-adjusted basis. The 8-hour overlay -- the mechanic this whole study exists to stress-test -- also survives: it beats a matched-leverage control and clears the 90th percentile of both a random-schedule and a random-genome control, including on the 2017-2023 data its own genome was never evolved on. Profitability is real but cost-gated (see box above), timing within the day is fragile and not to be trusted, and the honest tail-risk picture (test 9) says a 50%+ drawdown is more likely than not over a long enough horizon even though the historical path looked survivable.
The overlay's survival verdict flipped once already during this study -- the first full run showed it clearly failing. The reason why, and how it was caught, is below, because the catch is as much a part of this result as the number.
Test 1 -- Trend rule & horizon plateau
Four rules (SMA cross, EMA cross, Donchian breakout, time-series momentum) × 8 horizons (20-300 days). Decision rule: adopt the center of the widest plateau where neighboring horizons score within 20% of each other -- not just the single best cell.
| rule | 20d | 30d | 50d | 75d | 100d | 150d | 200d | 300d |
|---|---|---|---|---|---|---|---|---|
| sma (Calmar) | 0.61 | 0.70 | 0.98 | 0.74 | 0.68 | 0.69 | 0.39 | 0.45 |
| ema (Calmar) | 0.78 | 0.68 | 0.76 | 0.76 | 0.54 | 0.54 | 0.48 | 0.45 |
| tsmom (Calmar) | 0.91 | 0.68 | 0.65 | 0.70 | 0.22 | 0.25 | 0.26 | 0.34 |
| donchian (Calmar) | 0.90 | 0.73 | 0.50 | 0.53 | 0.42 | 0.52 | 0.33 | 0.50 |
Widest plateau: EMA, horizons 20-75d (avg Calmar 0.75). 100-day EMA alone (39.3% CAGR) sits outside this plateau and would have been rejected if it were the only candidate checked. Adopted: EMA @ 50 days.
Test 2 -- Base direction
Built on the EMA-50 winner: long/flat, long/short 1x, long/short 0.5x, and long/flat plus a conditional slow short. Decision rule: a short leg stays only if it beats long/flat on Calmar AND isn't negative in more than 3 of the archive's 6 up years.
| variant | CAGR% | MaxDD% | Calmar | short leg negative in |
|---|---|---|---|---|
| long_flat | 49.6 | -65.3 | 0.76 | -- |
| long_short_1x | 27.8 | -74.7 | 0.37 | 6 / 6 up years |
| long_short_0.5x | 42.4 | -67.9 | 0.62 | 6 / 6 up years |
| long_flat_plus_slow_short | 40.7 | -74.7 | 0.55 | 3 / 6 up years |
Shorts stay dead -- long/flat is the base going forward.
Test 3 -- Asymmetric exits
Same EMA-50 entry, four faster exits tested in place of the lagging original. Decision rule: adopt whichever cuts full-history max drawdown the most while costing under 5 points of CAGR.
| exit | CAGR% | MaxDD% | Calmar | Trades |
|---|---|---|---|---|
| baseline (original exit) | 49.6 | -65.3 | 0.76 | 211 |
| close_below_50d | 52.4 | -61.6 | 0.85 | 245 |
| close_below_20d_low | 46.9 | -69.7 | 0.67 | 81 |
| atr_trail_3x | 35.9 | -70.4 | 0.51 | 107 |
| panic_10d_-15pct | 24.5 | -79.2 | 0.31 | 63 |
Adopted: close below the 50-day close -- cut drawdown AND improved CAGR.
Test 4 -- Volatility targeting vs. constant leverage
Position sized as target-vol / 20-day realized vol, capped, across a 3×3 grid, against 1x and constant-leverage controls at matched average exposure. Decision rule: vol targeting stays only if it beats 1x AND the closest-matched constant-leverage control.
| variant | CAGR% | MaxDD% | Calmar | AvgExposure |
|---|---|---|---|---|
| 1x (no vol target) | 52.4 | -61.6 | 0.85 | 0.52 |
| const_1.5x | 74.1 | -78.3 | 0.95 | 0.78 |
| best vol-target (vt70_cap2.0) | 66.9 | -76.1 | 0.88 | 0.72 |
Dropped -- plain constant leverage beat every vol-targeted cell at matched exposure.
Test 5 -- The 8-hour overlay: alpha or beta?
Base fixed from tests 1-3 (EMA-50, long/flat, close-below-50d exit, 1x). Champion overlay: 474 trades over the full archive, average combined exposure 0.57x. Controls: base at matched constant leverage (no overlay), 200 randomly-timed schedules at the same trade count/hold, and 500 random genomes drawn from the same search bounds. Decision rule: the overlay survives only if it beats the matched-leverage control on Calmar AND sits above the 90th percentile of both random distributions. All numbers below at this study's realistic 8bps/side default.
| variant (full archive) | CAGR% | MaxDD% | Calmar |
|---|---|---|---|
| champion overlay | 66.8 | -66.9 | 1.00 |
| matched-leverage control (no overlay) | 52.1 | -69.2 | 0.75 |
| overlay-only-when-flat | 60.9 | -65.6 | 0.93 |
Random schedule control (n=200): mean Calmar 0.44, champion at the 100th percentile. Random genome control (n=500): mean Calmar 0.33, champion at the 98th percentile.
Required out-of-sample check, 2017-2023: the champion genome was evolved on 2023-2026 data only. 2017-2023 is data it never saw during its own evolution -- the honest test of whether the edge generalizes rather than having been shaped by its own era.
| variant (2017-2023 only) | CAGR% | MaxDD% | Calmar |
|---|---|---|---|
| champion overlay | 68.4 | -66.9 | 1.02 |
| matched-leverage control (no overlay) | 48.4 | -69.2 | 0.70 |
Overlay survives -- beats its matched-leverage control both on the full archive and on data its genome never trained on.
The lookahead bug -- what broke, and how it was caught
The first full run of this study reported the overlay as dead: a no-overlay "matched-leverage" control alone posted a 274% CAGR / Calmar 7.71, against the clean daily base engine's 52% / 0.85 on the identical signal. That gap was the tell. The composite engine broadcasts each day's trend signal onto that day's own 15-minute bars, but the signal is decided from that day's final close -- so bars early in the day were trading on information from later the same day. A one-day lookahead, worth roughly 200 points of phantom CAGR.
The fix: shift the daily signal by one day at the point it's broadcast onto intraday bars, so a day's decision applies to the next day's bars, matching the no-lookahead convention the rest of the study already used. Verified directly: shifting the gate by one day brought the composite's no-overlay control back in line with the daily engine (49.5% CAGR / Calmar 0.75 vs. 52.4% / 0.85 -- the small remaining gap is expected intraday turnover/fee mechanics, not lookahead). Re-running test 5 under the fix is what flipped the overlay's verdict from dead to survives, and the same fix changes test 6's cost-sensitivity numbers below too.
Caught before publication, not after -- the number that would have shipped was 5x too high.
Test 6 -- Cost sensitivity
Per-side costs {2,5,8,15,30,60} bps, base and overlay swept separately. This is the profitability table shown at the top of this page, in full alongside the plain base for comparison.
| cost (bps/side) | base CAGR% | base Calmar | overlay CAGR% | overlay Calmar |
|---|---|---|---|---|
| 2 | 54.9 | 0.90 | 84.6 | 1.36 |
| 5 | 53.7 | 0.88 | 75.5 | 1.17 |
| 8 | 52.4 | 0.85 | 66.8 | 1.00 |
| 15 | 49.5 | 0.79 | 48.6 | 0.68 |
| 30 | 43.6 | 0.67 | 15.5 | 0.19 |
| 60 | 32.3 | 0.46 | -29.5 | -0.30 |
Base overnight financing sensitivity (CFD case, 8bps trading cost held fixed): CAGR falls from 49.6% at 0.01%/day to 44.0% at 0.03%/day -- meaningful, but the base stays profitable across this whole range.
The overlay's own Calmar crosses below the plain base's Calmar near 12 bps/side. Under CFD-typical per-side cost (mid-teens of bps and up), the overlay stops being worth running over the plain base. Note this specific comparison is against the standalone unleveraged base (not test 5's matched-leverage control) -- a slightly different, stricter bar than test 5 used, which is why this number reads a bit more conservative than test 5's head-to-head at the same 8bps cost.
Test 7 -- Timing sensitivity
Base: does the daily signal-anchor hour (00:00 / 08:00 / 16:00 UTC) matter? Overlay: bucket its 474 long trades by 4-hour UTC window and check if any pattern holds across odd vs. even years.
| anchor hour UTC | CAGR% | MaxDD% | Calmar |
|---|---|---|---|
| 00:00 | 49.6 | -65.3 | 0.76 |
| 08:00 | 63.0 | -50.7 | 1.24 |
| 16:00 | 53.2 | -64.2 | 0.83 |
CAGR swing across anchor hours: 13.4 points -- fragile, treat base timing as arbitrary rather than meaningful. The overlay's own within-day pattern also does not hold consistently across odd/even years. No hour filter adopted.
Test 8 -- Walk-forward validation
Expanding window: each year 2019-2026, the (rule, horizon) pair is selected by best Calmar using only data strictly before that year, then applied fixed for the year -- concatenated into one genuinely out-of-sample equity path. Decision rule: if concatenated OOS CAGR is under 60% of the in-sample number, the plateau is a fitting artifact.
Concatenated OOS (2019-2026): CAGR 43.8%, max drawdown -57.5%, Calmar 0.76 -- against the in-sample plateau's 49.6% CAGR / -65.3% drawdown. 88% of in-sample CAGR survived out-of-sample.
Plateau is real, not an in-sample fitting artifact -- comfortably above the 60% bar. Worth flagging: the walk-forward's own year-by-year selections leaned toward shorter 20-day momentum/Donchian rules in most years rather than the 50-75d plateau found on the full dataset, only converging to SMA-50 in the final two years -- a detail worth watching, even though the pre-committed pass/fail threshold was cleared.
Test 9 -- Drawdown anatomy & tail risk
| best days removed | CAGR% remaining |
|---|---|
| 5 | 39.2 |
| 10 | 30.4 |
| 20 | 16.5 |
245 position changes over 9.0 years (27.1/year). Efficiency ratio at entry: mean 0.09 (0=pure chop, 1=pure trend) -- entries mostly happen in genuinely choppy conditions, not clean trends. Longest time underwater: 790 days (2.16 years). Block bootstrap (5000 paths, 20-day blocks): 95th-percentile-worst max drawdown -77.7% against the single observed path's -61.6%, and P(drawdown ≥ 50%) = 74.2%.
Return is concentrated in a handful of big trend runs, not steady accumulation, and the bootstrap says a 50%+ drawdown is more likely than not over a long enough horizon -- even though the actual historical path looked survivable. Size accordingly.
Test 10 -- Skill vs. random timing
1000 random block-structured long/flat schedules at the base's own time-in-market (51.7%, ~13-day average run length). Decision rule: the base's Calmar must clear the 95th percentile of random timing, or the "edge" is just leveraged exposure in disguise, not real entry/exit skill.
Base CAGR percentile vs. random timing: 99th. Base Calmar percentile: 99th. Sharpe 95% bootstrap CI: base [0.43, 1.85] vs. buy-and-hold [0.14, 1.51].
Passes, comfortably above the 95th-percentile bar -- this is real entry/exit timing skill, not disguised buy-and-hold beta.
Final assembled configuration
| piece | outcome |
|---|---|
| Entry rule | EMA @ 50 days |
| Direction | long / flat |
| Exit | close below the 50-day EMA |
| Sizing | constant leverage -- vol-targeting did not survive |
| 8h overlay | included -- survives full-archive and out-of-sample checks |
| Cost ceiling | ~12-15 bps/side -- spot-exchange execution, not CFD |
| Hour/timing filters | none -- both base and overlay timing patterns were too fragile to adopt |
| Walk-forward | 88% of in-sample CAGR survived OOS |
| Tail risk | P(drawdown ≥ 50%) = 74% by bootstrap -- size for this, not for the -61.6% history actually showed |
EMA-50 entry, long/flat direction, close-below-50d exit, constant leverage, with the 8-hour momentum overlay layered on top -- run on a venue with per-side costs meaningfully under 15bps, sized with a 50%+ eventual drawdown treated as the realistic tail case rather than the surprise case.
The GA is not part of this experiment. It runs afterward, on this configuration, with the conditions already set: fitness against cash (not buy-and-hold), walk-forward across the full archive with no culling on test slices, and a random-genome control.