Case study · Backtest
🗓 Backtest period: 2018-01-01..2023-01-01
Spec ID: spec-macro-gated-time-series-momentum-us-stocks-1783195630 · Generated: 2026-09-05 09:43 UTC
Cluster: Momentum · Sub Cluster: Low-Rate Gated Absolute Equity Momentum
The strategy holds up to 20 liquid US stocks with positive multi-horizon time-series momentum and bullish moving-average trends, but only when point-in-time FEDFUNDS is at or below 1%. Qualifying stocks are volatility-adjusted, ranked, and equally weighted.
Equity trends can persist because information diffuses gradually, investors underreact, and institutional repositioning occurs over time. Requiring positive 3-, 6-, and 12-month returns plus a bullish 50/200-day trend seeks to avoid weak or reversing trends, while dividing the composite score by recent volatility favors smoother momentum.
The macro gate assumes that momentum-bearing equities receive greater support when short-term policy rates are very low. Cheap funding, easier financial conditions, and greater investor risk appetite may strengthen trend persistence, while the FEDFUNDS threshold also removes exposure when monetary conditions are less accommodative.
[code omitted from public view]
| Param | Value | Notes |
|---|---|---|
| Signal formula | 0.4×R63 + 0.4×R126 + 0.2×R252 |
Multi-horizon absolute momentum |
| Volatility adjustment | Divide by 20-day realized volatility | Ranks smoother trends more highly |
| Trend filters | Close > SMA200; SMA50 > SMA200 | Required for entry |
| Return filters | R63 > 0; R126 > 0 | Required for entry |
| Minimum history | 252 trading days | Needed for the longest return window |
| Macro gate | FEDFUNDS <= 1.0% | Latest point-in-time observation by observation date |
| Macro missing-data rule | Skip new entries | Applies until a qualifying observation is available |
| Rebalance/execution | Daily close | Signals are measured at the close and executed market-on-close |
| Maximum positions | 20 | Highest-ranked qualifying stocks |
| Position sizing | Equal weight; 10% cap per stock | Portfolio may retain cash when too few names qualify |
| Maximum leverage | 4.0x | Configured hard ceiling |
| Liquidity threshold | $25 million | Minimum 20-day average dollar volume |
| Universe | 100 US stocks sorted by capitalization | Supplied symbol list; stock instruments only |
| Backtest window | 2018-01-01 to 2023-01-01 | Daily bars; no walk-forward analysis |
| Commission | $0.004/share | $1 minimum per order; maximum 1% of order value |
| Slippage | 0 bps | No modeled market impact or spread slippage |
| Missing execution price | Skip trade | No fill when the real daily close is missing |
| Required comparisons | Low-rate, non-low-rate, and ungated variants | Variant-level results were not supplied with the summary |
| # | Concern | Status |
|---|---|---|
| 1 | Close-derived returns, averages, and volume are executed at the same close | Compliant with the platform's market-on-close convention; no same-day-open execution is specified |
| 2 | FEDFUNDS point-in-time filtering | Partially controlled: observation_date <= signal_date is enforced, but publication timestamps or vintage availability should be verified |
| 3 | Rolling indicator construction | Compliant by specification: 20/50/63/126/200/252-day calculations use history through the signal close |
| 4 | Universe membership and capitalization ranking | Needs verification for survivorship bias and whether membership is reconstructed point in time |
| 5 | Corporate-action treatment | Not specified; adjusted-price handling should be confirmed for returns and moving averages |
| 6 | Missing execution prices | Controlled: trades are skipped rather than filled from future or synthetic prices |
From 2018 through the start of 2023, the backtest produced a 56.59% total return with a 0.88 Sharpe ratio, 0.82 Sortino ratio, 12.81% volatility, and a -15.13% maximum drawdown. The 1.75 profit factor and 79.18% win rate are positive, but the 10,662 trades, zero-slippage assumption, short test window, and absence of the required regime-variant results limit confidence that the macro gate adds robust out-of-sample value.
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 | 56.59% | matches the reported total return |
| Sharpe from these rows | 0.88 | stored 0.88 |
| Volatility from these rows | 12.81% | stored 12.81% |
| Max drawdown from these rows | -15.13% | stored -15.13% |
| CAGR from these rows | 9.39% | stored 9.39% |
| Metric | Value |
|---|---|
| Total Return | 56.59% |
| Sharpe | 0.88 |
| Sortino | 0.82 |
| Calmar | 0.62 |
| Max Drawdown | -15.13% |
| Volatility | 12.81% |
| Beta vs SPY | 0.27 |
| Win Rate | 79.18% |
| Profit Factor | 1.75 |
| Total Trades | 10662 |
| Symbols | 100 (AAPL, ABBV, ABT, ACN, ACON, ADBE, ADP, AMD, AMGN, AMT, +90 more) |