Case study · Backtest
🗓 Backtest period: 2018-01-01..2023-01-01
Spec ID: spec-multitimeframe-momentum-us-stocks-1783167355 · Generated: 2026-08-19 10:25 UTC
Cluster: Momentum · Sub Cluster: Weekly-Daily Trend Alignment
The strategy holds liquid US large-cap stocks only when completed-week and daily moving-average trends are simultaneously bullish. Positions are ATR-sized and exit on trend failure, a 3-ATR trailing stop, or a 126-trading-day holding limit.
Price trends can persist because investors adjust gradually to information, institutional portfolios rebalance incrementally, and market participants herd or underreact. Requiring agreement between weekly and daily trends seeks to participate in sustained advances while filtering short-lived daily signals that conflict with the slower regime.
ATR-based sizing and trailing exits attempt to normalize risk across stocks with different volatility and reduce exposure when an established trend reverses. The approach accepts frequent small losing trades in exchange for retaining fewer, larger winners.
[code omitted from public view]
| Param | Value | Notes |
|---|---|---|
| Direction | Long only | Requires bullish weekly and daily trends |
| Daily fast / slow SMA | 20 / 50 days | Fast SMA must exceed slow SMA |
| Daily fast-SMA slope | 5 days, positive | Close must also exceed fast SMA |
| Weekly fast / slow SMA | 20 / 50 weeks | Constructed from Friday-ending weeks |
| Weekly fast-SMA slope | 4 weeks, positive | Weekly close must exceed fast SMA |
| Weekly data timing | Completed weeks only | Last available daily close is the weekly close |
| Liquidity threshold | $10 million | Minimum 20-day average dollar volume |
| ATR period | 14 days | Used for sizing and trailing exits |
| Trailing stop | 3.0 × ATR | Applied to open positions |
| Target risk | 1% per position | ATR-volatility-adjusted sizing |
| Position cap | 10% of portfolio | Per-symbol maximum |
| Maximum leverage | 4.0× | Portfolio leverage ceiling |
| Maximum holding period | 126 trading days | Time-based exit |
| Rebalance / execution | Daily at close | Platform market-on-close convention |
| Universe | Fixed 20 US stocks | Labeled top 20 by capitalization; includes multiple share classes and several atypical constituents |
| Backtest window | 2018-01-01 to 2023-01-01 | Daily bars; no walk-forward analysis |
| Commission | $0.004/share; $1 minimum | Maximum commission is 1% of order value |
| Slippage | 0 bps | No market-impact allowance |
| Missing data | Skip signal or trade | Synthetic execution prices are prohibited |
| # | Concern | Status |
|---|---|---|
| 1 | Daily close, high, low, or volume used with same-day open execution | Pass — execution is at the same-day close under the platform's market-on-close convention |
| 2 | Incomplete weekly bars entering weekly indicators | Pass — only completed Friday-ending weeks are used |
| 3 | Rolling SMA, slope, ATR, and liquidity windows using future observations | Pass by specification — all windows are trailing; implementation should retain chronological sorting |
| 4 | Fixed top-cap universe selected with information unavailable at the historical date | Review required — constituent selection date and point-in-time ranking are not documented |
| 5 | Corporate actions, delistings, and missing-price handling | Partial — missing inputs are skipped, but point-in-time membership and adjustment quality are not established |
The backtest produced a 32.52% total return with a 0.72 Sharpe ratio, 8.99% volatility, and an 11.51% maximum drawdown. Beta versus SPY was low at 0.15. Across 1,064 trades, the 38.16% win rate and 1.52 profit factor fit a trend-following payoff profile in which relatively few larger gains offset more frequent losses. These figures are encouraging but remain sensitive to the unresolved universe construction, the single test window, and zero assumed slippage.
Recomputed here from the run's stored daily returns, because every annualized figure in the table above is derived from the LENGTH of that array (years = n / 252). Only total return and max drawdown do not depend on the row count, so when the recomputed and stored values differ by a common factor, those two are the numbers to trust.
| Check | From the run's own returns | Note |
|---|---|---|
| Daily-return rows | 1,259 | 1.00x the 1,260 trading days in 2018-01-01..2023-01-01 |
| Distinct dates | 1,259 | one row per date |
| Date span | 2018-01-02 .. 2022-12-30 | |
| Sum of daily returns | 32.52% | matches the reported total return |
| Sharpe from these rows | 0.72 | stored 0.72 |
| Volatility from these rows | 8.99% | stored 8.99% |
| Max drawdown from these rows | -11.51% | stored -11.51% |
| CAGR from these rows | 5.80% | stored 5.80% |
| Metric | Value |
|---|---|
| Total Return | 32.52% |
| Sharpe | 0.72 |
| Sortino | 0.72 |
| Calmar | 0.50 |
| Max Drawdown | -11.51% |
| Volatility | 8.99% |
| Beta vs SPY | 0.15 |
| Win Rate | 38.16% |
| Profit Factor | 1.52 |
| Total Trades | 1064 |
| Symbols | 20 (AAPL, ACON, AMZN, BETR, BRK-A, BRK-B, GOODO, GOOG, GOOGL, HOLO, +10 more) |