AQAI QuantAI research lab for systematic strategies

Automated analysis

This analysis was drafted by our research engine and has not been checked by a human editor. It may contain errors. It separates the paper’s own results from our tests, and any figures called ours come from our own backtest.

Our automated analysisOur backtest

On CRSP, trailing shrinkage nearly closes XGBoost's lead over neural forecasts

R² separates direction, size and seed noise; size explains 0.0527 of one 0.0683 swing, little of another.

2026-11-04 · 8 min read · Machine Learning / Adaptive Forecast Calibration · US equities

Reviewing: Decomposing Rank Reversals under Temporal Nonstationarity: Alignment, Aggressiveness, and Instability · Deying Song and Xueying Ding · Read it on arxiv

Our backtest of this idea

Our automated quick test, not the paper's

Historical Memory Selection with Paired Ridge–Boosting Ensembles

Backtest period 2020-01-01 to 2024-07-01 · hypothetical, net of modelled costs

Why these figures are not the paper's (3)

Run on a different market than the paper

No asset-class substitution is required for the equity-return forecasting mechanism. A US equity implementation would test the framework on a platform-supported panel, not reproduce the exact industry portfolios or external equity benchmark.

The paper's own figures describe its universe and do not carry over to ours.

This is not a replication of the paper (2)

  • The supplied excerpt does not establish the complete feature sets, panel construction, or experimental specifications for the external benchmarks. The proposed price-feature implementation tests the decomposition and adaptive calibration mechanism, not an exact replication of the reported model rankings.
  • Optimal forecast scaling calculated from evaluation-period outcomes is an oracle diagnostic, not an executable signal; trading calibration and memory selection must use only previously observed validation outcomes.

The figures below measure what we could run, not the paper's own method, so they are not evidence for or against its claim.

Our own audit found this run does not follow the paper faithfully (6)

  • Appendix C.1 fits and scores each industry separately, with no parameter shared across industries.: Fit pooled stock-date models and use pooled stock-date validation, without industry classifications. (invalidates: Source-panel industry empirical rankings and numerical scores are not transferable performance targets)
  • Paper predictors, industry excess-return targets and calendar samples.: Use daily-price-only individual-stock features, adjusted next-open-to-following-open targets and rolling prehistory within the platform interval. (invalidates: Industry and independent-equity numerical results are not predictions of this replacement panel)
  • Paper rolling 16-month, rolling 64-month and expanding industry histories.: Compare the task's four fixed session-count memories. (invalidates: Figure 3A memory-frequency result is not a guaranteed outcome on this grid; Table 1 window rankings are not replication targets)
  • Paper paired 80% within-month subsampling without replacement.: Use paired moving five-session date-block bootstrap replicates with replacement. (invalidates: Paper instability magnitudes and seed-variation results are not replication targets)

2 further finding(s) are described in the note.

These are our findings about our own implementation, not criticisms of the paper. Read the figures below as a description of what we ran.

Jan 2020Total 25.9%Jul 2024
Sharpe
0.50
Total Return
25.9%
Max Drawdown
-15.4%
CAGR
5.4%
Volatility
11.7%
Beta vs SPY
0.04
Trades
157,298

Fit a scalar on the trailing twelve months before paying for an architecture search in daily equity return forecasts. Song and Ding's CRSP stock panel gives a sharp reason to do so. Across 2022 to 2024, scaling forecasts using the preceding 12 months reduces nine XGBoost-versus-neural performance gaps from a range of 0.20 to 1.03 to under 0.00015. The authors attribute this convergence "almost entirely" to shrinking forecast magnitudes toward zero. In their reading, miscalibrated aggressiveness explains the gaps rather than differences in target alignment. We did not find stated units for the 0.20 to 1.03 range.

Read that result carefully.

Every pooled branch mean in Table 2 is negative over 2021 to 2024, ranging from -0.00076 to -0.00199. If the individual models also score below zero, shrinking them all toward zero mechanically moves their scores toward zero and closes the gaps. Convergence establishes that the forecasts were too large. Differences in alignment, including whether any model supplied usable direction, depend on a. Calibration leaves a unchanged.

R² = 2ag - g² - u, exactly

An exact identity anchors the paper. Fit a forecaster M times with different seeds or subsamples, then average the M forecasts. The result has three components. Alignment a measures the cosine between the average forecast and the realized target. Aggressiveness g divides the average forecast's norm by the target's norm. Instability u measures the mean squared spread of individual replicates around their average, scaled by target energy.

Mean replicate R² equals 2ag - g² - u exactly. The average forecast earns 2ag - g², recovering exactly u through averaging. Rescale that average by a/g and the best unconstrained score is a². Since these optimal scalars use evaluation outcomes, the authors describe them as in-sample oracle diagnostics. Across 351,540 empirical scope rows, the identity reconstructs within 10⁻⁹.

