Swing-Trading Backtests Inspired by Jake Bernstein: 21 Research Configurations
This is a retrospective study of 21 daily and weekly research implementations inspired by Jake Bernstein’s swing-trading material, plus a separate reference crossover. The results describe our simulation and its assumptions. They do not establish that the methods produce alpha or that a tradable portfolio would be profitable.
What the simulation shows
From 2002-01-02 through 2026-09-18, 342 stocks produced 624,724 positions across the 21 research configurations. The reference produced another 3,640; it is excluded from the 21-configuration counts. At an assumed execution charge of 0.10% of initial notional per completed position, 3 of the 21 configurations had a positive arithmetic mean. At 0.20%, 1 did.
These are untrimmed adjusted-price proxy returns. Each position has equal initial notional; partial exits are weighted within that position. The mean weights stocks by their number of positions, so frequently traded stocks contribute more. The median and terminal-close count are shown alongside the mean. A positive mean is before borrow, financing and capacity constraints and is not evidence of statistical significance.
| Configuration | Positions | Mean after assumed cost | Median after assumed cost | Win rate | Terminal closes |
|---|---|---|---|---|---|
| Channel trend, immediate entryW01 · Daily | 15,814 | −0.36% | −1.77% | 46.9% | 49 |
| Channel trend, pullback entry, every pullbackW02 · Daily | 58,929 | −0.04% | +0.32% | 55.0% | 73 |
| Channel trend, pullback entry, first pullback onlyW03 · Daily | 18,281 | +0.10% | +0.44% | 56.9% | 18 |
| Channel trend, immediate entry, alternative confirmationW04 · Daily | 18,942 | −0.37% | −1.53% | 47.4% | 56 |
| Channel trend, immediate entry, no confirmationW05 · Daily | 22,177 | −0.38% | −1.83% | 46.3% | 57 |
| Channel counter-move approximationW06 · Daily | 31,183 | −0.02% | +0.06% | 51.7% | 6 |
| Channel trend, immediate entryW07 · Weekly | 3,258 | −0.77% | −2.84% | 42.8% | 31 |
| Channel trend, pullback entry, every pullbackW08 · Weekly | 13,266 | +0.06% | +0.70% | 53.2% | 97 |
| Divergence, oscillator AW09 · Daily | 7,682 | −0.27% | +0.46% | 53.8% | 29 |
| Divergence, oscillator BW10 · Daily | 8,415 | −0.20% | +0.49% | 55.6% | 34 |
| Divergence, oscillator CW11 · Daily | 10,495 | −0.16% | −0.26% | 48.6% | 37 |
| Divergence, oscillator DW12 · Daily | 7,853 | −0.06% | −1.10% | 30.2% | 19 |
| Divergence, first of the four oscillatorsW13 · Daily | 17,665 | −0.15% | −0.67% | 41.9% | 51 |
| Divergence, oscillator AW14 · Weekly | 1,777 | −0.80% | −0.83% | 47.3% | 24 |
| Open/close averages, crossover approximationW15 · Daily | 95,357 | −0.24% | −0.88% | 35.4% | 129 |
| Open/close averages, research implementationW16 · Daily | 67,419 | −0.29% | −0.65% | 39.5% | 65 |
| Open/close averages, crossover approximationW17 · Weekly | 18,677 | +0.09% | −1.95% | 35.7% | 137 |
| Open/close averages, research implementationW18 · Weekly | 13,822 | −0.07% | −1.16% | 42.3% | 77 |
| Fast band swing tradeW19 · Daily | 99,455 | −0.10% | +0.86% | 64.6% | 44 |
| Fast band swing tradeW20 · Weekly | 19,905 | −0.12% | +2.14% | 64.4% | 60 |
| Volatility score (our reconstruction, two settings assumed)W21 · Daily | 74,352 | −0.26% | −0.80% | 40.0% | 130 |
| Reference: 50/200-day average cross, eligibility gatedW22 · Daily | 3,640 | +3.96% | −5.53% | 35.7% | 153 |
“Terminal closes” counts positions whose remaining exposure is liquidated at the common end of the simulation. Daily and weekly entries use different bars and holding periods; their mean returns per position are not directly comparable measures of efficiency or risk. Rows are shown by configuration ID, without selecting winners.
From the team behind this backtest
Get seasonal patterns that have worked in the past
Testing popular trading ideas against decades of data is what we do every day. Does It Repeat applies it to timing: which weeks of the year a market has historically risen or fallen, how consistently, and whether that pattern still holds up.
Seasonality screener
FreeThe next yearly windows with a perfect record
- ICG.LICG PLCLongOct 21 → Nov 25 · won 10 of 10 years · +13.3% avg
- PHParker HannifinLongOct 21 → Nov 22 · won 10 of 10 years · +11.4% avg
- ODFLOld Dominion Freight LineLongOct 22 → Dec 2 · won 10 of 10 years · +9.0% avg
Price cycle screener
FreeCycle models with an entry in the next two weeks
- LITELumentum Holdings Inc.Shortentry Oct 29 · +302.9% net · 100% won
- XMR-USDMoneroLongentry Oct 27 · +278.2% net · 80% won
- AMDAdvanced Micro Devices Inc.Shortentry Oct 27 · +217.1% net · 80% won
Free account includes a screener preview, no credit card. Full access $20/mo at early-adopter pricing, 14-day money-back guarantee, cancel anytime. All statistics are historical; past performance does not guarantee future results.
A smaller, auditable data sample
We intersected the platform’s explicitly recorded US index-stock tags with a frozen Nasdaq Trader listing directory. Of 477 explicitly tagged stocks, 471 exactly matched the directory; the others were excluded without guessing aliases. Fresh Yahoo histories were obtained for all candidates, including volume and corporate actions; provider identity, equity type and USD currency were checked. 469 histories passed the quality checks, and 342 generated eligible positions. The sample contains no futures, foreign-exchange pairs, crypto, ETFs or foreign-currency listings.
The tags define a reproducible platform snapshot; they are not verified historical index membership. Delisted securities and former constituents are not restored. This surviving-stock selection and the retrospective data-quality checks can bias results. For that reason we do not describe the sample as “current index members”, and the results should not be generalized to other markets.
The common end is September 18, 2026. Histories without an observation at that date, malformed OHLC, or missing/extra sessions against the exchange calendar are quarantined rather than silently closed at a stale last price. Exclusions: 1 inconsistent OHLC; 1 session calendar mismatch (1 missing, 0 extra). We preserve full price precision, do not fill missing prices, do not exclude a stock because it later makes large moves, and do not clip profitable or losing trades.
Entry eligibility uses only earlier completed sessions: a rolling average of historical share volume and a nominal-price floor. The averaging window and price floor are research choices, fixed before the simulation was run; the source’s liquidity requirement is retained privately. Eligibility is checked before opening a position, so a rejected entry cannot occupy the simulated account or suppress later signals. Existing positions continue to be managed if eligibility subsequently falls.
Yahoo’s split and dividend adjustments come from one fresh snapshot per symbol. Subsequent splits are reversed for nominal price and share-volume screening, and a nominal USD price increment is converted to the same units as the adjusted bars. Simulation begins in 2002, after US decimalization. Adjusted bars are a research proxy: they do not constitute an independently audited corporate-action ledger or executable historical quotes.
Order timing and unresolved bar ambiguity
Indicators use completed bars. Market orders triggered by a completed bar execute at the next open. Resting orders that are marketable at the open fill there; they are distinguished from entries reached later within the bar. Opening fills are processed before the remaining high/low range. Gap stops receive the opening price when it is worse than the stop. Limits receive an improved opening price when available.
If the order of a stop and a target within a bar is unknown, we assume the stop occurs first. For an entry reached within the bar, we check the stop but do not credit an entry-bar target. This is a conservative convention, not a reconstruction of the true price path. Targets can execute during the entry bar when entry was already known to occur at the open. Changes to protective orders resulting from a target take effect on the next bar.
Weekly bars use the first observed session for the opening date and the last for the closing date. Fill dates within a weekly bar remain intervals; we do not invent exact days or fractional exposure durations. We have not resolved weekly order sequences using intraday data. Weekly superiority, risk-adjusted performance and capital efficiency therefore remain untested.
Only one position per symbol and configuration can be open at a time. Separate configurations can overlap with each other and many stocks can be open simultaneously. No common capital budget or portfolio allocation is imposed. At the end of each independently simulated window, any remaining exposure closes at that window’s final close.
Long and short results are descriptive
The table separates directions but makes no comparison with random entries. Nor do we compare against the stocks’ full-history average return: that is not a random-entry experiment and does not track the changing exposure of partially closed positions. Short results assume fills are available; historical borrow availability, recalls and borrow fees are not modeled.
| Configuration | Long positions | Long mean after cost | Short positions | Short mean after cost |
|---|---|---|---|---|
| Channel trend, immediate entryW01 · Daily | 8,169 | +0.18% | 7,645 | −0.94% |
| Channel trend, pullback entry, every pullbackW02 · Daily | 33,775 | +0.22% | 25,154 | −0.38% |
| Channel trend, pullback entry, first pullback onlyW03 · Daily | 8,976 | +0.39% | 9,305 | −0.17% |
| Channel trend, immediate entry, alternative confirmationW04 · Daily | 9,801 | +0.16% | 9,141 | −0.93% |
| Channel trend, immediate entry, no confirmationW05 · Daily | 11,444 | +0.13% | 10,733 | −0.93% |
| Channel counter-move approximationW06 · Daily | 15,207 | +0.05% | 15,976 | −0.09% |
| Channel trend, immediate entryW07 · Weekly | 1,563 | +2.00% | 1,695 | −3.33% |
| Channel trend, pullback entry, every pullbackW08 · Weekly | 8,122 | +1.24% | 5,144 | −1.80% |
| Divergence, oscillator AW09 · Daily | 2,909 | +0.45% | 4,773 | −0.71% |
| Divergence, oscillator BW10 · Daily | 3,316 | +0.59% | 5,099 | −0.71% |
| Divergence, oscillator CW11 · Daily | 4,039 | +0.65% | 6,456 | −0.67% |
| Divergence, oscillator DW12 · Daily | 3,196 | +0.69% | 4,657 | −0.58% |
| Divergence, first of the four oscillatorsW13 · Daily | 6,854 | +0.53% | 10,811 | −0.58% |
| Divergence, oscillator AW14 · Weekly | 557 | +1.92% | 1,220 | −2.03% |
| Open/close averages, crossover approximationW15 · Daily | 47,974 | +0.18% | 47,383 | −0.66% |
| Open/close averages, research implementationW16 · Daily | 34,929 | −0.02% | 32,490 | −0.59% |
| Open/close averages, crossover approximationW17 · Weekly | 9,452 | +2.10% | 9,225 | −1.97% |
| Open/close averages, research implementationW18 · Weekly | 7,227 | +1.29% | 6,595 | −1.55% |
| Fast band swing tradeW19 · Daily | 53,490 | +0.12% | 45,965 | −0.35% |
| Fast band swing tradeW20 · Weekly | 10,829 | +0.69% | 9,076 | −1.09% |
| Volatility score (our reconstruction, two settings assumed)W21 · Daily | 37,273 | +0.29% | 37,079 | −0.80% |
| Reference: 50/200-day average cross, eligibility gatedW22 · Daily | 1,748 | +16.93% | 1,892 | −8.02% |
Two independently simulated date windows
The earlier window is run on data ending in 2019 and closes its remaining positions there. The later window starts flat in 2020, with older prices used only for indicator warm-up. Weekly entries start with a bar whose opening session lies inside the window. A trade cannot earn a post-2019 exit in the earlier window. Returns are not clipped using thresholds estimated from the full sample.
These are chronological sensitivity checks, not an untouched holdout or a walk-forward selection experiment. The present-day universe, vendor adjustments, and research choices were all established after both periods. No configuration is declared validated because it performs well in either window.
| Configuration | 2002–2019 positions | 2002–2019 mean | 2020–2026 positions | 2020–2026 mean |
|---|---|---|---|---|
| Channel trend, immediate entryW01 · Daily | 10,357 | −0.42% | 5,457 | −0.25% |
| Channel trend, pullback entry, every pullbackW02 · Daily | 39,031 | −0.001% | 19,934 | −0.11% |
| Channel trend, pullback entry, first pullback onlyW03 · Daily | 12,113 | +0.14% | 6,246 | +0.05% |
| Channel trend, immediate entry, alternative confirmationW04 · Daily | 12,440 | −0.41% | 6,502 | −0.29% |
| Channel trend, immediate entry, no confirmationW05 · Daily | 14,404 | −0.33% | 7,773 | −0.49% |
| Channel counter-move approximationW06 · Daily | 20,300 | −0.04% | 10,885 | +0.01% |
| Channel trend, immediate entryW07 · Weekly | 2,088 | −0.44% | 1,170 | −1.36% |
| Channel trend, pullback entry, every pullbackW08 · Weekly | 8,748 | +0.10% | 4,548 | −0.02% |
| Divergence, oscillator AW09 · Daily | 5,253 | −0.38% | 2,424 | −0.01% |
| Divergence, oscillator BW10 · Daily | 5,719 | −0.27% | 2,691 | −0.06% |
| Divergence, oscillator CW11 · Daily | 7,071 | −0.28% | 3,424 | +0.08% |
| Divergence, oscillator DW12 · Daily | 5,165 | −0.18% | 2,692 | +0.12% |
| Divergence, first of the four oscillatorsW13 · Daily | 11,759 | −0.22% | 5,916 | −0.01% |
| Divergence, oscillator AW14 · Weekly | 1,180 | −0.51% | 586 | −1.20% |
| Open/close averages, crossover approximationW15 · Daily | 62,714 | −0.22% | 32,643 | −0.27% |
| Open/close averages, research implementationW16 · Daily | 44,396 | −0.30% | 23,019 | −0.28% |
| Open/close averages, crossover approximationW17 · Weekly | 12,176 | +0.13% | 6,501 | +0.01% |
| Open/close averages, research implementationW18 · Weekly | 9,069 | −0.04% | 4,749 | −0.11% |
| Fast band swing tradeW19 · Daily | 66,018 | −0.08% | 33,445 | −0.14% |
| Fast band swing tradeW20 · Weekly | 13,133 | −0.01% | 6,779 | −0.35% |
| Volatility score (our reconstruction, two settings assumed)W21 · Daily | 49,626 | −0.30% | 24,726 | −0.18% |
| Reference: 50/200-day average cross, eligibility gatedW22 · Daily | 2,368 | +4.75% | 1,272 | +2.35% |
Sensitivity to assumed execution charges
Each column subtracts the stated charge once from each completed position’s gross proxy return, as a fraction of its initial notional. These are illustrative spread, slippage and commission scenarios, not measured all-in trading costs. The same assumption applies to both directions and all holding periods. Fixed charges do not capture borrow, margin interest, order size, market impact, multiple order commissions, or liquidity variation.
| Configuration | 0.00% execution cost | 0.10% | 0.20% | 0.40% |
|---|---|---|---|---|
| Channel trend, immediate entryW01 · Daily | −0.26% | −0.36% | −0.46% | −0.66% |
| Channel trend, pullback entry, every pullbackW02 · Daily | +0.06% | −0.04% | −0.14% | −0.34% |
| Channel trend, pullback entry, first pullback onlyW03 · Daily | +0.20% | +0.10% | +0.003% | −0.20% |
| Channel trend, immediate entry, alternative confirmationW04 · Daily | −0.27% | −0.37% | −0.47% | −0.67% |
| Channel trend, immediate entry, no confirmationW05 · Daily | −0.28% | −0.38% | −0.48% | −0.68% |
| Channel counter-move approximationW06 · Daily | +0.08% | −0.02% | −0.12% | −0.32% |
| Channel trend, immediate entryW07 · Weekly | −0.67% | −0.77% | −0.87% | −1.07% |
| Channel trend, pullback entry, every pullbackW08 · Weekly | +0.16% | +0.06% | −0.04% | −0.24% |
| Divergence, oscillator AW09 · Daily | −0.17% | −0.27% | −0.37% | −0.57% |
| Divergence, oscillator BW10 · Daily | −0.10% | −0.20% | −0.30% | −0.50% |
| Divergence, oscillator CW11 · Daily | −0.06% | −0.16% | −0.26% | −0.46% |
| Divergence, oscillator DW12 · Daily | +0.04% | −0.06% | −0.16% | −0.36% |
| Divergence, first of the four oscillatorsW13 · Daily | −0.05% | −0.15% | −0.25% | −0.45% |
| Divergence, oscillator AW14 · Weekly | −0.70% | −0.80% | −0.90% | −1.10% |
| Open/close averages, crossover approximationW15 · Daily | −0.14% | −0.24% | −0.34% | −0.54% |
| Open/close averages, research implementationW16 · Daily | −0.19% | −0.29% | −0.39% | −0.59% |
| Open/close averages, crossover approximationW17 · Weekly | +0.19% | +0.09% | −0.01% | −0.21% |
| Open/close averages, research implementationW18 · Weekly | +0.03% | −0.07% | −0.17% | −0.37% |
| Fast band swing tradeW19 · Daily | +0.0002% | −0.10% | −0.20% | −0.40% |
| Fast band swing tradeW20 · Weekly | −0.02% | −0.12% | −0.22% | −0.42% |
| Volatility score (our reconstruction, two settings assumed)W21 · Daily | −0.16% | −0.26% | −0.36% | −0.56% |
| Reference: 50/200-day average cross, eligibility gatedW22 · Daily | +4.06% | +3.96% | +3.86% | +3.66% |
Research implementations and source coverage
The reviewed material is Bernstein’s 2017 timing-trigger webinar and the course recordings cited below. We use neutral configuration labels and keep proprietary settings and order rules private. That limits public reproducibility: readers can inspect the reported methodology and outcomes, but cannot reproduce the private strategies from this page alone. This study is independent and is not affiliated with or endorsed by Bernstein.
The channel counter-move is an approximation. Divergence requires a research choice for its missing initial loss rule. The open/close implementations include research choices for management. The volatility score uses assumed settings. The bare crossover configurations and the reference also require entry eligibility, so they may remain flat between signals. None is presented as a verified reproduction of the author’s complete method.
| Method | Source location | Scope / research choices |
|---|---|---|
| Moving Average Channel | 2017 webinar 00:15:00–00:32:10; course S3 00:35:52–00:40:15, 00:44:32–00:58:50 | Tested: immediate and pullback entries, three confirmation variants, daily and weekly. Position split and tie-breaks are our choices. |
| Channel counter-move trade | 2017 webinar 00:24:40–00:29:30; course S3 01:03:41–01:04:12 | Single-bar approximation with research choices for exits. The multi-bar form is not tested. |
| Momentum divergence | 2017 webinar 00:32:14–00:42:40; course S3 01:11:56–01:13:30 | Daily tests cover four oscillators separately and combined. Only oscillator A receives a weekly counterpart. The reviewed material states no initial stop; ours is a research choice. |
| 8 Open / Close | 2017 webinar 00:42:40–00:53:30; course S3 01:15:20–01:19:30 | Tested twice: the bare cross used in our first article, and a research implementation using the 2017 session. Management after the decision bar is our choice; this is not a certified complete reproduction. |
| “888” | 2017 webinar 00:53:30–00:55:50 | Not tested. The trigger and target arithmetic are not recoverable from the recording. |
| 3 × 3 channel | 2017 webinar 01:08:45–01:10:40 | Tested daily and weekly. Re-entry handling is our choice. |
| Trailing rule after a large favourable move | 2017 webinar 00:10:47–00:14:30 | Applied inside the configurations where the material applies it. |
| Volatility Trigger | 2017 webinar 01:16:45–01:18:30 | Reconstruction only. Two settings are not legible in the recording and were assumed, so this is not the author’s indicator. |
| Seasonal date trades | 2017 webinar 00:55:50–01:01:10; course S4 00:34:13 | Not tested. The method depends on the author’s proprietary date lists. |
| Commitments of Traders trigger | 2017 webinar 01:10:42–01:16:45 | Not tested. Long-term positioning, formula not disclosed. |
| Opening gap trades | 2017 webinar 01:04:20–01:08:40 | Outside this study; intraday adaptations appear in our first article. |
| Expansion / Contraction | Course S1 00:47:54–00:56:40; S4 00:41:53–00:48:35 | Not tested. No formula is given. |
What this study cannot conclude
- Positions overlap in time and across correlated stocks. The number of trades is not a count of independent observations. For that reason no confidence interval or significance test is supplied.
- Twenty-one variants, multiple dates and several cost scenarios create selection risk. The tables do not correct for multiple testing and cannot identify a reliable trading edge.
- There is no matched random-entry experiment, investable portfolio, exposure-matched reference, or risk-adjusted benchmark. The reference crossover is another eligibility-gated strategy, not a measure of alpha.
- Vendor data, retrospective corporate-action adjustments, surviving-stock selection, missing order-book information and assumed execution can materially affect results. Independent point-in-time data and finer execution data would be needed for stronger conclusions.
- The study does not show a low-price advantage, an edge over market drift, short-side timing skill or weekly superiority, and it does not verify the author’s own performance figures. It does not establish that the author’s complete methods work or fail.
How the results were verified
Regression checks cover opening-order chronology, targets on known opening entries, trend changes during positions, nominal price increments, lagged liquidity eligibility, and date-window boundaries. All 22 configurations were checked against truncated histories with their indicators recomputed. Returns for all 1,256,874 positions across the full and separate windows were reconstructed from their exit records. An independent reference implementation reproduced 7,280 reference positions across the full and separate windows, and 704 aggregate rows were recomputed from the saved trade records.
The code, data and results are retained privately for audit. The run records source and code hashes, and this page is generated only after aggregate and reference-ledger verification. These checks establish consistency within the stated model; they do not resolve the research limitations above.
From the team behind this backtest
Get seasonal patterns that have worked in the past
Testing popular trading ideas against decades of data is what we do every day. Does It Repeat applies it to timing: which weeks of the year a market has historically risen or fallen, how consistently, and whether that pattern still holds up.
Seasonality screener
FreeThe next yearly windows with a perfect record
- ICG.LICG PLCLongOct 21 → Nov 25 · won 10 of 10 years · +13.3% avg
- PHParker HannifinLongOct 21 → Nov 22 · won 10 of 10 years · +11.4% avg
- ODFLOld Dominion Freight LineLongOct 22 → Dec 2 · won 10 of 10 years · +9.0% avg
Price cycle screener
FreeCycle models with an entry in the next two weeks
- LITELumentum Holdings Inc.Shortentry Oct 29 · +302.9% net · 100% won
- XMR-USDMoneroLongentry Oct 27 · +278.2% net · 80% won
- AMDAdvanced Micro Devices Inc.Shortentry Oct 27 · +217.1% net · 80% won
Free account includes a screener preview, no credit card. Full access $20/mo at early-adopter pricing, 14-day money-back guarantee, cancel anytime. All statistics are historical; past performance does not guarantee future results.