Backtested research example
🗓 Backtest period: 2020-01-01..2025-10-08
Spec ID: spec-tsm-trendfilter-crashprotected-us-stocks-1772186900 · Generated: 2026-05-18 10:18 UTC
Long-only weekly time-series momentum strategy on the 50 largest US stocks, selecting names with positive multi-horizon momentum, a 200-day trend filter, and sufficient ADX trend strength. Portfolio risk is moderated with inverse-vol weighting, volatility targeting, ATR trailing stops, SPY regime filters, and drawdown de-leveraging.
Time-series momentum and trend-following attempt to capture the empirical tendency for assets with positive recent returns and established uptrends to continue outperforming over intermediate horizons. The strategy combines stock-level continuation signals with a broad-market risk-on filter, reflecting the view that single-name momentum is more reliable when the market proxy is also above its long-term trend.
Crash protection is included because equity momentum can suffer during volatility spikes, sharp reversals, and correlated selloffs. Volatility targeting, inverse-volatility sizing, ATR stops, and portfolio drawdown de-leveraging are intended to reduce exposure when realized risk or losses rise, while still allowing participation during persistent equity trends.
[code omitted from public view]
| Param | Value | Notes |
|---|---|---|
| Universe | Top 50 US stocks by capitalization | Static symbol list supplied in spec; includes AAPL, MSFT, NVDA, AMZN, etc. |
| Side | Long only | No short positions. |
| Bar size | 1 day | Daily OHLCV inputs. |
| Backtest window | 2020-01-01 to 2025-10-08 | Includes COVID crash, 2022 bear market, and 2023-2025 rally period. |
| Rebalance frequency | Weekly | Uses last trading day of each week. |
| Entry signal | Majority vote, at least 3 of 4 votes | Votes: close > 200D SMA; 21D return > 0; 63D return > 0; 126D return > 0. |
| Trend strength filter | ADX(14) >= 18 | Filters weaker or choppier trends. |
| Ranking | 126D return, descending | Selects strongest eligible names. |
| Max positions | 15 | Concentrated large-cap momentum basket. |
| Weighting | Inverse volatility | Uses 20D realized volatility. |
| Per-name cap | 10% | Applied during portfolio construction. |
| Volatility target | 12% annualized | Always applied, based on 20D realized vol. |
| Vol scale bounds | 0.25 to 1.5 | Limits de-risking and re-risking from vol targeting. |
| Max leverage | 4.0 | Portfolio-level leverage ceiling. |
| ATR stop | 3.0 * ATR(14) trailing from highest close since entry | Exit on close breach, executed next open. |
| Market risk-on filter | SPY close > SPY 200D SMA | Required for new risk-on entries. |
| Volatility regime filter | SPY RV20 / RV252 <= 1.5 | De-risks when short-term market vol is elevated. |
| Drawdown control | 63D drawdown trigger at 12% | Risk scale multiplied by 0.5 for at least 10 trading days. |
| Drawdown reset | SPY above 200D SMA for 5 consecutive bars | Restores normal risk scale after condition is met. |
| Execution | Signal at close, market order at next open | Partial fills allowed. |
| Costs | Not specified / null | Backtest metrics should be interpreted as before explicit commissions, borrow, tax, and slippage assumptions unless the engine applied defaults outside the spec. |
| # | Concern | Status |
|---|---|---|
| 1 | Indicator timing | Signals are defined using close data and trades occur at the next open, reducing same-bar look-ahead risk. |
| 2 | Rolling windows | SMA, returns, ADX, ATR, and realized volatility use historical rolling windows with full-window minimums. |
| 3 | Universe construction | Universe is described as top 50 by capitalization; if selected using future information or survivorship-biased constituents, results may be overstated. |
| 4 | Corporate actions | Requires split- and dividend-adjusted prices for return and trend calculations; adjustment methodology should be verified. |
| 5 | Execution assumptions | Next-open market fills may be optimistic around gaps, halts, high volatility, or large rebalance trades. |
| 6 | Risk-control state | Drawdown triggers, trailing stops, and highest-close-since-entry must be updated only with information available at or before each decision time. |
The backtest produced a positive total return of 65.52% over 2020-01-01 to 2025-10-08, with moderate risk-adjusted performance: Sharpe 0.73, Sortino 0.87, and Calmar 0.36. The realized volatility was 15.63% and maximum drawdown reached -25.54%, indicating that the crash-protection layer reduced but did not eliminate substantial equity drawdown risk. Win rate was 64.93% with profit factor 1.35 across 3,977 trades, suggesting a broadly profitable but turnover-heavy implementation whose live viability depends heavily on realistic execution costs and point-in-time universe handling.
| Metric | Value |
|---|---|
| Total Return | 65.52% |
| Sharpe | 0.73 |
| Sortino | 0.87 |
| Calmar | 0.36 |
| Max Drawdown | -25.54% |
| Volatility | 15.63% |
| Win Rate | 64.93% |
| Profit Factor | 1.35 |
| Total Trades | 3977 |
| Symbols | 50 (AAPL, ABBV, ABT, ACN, ADBE, AMD, AMZN, AVGO, AXP, BAC, +40 more) |
Backtests are historical simulations for research purposes only. They are not investment advice and do not guarantee future performance.