Machine Learning · Replication · Financial Markets

Real-Time Machine Learning in the Cross-Section: A Public-Data Reproduction

Abstract

A leak-audited real-time ML pipeline — expanding-recursive annual windows, the paper’s exact 15-point grid, decile portfolios, six-factor alphas, and a cost overlay — built to reproduce the Chen–Zimmermann Table 7 sub-analysis of a prominent equity-ML paper. The paper-faithful track is blocked at a single identifier seam; a second, commercial-clean public track runs end to end and is the source of every live number here.

Equal- vs value-weighted Sharpe across configurations 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 Paper CZ(Table 7)HeadlineBRTLinearNN2Excl.smallest Annualized Sharpe (10−1) Configuration (public track unless noted) Equal-weightedValue-weighted
Figure 1. Equal- vs value-weighted Sharpe across configurations. Annualized 10−1 Sharpe by configuration on the public track. The leftmost bar is the paper’s published Chen–Zimmermann Table 7 equal-weighted target (3.68), which Track B does not reproduce — its value-weighted leg is published as a return, not a comparable Sharpe, so it is omitted. Across every Track B configuration the equal-weighted spread runs roughly two to three times its value-weighted twin: the gap to the paper is a size-and-weighting story, not a model story.

Key results

EW BRT 10−1 Sharpe
1.25 (t = 3.30)
VW BRT 10−1 Sharpe
0.43 (t = 1.20)
Paper CZ target
Sharpe 3.68 (not reproduced)
Public panel
17 signals · ~289 names/yr · 72 mo

Sample. OSAP March 2022 (207 signals) + SEC XBRL fundamentals and a licensed price feed; 17-signal public panel, ~289 names/yr, Jul 2019–Jun 2025 (72 months)

Headline

A public replication audit is the sharpest available test of whether a published result survives contact with public data and an independently built pipeline. This audit targets Real-Time Machine Learning in the Cross-Section of Stock Returns (Li, Rossi, Yan & Zheng, Journal of Financial Economics, 2025). It deliberately does not chase the paper’s marquee 18,113-signal claim — that universe is built from Compustat in the Yan–Zheng style and is not reproducible from public data — but the paper’s Table 7 Chen–Zimmermann sub-analysis, a robustness check on 207 published anomalies for which the paper reports a boosted-tree equal-weighted 10−1 return of 5.18%/month and an annualized Sharpe of 3.68.

The honest finding has three parts. Methodologically, a faithful, leak-audited real-time pipeline can be built and verified end to end, and the paper-faithful OSAP track is ready to run the moment an identifier-to-ticker bridge is available. On scope, that OSAP track is blocked at a single, nameable seam — the Open Source Asset Pricing library ships its signals keyed by a CRSP security identifier with no public route to a tradeable ticker — so no OSAP Table 7 number is claimed; the seam is located rather than papered over. Empirically, the one configuration that runs fully on public, commercial-clean data delivers an equal-weighted boosted-tree Sharpe of 1.25 (t = 3.30) that survives six-factor adjustment and short-term-reversal removal, yet collapses under value-weighting (0.43) and microcap exclusion (0.54) and is bracketed by a linear model above it and a two-layer neural net below — real, significant, well understood, and correctly not comparable to the paper’s 3.68, for reasons enumerated rather than hidden.

The target paper

Li, Rossi, Yan & Zheng (LRYZ) ask whether ML return-prediction strategies are truly implementable in real time, or whether their reported performance benefits from hindsight about anomalies that were only published later. Their headline finding is sobering: on a universe of 18,113 fundamental signals, a real-time boosted regression tree earns an equal-weighted 10−1 spread of only 0.95%/month (t = 6.63, Sharpe 1.02) and a value-weighted spread of 0.40%/month — substantially weaker than the prior anomaly-ML literature had led readers to expect.