The theory builds from there. The authors expand excess loss as A + B + V/h + Kh + Wh², with h denoting the number of recent training observations. Estimation variance enters through V/h; drift penalties increase with h. A complex class that incurs more variance and more quadratic drift can beat a simple class only when its history-independent advantage exceeds a U-shaped cost in h.

For ridge with local linear coefficient drift, optimal memory satisfies V/h² = J + (h+1)Q/2. This relies on simplifying assumptions: a fixed design matrix across windows and no curvature remainder. Set J = 0 and the expression becomes the cubic h²(h+1) = 2V/Q, approaching a cube-root rule for long windows. The authors acknowledge that the cube-root formula "is only approximate. It fails for general ridge shrinkage and for short histories." They extend the treatment to Trees, RNNs, LSTMs and Transformers through frozen-feature surrogates. Their transfer bounds are conditional, and they say those bounds do not establish a small surrogate-to-trained gap for trained XGBoost, recurrent or attention models.

The main empirical exercise predicts daily excess returns for the 17 Fama-French industry portfolios using 129 predictors. Monthly refits produce out-of-sample forecasts from January 1990 to November 2016 (6,784 days). Thirteen models use 16-month, 64-month and expanding windows, each with six seeds. In a simulation, increasing drift from 0.002 to 0.016 shortens optimal memory from 128 to 32. On a deterministic balanced design with p = 8, the log-log slope is -0.67, against the predicted -2/3.

Can the phase boundary locate the forest-versus-ridge reversal?

Random forest versus tuned ridge supplies the flagship reversal. With 16 months of history, random forest records mean seed R² of 0.3549; the expanding window lowers it to 0.2953. Tuned ridge moves the other way, from 0.3515 to 0.3602, reaching its high of 0.3668 at 64 months.

Table 8 makes this pair easy to explain. The forest's advantage changes from +0.0034 to -0.0649, a swing of -0.0683. The g² term accounts for about -0.0527, largely because tuned ridge's g² drops from 0.4625 to 0.3440. Another -0.0072 comes from 2ag, with -0.0084 from u. Here the description "miscalibrated aggressiveness" fits. Ridge becomes less aggressive as its training history grows.

The short-window end of the reversal is thin. At 16 months, the forest's seed interval of [0.3514, 0.3583] overlaps ridge's [0.3487, 0.3543]. By 64 months, ridge leads by about 0.03. The evidence establishes that the forest deteriorates with more history while ridge holds up. Predicting the crossover would require estimates of ΔV, ΔW and ΔK; we found none for the industry data. The paper calls the empirical pattern "consistent with" the phase boundary.

Its second named reversal is thinner still. Only on the expanding window does the 60-day Transformer overtake flattened XGBoost, scoring 0.3195 against 0.3148. The margin is 0.0047. Seed intervals do not overlap in this comparison, although seed intervals supply the only reported uncertainty.

The abstract attributes reversals to predictable surges in miscalibrated aggressiveness. Yet the authors say calibration cannot close the 20-day XGBoost-Transformer gap: a [0,1] scalar changes it by at most 0.005. Their conclusion discusses alignment alongside aggressiveness. The noise regression estimates -0.012 R² per standard deviation, with an interval of [-0.109, -0.001]. It barely clears zero.

What averaging recovers

For a practitioner, u is the paper's most useful component. In 18 of 20 architecture-context pairs, instability is higher at 16 months than at 64. Averaging six seeds raises the 16-month random forest's score from 0.3549 to 0.3705. It also raises the expanding 60-day Transformer's score from 0.3195 to 0.3342. Ridge with α = 1 at 16 months gives the clearest example: u = 0.1615 is exactly the gap between its mean score of -0.0909 and its ensemble score of 0.0706.

Averaging leaves shared error in place. On the expanding window, flattened ridge with a 20-day context scores -1.1533, with u = 0.8225 and g² = 1.1324. Ensembling lifts that to -0.3308, still below zero. Removing the residual requires shrinkage or a different model. In the tabular branch, tuned ridge with penalty 100 or 10,000 reduces g relative to α = 1 in 78 of 81 year-window pairs. It reduces u in all 81.

Audit the forecast clock before trusting a daily R² of 0.35

A daily R² of 0.35 on industry portfolios is hard to square with the paper's description of return-prediction signals as weak and transient. The authors cite Welch and Goyal (2008), among others, in that discussion. Their timing language deserves scrutiny. A tabular model "maps the vector x_t to the target y_tj", while temporal context spans the last L days "including day t".

Of the 129 inputs, the text we read describes only the 17 target returns as coming from the previous day. It gives no such lag for the three Fama-French factors or the 94 characteristic portfolios. If those inputs are dated t, same-day market comovement could explain an unknown share of the 0.35. A trader cannot buy that. In that case, tuned ridge's 1.1315 percentage-point RMSE would measure a nowcast.

