Does anything beat buy & hold on Soybean Oil (ZL)?
Every setup we tested on Soybean Oil (ZL) — ranked out-of-sample, corrected for multiple testing, and forward-tracked in public from the day this page published. The honest answer is the headline.
Beat buy-and-hold in both windows — but can't be told apart from selection luck.
Beat buy-and-hold in both the full window and out-of-sample but its OOS Sharpe 1.04 did not clear the 1.30 selection hurdle (best-of-N luck cannot be ruled out). Buy-and-hold benchmark: +5.9% CAGR over 25.9 years (+13.3% CAGR in the out-of-sample window).
Educational research from historical backtests — not investment advice. Past performance does not predict future results.
Soybean Oil: the winner beat buy-and-hold in both windows — and still can't shake the luck problem
In Soybean Oil, buy-and-hold is a harder benchmark than it looks: roll costs drag on returns, macro regimes flip the rules mid-game, and prices can go nowhere for years. Against that backdrop, we ran 755 indicator configurations on ZL. The best, Pascal's Weighted MA on the daily timeframe, beat buy-and-hold in both windows — +0.3% annualized edge over the full period, +4.6% out of sample against a buy-and-hold CAGR of +5.9%. Over 7.8 out-of-sample years it took 295 trades, won 38.0% of them, and drew down -37.3% at worst.
Here is the honest read. When you test 755 setups and keep the best one, the winner looks good by construction — even on pure noise. Our correction for that selection effect sets a Sharpe hurdle of 1.3, and this setup's out-of-sample Sharpe of 1.04 falls short. Statistically, we cannot distinguish it from the luckiest of hundreds of tries. It also has company: 17.0% of setups edged buy-and-hold, which tends to happen when one regime dominated the sample. Of everything tested, 653 produced enough trades to grade at all. Macro regimes rotate, and a rule tuned to one rarely survives the next. Past performance does not predict future results.
Every figure above is computed from our own backtests — nothing is estimated or invented. Hypothetical results; not investment advice.
Top setups as mechanical rules
Exactly as the backtest defined them — no discretionary steps, no hidden filters.
Pascal's Weighted MA
Mechanical rule (exactly as backtested): MA variant — binomial (Pascal's-triangle) weighted MA; long above a rising line. Signals are evaluated at daily-bar close, the position changes on the NEXT bar, 0.08% cost per side, long/flat only — no leverage, no shorting.
Out-of-sample (last ~30% of the window, never used to pick this setup): Sharpe 1.04 · alpha +4.6% · 97 trades over 7.8 yrs.
Cascade Z-Score
Mechanical rule (exactly as backtested): Momentum continuation — buys a price z-score breakout above +1σ and rides while price stays above its mean (buys strength, not weakness). Signals are evaluated at daily-bar close, the position changes on the NEXT bar, 0.08% cost per side, long/flat only — no leverage, no shorting.
Out-of-sample (last ~30% of the window, never used to pick this setup): Sharpe 0.95 · alpha +4.4% · 55 trades over 7.8 yrs.
Premier Stochastic
Mechanical rule (exactly as backtested): Lee's double-smoothed, normalized stochastic — long while positive. Signals are evaluated at daily-bar close, the position changes on the NEXT bar, 0.08% cost per side, long/flat only — no leverage, no shorting.
Out-of-sample (last ~30% of the window, never used to pick this setup): Sharpe 0.94 · alpha +5.9% · 66 trades over 7.8 yrs.
Since publication — including if it loses
The forward record is just getting started — the gap between the two is the honest score. Marked to market nightly from real prices, rules frozen at publication, as of 2026-07-02. Currently FLAT.
We tested 755 setups (indicator × parameters × timeframe) on Soybean Oil (ZL). Only setups with ≥30 trades qualify (653 did). Setups are ranked by out-of-sample Sharpe — the last ~30% of history, which standard-parameter rules never saw during selection. Because picking the best of 755 tries mines even the holdout, the VALIDATED verdict additionally requires the top setup’s OOS Sharpe to clear a selection hurdle of 1.3 (√(2 ln N)/√T) AND positive alpha in both windows. Of the eligible setups, 17.0% had positive out-of-sample alpha (median OOS Sharpe 0.53) — the table below is truncated, but this summary covers all of them. Full recipe: methodology · the engine’s contract lives in the repo as STRATEGY_METHODOLOGY.md.
Top 20 of 653 eligible setups
Ranked by out-of-sample Sharpe. Full + out-of-sample columns, costs included. Hypothetical.
| # | Setup | TF | Total ret | Sharpe | Max DD | Win | Trades | α vs B&H | OOS Sharpe | OOS α | OOS trades |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Pascal's Weighted MA | Daily | +374.5% | 0.48 | -37.3% | 38.0% | 295 | +0.3% | 1.04 | +4.6% | 97 |
| 2 | Cascade Z-Score | Daily | +210.1% | 0.35 | -54.0% | 36.8% | 209 | -1.4% | 0.95 | +4.4% | 55 |
| 3 | Premier Stochastic | Daily | +193.3% | 0.32 | -61.9% | 39.0% | 246 | -1.6% | 0.94 | +5.9% | 66 |
| 4 | Woodie Pivots | Daily | +92.6% | 0.23 | -69.8% | 44.2% | 1,381 | -3.3% | 0.94 | +5.4% | 405 |
| 5 | VWMA vs Price | Daily | +413.4% | 0.44 | -60.3% | 40.2% | 396 | +0.6% | 0.92 | +5.5% | 110 |
| 6 | ZLEMA 200 Trend | Daily | +596.5% | 0.54 | -44.4% | 36.4% | 151 | +1.9% | 0.91 | +3.8% | 38 |
| 7 | VWAP Trend | Daily | +409.6% | 0.44 | -58.0% | 40.2% | 383 | +0.6% | 0.9 | +4.9% | 109 |
| 8 | Know Sure Thing | Daily | +259.1% | 0.37 | -70.2% | 42.9% | 175 | -0.8% | 0.9 | +3.6% | 52 |
| 9 | Rate of Change | Daily | +75.4% | 0.21 | -73.7% | 42.5% | 414 | -3.7% | 0.89 | +4.4% | 118 |
| 10 | Triangular MA | Daily | +310.5% | 0.39 | -62.4% | 37.1% | 361 | -0.3% | 0.88 | +4.5% | 102 |
| 11 | Sine-Weighted MA | Daily | +269.7% | 0.37 | -64.7% | 36.5% | 367 | -0.7% | 0.88 | +4.4% | 103 |
| 12 | Coppock (fast) | Daily | +189.0% | 0.32 | -70.2% | 40.0% | 225 | -1.7% | 0.88 | +4.4% | 63 |
| 13 | Sine-Weighted MA | Daily | +269.7% | 0.37 | -64.7% | 36.5% | 367 | -0.7% | 0.88 | +4.4% | 103 |
| 14 | Disparity Index | Daily | +350.3% | 0.41 | -52.7% | 36.7% | 452 | +0.1% | 0.87 | +4.2% | 131 |
| 15 | Pretty Good Oscillator | Daily | +355.6% | 0.41 | -52.7% | 36.8% | 451 | +0.1% | 0.87 | +4.2% | 131 |
| 16 | DPO (10) | Daily | +216.9% | 0.34 | -62.1% | 38.2% | 335 | -1.3% | 0.87 | +4.1% | 93 |
| 17 | Andean Oscillator | Daily | +198.6% | 0.35 | -57.4% | 45.9% | 135 | -1.6% | 0.86 | +1.8% | 35 |
| 18 | Inverse Fisher RSI | Daily | +236.3% | 0.35 | -66.4% | 38.3% | 227 | -1.1% | 0.85 | +3.8% | 62 |
| 19 | Std Error Channel | Daily | +214.7% | 0.35 | -55.6% | 39.5% | 266 | -1.4% | 0.85 | +2.0% | 69 |
| 20 | LSMA 100 Trend | Daily | +131.4% | 0.29 | -43.9% | 37.1% | 256 | -2.6% | 0.85 | +1.7% | 69 |
Hypothetical backtests with 0.08%/side costs. Not investment advice — see the full disclaimer.
These are historical backtests of mechanical rules. They are educational research, not investment advice, not a recommendation, and not tailored to you. Educational information only — not investment advice. Hypothetical backtested results; past performance does not guarantee future results. Trading involves risk of loss.