The paper anticipates the obvious objection — “maybe the ML is just bad” — with a battery of robustness samples. Only one cell of that structure can be faithfully targeted from public inputs, and even it runs into a hard data seam. The annual cadence is essential and easy to get wrong: LRYZ predict annual July(t)-to-June(t+1) excess returns, refit annually, hold for twelve months, and rebalance once a year. Every design choice in this audit assumes that annual cadence.

ExhibitContentPublic?
Tables 1–2Central claim: BRT deciles over 18,113 fundamental signals; EW 10−1 = 0.95%/mo, VW = 0.40%/moNo — needs Compustat / Yan–Zheng
Table 3Large- vs small-cap subsamples on the 18k universeNo
Table 4Neural nets NN1–NN5; shallow beats deepShape check only
Table 6Green–Hand–Zhang 94-anomaly samplePartially
Table 7Chen–Zimmermann 207-anomaly sample (OSAP Mar 2022): BRT EW 10−1 = 5.18%/mo, Sharpe 3.68; VW = 2.32%/moTarget of this audit
Table 9Short-term-reversal–excluded CZ robustnessSecondary target
Table 11Chen–Velikov net-of-cost returns on the 18k universeOverlay (CZ scope)
Table 1. Map of the target paper and the cell this audit replicates. Tables 1–2 carry the paper’s central full-universe claim and are not publicly reproducible. Table 7 — the Chen–Zimmermann 207-anomaly robustness check — is the target of this audit; Table 9 (reversal-excluded) is a secondary target.

Scope and the two-track design

Replicating Table 7 demonstrates that an OSAP-plus-boosting-plus-public-price pipeline can reproduce prior-literature-magnitude alphas on published anomalies. It does not test the paper’s central claim, because the 18k universe cannot be built from public data. Every empirical number in this report carries Table 7 / CZ-sample scope and must never be read as a full-universe result.

In the course of the work the project split into two tracks, both engineered behind a single interface and schema layer. Track A — the OSAP headline (paper-faithful) targets Table 7 directly with the OSAP March 2022 207-signal library, a CRSP-substitute price panel, and the paper’s exact protocol. It is fully engineered and tested, but its production headline run is blocked at the identifier seam. Track B — the commercial-clean public track (ticker-native) removes all WRDS/CRSP/Compustat dependencies by using the SEC company-ticker universe with the central index key (CIK) as the entity id, SEC EDGAR XBRL fundamentals (point-in-time by filing date), and a licensed price feed. It recomputes a focused 17-signal anomaly subset, runs end to end on real data, and is the source of every live result below.

The split is itself a governance finding: the identifier and licensing constraints on the canonical academic data are as binding as the statistical questions, and a deployable pipeline has to be designed around them from the start. The seam that blocks Track A — an identifier with no public route to a ticker — is the very thing Track B dissolves by choosing a public, ticker-mappable universe.

Methodology

The pipeline is a sequence of validated stages, each recording its row counts, source vintages, runtime, and warnings into a run manifest. Four stages are empirically load-bearing.

Prediction target. Signals for formation year t are paired with the compounded July-to-June forward annual excess return (Equation 1), following the Fama–French publication-availability convention, so signals dated t never see returns that postdate their formation.

Rank transform. Each raw signal is mapped, within each cross-section, to a rank scaled to [−1, +1] (Equation 2), with missing values imputed to 0 — the cross-sectional median by construction, the GKX and paper convention. Because only the ordering survives, a level-vs-log choice for any single predictor is immaterial — a fact the audit exploits when proxying the identifier-gated signals and verifies directly with a missing-value ablation.

The real-time expanding-recursive protocol is the centerpiece (Equation 3). Training expands recursively while a fixed-length validation span rolls forward, so no window ever touches data on or after its test year. The paper uses L = V = 12; Track B uses a shortened L = 6, V = 4 forced by the post-2009 XBRL panel. The implementation enforces y0 ≤ train_end < val_start ≤ val_end < τ as a hard invariant and runs two leak guards on every fit — one forbids any feature column from equalling the target to numerical tolerance, the other forbids access to any year at or beyond the test year. A dedicated leak test is part of the suite.

