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.