Backtested research example
🗓 Backtest period: 2020-01-01..2025-10-08
Spec ID: spec-covariance-regret-dual-tilt-us-largecap-1785694276 · Generated: 2026-08-02 18:47 UTC
Cluster: Risk Allocation · Sub Cluster: Covariance-Regret Dual Tilt
Allocates weekly across 200 liquid US large-cap stocks using a minimum-variance anchor plus covariance-weighted recent-return tilts. The two active directions implement opposite gradient signs: an alpha/momentum sleeve and a regret/contrarian sleeve, then project weights into long-only, capped, volatility-targeted constraints.
The strategy is motivated by a covariance-regret framing in which the sensitivity of a linear allocation rule to cross-sectional return/cost covariance is proportional to the covariance matrix. A minimum-variance portfolio is used as the budget-constrained anchor, while recent demeaned returns are transformed by the rolling covariance matrix to emphasize assets whose recent relative moves align with broad covariance structure.
Economically, the alpha-maximizing direction behaves like covariance-weighted momentum, while the opposite sign is intended to behave like covariance-weighted mean reversion. The projection layer turns the theoretical gradient tilt into a tradable long-only portfolio with single-name caps, turnover limits, transaction costs, and volatility targeting.
[code omitted from public view]
| Param | Value | Notes |
|---|---|---|
| Universe | Top 200 US stocks | Yearly capitalization screen; ADRs excluded; daily close prices used. |
| Backtest window | 2020-01-01 to 2025-10-08 | Daily bars, weekly rebalancing on the last available trading day. |
| Anchor | Minimum variance | w_MVP = Sigma^-1 1 / (1' Sigma^-1 1). |
| Covariance lookback | 252 trading days | Rolling daily return covariance; minimum history 252 days. |
| Covariance stabilization | 5% diagonal shrinkage; eigenvalue floor 1e-6 | Used to stabilize a 200-name covariance inversion. |
| Recent-return signal | 20 trading days | Mean recent return minus rolling 252-day mean return. |
| Step size | eta = 1 / spectral_norm(Sigma_hat) |
Recomputed each rebalance. |
| Active tilts | +eta Sigma x_t and -eta Sigma x_t |
Alpha-maximizing and regret-minimizing sleeves. |
| Rebalance frequency | Weekly | Signals measured through the rebalance close and executed at that close. |
| Constraints | Long-only, max 10% per name | Budget projection with residual cash when volatility scaling reduces exposure. |
| Volatility target | 10% annualized ex-ante | Risky weights scaled down toward cash if projected volatility exceeds target; no gross leverage above 1.0 in implementation. |
| Turnover cap | 25% one-way per rebalance | Euclidean projection toward prior weights when cap is exceeded. |
| Trading cost | 5 bps per dollar traded | Strategy-level transaction cost model. |
| Brokerage assumptions | $0.004/share, $1 min/order, max 1% commission | No additional slippage bps in the supplied cost block. |
| # | Concern | Status |
|---|---|---|
| 1 | Signal/execution timing | Signals use data available through the rebalance close and execute at that same close via market-on-close convention. |
| 2 | Same-day open execution | No same-day open execution is specified for close-derived signals. |
| 3 | Rolling return and covariance windows | Covariance, mean return, and recent-return features are computed from historical close-to-close returns up to the rebalance date. |
| 4 | Universe selection | Universe uses a yearly capitalization screen with rebalance_year; researchers should confirm the source table is point-in-time for that year. |
| 5 | Missing prices | Required close prices are not fabricated; affected symbol orders are skipped. |
| 6 | Fundamental data latency | No earnings, filings, transcripts, or other event-time fundamentals are used. |
-eta Sigma_r x_t to demeaned returns for the sleeve labeled regret-minimizing, which may invert the intended cost-space descent direction; the alpha and regret labels should therefore be interpreted cautiously.The backtest produced a positive total return of 94.68% with Sharpe 0.79, Sortino 1.19, and profit factor 1.99 over 2020-01-01 to 2025-10-08. Risk was material: realized volatility was 20.90% and max drawdown reached -25.11%, which is high relative to the 10% ex-ante volatility target and suggests realized risk control was imperfect during this sample.
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,450 | 1.00x the 1,454 trading days in 2020-01-01..2025-10-08 |
| Distinct dates | 1,450 | one row per date |
| Date span | 2020-01-02 .. 2025-10-08 | |
| Sum of daily returns | 94.68% | matches the reported total return |
| Sharpe from these rows | 0.79 | stored 0.79 |
| Volatility from these rows | 20.90% | stored 20.90% |
| Max drawdown from these rows | -25.11% | stored -25.11% |
| CAGR from these rows | 12.28% | stored 12.28% |
| Metric | Value |
|---|---|
| Total Return | 94.68% |
| Sharpe | 0.79 |
| Sortino | 1.19 |
| Calmar | 0.49 |
| Max Drawdown | -25.11% |
| Volatility | 20.90% |
| Win Rate | 56.69% |
| Profit Factor | 1.99 |
| Total Trades | 16431 |
| Symbols | 200 (AAPL, ABBV, ABNB, ABT, ACN, ADBE, ADI, ADP, ADSK, AJG, +190 more) |
Backtests are historical simulations for research purposes only. They are not investment advice and do not guarantee future performance.