Models and evaluation. The headline model is a boosted regression tree (LightGBM) selected over the paper’s exact 15-point grid (Equation 4); two comparison models share the same harness — a linear elastic-net-style baseline and a single two-layer [32, 16] NN2 shape check. Within each test year, stocks are sorted into deciles on the prediction; the strategy is long decile 10, short decile 1, held twelve months, in equal- and value-weighted form. Reported statistics use Newey–West HAC standard errors (6 lags), and risk-adjusted alphas come from time-series regressions under six factor models: CAPM, FF3, Carhart, FF5, FF5+MOM, and the Hou–Xue–Zhang Q-factor model.

rexci,t =m=Jul(t)Jun(t+1) ( 1 + ri,m ) m=Jul(t)Jun(t+1) ( 1 + rfm )
(1)
si,t = 2 · ρi,t 1Nt 1 1 [−1, +1] ,   missing 0
(2)
[ y0 , τV1 ]train [ τV , τ1 ]val { τ }test ,   τ y0 + L + V
(3)
grid = n_estimators {100, 250, 500, 750, 1000} × learning_rate {0.01, 0.05, 0.10}
(4)
SeriesSource / vintageRole & caveat
Anomaly signals (A)OSAP, March 2022 release (Chen–Zimmermann; 207)Paper-exact pin; keyed by a CRSP identifier only
Universe (B)SEC company-ticker list; entity id = CIKPublic, commercial-clean; SEC publishes the CIK↔ticker map
Fundamentals (B)SEC EDGAR XBRL, point-in-time by filing datePublic domain; the XBRL mandate begins the panel ~2009
Prices / market capyfinance (A, CRSP substitute); Tiingo EOD (B)Survivorship + no delisting returns is the central risk
FF3, FF5, MOM, RFKen French data libraryStandard; Sharpe denominator uses the French RF rate
Q-factorHou–Xue–ZhangQ-factor alpha row; panel ends Dec 2024
Trading costsChen–Velikov (2022) LF effective spreadsEnds 2017; Track B uses a fixed-bp grid instead
Table 2. Data sources, by track (vintages pinned in the run manifest). Track A uses yfinance as a deliberately weak CRSP substitute with no delisting returns; Track B uses a licensed feed because a commercial showcase cannot rest on non-commercial academic data. The pipeline is identical across price vendors — a new vendor is a single loader, not a pipeline change.

Track A: the identifier seam

Track A implements every methodology stage against the paper-pinned inputs and passes its unit, integration, and leak tests. The OSAP March 2022 release downloads in full, and the boosting library fits cleanly. The blocker is neither of those — it is a single identifier seam.

OSAP distributes every signal as a panel keyed only by a CRSP security identifier and a year-month, with no shipped ticker or CUSIP. Forming portfolios requires a price and market-capitalization series for each identifier, but public price feeds are keyed by ticker, and no public, commercial-clean table bridges the CRSP identifier to a tradeable ticker. The canonical crosswalk is the CRSP security-name file behind WRDS, which is both access-gated and non-commercial; gray community crosswalks are licensing-ambiguous and survivorship-biased on exactly the delisted names that matter. The 207-signal panel therefore cannot be priced without CRSP/WRDS, and no OSAP Table 7 alpha is claimed in this report. Reporting a number from a partial or mis-linked panel would be a governance failure; locating and naming the seam is the finding.

Even blocked, Track A yields a production compute profile, measured on dimension-matched synthetic data at full production scale. Boosting cost scales with rows × features × trees, all of which match production, so the timing is representative even though the feature values are synthetic — the moment an identifier bridge lands, the headline run is a roughly half-hour job, not a re-engineering effort.

QuantityValue
Grid points per window15
Forecast windows (full sweep)11
First-window wall-clock117.6 s
Full expanding-sweep wall-clock (est.)1,556.8 s (≈25.9 min)
Panel rows / signals / stocks-per-year140,000 / 207 / 4,000
Peak resident memory428.2 MB
Modal selected hyperparameterslr = 0.01, trees ∈ {750, 1000}
Table 3. Track A production compute profile (dimension-matched synthetic data). Measured at production-scale dimensions: 207 signals × 4,000 stocks/year under the 12+12 protocol. Selected hyperparameters cluster at a 0.01 learning rate with 750–1,000 trees.