The authors disclose other limitations. Networks receive only 12 of the 16 months in the shortest window. The intervals capture seed and subsample variation alone, and "this appendix reports no test of equal predictive accuracy." For the first 37 forecast months, the 64-month and expanding windows are identical. The CRSP exercise uses two seeds and fixed hyperparameters. We found no portfolio, Sharpe ratio or cost figure anywhere in the paper.

We would want every input lagged a session, followed by a comparison of raw, averaged and trailing-scaled forecasts in a long-short book after costs. Our note on CZAR flagged the same distance between lower squared error and a tradable book.

Our US large-cap test

We could not run the 17 industry portfolios or the 129-predictor set. Nor could we run the Zhang et al. CRSP features and universe used for the paper's external benchmark. We did not reconstruct those panels, and the paper gives no CRSP universe size. Our exercise tests the decomposition and calibration mechanism on a different panel. It therefore says nothing about the paper's model rankings. We fit scalars solely from validation outcomes already observed; the paper's optimal-scaling figures are oracles and cannot be executed.

Our adaptation uses the annual top 500 non-ADR US stocks by capitalization. Daily data run from January 2020 to July 2024, with metrics starting on 4 February 2020. Features cover price, volatility and dollar-volume only. We fit ridge with α = 1 and a depth-2, 150-tree XGBoost on each of 63, 126, 252 and 504 sessions. Every fit uses six paired five-session block bootstraps. We estimate γ, clipped to [0,1], over 126 calibration sessions, then select the candidate model on the next 126.

The book buys the top 10% and shorts the bottom 10% of averaged forecasts, holding ±50% of NAV on each side. Its measured beta to SPY was 0.04. Positions enter at the next open and exit at the following open, with commissions charged on every fill.

The headline figures above this article come from that run. Their interpretation depends on its setup. A full comparison requires 504 training dates and 252 archived out-of-sample dates, or about three years at 252 sessions a year. Until then, the book stays in cash. Only roughly the last year and a half of the window therefore reflects the strategy.

Reported annualized volatility of 11.67% mixes roughly three years of cash with the trading stretch. It understates risk while the book is trading. We also still need to reconcile our execution timing with the next-open schedule we specified. These figures leave short borrow and market impact unresolved for a book that turns over daily.

The paper reports no trading results to compare with ours. Even if that comparison existed, it would place industry-portfolio R² beside a stock book measured net of commissions, two different measurements. The same cash period dilutes our run's Sharpe of 0.50. Like every result here, it is evidence about our pass first.

The authors recommend examining the three components before financing expensive architecture searches. We add a narrower prescription: estimate the scalar on trailing data and measure how much of the gap remains. Spend compute on architecture where alignment differs.

Our backtest stops at 2024-07-01, and everything after that date is deliberately left untouched so the same strategy can be checked out of sample later.

How our backtest worked

The steps the code we ran actually executed, from its strategy card. Ours, not the paper's — it is one automated implementation of the idea, not the authors' own.

Specified research logic; reported platform execution metadata requires reconciliation with its next-open schedule.

1. Each year, select up to 500 non-ADR stocks by historical capitalization;
   use each signal year's roster throughout training and evaluation.
2. After each close, construct valid return, volatility and volume features.
   Target y[i,t] = adjusted_open[i,t+2] / adjusted_open[i,t+1] - 1.
   Admit labels only after their actual exit-open timestamps occur.
3. At each month start, use information available at prior month-end:
   for each model and h in {63,126,252,504}, fit six paired bootstrap
   replicates using five-session date blocks; scale training rows only.
   Keep fitted models and scalers fixed for the month.
4. Retrieve 252 fully realized dates of genuine historical OOS forecasts
   on common stock-date support. Use earlier 126 dates as calibration C
   and later 126 as selection V.
5. For each candidate, estimate gamma_C = clip(sum(y*p)/sum(p*p),0,1)
   on C, then minimize sum((y-gamma_C*p)^2) on V.
   Break candidate ties by model name, then shorter window.
   Refit the selected candidate's gamma on V and freeze it for the month.
6. Each close, average its six unrounded forecasts. If gamma > 0,
   rank the underlying means; break genuine ties by symbol_key.
   Long the top floor(0.1*N), short the bottom floor(0.1*N).
   Target +50%/-50% NAV, equal intended dollars within each leg,
   subject to position and leverage caps; leave residual allocation cash.
7. Specification queues orders for the next adjusted open and holds
   through the following open. Net targets against drifted holdings;
   transact only net share changes. Missing entries remain cash without
   replacements; missing exits remain unresolved until an actual open.
8. Target cash when gamma is zero, either tail cannot form, or the full
   candidate comparison is unavailable. Charge executable liquidations,
   including annual-roster exits and terminal liquidation.