Track B: the realized panel and headline result

SEC XBRL begins at the ~2009 mandate, so the fundamentals-bearing panel spans 2009–2024: 394 names, 4,623 firm-years (~289 names/year), 17 ranked signals, with overall signal coverage of 84.6%. Three consequences of this short, large-cap panel drive every downstream caveat. The protocol must be shortened to 6+4, making 2019 the first forecast year and giving six windows (2019–2024) and 72 holding months (July 2019–June 2025). No in-sample-versus-post-publication decay comparison is possible, because every Track B holding month is already post-publication — a per-forecast-year view stands in for it. And the universe is a free-tier large-cap set of the ~470 largest SEC filers, so value-weighting should, and does, dampen the spread sharply.

The boosted-tree 10−1 portfolio earns an equal-weighted 16.6%/year (1.387%/month) at an annualized Sharpe of 1.25 with a Newey–West t of 3.30; the value-weighted spread is 11.5%/year at Sharpe 0.43 (t = 1.20) — statistically indistinguishable from zero. The equal-over-value gap is exactly the smaller-cap concentration of anomaly returns operating on a large-cap universe, and the VW drawdown (−33% versus EW’s −14%) reflects the handful of mega-caps that dominate the value-weighted legs. The spread is real but top-heavy: it is driven mainly by decile 10 against a relatively flat middle, rather than by a clean monotone staircase — useful texture for anyone tempted to read a single Sharpe number as a uniform signal.

Metric (10−1)Equal-weightedValue-weighted
Annualized Sharpe1.2530.433
Mean return, %/month1.3870.955
Mean return, %/year16.6511.46
Annualized volatility, %13.2926.47
Newey–West t-stat (6 lags)3.301.20
Maximum drawdown, %−14.3−32.8
Round-trip turnover, %/yr134134
Net Sharpe @ 50 bp/side1.2160.414
Months7272
Table 4. Track B headline: BRT 10−1 long–short, Jul 2019–Jun 2025. 72 months, 6 forecast windows, 6+4 protocol. Turnover and net-of-cost from the fixed-bp overlay. The equal-weighted leg is significant and survives costs; the value-weighted leg is indistinguishable from zero.

Risk-adjusted alphas

The equal-weighted spread is not a factor exposure in disguise. Across all six factor models the EW 10−1 alpha is 1.2–1.5%/month with Newey–West t-statistics between 2.9 and 4.6; the Carhart and FF5+MOM alphas confirm that momentum does not absorb it, and the Q-factor alpha (1.48%/mo, t = 3.5) survives the investment and profitability factors. The value-weighted alphas, by contrast, are economically smaller and statistically insignificant (t ≤ 1.9 in every model) — the same equal-over-value story the raw spread tells, now visible through a risk-model lens.

Equal-weighted 10−1 alpha across six factor models 0 0.5 1 1.5 2 CAPM +1.16 FF3 +1.40 Carhart (FF3+MOM) +1.28 FF5 +1.47 FF5 + MOM +1.34 Q-factor (HXZ) +1.48 EW 10−1 alpha (% per month) with ~95% NW(6) CI
Figure 2. Equal-weighted 10−1 alpha across six factor models. Point estimate with an approximate 95% interval implied by the Newey–West(6) t-statistic (CI ≈ alpha ± 1.96·alpha/t). Every model puts the EW alpha well above zero; FF5 is the strongest at 1.47%/mo (t = 4.61). The Q-factor row uses 66 months because that series ends Dec 2024.
Factor modelEW α (%/mo)EW (t)VW α (%/mo)VW (t)
CAPM1.16(2.85)0.48(0.65)
FF31.40(4.22)0.85(1.72)
Carhart1.28(4.08)0.62(1.34)
FF51.47(4.61)0.89(1.76)
FF5+MOM1.34(4.49)0.58(1.23)
Q-factor1.48(3.47)1.21(1.90)
Table 5. Six-factor alphas of the BRT 10−1 spread, Jul 2019–Jun 2025. Alphas in %/month; Newey–West(6) t-statistics in parentheses. The equal-weighted alpha is significant in all six models; the value-weighted alpha is insignificant in all six.

Robustness ablations

The headline survives — or fails in interpretable ways — across the ablations the panel permits, and four findings stand out. The spread is not a short-term-reversal artifact: dropping the one-month reversal signal leaves the EW Sharpe essentially unchanged (1.265 versus 1.253) and actually raises the VW Sharpe, echoing the paper’s similarly modest CZ reversal-excluded result. Size concentration is the dominant lever: removing the smallest within-panel size decile cuts the EW Sharpe by more than half to 0.54, and value-weighting cuts it to 0.43 — both point at the premium living in the smaller names. Complexity is not rewarded: a two-layer NN2 underperforms the boosted tree badly (0.54 versus 1.25) while a plain linear model slightly beats it (1.30), because on a 17-signal, ~289-name annual panel there is little non-linear structure to exploit. And imputation is load-bearing: letting the booster handle missing values natively reproduces the headline (1.225), but dropping every row with any missing signal is degenerate — only 7.6% of firm-years are fully observed, so the panel thins and the Sharpe falls to 0.84, which is itself the finding that the accounting signals are sparse early and zero-imputation is doing real work. The long-window ablations remain skipped — reported as skipped rather than silently omitted — because the post-2009 panel cannot form windows needing 22–30 years of history.

AblationModelSharpe EWSharpe VWΔ EWPaper ref.
headlineBRT1.2530.433+0.000Table 7
grid_narrowBRT1.1700.547-0.083§2.3 fn.9
grid_wideBRT1.3360.557+0.083§2.3 fn.9
exclude_strevBRT1.2650.760+0.012Table 9
missing_nativeBRT1.2250.791-0.028§2.3 fn.12
missing_drop_row †BRT0.8400.729-0.413§2.3 fn.12
model_linearlinear1.3010.840+0.048Table 4 analog
model_nn2NN20.5370.428-0.716Table 4 analog
exclude_microcap ‡BRT0.5400.538-0.713Table 3 analog
window_10_12 … 18_12BRTskippedskippedTable IA.2
Table 6. Track B ablation matrix. Δ is the EW-Sharpe change versus the headline. † Degenerate: only 7.6% of firm-years are fully observed, so the panel thins to 5 windows. ‡ Drops the smallest within-panel decile; the large-cap universe contains no true NYSE microcaps. Window ablations are skipped — the panel lacks the history they require.
Equal-weighted Sharpe across the completed ablations 0.00 0.25 0.50 0.75 1.00 1.25 1.50 headlinegridnarrowgridwideexcl.strevmiss.nativedroprowlinearNN2excl.microcap Equal-weighted Sharpe (10−1) Ablation EW Sharpe
Figure 3. Equal-weighted Sharpe across the completed ablations. Headline EW Sharpe is 1.253 (dotted reference in the report). Grid and signal tweaks leave the headline in a tight band; the NN2, the microcap exclusion, and the drop-row policy are where the spread genuinely compresses — all pointing at the same size mechanism or at unrewarded model complexity.

What the model actually uses

A governance audit should be able to say which signals a model leans on, not just how it scores. BRT gain importance averaged over the six forecast windows is coherent with the ablations: size and price characteristics dominate. The size proxy alone is 15.5% of total gain, and together the two size measures plus the price level account for roughly 28%; volatility, reversal, value, and momentum signals form a broad middle band; and the sparsely-populated accounting fundamentals sit at the bottom. This is exactly why removing the smallest size decile guts the spread — the model’s single most important axis is size, and the premium it captures lives in the smaller names. It also flags a redundancy: the panel carries both a market-equity size proxy and an accounting size signal, which a production build would collapse to one.

The 17-signal set is itself worth naming. The price- and volume-based signals are six- and twelve-month momentum, twelve-month cumulative return, one-month reversal, long-term (months 13–60) reversal, the twelve-month maximum daily return, and twelve- and thirty-six-month volatility. The accounting signals from SEC XBRL are gross and operating profitability, accruals, asset growth, net issuance, book-to-market, and size. Two market-linked proxies — the price level and a market-equity size proxy — complete the set.

BucketSignalsApprox. share of BRT gain
Size & pricemarket-equity size proxy, accounting size, price level~28% (size proxy alone 15.5%)
Middle bandvolatility, reversal, value, momentumbroad middle
Bottomgross & operating profitabilitylowest (sparse early panel)
Table 7. BRT gain importance by signal bucket (averaged over six windows). Gain-importance share over the 17 signals. Size is the single most-used axis, consistent with the microcap-exclusion and value-weighting ablations.

Per-forecast-year behaviour

With no in-sample leg to decay from, the honest substitute is to ask whether the composite has weakened across the six post-publication forecast years. It has not: the equal-weighted 10−1 spread is positive in every year from 2019 to 2024 (+25%, +15%, +3%, +21%, +9%, +27%), with no monotone fade. The value-weighted leg is far choppier — two negative years (2021 and 2023) — which is the year-by-year shadow of its weak full-sample Sharpe. The equal-weighted composite is durable over this window; it is simply small-cap-tilted.

Per-forecast-year equal-weighted 10−1 spread 0 5 10 15 20 25 30 201920202021202220232024 EW 10−1 spread (% per year) Formation year EW 10−1 spread
Figure 4. Per-forecast-year equal-weighted 10−1 spread. Annualized EW long–short spread by formation year. Positive in all six post-publication years with no decay trend; the value-weighted leg (not shown) has two negative years, 2021 and 2023, consistent with its insignificant full-sample t-stat.

Trading costs

Because the holding window (2019–2025) lies entirely past the Chen–Velikov 2017 cutoff, the paper-faithful low-frequency-spread overlay cannot be applied to Track B, and a fixed-bp sensitivity is reported instead. Measured annual one-way turnover averages ~67% per leg (~134% round-trip), so even at an aggressive 50 bp/side the equal-weighted net Sharpe is 1.216 (gross 1.253) and the net return is 16.1%/yr (gross 16.6%) — a trivial drag, because the strategy rebalances once a year. Costs are not what separates this composite from the paper’s; the universe, breadth, and weighting are.

Why the magnitudes differ from the paper

The paper’s CZ-sample BRT posts an EW Sharpe of 3.68; Track B posts 1.25. This gap is expected and attributable to design differences, not a contradiction of the paper. The runnable levers are large and all point the same way: value-weighting (−0.82 Sharpe) and removing the smallest names (−0.71) each roughly halve the spread, confirming that the bulk of the magnitude difference is a size-and-weighting story, not an ML story. The residual to 3.68 is carried by the levers that cannot be reproduced from public data — the OSAP 207-signal breadth versus the 17 here, the full CRSP cross-section versus ~470 large caps, the 12+12 window versus 6+4, and the 1987–2019 sample versus a six-year post-publication window.

The disciplined reading is that a fully public, commercial-clean anomaly-ML pipeline produces an economically meaningful, statistically significant equal-weighted spread out of sample, while value-weighting it on a large-cap universe removes most of the premium — directionally consistent with both the anomaly literature and the target paper’s caution about real-time implementability.

LeverMechanismΔ Sharpe
Headline BRT EW17 signals, ~289 names, 6+4, all-cap, EW(1.253)
Drop short-term reversalpremium is not reversal+0.01
Linear instead of BRTlittle non-linearity to exploit+0.05
NN2 instead of BRTcomplexity unrewarded on a thin panel−0.72
Exclude smallest decilepremium concentrates in smaller names−0.71
Value-weight (large-cap)mega-caps dominate; small-cap premium muted−0.82
Signal breadth (structural)17 recomputed vs the curated CZ 207↓↓
Universe (structural)~470 large caps vs full CRSP cross-section↓↓
Protocol & sample (structural)6+4, 2019–24 vs 12+12, 1987–2019
Data quality (structural)yfinance/Tiingo vs CRSP (no delisting returns)ambiguous
Table 8. Sources of the Track B-versus-paper magnitude gap. Runnable counterfactuals carry a measured EW-Sharpe change versus the headline; structural levers cannot be reproduced from public data and are shown by direction only (↓↓ large, ↓ moderate).

Reproducibility and governance controls

The audit is engineered so that any number traces to a configuration, a code path, and a data vintage. Thirteen frozen project decisions — scope tier, window, protocol, OSAP pin, grid, factor roster, cost model, imputation, filters, seeds, and acceptance bands — together with two labelled deviations are recorded in a decision log and mirrored into versioned configuration, so changing one requires an explicit log update. Every live number is rebuilt from the committed processed panel and a single date-stamped seed by the project’s own modules, and the reconstructed equal- and value-weighted Sharpes (1.253 / 0.433) match the committed metrics to four decimals.

A fail-closed production-validation gate refuses to pass on smoke or fixture paths, missing artifacts, placeholder report text, bad snapshot hashes, or a forbidden full-universe scope tag. Its required-artifact list is wired to the blocked Track A OSAP headline, so it gates the paper-faithful deliverable rather than this Track B note, whose governance evidence is the manifest, the deterministic reconstruction, and the test suite. The two deviations are recorded with rationale and auto-superseding behaviour, never as silent substitutions: D1 proxies the three identifier-gated OSAP signals from public prices (adequate because the rank-only transform makes level proxies sufficient), and D2 adopts the commercial-clean ticker-native SEC CIK track because CRSP/Compustat are non-commercial and academic.

Limitations and non-goals

Several limitations bound these claims, and naming them is part of the deliverable.

  • Nothing here speaks to the paper’s central full-universe claim, which requires the Compustat and Yan–Zheng construction; the scope is Table 7 only.
  • No OSAP Table 7 number is reported, because Track A is blocked at the identifier-to-ticker bridge; only its compute profile is.
  • No decay measurement is possible on Track B, whose XBRL-era panel forecasts 2019–2024, all post-publication — hence the per-forecast-year substitute.
  • The microcap ablation is within-panel: the large-cap universe has no true NYSE microcaps, so it is suggestive rather than a clean Avramov-style test.
  • The neural-net result is a single two-layer shape check, not the paper’s NN1–NN5; it underperforms here, but that is a one-architecture result, not a verdict on neural networks.
  • Public price feeds are weak CRSP substitutes with no delisting returns and survivorship in the constituent list; earnings-day sensitivity is marked missing rather than faked.

Recommendations and conclusion

The framework is a reusable template, and a second replication every six months compounds reputational credit far faster than one-off pieces. The gap between what the pipeline can prove and what the public data will allow is precisely the kind of finding a governance function exists to surface.

Lessons for organizations running similar pipelines

Audit identifiers before models. The one thing that blocked the paper-faithful track was not compute or signal licensing but that OSAP ships a CRSP identifier with no public ticker bridge — map a security master to a tradeable, commercially-clean identifier before choosing a data vendor. Make the real-time protocol a tested invariant, because look-ahead leakage is the single failure that invalidates an entire backtest — encode window boundaries and leak guards as assertions with their own tests. Report “skipped” and “degenerate” loudly: window ablations the data cannot support, and a drop-row policy that thins the panel to 7.6%, are first-class results. Look at what a model uses, not just its Sharpe — gain importance (size dominates) predicted the microcap-exclusion collapse before it was run. Prefer the simplest model that clears the bar: a linear model matched the boosted tree and a neural net underperformed both, so complexity should be earned by out-of-sample lift, not assumed.

Related research