Auto-Research PipelineA durable, human-gated pipeline for computational research
Research run7af2280f389b· 8 September 2026

Do volatility-managed factor portfolios survive real-time implementation and a horse race against time-series factor momentum? A century of US market, size and value factors

CompleteArchived runFinance · Modelled on Journal of Finance

Paper

Volatility Timing or Factor Momentum? A Real-Time Horse Race on a Century of U.S. Factor Returns

Abstract

Volatility management and time-series factor momentum both time a factor using nothing but its own past returns. We race them on the Fama–French market, size and value factors, 1,189 months from July 1927 to July 2026. Volatility management earns a spanning alpha only for the market, 3.35% per year (t = 2.34); adding a momentum-managed leg cuts it to 2.04% (t = 1.52). The mirror specification is not symmetric — momentum-managed alphas of 5.56%, 2.59% and 3.37% per year survive — but those alphas come with lower Sharpe ratios, so neither leg is a better portfolio. Real-time volatility-managed Sharpe ratios fall for every factor, and the market effect is entirely pre-1963.

§Ask about this paper

Grounded in this run

Questions are answered from this run's record — the paper, the executed analysis, the data provenance and the referee report. Nothing else is consulted.

This run is finished, so the recorded paper cannot be rewritten. Questions are still answered from its record.

Pipeline

1.Literature review

Attempt 3Done

Literature review complete (live:agent:claude-opus-5): 10 key papers, 21 grounded sources, 5 open gaps.

Summary

Two strands of the factor-timing literature claim that a factor portfolio can be improved using nothing but the factor's own past returns, and they have never been made to compete directly. The volatility-management strand begins with Moreira and Muir (2017), who scale each factor by the inverse of its lagged realised variance and report large spanning-regression alphas for the market, value, momentum, profitability, investment and betting-against-beta factors, plus Sharpe-ratio and utility gains. The economics is that conditional variance moves far more than the conditional risk premium, inverting the classic positive intertemporal trade-off of French, Schwert and Stambaugh (1987); Moreira and Muir (2019) price the resulting welfare loss from ignoring volatility at about 2.4% of wealth per year, and Barroso and Santa-Clara (2015) show the same device tames momentum crashes. The factor-momentum strand — Gupta and Kelly (2019), Ehsani and Linnainmaa (2022), Arnott, Kalesnik and Linnainmaa (2023) — documents that most factors are positively autocorrelated, so that a factor's trailing twelve-month return is itself a timing signal; Haddad, Kozak and Santosh (2020) show more generally that dominant equity factors are predictable.

The critical literature has concentrated on the first strand. Cederburg, O'Doherty, Wang and Yan (2020) show across 103 strategies that managed portfolios earn positive spanning alphas yet do not beat their unmanaged counterparts in direct comparison, because the scaling constant and the spanning loading are full-sample objects; real-time versions deliver lower certainty equivalents and Sharpe ratios, which they attribute to structural instability. Liu, Tang and Zhou (2019) make the same look-ahead point for the market and add severe drawdowns. Barroso and Detzel (2021) tie the managed premium to investor sentiment rather than frictions, and DeMiguel, Martin-Utrera and Uppal (2024) find that conditional multifactor portfolios do survive out of sample while factor risk prices fall with volatility, deepening the puzzle.

Method conventions are settled: spanning regressions with Newey-West (1987) standard errors and appraisal ratios; direct Sharpe comparisons with Ledoit-Wolf (2008) bootstrap inference; strict expanding-window real-time implementation in the spirit of Goyal and Welch (2008); and subsample splits around 1963. What is missing is a like-for-like contest. Both signals are functions of the same past returns — one of their squared magnitude, one of their level — so if either subsumes the other, one literature is partly redundant. Grobys, Kolari and Rutanen (2022) combine them but as complements, on option-implied volatility and a short sample, not as a horse race under real-time discipline.

Key papers (10)

  1. Volatility-Managed Portfolios. Alan Moreira and Tyler Muir, Journal of Finance 72(4), 1611-1644, 2017.
    The origin of the inverse-variance scaling rule this study tests; supplies the spanning-regression design and the claim of large alphas and Sharpe gains for market, size-adjacent and value-type factors.
  2. On the performance of volatility-managed portfolios. Scott Cederburg, Michael S. O'Doherty, Feifei Wang and Xuemin Sterling Yan, Journal of Financial Economics 138(1), 95-117, 2020.
    The central critique: positive spanning alphas coexist with no real-time outperformance across 103 strategies, because the scaling constant and loading are full-sample quantities. Defines the real-time standard this study adopts.
  3. Volatility-Managed Portfolio: Does It Really Work?. Fang Liu, Xiaoxiao Tang and Guofu Zhou, Journal of Portfolio Management 46(1), 38-51, 2019.
    Documents the look-ahead bias in the standard implementation for the market factor and the extreme drawdowns that follow once it is removed; motivates the expanding-window design.
  4. Factor Momentum and the Momentum Factor. Sina Ehsani and Juhani T. Linnainmaa, Journal of Finance 77(3), 1877-1919, 2022.
    Establishes that most factors are positively autocorrelated so that trailing own-factor returns time factors; supplies the competing signal in the horse race.
  5. Factor Momentum Everywhere. Tarun Gupta and Bryan Kelly, Journal of Portfolio Management 45(3), 13-36, 2019.
    The canonical time-series factor-momentum result: individual factors can be timed on their own recent performance, giving the exact signal construction used here.
  6. A Multifactor Perspective on Volatility-Managed Portfolios. Victor DeMiguel, Alberto Martin-Utrera and Raman Uppal, Journal of Finance 79(6), 2024.
    Most recent Journal of Finance treatment; finds conditional multifactor portfolios do survive out of sample and net of costs while factor risk prices fall with volatility, so the single-factor real-time verdict is still contested.
  7. Momentum has its moments. Pedro Barroso and Pedro Santa-Clara, Journal of Financial Economics 116(1), 111-120, 2015.
    Prior demonstration that scaling a factor by its lagged realised variance roughly doubles its Sharpe ratio, establishing volatility scaling as a general factor-level device rather than a market-only one.
  8. Factor Timing. Valentin Haddad, Serhiy Kozak and Shrihari Santosh, Review of Financial Studies 33(5), 1980-2018, 2020.
    Frames factor timing as equivalent to recovering the stochastic discount factor and shows dominant equity factors are robustly predictable, setting the stakes for whether simple own-factor signals work.
  9. A Comprehensive Look at the Empirical Performance of Equity Premium Prediction. Amit Goyal and Ivo Welch, Review of Financial Studies 21(4), 1455-1508, 2008.
    The methodological ancestor of the in-sample versus out-of-sample distinction, and the source of the out-of-sample evaluation discipline applied to the timing signals here.
  10. Factor momentum, option-implied volatility scaling, and investor sentiment. Klaus Grobys, James W. Kolari and Jere Rutanen, Journal of Asset Management 23(2), 138-155, 2022.
    The only located study that combines volatility scaling with factor momentum, but it treats them as complements using option-implied volatility over a short sample rather than running a real-time horse race.

Methods in use

  • Moreira-Muir spanning regression of the volatility-managed factor on its unmanaged counterpart, with the alpha t-statistic and the appraisal ratio alpha/sigma(residual) as headline statistics.
  • Newey and West (1987) heteroskedasticity- and autocorrelation-consistent standard errors, typically with a lag truncation of three to twelve months for monthly factor returns.
  • Inverse-realised-variance scaling of factor returns, with the scaling constant chosen to equate the unconditional volatility of the managed and unmanaged series.
  • Time-series factor momentum signals built from trailing twelve-month (or one-to-twelve-month) own-factor returns, as in Gupta and Kelly (2019) and Ehsani and Linnainmaa (2022).
  • Direct performance comparison via annualised Sharpe ratios, certainty-equivalent returns for a mean-variance investor, maximum drawdown and skewness.
  • Ledoit and Wolf (2008) studentized circular block bootstrap for the difference of two Sharpe ratios, robust to heavy tails and serial dependence.
  • Strict real-time implementation in which every constant (scaling constant, regression loading, signal standardisation) is estimated on an expanding window ending in the prior month; evaluated with out-of-sample R-squared against the prevailing mean, following Goyal and Welch (2008).
  • Predictive regressions of the factor return on standardised lagged conditioning variables, with a joint horse race that includes both signals and tests each slope separately and jointly.
  • Subsample stability analysis, conventionally splitting US factor data at 1963 because pre-1963 CRSP coverage is thinner.

Open gaps

  • Volatility timing and time-series factor momentum have never been run against each other on the same factors under the same real-time discipline, even though both signals are functions of the factor's own past returns; if one subsumes the other, part of one literature is redundant.
  • Whether a purely monthly-frequency variance proxy - the only variance measure available over the full 1926-onwards factor history - carries the timing information that daily realised variance is credited with, which bounds how much of the effect is a high-frequency measurement phenomenon.
  • The size and value factors specifically have not been given a clean full-century real-time treatment; the critical literature concentrates on the market factor or on large post-1963 cross-sections of anomalies.
  • Decomposing real-time failure into its sources: the full-sample scaling constant, the full-sample spanning loading, or the absence of genuine predictability in the signal itself.
  • Whether the gap between in-sample spanning alphas and real-time performance is stable across the 1926-1963 and post-1963 subsamples, which would distinguish structural instability from a sample-specific artefact.
Grounded search sources (21) · mode: live:agent:claude-opus-5

2.Ideation

Attempt 2Done

3 candidate ideas generated; selected: “Volatility Timing or Factor Momentum? A Real-Time Horse Race on a Century of US Market, Size and Value Factors”.

  1. Idea 1Selected

    Volatility Timing or Factor Momentum? A Real-Time Horse Race on a Century of US Market, Size and Value Factors

    Hypothesis. Volatility timing is an economically distinct and real-time-implementable source of factor-timing gains. Concretely, for the Fama-French market, size and value factors: (a) in a spanning regression that already contains the unmanaged factor AND a time-series factor-momentum-managed version of the same factor, the volatility-managed factor still earns a positive alpha with a Newey-West t-statistic above 1.96 for at least two of the three factors; and (b) under strictly real-time expanding-window implementation the volatility-managed portfolio's annualised Sharpe ratio exceeds the unmanaged factor's for at least two of the three factors. The hypothesis is refuted if either condition fails - in particular if the volatility-managed alpha is absorbed by the momentum-managed factor, or if real-time Sharpe ratios fall.

    Dataset. Fama-French three factors, monthly ff_factors_monthly

    Test plan, novelty and risk

    Test plan. Data: ff_factors_monthly, columns Date, Mkt-RF, SMB, HML, RF, monthly percent returns divided by 100. Sample filter: all months with a complete 12-month lagged history of the factor, i.e. observations from the 13th month of the file onward; the sample size actually analysed is reported. Signals, both known at the end of month t-1: (i) RV_{t-1}, the mean squared monthly factor return over months t-12 to t-1; (ii) MOM_{t-1}, the sum of the factor's returns over months t-12 to t-1. Portfolios: the volatility-managed factor f^v_t = (c_v / RV_{t-1}) * f_t and the momentum-managed factor f^m_t = c_m * sign(MOM_{t-1}) * f_t, with c_v and c_m set so each managed series has the same unconditional standard deviation as the unmanaged factor. Estimation: (1) the Moreira-Muir benchmark spanning regression f^v_t = a + b f_t + e_t with Newey-West standard errors (6 lags), reporting annualised alpha, t-statistic, beta, R-squared and the appraisal ratio; (2) the horse-race spanning regression f^v_t = a + b1 f_t + b2 f^m_t + e_t and the mirror-image regression f^m_t = a + b1 f_t + b2 f^v_t + e_t, both Newey-West(6); (3) predictive regressions of f_t on the standardised inverse-variance signal, on standardised MOM_{t-1}, and on both jointly, Newey-West(6), to see whether either signal forecasts the conditional mean; (4) a strictly real-time version in which c_v and c_m are re-estimated each month on an expanding window ending at t-1 after a 120-month burn-in, giving out-of-sample managed returns, with annualised Sharpe ratios, the Sharpe difference, a Ledoit-Wolf studentized circular block bootstrap p-value for that difference, certainty-equivalent returns for a mean-variance investor with risk aversion 5, maximum drawdown and realised leverage; (5) subsample split at July 1963 and sensitivity of the in-sample alpha to variance windows of 3, 6, 12 and 24 months. Refutation: the hypothesis fails if the horse-race alpha on the volatility-managed factor is insignificant for two or more factors, or if the real-time Sharpe difference is negative for two or more factors.

    Novelty. Moreira-Muir (2017) and the factor-momentum papers (Gupta-Kelly 2019, Ehsani-Linnainmaa 2022) each build a timing signal out of the factor's own past returns - one from their squared magnitude, one from their level - but no located study runs the two against each other on the same factors with the same real-time discipline. Grobys, Kolari and Rutanen (2022) combine them as complements using option-implied volatility on a short sample, not as a horse race. Cederburg et al. (2020) impose real-time discipline on volatility management but do not confront it with factor momentum. Doing both at once on a full century of data also settles the untested question of whether a purely monthly-frequency variance proxy - the only variance measure an investor had for most of this sample - carries the timing information credited to daily realised variance.

    Expected outcome. The volatility-managed market factor should show a modest in-sample alpha of a few percent a year, weaker than the daily-realised-variance version in Moreira-Muir, and essentially nothing for size and value. The horse race is genuinely open: if the two signals are proxies for the same conditional information the volatility alpha will be absorbed, and given the Cederburg et al. evidence the real-time Sharpe differences are likely to be small or negative. A refutation of the hypothesis is a fully informative outcome and would say that the volatility-managed premium in monthly data is neither distinct from factor momentum nor available to a real-time investor.

    Main risk. The variance proxy is built from twelve trailing monthly returns rather than within-month daily returns, so it is a coarser and more sluggish measure than the one Moreira-Muir use; a null result could reflect the proxy rather than the phenomenon. This is mitigated by reporting the window-length sensitivity (3, 6, 12, 24 months) and by checking that the market-factor alpha at the baseline window is of the same order as the published estimate. A second risk is extreme leverage when the trailing variance is small, which is addressed by reporting the realised weight distribution and a capped-leverage variant.

  2. Idea 2

    Where Does Volatility Timing Pay? Volatility-Managed Returns Across the 25 Size and Book-to-Market Portfolios

    Hypothesis. The gains from inverse-variance scaling are concentrated in the high-volatility corners of the size and book-to-market grid: volatility-managed alphas from spanning regressions rise monotonically as one moves from large-cap to small-cap portfolios, so that the average managed alpha in the smallest size quintile exceeds that in the largest by a statistically significant margin. Refuted if the cross-sectional pattern of managed alphas is flat or reversed in the size dimension.

    Dataset. Fama-French 25 portfolios formed on size and book-to-market, monthly value-weighted returns ff_25_portfolios_5x5

    Test plan, novelty and risk

    Test plan. Data: ff_25_portfolios_5x5 (total monthly percent returns on the 25 size-by-book-to-market portfolios) merged on Date with the risk-free rate from the same library to form excess returns. Sample: all months with a full 12-month lagged history for each portfolio. For each of the 25 portfolios build RV_{t-1} as the mean squared excess return over the prior 12 months, form the managed series (c/RV_{t-1}) * r_t with c set to equate unconditional volatilities, and run the spanning regression of managed on unmanaged excess returns with Newey-West(6) standard errors. Report the 5x5 grid of annualised alphas and t-statistics, the average alpha by size quintile and by book-to-market quintile, and a test of the difference between the smallest and largest size quintile averages using the time series of the corresponding equal-weighted alpha-generating residual portfolios. Refutation: a flat or negative small-minus-big difference in managed alphas.

    Novelty. The volatility-management literature reports results factor by factor; the cross-sectional geography of the effect across the canonical 25 test assets has not been mapped, and it discriminates between a risk-based story (gains should track conditional variance) and a mispricing story (gains should track limits to arbitrage, which also load on small caps).

    Expected outcome. Managed alphas that are larger and more often significant among small-cap portfolios, but with wide standard errors that may leave the small-minus-big difference statistically inconclusive.

    Main risk. Twenty-five simultaneous spanning regressions invite multiple-testing problems, and the small-growth corner is known to be an outlier that could drive any monotonic pattern on its own; the design would need the pattern to hold after excluding it.

  3. Idea 3

    Does the Short-Long Rate Spread Forecast Changes in the Short Rate? A Real-Time Reassessment of the Expectations Hypothesis on US Quarterly Data

    Hypothesis. The one-year minus three-month Treasury spread has positive predictive power for the subsequent change in the three-month bill rate, with a slope that is positive and significantly different from zero but significantly below the value of one implied by the pure expectations hypothesis. Refuted if the slope is statistically indistinguishable from zero, or if it is indistinguishable from one.

    Dataset. US macroeconomic and interest-rate series, 1957–2005 (Stock and Watson) us_macro_sw_quarterly

    Test plan, novelty and risk

    Test plan. Data: us_macro_sw_quarterly, columns tbill (3-month), tbond (1-year), ffrate, unemp, cpi, 193 quarters from 1957Q1 to 2005Q1. Construct the spread s_t = tbond_t - tbill_t and the realised change d_{t+1} = tbill_{t+1} - tbill_t; also the four-quarter-ahead change. Estimate d_{t+h} = a + b s_t + e with Newey-West standard errors using the Bartlett lag rule for the overlap horizon, test b = 0 and b = 1 separately, add inflation and unemployment as controls, and split the sample at 1979Q3 to isolate the Volcker regime change. Refutation: b indistinguishable from zero, or from one.

    Novelty. The expectations-hypothesis regression is textbook, so novelty here is limited to the regime split and to imposing an out-of-sample evaluation on a short quarterly sample.

    Expected outcome. A positive but well-below-one slope, with instability across the Volcker break.

    Main risk. Only 193 quarterly observations and only two maturities, so power is low and the finding is likely to restate what is already in the textbook that distributes this dataset.

Ranking rationale

Idea 1 is ranked first because it poses a question that is genuinely open in the Journal of Finance literature - whether volatility timing and factor momentum are the same phenomenon dressed differently - and because a single dataset of 1,201 monthly observations can settle it decisively in either direction with the field's standard estimators, in seconds of computation. It also delivers a verdict that is informative whichever way it falls. Idea 2 is a worthwhile descriptive map but it is a within-literature extension rather than a confrontation between literatures, and running 25 simultaneous spanning regressions makes the inference fragile. Idea 3 is the weakest: the expectations-hypothesis regression is a textbook exercise, the sample has only 193 quarterly observations and two maturities, and the likely answer is already documented in the source from which the dataset is distributed.

3.Experimentation

Attempt 3Done

Experiment succeeded in 1 round (1.44s).

Succeeded1 round · exit 0 · 1.44s

Data provenance

Datasetff_factors_monthly

Fama-French three factors, monthly

Source
Kenneth R. French Data Library, Tuck School of Business, Dartmouth College
Citation
Fama, E.F. and French, K.R. (1993) Common risk factors in the returns on stocks and bonds. Journal of Financial Economics 33(1), 3-56. Data: Kenneth R. French Data Library, Tuck School of Business, Dartmouth College.
Licence
Copyright Eugene F. Fama and Kenneth R. French. No formal licence is posted; the library is distributed for research use and is universally cited in the academic literature. Attribution to the Data Library is required.
File
https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/ftp/F-F_Research_Data_Factors_CSV.zip
Observations
1,201
Variables (5)
Date, Mkt-RF, SMB, HML, RF
Units
Mkt-RF, SMB and HML are excess/long-short returns in percent per month (divide by 100 for decimals). RF is the one-month Treasury bill rate, also percent per month. Date is the first day of the month.
Retrieved
8 Sept 2026, 15:45
Checksum
sha256 b840dba55d319f48…

Real, publicly available data — downloaded and checksum-verified before the analysis ran, never simulated.

Result (RESULT_JSON)

{
  "data": {
    "rows_in_file": 1201,
    "file_start": "1926-07-01",
    "file_end": "2026-07-01",
    "missing_values": 0,
    "variance_window_months": 12,
    "hac_lags": 6,
    "burn_in_months": 120,
    "risk_aversion": 5,
    "bootstrap_reps": 999,
    "bootstrap_block_months": 6
  },
  "descriptives": {
    "Mkt-RF": {
      "n": 1189,
      "start": "1927-07-01",
      "end": "2026-07-01",
      "mean_ann_pct": 8.255576114381833,
      "sd_ann_pct": 18.44345589631064,
      "sharpe_ann": 0.4476154664719451,
      "skewness": 0.1565169614606462,
      "corr_signal_vol_mom": 0.11235413270589796
    },
    "SMB": {
      "n": 1189,
      "start": "1927-07-01",
      "end": "2026-07-01",
      "mean_ann_pct": 2.0668460891505465,
      "sd_ann_pct": 10.945681150557316,
      "sharpe_ann": 0.18882754400764817,
      "skewness": 1.7739469780337562,
      "corr_signal_vol_mom": -0.1896993914367931
    },
    "HML": {
      "n": 1189,
      "start": "1927-07-01",
      "end": "2026-07-01",
      "mean_ann_pct": 4.187182506307821,
      "sd_ann_pct": 12.331981639066854,
      "sharpe_ann": 0.33953849663894403,
      "skewness": 2.0485792215798946,
      "corr_signal_vol_mom": -0.1796354154896663
    }
  },
  "mm_benchmark": {
    "Mkt-RF": {
      "n": 1189,
      "r2": 0.4940508241208934,
      "alpha_ann_pct": 3.3493076778586337,
      "alpha_t": 2.3440356503973594,
      "alpha_stars": "**",
      "resid_sd_ann_pct": 13.124374332337228,
      "appraisal_ratio": 0.2551975121287308,
      "b_factor": 0.702887490371605,
      "t_factor": 8.058452329844089,
      "sharpe_ann_managed": 0.4962220153273443,
      "sharpe_ann_unmanaged": 0.4476154664719451,
      "weight_mean": 1.2178659707336823,
      "weight_p95": 3.026315274051037,
      "weight_max": 7.782600471026032,
      "sharpe_ann_mom_managed": 0.4120874955330294,
      "corr_vol_mom_managed": 0.2568810494777717
    },
    "SMB": {
      "n": 1189,
      "r2": 0.4536301453525804,
      "alpha_ann_pct": -0.7891661545027914,
      "alpha_t": -0.9485339147210234,
      "alpha_stars": "",
      "resid_sd_ann_pct": 8.094108441224158,
      "appraisal_ratio": -0.09749883637381034,
      "b_factor": 0.673520708926296,
      "t_factor": 8.35018541814671,
      "sharpe_ann_managed": 0.055080856130431816,
      "sharpe_ann_unmanaged": 0.18882754400764817,
      "weight_mean": 1.159109805129311,
      "weight_p95": 2.912319644654842,
      "weight_max": 13.073005905689236,
      "sharpe_ann_mom_managed": 0.30847760753285464,
      "corr_vol_mom_managed": 0.008493840724673275
    },
    "HML": {
      "n": 1189,
      "r2": 0.3378110808522886,
      "alpha_ann_pct": 0.6666812379505825,
      "alpha_t": 0.6547382749920001,
      "alpha_stars": "",
      "resid_sd_ann_pct": 10.039375188373969,
      "appraisal_ratio": 0.06640664637403215,
      "b_factor": 0.5812151760340467,
      "t_factor": 5.380027046466666,
      "sharpe_ann_managed": 0.2514060875357873,
      "sharpe_ann_unmanaged": 0.33953849663894403,
      "weight_mean": 1.2070536624957025,
      "weight_p95": 2.9349994059381173,
      "weight_max": 8.571696578660793,
      "sharpe_ann_mom_managed": 0.30783420285972973,
      "corr_vol_mom_managed": -0.031781939131736534
    }
  },
  "horse_race_vol": {
    "Mkt-RF": {
      "n": 1189,
      "r2": 0.5307028231754638,
      "alpha_ann_pct": 2.0374548099588408,
      "alpha_t": 1.5206883088980088,
      "alpha_stars": "",
      "resid_sd_ann_pct": 12.645387672603423,
      "appraisal_ratio": 0.161122368306117,
      "b_factor": 0.6847518681438823,
      "t_factor": 8.575540858142066,
      "b_mom_managed": 0.19230418572708471,
      "t_mom_managed": 2.5727731336638917
    },
    "SMB": {
      "n": 1189,
      "r2": 0.4842467982644807,
      "alpha_ann_pct": -0.27544148892622733,
      "alpha_t": -0.33191055669250163,
      "alpha_stars": "",
      "resid_sd_ann_pct": 7.867371081430466,
      "appraisal_ratio": -0.035010613593193546,
      "b_factor": 0.7212656519352745,
      "t_factor": 11.314203179418104,
      "b_mom_managed": -0.18137318571065275,
      "t_mom_managed": -3.044593968595202
    },
    "HML": {
      "n": 1189,
      "r2": 0.34929428501569915,
      "alpha_ann_pct": 1.0188771381960524,
      "alpha_t": 0.9663121907349246,
      "alpha_stars": "",
      "resid_sd_ann_pct": 9.956141395790612,
      "appraisal_ratio": 0.10233654763348644,
      "b_factor": 0.5950639842882032,
      "t_factor": 5.3666233746114935,
      "b_mom_managed": -0.10805088455663373,
      "t_mom_managed": -1.4609343394260372
    }
  },
  "horse_race_mom": {
    "Mkt-RF": {
      "n": 1189,
      "r2": 0.08069157353403233,
      "alpha_ann_pct": 5.5600564597094175,
      "alpha_t": 2.9864383372384147,
      "alpha_stars": "***",
      "resid_sd_ann_pct": 17.69859526364225,
      "appraisal_ratio": 0.31415241587739406,
      "b_factor": -0.1704746743459807,
      "t_factor": -0.7121896059999533,
      "b_vol_managed": 0.37670556550073486,
      "t_vol_managed": 2.358659851725161
    },
    "SMB": {
      "n": 1189,
      "r2": 0.12144945696479048,
      "alpha_ann_pct": 2.588599613618226,
      "alpha_t": 2.5493974410978812,
      "alpha_stars": "**",
      "resid_sd_ann_pct": 10.268146220671197,
      "appraisal_ratio": 0.25209999526565147,
      "b_factor": 0.4713303352683366,
      "t_factor": 2.7657362591384977,
      "b_vol_managed": -0.3089569008237259,
      "t_vol_managed": -2.914385343679339
    },
    "HML": {
      "n": 1189,
      "r2": 0.03348378359416859,
      "alpha_ann_pct": 3.3665342811812384,
      "alpha_t": 2.88974695330679,
      "alpha_stars": "***",
      "resid_sd_ann_pct": 12.133981202084442,
      "appraisal_ratio": 0.27744680209352196,
      "b_factor": 0.22144958903144543,
      "t_factor": 1.4916029500011527,
      "b_vol_managed": -0.16049180100331573,
      "t_vol_managed": -1.8243599766341412
    }
  },
  "predictive": {
    "Mkt-RF": {
      "vol_only_b": -0.07797194480963189,
      "vol_only_t": -0.5677168008948346,
      "vol_only_stars": "",
      "vol_only_r2_pct": 0.02144733702638124,
      "mom_only_b": 0.21243954299239676,
      "mom_only_t": 0.7852371393789462,
      "mom_only_stars": "",
      "mom_only_r2_pct": 0.1592089066649316,
      "joint_vol_b": -0.10314241869746586,
      "joint_vol_t": -0.8296161568687924,
      "joint_vol_stars": "",
      "joint_mom_b": 0.22402801999033892,
      "joint_mom_t": 0.8385323787502491,
      "joint_mom_stars": "",
      "joint_r2_pct": 0.19626452579631912,
      "joint_wald_chi2": 1.7565796782379492,
      "joint_wald_p": 0.41549286408464026,
      "n": 1189
    },
    "SMB": {
      "vol_only_b": -0.14061807898960405,
      "vol_only_t": -1.5904609839349195,
      "vol_only_stars": "",
      "vol_only_r2_pct": 0.19805142955008348,
      "mom_only_b": 0.23945569111199055,
      "mom_only_t": 2.240394336428058,
      "mom_only_stars": "**",
      "mom_only_r2_pct": 0.5743094822486805,
      "joint_vol_b": -0.0987469748336317,
      "joint_vol_t": -1.1517916912326276,
      "joint_vol_stars": "",
      "joint_mom_b": 0.2207234500798263,
      "joint_mom_t": 1.9896577513588931,
      "joint_mom_stars": "**",
      "joint_r2_pct": 0.6684608566267625,
      "joint_wald_chi2": 7.135800814739809,
      "joint_wald_p": 0.028215031606210413,
      "n": 1189
    },
    "HML": {
      "vol_only_b": -0.15290458501171192,
      "vol_only_t": -1.4489331714955327,
      "vol_only_stars": "",
      "vol_only_r2_pct": 0.18448307290180876,
      "mom_only_b": 0.2740697330548659,
      "mom_only_t": 1.6370577925275798,
      "mom_only_stars": "",
      "mom_only_r2_pct": 0.592703730549915,
      "joint_vol_b": -0.10712888401158638,
      "joint_vol_t": -0.979898837477829,
      "joint_vol_stars": "",
      "joint_mom_b": 0.25482559146450023,
      "joint_mom_t": 1.464375958423804,
      "joint_mom_stars": "",
      "joint_r2_pct": 0.6803398976528929,
      "joint_wald_chi2": 5.012755372035944,
      "joint_wald_p": 0.08156315213126543,
      "n": 1189
    }
  },
  "real_time": {
    "Mkt-RF": {
      "n_oos": 1069,
      "mean_unmanaged_pct": 8.272927970065481,
      "mean_vol_pct": 13.438701258832245,
      "mean_mom_pct": 6.307042822718049,
      "vol_unmanaged_pct": 15.79216564719028,
      "vol_vol_pct": 26.493494298933495,
      "vol_mom_pct": 15.90024967061218,
      "oos_start": "1937-07-01",
      "oos_end": "2026-07-01",
      "sharpe_unmanaged": 0.5238627908856431,
      "sharpe_vol": 0.5072453300119503,
      "sharpe_mom": 0.3966631312950459,
      "sharpe_vol_capped3x": 0.5195624677719209,
      "d_sharpe_vol": -0.01661746087369287,
      "d_sharpe_vol_se": 0.07314452966188331,
      "d_sharpe_vol_p": 0.835,
      "d_sharpe_mom": -0.12719965959059726,
      "d_sharpe_mom_se": 0.14420795169059503,
      "d_sharpe_mom_p": 0.418,
      "ce_unmanaged_pct": 2.0381155743580583,
      "ce_vol_pct": -4.108929745358295,
      "ce_mom_pct": -0.013405666977019117,
      "mdd_unmanaged_pct": -55.71442925619735,
      "mdd_vol_pct": -82.75052116997759,
      "mdd_mom_pct": -47.305861842977656,
      "leverage_mean": 1.7357709264052497,
      "leverage_p95": 3.9020308974462288,
      "leverage_max": 10.974463119903955,
      "share_months_leverage_above_2": 0.33208606173994387
    },
    "SMB": {
      "n_oos": 1069,
      "mean_unmanaged_pct": 1.6987464920486437,
      "mean_vol_pct": 1.049237832842951,
      "mean_mom_pct": 2.4079470139051757,
      "vol_unmanaged_pct": 9.95588205738686,
      "vol_vol_pct": 12.826372571355533,
      "vol_mom_pct": 9.996952663929855,
      "oos_start": "1937-07-01",
      "oos_end": "2026-07-01",
      "sharpe_unmanaged": 0.1706274222873344,
      "sharpe_vol": 0.08180316196226509,
      "sharpe_mom": 0.24086810199605352,
      "sharpe_vol_capped3x": 0.09101210099459764,
      "d_sharpe_vol": -0.08882426032506932,
      "d_sharpe_vol_se": 0.08293307572600687,
      "d_sharpe_vol_p": 0.283,
      "d_sharpe_mom": 0.07024067970871911,
      "d_sharpe_mom_se": 0.13583512578242593,
      "d_sharpe_mom_p": 0.612,
      "ce_unmanaged_pct": -0.7792431964662977,
      "ce_vol_pct": -3.0636580006375875,
      "ce_mom_pct": -0.0905295502161809,
      "mdd_unmanaged_pct": -54.91554990102843,
      "mdd_vol_pct": -82.51319226195658,
      "mdd_mom_pct": -57.30526089710878,
      "leverage_mean": 1.383465284078266,
      "leverage_p95": 3.793115547739828,
      "leverage_max": 12.974892903937487,
      "share_months_leverage_above_2": 0.23573433115060805
    },
    "HML": {
      "n_oos": 1069,
      "mean_unmanaged_pct": 3.961796071094481,
      "mean_vol_pct": 5.464125353069687,
      "mean_mom_pct": 3.542820782477728,
      "vol_unmanaged_pct": 10.11557647251876,
      "vol_vol_pct": 18.736059487722223,
      "vol_mom_pct": 10.117770268837177,
      "oos_start": "1937-07-01",
      "oos_end": "2026-07-01",
      "sharpe_unmanaged": 0.3916530196630504,
      "sharpe_vol": 0.2916368490743925,
      "sharpe_mom": 0.3501582550643245,
      "sharpe_vol_capped3x": 0.30772210054957716,
      "d_sharpe_vol": -0.10001617058865792,
      "d_sharpe_vol_se": 0.0909931073572655,
      "d_sharpe_vol_p": 0.29,
      "d_sharpe_mom": -0.04149476459872592,
      "d_sharpe_mom_se": 0.1563714882393054,
      "d_sharpe_mom_p": 0.797,
      "ce_unmanaged_pct": 1.4036738868101035,
      "ce_vol_pct": -3.311872775116964,
      "ce_mom_pct": 0.98358890215359,
      "mdd_unmanaged_pct": -57.77720404536155,
      "mdd_vol_pct": -49.67572351010544,
      "mdd_mom_pct": -37.88603102724939,
      "leverage_mean": 1.5376881034585108,
      "leverage_p95": 4.157006704555441,
      "leverage_max": 10.645806878949983,
      "share_months_leverage_above_2": 0.24789522918615528
    }
  },
  "subsamples": {
    "Mkt-RF": {
      "pre1963": {
        "n": 432,
        "start": "1927-07-01",
        "end": "1963-06-01",
        "mm_alpha_ann_pct": 9.530141708915048,
        "mm_alpha_t": 2.925210639545748,
        "mm_alpha_stars": "***",
        "hr_alpha_ann_pct": 7.510215844100214,
        "hr_alpha_t": 2.433924150528601,
        "hr_alpha_stars": "**"
      },
      "post1963": {
        "n": 757,
        "start": "1963-07-01",
        "end": "2026-07-01",
        "mm_alpha_ann_pct": 0.5393844066224788,
        "mm_alpha_t": 0.4285824036448336,
        "mm_alpha_stars": "",
        "hr_alpha_ann_pct": -0.22157200383553904,
        "hr_alpha_t": -0.1914958576371273,
        "hr_alpha_stars": ""
      }
    },
    "SMB": {
      "pre1963": {
        "n": 432,
        "start": "1927-07-01",
        "end": "1963-06-01",
        "mm_alpha_ann_pct": -1.8694880333434325,
        "mm_alpha_t": -1.2943102496511465,
        "mm_alpha_stars": "",
        "hr_alpha_ann_pct": -1.0159448960348214,
        "hr_alpha_t": -0.7237638190222587,
        "hr_alpha_stars": ""
      },
      "post1963": {
        "n": 757,
        "start": "1963-07-01",
        "end": "2026-07-01",
        "mm_alpha_ann_pct": -0.17254134005780217,
        "mm_alpha_t": -0.17066491035727965,
        "mm_alpha_stars": "",
        "hr_alpha_ann_pct": 0.1413443199032085,
        "hr_alpha_t": 0.13711394910702945,
        "hr_alpha_stars": ""
      }
    },
    "HML": {
      "pre1963": {
        "n": 432,
        "start": "1927-07-01",
        "end": "1963-06-01",
        "mm_alpha_ann_pct": 2.455082807853898,
        "mm_alpha_t": 1.2155289954625903,
        "mm_alpha_stars": "",
        "hr_alpha_ann_pct": 3.0905939519448866,
        "hr_alpha_t": 1.3963525674984263,
        "hr_alpha_stars": ""
      },
      "post1963": {
        "n": 757,
        "start": "1963-07-01",
        "end": "2026-07-01",
        "mm_alpha_ann_pct": -0.48052912681930937,
        "mm_alpha_t": -0.45117473439905725,
        "mm_alpha_stars": "",
        "hr_alpha_ann_pct": -0.3096265514354632,
        "hr_alpha_t": -0.30274037955742533,
        "hr_alpha_stars": ""
      }
    }
  },
  "window_sensitivity": {
    "W3": {
      "Mkt-RF": {
        "n": 1198,
        "alpha_ann_pct": 1.3452093956189,
        "alpha_t": 0.7449623832467309,
        "alpha_stars": ""
      },
      "SMB": {
        "n": 1198,
        "alpha_ann_pct": 0.8746290917903946,
        "alpha_t": 0.880753510414738,
        "alpha_stars": ""
      },
      "HML": {
        "n": 1198,
        "alpha_ann_pct": -0.6504550675334551,
        "alpha_t": -0.5196919620345878,
        "alpha_stars": ""
      }
    },
    "W6": {
      "Mkt-RF": {
        "n": 1195,
        "alpha_ann_pct": 1.773933140269158,
        "alpha_t": 1.0797873454556397,
        "alpha_stars": ""
      },
      "SMB": {
        "n": 1195,
        "alpha_ann_pct": -1.2555108302321796,
        "alpha_t": -1.3662658210127598,
        "alpha_stars": ""
      },
      "HML": {
        "n": 1195,
        "alpha_ann_pct": 0.15658866648602598,
        "alpha_t": 0.1479863592274214,
        "alpha_stars": ""
      }
    },
    "W12": {
      "Mkt-RF": {
        "n": 1189,
        "alpha_ann_pct": 3.3493076778586337,
        "alpha_t": 2.3440356503973594,
        "alpha_stars": "**"
      },
      "SMB": {
        "n": 1189,
        "alpha_ann_pct": -0.7891661545027914,
        "alpha_t": -0.9485339147210234,
        "alpha_stars": ""
      },
      "HML": {
        "n": 1189,
        "alpha_ann_pct": 0.6666812379505825,
        "alpha_t": 0.6547382749920001,
        "alpha_stars": ""
      }
    },
    "W24": {
      "Mkt-RF": {
        "n": 1177,
        "alpha_ann_pct": 2.7776312626249124,
        "alpha_t": 2.0256345069488786,
        "alpha_stars": "**"
      },
      "SMB": {
        "n": 1177,
        "alpha_ann_pct": -0.7426521991425441,
        "alpha_t": -1.0137556987359466,
        "alpha_stars": ""
      },
      "HML": {
        "n": 1177,
        "alpha_ann_pct": 0.08733314523529444,
        "alpha_t": 0.08311455718784759,
        "alpha_stars": ""
      }
    }
  },
  "decision": {
    "n_factors_vol_alpha_survives_horse_race": 0,
    "n_factors_real_time_sharpe_gain": 0,
    "n_factors_mom_alpha_survives_horse_race": 3,
    "n_factors_mm_benchmark_alpha_significant": 1,
    "n_factors_real_time_sharpe_gain_mom": 1,
    "rule": "supported requires >=2 of 3 factors with horse-race vol alpha t>1.96 AND >=2 of 3 with positive real-time Sharpe difference"
  },
  "hypothesis_supported": false
}
Experiment script · experiment_v1.py
"""Volatility timing vs time-series factor momentum: a real-time horse race on the
Fama-French market, size and value factors (monthly, Kenneth R. French Data Library)."""
import json
import numpy as np
import pandas as pd
import statsmodels.api as sm
from dataset import load

RNG = np.random.default_rng(20260908)
HAC_LAGS = 6
BASE_W = 12          # months in the trailing variance / momentum window
BURN = 120           # months of burn-in before real-time constants are usable
GAMMA = 5.0          # risk aversion for certainty-equivalent returns
BOOT = 999           # bootstrap replications
BLOCK = 6            # circular block length (months)
FACTORS = ["Mkt-RF", "SMB", "HML"]


def stars(t):
    a = abs(t)
    return "***" if a > 2.576 else ("**" if a > 1.96 else ("*" if a > 1.645 else ""))


def ann_sr(x):
    x = np.asarray(x, float)
    return float(x.mean() / x.std(ddof=1) * np.sqrt(12.0))


def max_drawdown(x):
    w = np.cumprod(1.0 + np.asarray(x, float))
    return float(np.min(w / np.maximum.accumulate(w)) - 1.0)


def hac_reg(y, X_cols, names):
    X = sm.add_constant(np.column_stack(X_cols))
    r = sm.OLS(np.asarray(y, float), X).fit(cov_type="HAC", cov_kwds={"maxlags": HAC_LAGS})
    out = {"n": int(r.nobs), "r2": float(r.rsquared),
           "alpha_ann_pct": float(r.params[0] * 1200.0),
           "alpha_t": float(r.tvalues[0]), "alpha_stars": stars(r.tvalues[0]),
           "resid_sd_ann_pct": float(np.std(r.resid, ddof=X.shape[1]) * np.sqrt(12.0) * 100.0)}
    out["appraisal_ratio"] = float(r.params[0] * np.sqrt(12.0) / np.std(r.resid, ddof=X.shape[1]))
    for i, nm in enumerate(names):
        out["b_" + nm] = float(r.params[i + 1])
        out["t_" + nm] = float(r.tvalues[i + 1])
    return out


def sharpe_diff_test(r1, r2, boot=BOOT, block=BLOCK, rng=RNG):
    """Ledoit-Wolf (2008) studentized circular block bootstrap for SR1 - SR2 (annualised)."""
    r1 = np.asarray(r1, float); r2 = np.asarray(r2, float); n = r1.size

    def stat_and_se(a, b):
        m1, m2 = a.mean(), b.mean()
        g1, g2 = (a ** 2).mean(), (b ** 2).mean()
        v1, v2 = g1 - m1 ** 2, g2 - m2 ** 2
        if v1 <= 0 or v2 <= 0:
            return np.nan, np.nan
        d = m1 / np.sqrt(v1) - m2 / np.sqrt(v2)
        grad = np.array([g1 / v1 ** 1.5, -0.5 * m1 / v1 ** 1.5,
                         -g2 / v2 ** 1.5, 0.5 * m2 / v2 ** 1.5])
        y = np.column_stack([a, a ** 2, b, b ** 2])
        y = y - y.mean(0)
        psi = (y.T @ y) / n
        for L in range(1, HAC_LAGS + 1):
            g = (y[L:].T @ y[:-L]) / n
            psi += (1.0 - L / (HAC_LAGS + 1.0)) * (g + g.T)
        var = float(grad @ psi @ grad) / n
        return d, (np.sqrt(var) if var > 0 else np.nan)

    d_hat, se_hat = stat_and_se(r1, r2)
    if not np.isfinite(se_hat) or se_hat == 0:
        return float(d_hat * np.sqrt(12.0)), None, None
    tstat = d_hat / se_hat
    nb = int(np.ceil(n / block))
    starts = rng.integers(0, n, size=(boot, nb))
    offs = np.arange(block)
    idx = (starts[:, :, None] + offs[None, None, :]).reshape(boot, nb * block)[:, :n] % n
    cnt = 0; used = 0
    for k in range(boot):
        a, b = r1[idx[k]], r2[idx[k]]
        d_b, se_b = stat_and_se(a, b)
        if np.isfinite(se_b) and se_b > 0:
            used += 1
            if abs((d_b - d_hat) / se_b) >= abs(tstat):
                cnt += 1
    p = (cnt + 1.0) / (used + 1.0) if used else None
    return float(d_hat * np.sqrt(12.0)), float(se_hat * np.sqrt(12.0)), p


# ----------------------------------------------------------------- data
raw = load()
print("loaded shape:", raw.shape, "columns:", list(raw.columns))
print("dtypes:\n", raw.dtypes.to_string())
print("missing per column:", raw.isna().sum().to_dict())
df = raw.sort_values("Date").reset_index(drop=True)
n_raw = int(len(df))
for c in FACTORS + ["RF"]:
    df[c] = df[c].astype(float) / 100.0     # percent per month -> decimals
print("sample:", df["Date"].min().date(), "to", df["Date"].max().date(), "rows:", n_raw)

results = {
    "data": {
        "rows_in_file": n_raw,
        "file_start": str(df["Date"].min().date()),
        "file_end": str(df["Date"].max().date()),
        "missing_values": int(raw.isna().sum().sum()),
        "variance_window_months": BASE_W,
        "hac_lags": HAC_LAGS,
        "burn_in_months": BURN,
        "risk_aversion": GAMMA,
        "bootstrap_reps": BOOT,
        "bootstrap_block_months": BLOCK,
    },
    "descriptives": {}, "mm_benchmark": {}, "horse_race_vol": {}, "horse_race_mom": {},
    "predictive": {}, "real_time": {}, "subsamples": {}, "window_sensitivity": {},
}

panel = {}
for f in FACTORS:
    r = df[f]
    rv = (r ** 2).rolling(BASE_W).mean().shift(1)      # known at end of t-1
    mom = r.rolling(BASE_W).sum().shift(1)             # known at end of t-1
    d = pd.DataFrame({"Date": df["Date"], "r": r, "rv": rv, "mom": mom}).dropna().reset_index(drop=True)
    panel[f] = d
    results["descriptives"][f] = {
        "n": int(len(d)),
        "start": str(d["Date"].iloc[0].date()), "end": str(d["Date"].iloc[-1].date()),
        "mean_ann_pct": float(d["r"].mean() * 1200.0),
        "sd_ann_pct": float(d["r"].std(ddof=1) * np.sqrt(12.0) * 100.0),
        "sharpe_ann": ann_sr(d["r"]),
        "skewness": float(d["r"].skew()),
        "corr_signal_vol_mom": float(np.corrcoef(1.0 / d["rv"], d["mom"])[0, 1]),
    }

# ------------------------------------------------- managed portfolios (in sample)
def build_managed(d):
    wv = 1.0 / d["rv"].values
    cv = d["r"].std(ddof=1) / np.std(wv * d["r"].values, ddof=1)
    volm = cv * wv * d["r"].values
    sgn = np.sign(d["mom"].values); sgn[sgn == 0] = 1.0
    cm = d["r"].std(ddof=1) / np.std(sgn * d["r"].values, ddof=1)
    momm = cm * sgn * d["r"].values
    return volm, momm, cv * wv, sgn


for f in FACTORS:
    d = panel[f]
    volm, momm, wgt, sgn = build_managed(d)
    results["mm_benchmark"][f] = hac_reg(volm, [d["r"].values], ["factor"])
    results["mm_benchmark"][f]["sharpe_ann_managed"] = ann_sr(volm)
    results["mm_benchmark"][f]["sharpe_ann_unmanaged"] = ann_sr(d["r"].values)
    results["mm_benchmark"][f]["weight_mean"] = float(wgt.mean())
    results["mm_benchmark"][f]["weight_p95"] = float(np.percentile(wgt, 95))
    results["mm_benchmark"][f]["weight_max"] = float(wgt.max())
    results["horse_race_vol"][f] = hac_reg(volm, [d["r"].values, momm], ["factor", "mom_managed"])
    results["horse_race_mom"][f] = hac_reg(momm, [d["r"].values, volm], ["factor", "vol_managed"])
    results["mm_benchmark"][f]["sharpe_ann_mom_managed"] = ann_sr(momm)
    results["mm_benchmark"][f]["corr_vol_mom_managed"] = float(np.corrcoef(volm, momm)[0, 1])

# ------------------------------------------------- predictive regressions
for f in FACTORS:
    d = panel[f]
    zv = 1.0 / d["rv"].values; zv = (zv - zv.mean()) / zv.std(ddof=1)
    zm = d["mom"].values; zm = (zm - zm.mean()) / zm.std(ddof=1)
    y = d["r"].values * 100.0                      # percent per month
    o = {}
    r1 = sm.OLS(y, sm.add_constant(zv)).fit(cov_type="HAC", cov_kwds={"maxlags": HAC_LAGS})
    o["vol_only_b"] = float(r1.params[1]); o["vol_only_t"] = float(r1.tvalues[1])
    o["vol_only_stars"] = stars(r1.tvalues[1]); o["vol_only_r2_pct"] = float(r1.rsquared * 100.0)
    r2 = sm.OLS(y, sm.add_constant(zm)).fit(cov_type="HAC", cov_kwds={"maxlags": HAC_LAGS})
    o["mom_only_b"] = float(r2.params[1]); o["mom_only_t"] = float(r2.tvalues[1])
    o["mom_only_stars"] = stars(r2.tvalues[1]); o["mom_only_r2_pct"] = float(r2.rsquared * 100.0)
    r3 = sm.OLS(y, sm.add_constant(np.column_stack([zv, zm]))).fit(
        cov_type="HAC", cov_kwds={"maxlags": HAC_LAGS})
    o["joint_vol_b"] = float(r3.params[1]); o["joint_vol_t"] = float(r3.tvalues[1])
    o["joint_vol_stars"] = stars(r3.tvalues[1])
    o["joint_mom_b"] = float(r3.params[2]); o["joint_mom_t"] = float(r3.tvalues[2])
    o["joint_mom_stars"] = stars(r3.tvalues[2])
    o["joint_r2_pct"] = float(r3.rsquared * 100.0)
    w = r3.wald_test(np.eye(3)[1:], scalar=True)
    o["joint_wald_chi2"] = float(w.statistic); o["joint_wald_p"] = float(w.pvalue)
    o["n"] = int(r3.nobs)
    results["predictive"][f] = o

# ------------------------------------------------- real-time implementation
print("running real-time expanding-window implementation ...")
for f in FACTORS:
    d = panel[f]
    n = len(d); rr = d["r"].values; w = 1.0 / d["rv"].values
    sgn = np.sign(d["mom"].values); sgn[sgn == 0] = 1.0
    rt_v = np.full(n, np.nan); rt_m = np.full(n, np.nan)
    rt_vc = np.full(n, np.nan); lev = np.full(n, np.nan)
    for t in range(BURN, n):
        h = slice(0, t)
        sd_r = np.std(rr[h], ddof=1)
        cv = sd_r / np.std(w[h] * rr[h], ddof=1)
        cm = sd_r / np.std(sgn[h] * rr[h], ddof=1)
        lev[t] = cv * w[t]
        rt_v[t] = cv * w[t] * rr[t]
        rt_m[t] = cm * sgn[t] * rr[t]
        rt_vc[t] = min(cv * w[t], 3.0) * rr[t]
    ok = ~np.isnan(rt_v)
    u, v, m, vc = rr[ok], rt_v[ok], rt_m[ok], rt_vc[ok]
    dv, sev, pv = sharpe_diff_test(v, u)
    dm, sem, pm = sharpe_diff_test(m, u)
    ce = lambda x: float(x.mean() * 12.0 - 0.5 * GAMMA * (x.std(ddof=1) ** 2 * 12.0))
    av = lambda x: float(x.std(ddof=1) * np.sqrt(12.0) * 100.0)
    am = lambda x: float(x.mean() * 1200.0)
    results["real_time"][f] = {
        "n_oos": int(ok.sum()),
        "mean_unmanaged_pct": am(u), "mean_vol_pct": am(v), "mean_mom_pct": am(m),
        "vol_unmanaged_pct": av(u), "vol_vol_pct": av(v), "vol_mom_pct": av(m),
        "oos_start": str(d["Date"].values[np.argmax(ok)])[:10],
        "oos_end": str(d["Date"].iloc[-1].date()),
        "sharpe_unmanaged": ann_sr(u), "sharpe_vol": ann_sr(v), "sharpe_mom": ann_sr(m),
        "sharpe_vol_capped3x": ann_sr(vc),
        "d_sharpe_vol": ann_sr(v) - ann_sr(u), "d_sharpe_vol_se": sev, "d_sharpe_vol_p": pv,
        "d_sharpe_mom": ann_sr(m) - ann_sr(u), "d_sharpe_mom_se": sem, "d_sharpe_mom_p": pm,
        "ce_unmanaged_pct": ce(u) * 100.0, "ce_vol_pct": ce(v) * 100.0, "ce_mom_pct": ce(m) * 100.0,
        "mdd_unmanaged_pct": max_drawdown(u) * 100.0, "mdd_vol_pct": max_drawdown(v) * 100.0,
        "mdd_mom_pct": max_drawdown(m) * 100.0,
        "leverage_mean": float(np.nanmean(lev[ok])), "leverage_p95": float(np.nanpercentile(lev[ok], 95)),
        "leverage_max": float(np.nanmax(lev[ok])),
        "share_months_leverage_above_2": float(np.mean(lev[ok] > 2.0)),
    }

# ------------------------------------------------- subsamples and window sweep
split = pd.Timestamp("1963-07-01")
for f in FACTORS:
    d = panel[f]
    volm, momm, _, _ = build_managed(d)
    sub = {}
    for label, mask in [("pre1963", (d["Date"] < split).values), ("post1963", (d["Date"] >= split).values)]:
        dd = d.loc[mask]
        wv = 1.0 / dd["rv"].values
        cv = dd["r"].std(ddof=1) / np.std(wv * dd["r"].values, ddof=1)
        vm = cv * wv * dd["r"].values
        sg = np.sign(dd["mom"].values); sg[sg == 0] = 1.0
        cm = dd["r"].std(ddof=1) / np.std(sg * dd["r"].values, ddof=1)
        mm = cm * sg * dd["r"].values
        base = hac_reg(vm, [dd["r"].values], ["factor"])
        hr = hac_reg(vm, [dd["r"].values, mm], ["factor", "mom_managed"])
        sub[label] = {"n": int(len(dd)), "start": str(dd["Date"].iloc[0].date()),
                      "end": str(dd["Date"].iloc[-1].date()),
                      "mm_alpha_ann_pct": base["alpha_ann_pct"], "mm_alpha_t": base["alpha_t"],
                      "mm_alpha_stars": base["alpha_stars"],
                      "hr_alpha_ann_pct": hr["alpha_ann_pct"], "hr_alpha_t": hr["alpha_t"],
                      "hr_alpha_stars": hr["alpha_stars"]}
    results["subsamples"][f] = sub

for W in [3, 6, 12, 24]:
    row = {}
    for f in FACTORS:
        r = df[f]
        rv = (r ** 2).rolling(W).mean().shift(1)
        dd = pd.DataFrame({"r": r, "rv": rv}).dropna()
        wv = 1.0 / dd["rv"].values
        cv = dd["r"].std(ddof=1) / np.std(wv * dd["r"].values, ddof=1)
        vm = cv * wv * dd["r"].values
        b = hac_reg(vm, [dd["r"].values], ["factor"])
        row[f] = {"n": b["n"], "alpha_ann_pct": b["alpha_ann_pct"], "alpha_t": b["alpha_t"],
                  "alpha_stars": b["alpha_stars"]}
    results["window_sensitivity"]["W%d" % W] = row

# ------------------------------------------------- decision rule
cond_a = sum(1 for f in FACTORS if results["horse_race_vol"][f]["alpha_t"] > 1.96)
cond_b = sum(1 for f in FACTORS if results["real_time"][f]["d_sharpe_vol"] > 0)
supported = bool(cond_a >= 2 and cond_b >= 2)
results["decision"] = {
    "n_factors_vol_alpha_survives_horse_race": int(cond_a),
    "n_factors_real_time_sharpe_gain": int(cond_b),
    "n_factors_mom_alpha_survives_horse_race": int(
        sum(1 for f in FACTORS if results["horse_race_mom"][f]["alpha_t"] > 1.96)),
    "n_factors_mm_benchmark_alpha_significant": int(
        sum(1 for f in FACTORS if results["mm_benchmark"][f]["alpha_t"] > 1.96)),
    "n_factors_real_time_sharpe_gain_mom": int(
        sum(1 for f in FACTORS if results["real_time"][f]["d_sharpe_mom"] > 0)),
    "rule": "supported requires >=2 of 3 factors with horse-race vol alpha t>1.96 AND >=2 of 3 with positive real-time Sharpe difference",
}
results["hypothesis_supported"] = supported
print("RESULT_JSON: " + json.dumps(results, allow_nan=False))
Listing. experiment_v1.py

4.Analysis

Attempt 2Done

Analysis complete: experiment succeeded; hypothesis refuted; 11 key numbers.

Hypothesis refutedExperiment succeeded

Results and analysis

The hypothesis is refuted, and refuted in both of its parts.

  1. The Moreira-Muir benchmark replicates only for the market, and only weakly. Scaling each factor by the inverse of its trailing twelve-month realised variance and equating unconditional volatilities, the spanning regression of the managed on the unmanaged factor gives an annualised alpha of 3.35% (Newey-West(6) t = 2.34) for Mkt-RF, -0.79% (t = -0.95) for SMB and 0.67% (t = 0.65) for HML, over 1,189 monthly observations from July 1927 to July 2026. The market appraisal ratio is 0.26. One of three factors clears the conventional two-standard-error bar. The market estimate is smaller than the roughly five percent per year reported with daily realised variance, which is what one would expect from a coarser, monthly variance proxy, but it is of the same sign and order.

  2. The volatility-managed alpha does not survive the horse race. Adding the momentum-managed version of the same factor (weight = sign of the trailing twelve-month return, scaled to the factor's unconditional volatility) to the spanning regression cuts the market's managed alpha from 3.35% to 2.04% per year and its t-statistic from 2.34 to 1.52. The loading of the volatility-managed market on the momentum-managed market is 0.19 (t = 2.57). For SMB the horse-race alpha is -0.28% (t = -0.33) and for HML 1.02% (t = 0.97). Zero of three factors satisfy condition (a).

  3. The mirror-image regression is not symmetric. Regressing the momentum-managed factor on the unmanaged factor and the volatility-managed factor leaves alphas of 5.56% per year (t = 2.99) for Mkt-RF, 2.59% (t = 2.55) for SMB and 3.37% (t = 2.89) for HML. Three of three survive. Time-series factor momentum spans volatility management in these data; volatility management does not span factor momentum.

  4. The reason is visible in the predictive regressions. The standardised inverse-variance signal has no forecasting power for the next month's factor return, and its point estimate is negative for every factor: -0.08 percentage points per month (t = -0.57) for Mkt-RF, -0.14 (t = -1.59) for SMB and -0.15 (t = -1.45) for HML. The standardised twelve-month momentum signal is positive throughout and significant for SMB, 0.24 points per month (t = 2.24), with R-squared of 0.57%. In the joint specification the volatility slope stays negative and insignificant everywhere while the momentum slope stays positive, significant for SMB (0.22, t = 1.99). The joint Wald test rejects at 5% only for SMB (chi-square 7.14, p = 0.028). Whatever the volatility-managed market portfolio earns, it is not earned by forecasting the conditional mean; it comes from the mechanical effect of taking less risk when variance is high.

  5. Real-time implementation removes even that. With the scaling constant re-estimated each month on an expanding window ending at t-1 after a 120-month burn-in, the out-of-sample period runs from July 1937 to July 2026, 1,069 months. The volatility-managed Sharpe ratio is below the unmanaged Sharpe ratio for all three factors: 0.51 against 0.52 for Mkt-RF (difference -0.017, Ledoit-Wolf bootstrap p = 0.835), 0.08 against 0.17 for SMB (-0.089, p = 0.283) and 0.29 against 0.39 for HML (-0.100, p = 0.290). Zero of three factors satisfy condition (b). None of the differences is statistically distinguishable from zero, so the honest statement is that a real-time investor gained nothing, not that she lost significantly.

  6. The real-time strategy is a levered bet rather than a risk-matched one, and that is where the economic damage shows. Because the real-time constant cannot equalise volatility ex post, the managed market portfolio realises 26.5% annualised volatility against 15.8% for the unmanaged market, with mean 13.4% against 8.3%. Mean leverage is 1.74, the 95th percentile 3.90 and the maximum 10.97, with 33% of months levered above two. Maximum drawdown deepens from -55.7% to -82.8%, and the certainty-equivalent return for a mean-variance investor with risk aversion five falls from +2.04% to -4.11% per year. Capping leverage at three times leaves the Sharpe ratio essentially unchanged at 0.52, so the result is not a leverage artefact in either direction.

  7. The subsample split is the most damaging single fact for the volatility-timing story. The market's managed alpha is 9.53% per year (t = 2.93) before July 1963 and 0.54% (t = 0.43) after; in the horse race it is 7.51% (t = 2.43) before and -0.22% (t = -0.19) after. Every part of the effect measured on monthly data lives in the 1927-1963 window, the part of the Kenneth R. French sample built on the thinnest coverage. Neither SMB nor HML shows a significant managed alpha in either subsample.

  8. Window sensitivity confirms that the one positive result is fragile. The market's managed alpha is 1.35% (t = 0.74) at a three-month variance window, 1.77% (t = 1.08) at six months, 3.35% (t = 2.34) at twelve and 2.78% (t = 2.03) at twenty-four. SMB and HML are insignificant at every window.

Taken together: on a century of monthly US factor data, volatility management is neither an independent phenomenon nor a real-time-implementable one. Its only detectable trace is a market-factor alpha that is concentrated before 1963, that is absorbed by time-series factor momentum, and that does not translate into any out-of-sample Sharpe gain. Time-series factor momentum, by contrast, generates spanning alphas that survive the volatility-managed control for all three factors - though its own real-time Sharpe improvement appears for only one factor, SMB (0.24 against 0.17, difference +0.070, p = 0.612), which is itself not statistically distinguishable from zero. The pattern of significant spanning alphas coexisting with no real-time performance gain is exactly the diagnosis Cederburg, O'Doherty, Wang and Yan (2020) offer, and it reappears here for factor momentum as well as for volatility management.

Key numbers

MetricValueInterpretation
Moreira-Muir spanning alpha, market factor (in sample)3.35% per year, Newey-West(6) t = 2.34, beta = 0.70, R-squared = 0.494, appraisal ratio 0.26, n = 1,189The benchmark volatility-managed result replicates for the market with a monthly variance proxy, at roughly two-thirds the magnitude reported with daily realised variance.
Moreira-Muir spanning alphas, SMB and HML (in sample)SMB -0.79% per year (t = -0.95); HML +0.67% per year (t = 0.65)Volatility management adds nothing to the size and value factors at any conventional significance level.
Horse-race alpha of the volatility-managed factor, controlling for the momentum-managed factorMkt-RF +2.04% per year (t = 1.52); SMB -0.28% (t = -0.33); HML +1.02% (t = 0.97); 0 of 3 significantCondition (a) of the hypothesis fails: factor momentum absorbs the volatility-managed alpha.
Mirror-image horse-race alpha of the momentum-managed factor, controlling for the volatility-managed factorMkt-RF +5.56% per year (t = 2.99); SMB +2.59% (t = 2.55); HML +3.37% (t = 2.89); 3 of 3 significantThe spanning relation runs one way: momentum management subsumes volatility management, not the reverse.
Predictive slope of the standardised inverse-variance signal on next-month returnsMkt-RF -0.078 points per month (t = -0.57); SMB -0.141 (t = -1.59); HML -0.153 (t = -1.45)The volatility signal carries no information about the conditional mean, and its sign is the wrong one; any gain must be mechanical variance timing.
Predictive slope of the standardised twelve-month momentum signalSMB +0.239 points per month (t = 2.24), R-squared 0.57%; joint specification +0.221 (t = 1.99), joint Wald chi-square 7.14 (p = 0.028)Only factor momentum, and only for the size factor, forecasts the conditional mean in this sample.
Real-time out-of-sample Sharpe ratios, volatility-managed versus unmanagedMkt-RF 0.507 vs 0.524 (difference -0.017, Ledoit-Wolf p = 0.835); SMB 0.082 vs 0.171 (-0.089, p = 0.283); HML 0.292 vs 0.392 (-0.100, p = 0.290); n = 1,069 months, July 1937 to July 2026Condition (b) fails for all three factors, though none of the shortfalls is statistically distinguishable from zero.
Real-time risk profile of the volatility-managed market portfolio26.5% annualised volatility vs 15.8% unmanaged; mean leverage 1.74, 95th percentile 3.90, maximum 10.97; maximum drawdown -82.8% vs -55.7%; certainty equivalent -4.11% vs +2.04% per year at risk aversion 5Without a full-sample scaling constant the strategy is a levered bet; the Sharpe ratio is unchanged but the investor's welfare is much worse.
Subsample split at July 1963, market factorPre-1963 managed alpha 9.53% per year (t = 2.93), horse-race alpha 7.51% (t = 2.43), n = 432; post-1963 managed alpha 0.54% (t = 0.43), horse-race alpha -0.22% (t = -0.19), n = 757The entire monthly-data volatility-timing effect sits in the pre-1963 period; there is nothing left in the modern sample.
Sensitivity to the variance window, market factor3 months 1.35% (t = 0.74); 6 months 1.77% (t = 1.08); 12 months 3.35% (t = 2.34); 24 months 2.78% (t = 2.03)Significance appears only at the longer windows, so the single positive in-sample result is not robust to the measurement choice.
Sample analysed1,201 monthly rows in the file (July 1926 to July 2026), 1,189 used after requiring a complete twelve-month lagged history; zero missing valuesThe full available history of the Fama-French three factors is used; the twelve dropped months are the initial window.

Caveats

  • The variance proxy is the mean squared monthly factor return over the prior twelve months, not the within-month realised variance from daily returns used by Moreira and Muir (2017). This is deliberate - it is the only variance measure available across the whole 1926-2026 sample - but it is coarser and more sluggish, so the null results bound the informativeness of monthly-frequency variance rather than of volatility timing in general.
  • The study measures gross returns only. No transaction costs, financing costs, margin requirements or short-sale constraints are imposed, and the real-time strategy demands leverage above two in a third of months and above ten at its peak, so the reported real-time performance is an upper bound on what an investor could have achieved.
  • None of the real-time Sharpe differences is statistically distinguishable from zero at conventional levels. The correct reading is that the data cannot reject equality of the managed and unmanaged Sharpe ratios, not that volatility management is proven harmful.
  • The momentum-managed portfolio uses a sign-based weight, which goes short the factor after a losing year. A long-only or continuously scaled variant was not estimated, so the factor-momentum results are specific to this implementation.
  • Three factors from one country over one century is a single, highly serially persistent macroeconomic sample; the pre-1963 subperiod dominates the in-sample findings and rests on the thinner CRSP coverage the data provider itself flags.
  • The decision rule for the hypothesis (at least two of three factors on each of two conditions) was set in advance but is coarse; with three test assets it cannot distinguish a genuinely absent effect from one too small to detect at this sample size.
  • The Ledoit-Wolf test is implemented with a Newey-West HAC covariance and a circular block bootstrap of block length six months and 999 replications rather than the prewhitened kernel of the original paper, so the p-values are close to but not identical with that procedure.

5.Paper writing

Attempt 5Done

Manuscript drafted: “Volatility Timing or Factor Momentum? A Real-Time Horse Race on a Century of U.S. Factor Returns” (≈ 3830 words).

Reviewer feedback applied: Referee recommendation: major_revision. Rewrite the manuscript to address every required change below, using only numbers already produced by the executed script. (1) "Restate H1 so that it is testable. Make the horse-race condition conditional on the benchmark alpha being significant, or test it factor by factor, and say plainly in Section IV that the horse race can only discriminate for the market factor because Table II leaves nothing to absorb for SMB and HML." (2) "Report the in-sample annualised Sharpe ratios of the momentum-managed portfolios (0.412 for Mkt-RF, 0.308 for SMB, 0.308 for HML, against unmanaged 0.448, 0.189 and 0.340) in Table II or Table III, and add a paragraph after Table III stating that the Panel B alphas are not evidence of a better portfolio: for the market the momentum-managed Sharpe ratio is below the unmanaged one both in sample and out of sample, and the positive alpha comes partly from the negative loading of -0.170 on the factor. Apply the Cederburg et al. (2020) diagnosis symmetrically to both legs." (3) "Separate the two real-time failures. State explicitly that because the managed market realises 26.49% volatility against 15.79%, the certainty-equivalent comparison in Table V is a leverage-mismatch result and only the Sharpe-ratio comparison is a clean test of timing value; do not use the certainty equivalent as the headline evidence about volatility timing." (4) "Move every number now reported only in prose into a numbered table with notes: the horse-race appraisal ratios, the residual volatility of the benchmark regression, the real-time leverage distribution (mean 1.74, 95th percentile 3.90, maximum 10.97, 33% of months above two) and the capped-leverage Sharpe ratio of 0.520 against 0.507." (5) "Correct the sentence 'Panel B is not the mirror image' to say that Panel B is the mirror-image specification but the result is not symmetric, and add one sentence where Tables II and III are introduced noting that both scaling constants use full-sample information, so those alphas are not attainable and Table V is the implementable counterpart." (6) "Strengthen the conclusion's treatment of the measurement limitation. Given Table VII, state that the study bounds the timing content of monthly-frequency variance and cannot reject that daily realised variance would deliver a different answer, rather than concluding that volatility management 'is neither distinct nor implementable' without that qualifier." Numbers from the executed run available for the new table cells (invent nothing else): horse-race appraisal ratios 0.161 (Mkt-RF), -0.035 (SMB), 0.102 (HML); benchmark residual volatilities 13.12, 8.09, 10.04 percent per year; horse-race residual volatilities 12.65, 7.87, 9.96 percent per year; in-sample Sharpe of the momentum-managed portfolios 0.412, 0.308, 0.308; real-time leverage mean/p95/max 1.74/3.90/10.97 (Mkt-RF), 1.38/3.79/12.97 (SMB), 1.54/4.16/10.65 (HML); share of out-of-sample months with leverage above two 33.2, 23.6, 24.8 percent; real-time Sharpe with leverage capped at three times 0.520, 0.091, 0.308; in-sample correlation between the volatility- and momentum-managed portfolios 0.257, 0.009, -0.032. Keep the manuscript inside the 2,600-3,600 word bound and add no analysis the script did not run.

≈ 3830 words · AI-drafted manuscript · not peer-reviewed

Volatility Timing or Factor Momentum? A Real-Time Horse Race on a Century of U.S. Factor Returns

Abstract

Volatility management and time-series factor momentum both time a factor using nothing but its own past returns. We race them on the Fama–French market, size and value factors, 1,189 months from July 1927 to July 2026. Volatility management earns a spanning alpha only for the market, 3.35% per year (t = 2.34); adding a momentum-managed leg cuts it to 2.04% (t = 1.52). The mirror specification is not symmetric — momentum-managed alphas of 5.56%, 2.59% and 3.37% per year survive — but those alphas come with lower Sharpe ratios, so neither leg is a better portfolio. Real-time volatility-managed Sharpe ratios fall for every factor, and the market effect is entirely pre-1963.

I. Introduction

Two literatures claim that a factor portfolio can be improved using only the factor's own history. Moreira and Muir (2017) scale each factor by the inverse of its lagged realized variance and report large alphas, higher Sharpe ratios and utility gains, extended to long horizons in Moreira and Muir (2019); Barroso and Santa-Clara (2015) apply the device to momentum. The economics is that conditional variance moves far more than the conditional risk premium, weakening the trade-off of French, Schwert and Stambaugh (1987) at monthly horizons. Separately, Gupta and Kelly (2019), Ehsani and Linnainmaa (2022) and Arnott, Kalesnik and Linnainmaa (2023) show most factors are positively autocorrelated, so a factor's trailing twelve-month return is itself a timing signal; Haddad, Kozak and Santosh (2020) find dominant equity factors predictable more generally.

The two signals are functions of the same object — one the squared magnitude of the last year of returns, the other their level — so if they carry the same information, part of one literature is redundant. No study we know of races them on the same factors under one real-time discipline; Grobys, Kolari and Rutanen (2022) combine them as complements, on option-implied volatility over a short sample.

We run that race twice: in sample, in the spanning framework that literature uses, and in strict real time, every scaling constant estimated on an expanding window ending in the prior month, in the out-of-sample spirit of Goyal and Welch (2008). Real-time discipline is the crux of the critical literature. Cederburg, O'Doherty, Wang and Yan (2020) show across 103 strategies that positive spanning alphas coexist with no real-time outperformance, because the scaling constant and the loading are full-sample objects; Liu, Tang and Zhou (2019) make the same look-ahead point for the market; DeMiguel, Martín-Utrera and Uppal (2024) show conditional multifactor portfolios do survive out of sample, leaving the single-factor verdict open.

Four results follow. The Moreira and Muir (2017) benchmark replicates only for the market and only weakly, 3.35% per year (t = 2.34), falling to 2.04% (t = 1.52) once the momentum-managed market enters the regression. The mirror specification is not symmetric — momentum-managed alphas of 5.56%, 2.59% and 3.37% survive — but these are spanning alphas without portfolio gains: the momentum-managed market earns a Sharpe ratio of 0.412 against 0.448 unmanaged. In real time the volatility-managed Sharpe ratio is below the unmanaged one for every factor. And the inverse-variance signal does not forecast the conditional mean, so its in-sample gain rests on a full-sample normalization the real-time constant destroys. We thus supply the missing head-to-head test and extend the Cederburg et al. (2020) critique to a century of data and to size and value. Sections II to VI cover hypotheses, data, results, robustness and conclusions.

II. Hypothesis Development

Let ftf_t be a factor's excess or long–short return. Volatility management multiplies ftf_t by a weight inversely proportional to a variance estimate formed at t−1t-1: if conditional variance is persistent while the conditional mean is not proportional to it, the managed portfolio has a higher unconditional mean-to-variance ratio, and a spanning regression of managed on unmanaged returns yields a positive intercept. Factor momentum instead multiplies ftf_t by the sign of the trailing return; positive autocorrelation again yields a positive intercept, but here the conditional mean, not the variance, is timed. Both weights are functions of {ft−1,…,ft−12}\{f_{t-1},\dots,f_{t-12}\}, so the strategies can be correlated by construction.

H1 (distinctness), tested factor by factor. For any factor whose volatility-managed portfolio earns a benchmark alpha significant at the 5% level, that alpha remains positive with a Newey–West t-statistic above 1.96 once the momentum-managed factor enters the spanning regression. H1 is informative only where there is an alpha to absorb; Table II shows this is the market factor alone.

H2 (implementability). Under expanding-window real-time implementation, the volatility-managed portfolio's annualized Sharpe ratio exceeds the unmanaged factor's.

The joint hypothesis requires both. Our code recorded a pre-committed rule requiring at least two of three factors on each condition; we report it alongside the factor-by-factor verdicts, which are the informative test.

III. Data and Methodology

A. Data

We use the file "Fama–French three factors, monthly" from the Kenneth R. French Data Library, Tuck School of Business, Dartmouth College (Fama and French 1993), retrieved on 8 September 2026. It holds 1,201 monthly observations from July 1926 to July 2026 in five columns: Date (first day of the month), Mkt-RF (the value-weighted CRSP market return less the one-month Treasury bill rate), SMB (small minus big), HML (high minus low book-to-market) and RF (the bill rate). All series are in percent per month and are divided by 100 before use; there are no missing values. One filter applies: an observation enters only if the factor has a complete twelve-month lagged history, which drops the first twelve months and leaves 1,189 monthly observations from July 1927 to July 2026 for each factor. The provider notes that pre-1963 coverage rests on thinner data; Section V treats that period separately.

B. Variable construction

For each factor f∈{Mkt-RF,SMB,HML}f \in \{\text{Mkt-RF}, \text{SMB}, \text{HML}\}, both signals use only information available at the close of month t−1t-1:

RVt−1=112∑j=112ft−j2,MOMt−1=∑j=112ft−j.(1)RV_{t-1} = \frac{1}{12}\sum_{j=1}^{12} f_{t-j}^{2}, \qquad MOM_{t-1} = \sum_{j=1}^{12} f_{t-j}. \tag{1}

The two managed portfolios are

ftv=cvRVt−1 ft,ftm=cm sign(MOMt−1) ft,(2)f^{v}_{t} = \frac{c_{v}}{RV_{t-1}}\, f_{t}, \qquad f^{m}_{t} = c_{m}\,\mathrm{sign}(MOM_{t-1})\, f_{t}, \tag{2}

where cvc_v and cmc_m set each managed series to the unconditional standard deviation of the unmanaged factor, following Moreira and Muir (2017). The momentum-managed portfolio goes short the factor after a losing year, the time-series construction of Gupta and Kelly (2019) and Ehsani and Linnainmaa (2022). Because the file is monthly, RVt−1RV_{t-1} is a trailing monthly-return variance rather than the within-month realized variance built from daily data; it is the only variance measure available across the century, and it bounds what we can conclude (Section VI).

C. Specifications

The benchmark and horse-race spanning regressions are

ftv=α+βft+εt,(3)f^{v}_{t} = \alpha + \beta f_{t} + \varepsilon_{t}, \tag{3} ftv=α+β1ft+β2ftm+εt,ftm=α+β1ft+β2ftv+εt.(4)f^{v}_{t} = \alpha + \beta_{1} f_{t} + \beta_{2} f^{m}_{t} + \varepsilon_{t}, \qquad f^{m}_{t} = \alpha + \beta_{1} f_{t} + \beta_{2} f^{v}_{t} + \varepsilon_{t}. \tag{4}

The predictive horse race regresses the factor on standardized signals, so each slope is a one-standard-deviation effect in percentage points per month:

ft=a+bvzt−1v+bmzt−1m+ut,zt−1v=std ⁣(RVt−1−1),  zt−1m=std(MOMt−1).(5)f_{t} = a + b_{v} z^{v}_{t-1} + b_{m} z^{m}_{t-1} + u_{t}, \qquad z^{v}_{t-1} = \mathrm{std}\!\left(RV_{t-1}^{-1}\right),\; z^{m}_{t-1} = \mathrm{std}(MOM_{t-1}). \tag{5}

All regressions use Newey and West (1987) standard errors with six lags; *, **, *** denote 10%, 5% and 1% significance. Alphas are annualized by multiplying the monthly intercept by twelve, and the appraisal ratio is the annualized alpha over the annualized residual standard deviation. Both cvc_v and cmc_m in equations (3) and (4) use the whole sample, so those alphas are not attainable by any investor; Table V is their implementable counterpart. It re-estimates cvc_v and cmc_m on the expanding window through t−1t-1 after a 120-month burn-in, giving 1,069 out-of-sample months from July 1937 to July 2026. Sharpe differences are tested by the Ledoit and Wolf (2008) studentized circular block bootstrap (block six, 999 replications, seed 20260908), and certainty equivalents are μ−12γσ2\mu - \tfrac{1}{2}\gamma\sigma^{2} at γ=5\gamma = 5.

IV. Results

Table I. Summary statistics for the Fama–French factors.

FactorNMean (%/yr)SD (%/yr)SharpeSkewnessCorr(RV−1RV^{-1}, MOMMOM)
Mkt-RF1,1898.2618.440.4480.160.11
SMB1,1892.0710.950.1891.77−0.19
HML1,1894.1912.330.3402.05−0.18

Notes. Monthly returns from the Kenneth R. French Data Library, re-annualized from percent per month; July 1927 to July 2026, all months with a complete twelve-month lagged history. Sharpe ratios are 12\sqrt{12} times the monthly mean-to-standard-deviation ratio; the last column correlates the two signals of equation (1).

Table II. Volatility-managed spanning regressions (benchmark) and managed-portfolio Sharpe ratios.

Mkt-RFSMBHML
α\alpha (%/yr)3.35** (2.34)−0.79 (−0.95)0.67 (0.65)
β\beta0.703 (8.06)0.674 (8.35)0.581 (5.38)
R2R^20.4940.4540.338
Residual SD (%/yr)13.128.0910.04
Appraisal ratio0.255−0.0970.066
Sharpe: unmanaged0.4480.1890.340
Sharpe: volatility-managed0.4960.0550.251
Sharpe: momentum-managed0.4120.3080.308
Corr(fvf^{v}, fmf^{m})0.2570.009−0.032
N1,1891,1891,189

Notes. Equation (3), July 1927 to July 2026, both scaling constants set on the full sample. Newey–West(6) standard errors, t-statistics in parentheses; *, **, *** denote 10%, 5% and 1%. Alphas and Sharpe ratios are annualized over the same 1,189 months.

The benchmark survives at the 5% level only for the market, at roughly two-thirds the magnitude reported with daily realized variance: 3.35% per year on 13.12% residual volatility, an appraisal ratio of 0.26 — real, but modest. For size and value the volatility-managed Sharpe ratio is below the unmanaged one. The last row shows the two managed legs are near-orthogonal, so the horse race is a genuine contest rather than a collinearity problem.

Table III. Horse-race spanning regressions.

Panel A: fvf^{v} on ff and fmf^{m}Panel B: fmf^{m} on ff and fvf^{v}
Mkt-RFSMBHMLMkt-RFSMBHML
α\alpha (%/yr)2.04 (1.52)−0.28 (−0.33)1.02 (0.97)5.56*** (2.99)2.59** (2.55)3.37*** (2.89)
β1\beta_1 (factor)0.685 (8.58)0.721 (11.31)0.595 (5.37)−0.170 (−0.71)0.471 (2.77)0.221 (1.49)
β2\beta_2 (other leg)0.192 (2.57)−0.181 (−3.04)−0.108 (−1.46)0.377 (2.36)−0.309 (−2.91)−0.160 (−1.82)
Residual SD (%/yr)12.657.879.9617.7010.2712.13
Appraisal ratio0.161−0.0350.1020.3140.2520.277
R2R^20.5310.4840.3490.0810.1210.033
N1,1891,1891,1891,1891,1891,189

Notes. Equation (4), July 1927 to July 2026, again with full-sample scaling constants, so neither panel's alpha is attainable in real time. Panel A adds the momentum-managed factor to the benchmark; Panel B is the mirror image. Newey–West(6) t-statistics in parentheses.

Table III refutes H1 where it is informative. The market is the only factor with a benchmark alpha to absorb, and the momentum-managed leg cuts it by 39%, from 3.35% to 2.04%, and the appraisal ratio from 0.26 to 0.16, leaving t = 1.52. For SMB and HML the horse race cannot discriminate, because Table II leaves nothing to absorb; the pre-committed count returns 0 of 3, but only the market entry is informative.

Panel B is the mirror-image specification and the result is not symmetric: all three momentum-managed alphas are positive, with t-statistics of 2.99, 2.55 and 2.89, significant at the 1%, 5% and 1% levels. This is not evidence of a better portfolio, and the Cederburg et al. (2020) diagnosis applies to it as forcefully as to the volatility-managed leg. The momentum-managed market's Sharpe ratio is 0.412 against 0.448 unmanaged in sample and 0.397 against 0.524 out of sample (Table V), and its Panel B alpha owes much to the loading of −0.170 on the factor itself, which turns a lower-Sharpe portfolio into a positive intercept against a benchmark it partly shorts. The claim is one of relative spanning only: factor momentum spans volatility management, not the reverse, while neither leg beats holding the factor.

Table IV. Predictive regressions of factor returns on standardized signals.

Mkt-RF (1)(2)(3)SMB (1)(2)(3)HML (1)(2)(3)
zt−1vz^{v}_{t-1}−0.078 (−0.57)−0.103 (−0.83)−0.141 (−1.59)−0.099 (−1.15)−0.153 (−1.45)−0.107 (−0.98)
zt−1mz^{m}_{t-1}0.212 (0.79)0.224 (0.84)0.239** (2.24)0.221** (1.99)0.274 (1.64)0.255 (1.46)
R2R^2 (%)0.020.160.200.200.570.670.180.590.68
Wald χ2\chi^2 (p)1.76 (0.42)7.14 (0.03)5.01 (0.08)

Notes. Equation (5), N = 1,189 months in every column; the dependent variable is the factor return in percent per month, so each coefficient is a one-standard-deviation effect in percentage points per month. Newey–West(6) t-statistics in parentheses; the Wald statistic tests both slopes jointly.

Table IV explains the asymmetry. The inverse-variance signal never forecasts the conditional mean: a one-standard-deviation increase in RVt−1−1RV^{-1}_{t-1} is associated with 8 to 15 basis points lower return next month for every factor, never with a t-statistic beyond −1.59. Factor momentum has the right sign everywhere and is significant at the 5% level for SMB, where a one-standard-deviation move is worth 24 basis points per month alone and 22 jointly; the joint Wald test rejects at the 5% level only for SMB. The volatility-managed market's gain thus comes not from return prediction but from normalizing a portfolio whose variance is predictable.

Table V. Real-time out-of-sample performance, July 1937 to July 2026.

Mean (%/yr)SD (%/yr)SharpeΔ\DeltaSharpeLW pCE (%/yr)Max DD (%)
Mkt-RF unmanaged8.2715.790.5242.04−55.7
Volatility-managed13.4426.490.507−0.0170.835−4.11−82.8
Momentum-managed6.3115.900.397−0.1270.418−0.01−47.3
SMB unmanaged1.709.960.171−0.78−54.9
Volatility-managed1.0512.830.082−0.0890.283−3.06−82.5
Momentum-managed2.4110.000.241+0.0700.612−0.09−57.3
HML unmanaged3.9610.120.3921.40−57.8
Volatility-managed5.4618.740.292−0.1000.290−3.31−49.7
Momentum-managed3.5410.120.350−0.0410.7970.98−37.9

Notes. Scaling constants re-estimated each month on an expanding window ending at t−1t-1 after a 120-month burn-in; 1,069 out-of-sample months. Δ\DeltaSharpe is managed minus unmanaged; LW p is the two-sided Ledoit and Wolf (2008) bootstrap p-value of Section III.C. CE is the certainty equivalent at risk aversion five; Max DD compounds monthly returns.

Table V refutes H2 for every factor. The volatility-managed Sharpe ratio is lower than the unmanaged one in all three cases, though no shortfall is distinguishable from zero at the 10% level: a real-time investor gained nothing, rather than demonstrably losing. The Sharpe comparison is the clean test of timing value, and it returns nothing. The certainty-equivalent column is not: because the real-time constant cannot equalize volatility ex post, the managed market realizes 26.49% annualized volatility against 15.79%, so the fall from +2.04% to −4.11% per year measures a leverage mismatch — an estimation failure in cvc_v — not the absence of timing information, and that mismatch also deepens maximum drawdown from −55.7% to −82.8%. Momentum management raises the real-time Sharpe ratio for one factor only, SMB (0.241 against 0.171, p = 0.612).

V. Robustness

Table VI. Real-time leverage and a capped-leverage variant.

Mean leverage95th pctMaxMonths above 2× (%)Sharpe, uncappedSharpe, capped at 3×
Mkt-RF1.743.9010.9733.20.5070.520
SMB1.383.7912.9723.60.0820.091
HML1.544.1610.6524.80.2920.308

Notes. Leverage is the real-time weight cv/RVt−1c_v/RV_{t-1} over the 1,069 out-of-sample months of Table V; the final column caps that weight at three before returns are computed. Sharpe ratios are annualized.

The strategy is genuinely levered — a third of months above twice the unmanaged position for the market, with a maximum of eleven times — yet capping the weight at three barely moves performance, 0.520 against 0.507. The verdict is neither a leverage artifact nor rescued by a realistic constraint.

Table VII. Subsample split at July 1963.

Mkt-RF preMkt-RF postSMB preSMB postHML preHML post
Benchmark α\alpha (%/yr)9.53*** (2.93)0.54 (0.43)−1.87 (−1.29)−0.17 (−0.17)2.46 (1.22)−0.48 (−0.45)
Horse-race α\alpha (%/yr)7.51** (2.43)−0.22 (−0.19)−1.02 (−0.72)0.14 (0.14)3.09 (1.40)−0.31 (−0.30)
N432757432757432757

Notes. Equations (3) and (4) on July 1927–June 1963 ("pre") and July 1963–July 2026 ("post"), scaling constants recomputed within each subsample. Newey–West(6) t-statistics in parentheses.

Table VII is the most damaging single result for volatility timing. The market's benchmark alpha is 9.53% per year before July 1963 and 0.54% after; in the horse race, 7.51% and −0.22%. The whole monthly-data effect lives in the period the provider flags for thinner coverage, and neither SMB nor HML is significant at the 10% level in either subsample.

Table VIII. Sensitivity of the benchmark alpha to the variance window.

Window (months)Mkt-RFSMBHMLN
31.35 (0.74)0.87 (0.88)−0.65 (−0.52)1,198
61.77 (1.08)−1.26 (−1.37)0.16 (0.15)1,195
123.35** (2.34)−0.79 (−0.95)0.67 (0.65)1,189
242.78** (2.03)−0.74 (−1.01)0.09 (0.08)1,177

Notes. Annualized alphas from equation (3), percent per year, Newey–West(6) t-statistics in parentheses, re-estimating RVt−1RV_{t-1} over the stated window. N varies because a longer window drops more initial months. The one positive in-sample result is fragile: the market alpha is insignificant at the 10% level at three and six months and reaches the 5% level only at twelve and twenty-four.

Three limitations bear on the reading. The variance proxy uses twelve trailing monthly returns, not within-month daily data as in Moreira and Muir (2017), so our nulls bound the informativeness of monthly-frequency variance, not of volatility timing in general. All returns are gross: no transaction, financing or margin costs are imposed on a strategy levered above two in a third of months, so Table V is an upper bound. And the momentum-managed leg uses a sign-based weight; no long-only or continuously scaled variant was estimated. We test three factors from one country.

VI. Conclusion

On a century of monthly U.S. factor returns, and with a variance signal built from monthly data alone, volatility management is neither distinct from time-series factor momentum nor implementable in real time. Its only trace is a market alpha of 3.35% per year that falls to 2.04% and loses significance at the 5% level once a momentum-managed leg is present, is confined to the pre-1963 sample, and yields no out-of-sample Sharpe improvement. The mirror specification survives for all three factors, but with lower Sharpe ratios than the unmanaged factors, so the Cederburg et al. (2020) and Liu, Tang and Zhou (2019) diagnosis — spanning alphas without portfolio gains — applies to both legs alike.

The qualifier matters. Table VIII shows the in-sample estimate depends on the variance window, so our evidence bounds the timing content of monthly-frequency variance; we cannot reject that a within-month realized variance from daily returns would deliver a different answer, and testing that is the natural next step, since Barroso and Detzel (2021) and DeMiguel, Martín-Utrera and Uppal (2024) both find structure a single-factor monthly design cannot see. Whether the pre-1963 concentration reflects time variation in the risk–return trade-off or the thinner data of that era is unresolved.

References

Arnott, Robert D., Vitali Kalesnik, and Juhani T. Linnainmaa, 2023, Factor momentum, Review of Financial Studies 36, 3034–3070.

Barroso, Pedro, and Andrew Detzel, 2021, Do limits to arbitrage explain the benefits of volatility-managed portfolios?, Journal of Financial Economics 140, 744–767.

Barroso, Pedro, and Pedro Santa-Clara, 2015, Momentum has its moments, Journal of Financial Economics 116, 111–120.

Cederburg, Scott, Michael S. O'Doherty, Feifei Wang, and Xuemin Sterling Yan, 2020, On the performance of volatility-managed portfolios, Journal of Financial Economics 138, 95–117.

DeMiguel, Victor, Alberto Martín-Utrera, and Raman Uppal, 2024, A multifactor perspective on volatility-managed portfolios, Journal of Finance 79, issue 6.

Ehsani, Sina, and Juhani T. Linnainmaa, 2022, Factor momentum and the momentum factor, Journal of Finance 77, 1877–1919.

Fama, Eugene F., and Kenneth R. French, 1993, Common risk factors in the returns on stocks and bonds, Journal of Financial Economics 33, 3–56.

French, Kenneth R., G. William Schwert, and Robert F. Stambaugh, 1987, Expected stock returns and volatility, Journal of Financial Economics 19, 3–29.

Goyal, Amit, and Ivo Welch, 2008, A comprehensive look at the empirical performance of equity premium prediction, Review of Financial Studies 21, 1455–1508.

Grobys, Klaus, James W. Kolari, and Jere Rutanen, 2022, Factor momentum, option-implied volatility scaling, and investor sentiment, Journal of Asset Management 23, 138–155.

Gupta, Tarun, and Bryan Kelly, 2019, Factor momentum everywhere, Journal of Portfolio Management 45, 13–36.

Haddad, Valentin, Serhiy Kozak, and Shrihari Santosh, 2020, Factor timing, Review of Financial Studies 33, 1980–2018.

Ledoit, Olivier, and Michael Wolf, 2008, Robust performance hypothesis testing with the Sharpe ratio, Journal of Empirical Finance 15, 850–859.

Liu, Fang, Xiaoxiao Tang, and Guofu Zhou, 2019, Volatility-managed portfolio: Does it really work?, Journal of Portfolio Management 46, 38–51.

Moreira, Alan, and Tyler Muir, 2017, Volatility-managed portfolios, Journal of Finance 72, 1611–1644.

Moreira, Alan, and Tyler Muir, 2019, Should long-term investors time volatility?, Journal of Financial Economics 131, 507–527.

Newey, Whitney K., and Kenneth D. West, 1987, A simple, positive semi-definite, heteroskedasticity and autocorrelation consistent covariance matrix, Econometrica 55, 703–708.

6.Review

Attempt 2Done

Automated review: Minor revision (novelty 3, rigor 4, clarity 4, reproducibility 5).

Minor revision
Novelty 3/5Rigor 4/5Clarity 4/5Reproducibility 5/5

This revision answers all six points raised in the previous round. H1 is now stated factor by factor and conditional on there being a benchmark alpha to absorb, and Section IV says plainly that only the market entry is informative; the in-sample momentum-managed Sharpe ratios are reported in Table II and the Cederburg et al. (2020) diagnosis is applied symmetrically to both legs, including the -0.170 loading that inflates the Panel B intercept; the certainty-equivalent comparison is explicitly demoted to a leverage-mismatch result and the Sharpe comparison carries the verdict; the horse-race appraisal ratios, residual volatilities, leverage distribution and capped-leverage Sharpe ratios have all moved into numbered tables; the mirror-image sentence is corrected and both table sets are flagged as unattainable full-sample objects with Table V as the implementable counterpart; and the conclusion now bounds its claim to the timing content of monthly-frequency variance. The manuscript is faithful to the executed script and to the recorded provenance in every particular I checked - dataset, provider, retrieval date, 1,201 rows loaded and 1,189 analysed, the sample filter, the estimators, the standard errors and the seed. What remains is presentational and interpretive: one verb that overstates a null result, an undisclosed full-sample standardisation in the predictive regressions, an unreadable Table IV, and two small reference and table blemishes. None requires new estimation. The contribution is honest and well executed but incremental for this venue, which is why novelty stays at 3.

Strengths

  • The head-to-head design is the paper's genuine contribution. Volatility management and time-series factor momentum are both functions of the same twelve trailing returns, and running them against each other in the same spanning regression, on the same factors, under one real-time protocol, is a test the two literatures have not confronted. The asymmetry the paper documents - momentum-managed alphas of 5.56%, 2.59% and 3.37% per year survive a volatility-managed control while the volatility-managed market alpha falls from 3.35% (t = 2.34) to 2.04% (t = 1.52) - is a clean and interpretable result.
  • The data section matches the experiment record exactly. The file is correctly identified as the monthly Fama-French three-factor series from the Kenneth R. French Data Library, Tuck School of Business, Dartmouth College, retrieved 8 September 2026, 1,201 rows spanning July 1926 to July 2026, five named columns with units in percent per month, no missing values, and a single stated filter (a complete twelve-month lagged history) that leaves 1,189 observations from July 1927 to July 2026. The data are nowhere described as simulated, and no dataset other than the recorded one is claimed.
  • Every number in Tables I through VIII traces to the executed script, including the ones the previous round left in prose. The horse-race appraisal ratios (0.161, -0.035, 0.102), benchmark and horse-race residual volatilities, the real-time leverage distribution (mean 1.74, 95th percentile 3.90, maximum 10.97, 33.2% of months above two) and the capped-leverage Sharpe ratio of 0.520 against 0.507 now all sit in numbered tables with notes. No table, sweep or robustness check appears that the script did not run.
  • The revision applies the Cederburg, O'Doherty, Wang and Yan (2020) diagnosis symmetrically. The paragraph after Table III states plainly that the Panel B alphas are not evidence of a better portfolio, gives the momentum-managed market's Sharpe ratio of 0.412 against 0.448 in sample and 0.397 against 0.524 out of sample, and attributes part of the intercept to the -0.170 loading on the factor. This is the intellectually honest reading and it is now the paper's own.
  • The separation of the two real-time failures is correct and clearly argued. The paper states that the managed market realises 26.49% annualised volatility against 15.79%, concludes that the certainty-equivalent fall from +2.04% to -4.11% per year is a leverage mismatch rather than evidence about timing, and rests the verdict on the Sharpe comparison instead. It also concedes that no real-time Sharpe difference is distinguishable from zero at the 10% level, so the claim is that the investor gained nothing rather than that she demonstrably lost.
  • Reproducibility is exemplary. The variance and momentum signals, the scaling normalisation, the 120-month burn-in, the six-lag Newey-West covariance, the Ledoit and Wolf (2008) bootstrap parameters (block six, 999 replications, seed 20260908) and the risk-aversion parameter are all stated in the text, and each matches the executed script.

Weaknesses

  • The incremental contribution is real but modest for this venue. The negative real-time verdict reproduces Cederburg et al. (2020) and Liu, Tang and Zhou (2019) on new factors and a longer sample rather than overturning them, and the one genuinely new object - the horse race - is informative for a single test asset, because Table II leaves no benchmark alpha to absorb for SMB or HML. Three factors is thin ground on which to adjudicate between two literatures.
  • Table V is said to 'refute H2 for every factor', but the same paragraph concedes that no Sharpe shortfall is distinguishable from zero at the 10% level. Both statements are defensible on their own terms - the pre-committed condition required the managed Sharpe ratio to exceed the unmanaged one, and the point estimates do not - but 'refutes' reads as a stronger negative than the standard errors support.
  • The signals in the predictive regressions of Table IV are standardised with full-sample means and standard deviations, as the executed script does. Those regressions are therefore in-sample evidence, subject to the same look-ahead the paper criticises elsewhere. The manuscript flags the full-sample scaling constants of Tables II and III but is silent on this one, even though Table IV carries a good deal of the interpretive weight.
  • Table IV, with ten columns of specification-by-factor results, is difficult to read and out of keeping with the venue's table conventions. Table III's two panels laid side by side across seven columns has the same problem to a lesser degree.
  • The paper reports gross returns on a strategy that is levered above two in a third of out-of-sample months and above ten at its peak. This is acknowledged as a limitation, and no cost analysis was executed, but it means the real-time comparison is an upper bound on what any investor could have realised, and the reader should be reminded of that where Table V is interpreted rather than only in the limitations paragraph.
  • Minor: Table I reports skewness, which is never used in the argument; the Robustness prose rounds a maximum leverage of 10.97 to 'eleven times'; and the DeMiguel, Martin-Utrera and Uppal (2024) entry in the reference list carries an issue number in place of page numbers, which is not the venue's format.

Required changes

  • Soften the verdict language around Table V. Replace 'refutes H2 for every factor' with a statement that the pre-committed condition fails for all three factors because every point estimate of the Sharpe difference is negative, while making clear in the same sentence that the data cannot reject equality of the managed and unmanaged Sharpe ratios. The substance of the paragraph is already correct; only the headline verb overstates it.
  • State in Section III.C, or in the notes to Table IV, that the standardised signals in equation (5) use full-sample means and standard deviations, so those predictive regressions are in-sample and share the look-ahead the paper criticises in Tables II and III. No re-estimation is required - a one-sentence disclosure is enough, and it strengthens rather than weakens the paper's argument, since the volatility signal fails even with that advantage.
  • Recast Table IV so that each factor occupies a row and the three specifications are grouped columns, or split it into two panels. Ten columns of coefficient-and-t-statistic pairs is unreadable at the venue's page width.
  • Add one clause where Table V is interpreted noting that all returns are gross and the comparison is therefore an upper bound, rather than leaving that qualification only to the limitations paragraph at the end of Section V.
  • Correct the DeMiguel, Martin-Utrera and Uppal (2024) reference to the venue's format with page numbers, or state that the article is forthcoming, and either use the skewness column of Table I in the discussion or drop it.

Record

§Event timeline

  1. Run createdQuestion: “Do volatility-managed factor portfolios survive real-time implementation and a horse race against time-series factor momentum? A century of US market, size and value factors” · output language: English · venue: Finance · Journal of Finance · models: agent:claude-opus-5
  2. Stage started · Literature reviewAttempt 1 · agent:claude-opus-5
  3. awaiting_agent · Literature reviewsearch response for literature_review: literature_review-search-1.response.json
  4. Resume requested
  5. Stage started · Literature reviewAttempt 2 · agent:claude-opus-5
  6. Search complete · Literature review21 sources · 8,695 characters of notes
  7. awaiting_agent · Literature reviewcomplete_json response for literature_review: literature_review-complete_json-1.response.json
  8. Resume requested
  9. Stage started · Literature reviewAttempt 3 · agent:claude-opus-5
  10. Search complete · Literature review21 sources · 8,695 characters of notes
  11. Stage completed · Literature review
  12. Stage started · IdeationAttempt 1 · agent:claude-opus-5
  13. awaiting_agent · Ideationcomplete_json response for ideation: ideation-complete_json-1.response.json
  14. Resume requested
  15. Stage started · IdeationAttempt 2 · agent:claude-opus-5
  16. Awaiting approval · Ideation
  17. Approved · IdeationIdea 1 selected
  18. Stage started · ExperimentationAttempt 1 · agent:claude-opus-5
  19. Dataset provisioned · Experimentationff_factors_monthly · 1,201 observations · 5 variables · sha256 b840dba55d31
  20. awaiting_agent · Experimentationcomplete response for experimentation: experimentation-complete-1.response.txt
  21. Resume requested
  22. Stage started · ExperimentationAttempt 2 · agent:claude-opus-5
  23. Dataset provisioned · Experimentationff_factors_monthly · 1,201 observations · 5 variables · sha256 b840dba55d31
  24. awaiting_agent · Experimentationcomplete response for experimentation: experimentation-complete-1.response.txt
  25. Resume requested
  26. Stage started · ExperimentationAttempt 3 · agent:claude-opus-5
  27. Dataset provisioned · Experimentationff_factors_monthly · 1,201 observations · 5 variables · sha256 b840dba55d31
  28. Experiment round · ExperimentationRound 1: exit 0; result parsed (1.44s)
  29. Stage completed · Experimentation
  30. Stage started · AnalysisAttempt 1 · agent:claude-opus-5
  31. awaiting_agent · Analysiscomplete_json response for analysis: analysis-complete_json-1.response.json
  32. Resume requested
  33. Stage started · AnalysisAttempt 2 · agent:claude-opus-5
  34. Stage completed · Analysis
  35. Stage started · Paper writingAttempt 1 · agent:claude-opus-5
  36. awaiting_agent · Paper writingcomplete response for paper_writing: paper_writing-complete-1.response.txt
  37. Resume requested
  38. Stage started · Paper writingAttempt 2 · agent:claude-opus-5
  39. Stage completed · Paper writing
  40. Stage started · ReviewAttempt 1 · agent:claude-opus-5
  41. awaiting_agent · Reviewcomplete_json response for review: review-complete_json-1.response.json
  42. Resume requested
  43. Stage started · ReviewAttempt 2 · agent:claude-opus-5
  44. Awaiting approval · Review
  45. Sent back for revision · ReviewRe-running from Paper writing: “The referee recommends major_revision. Address every required change verbatim, using only numbers already in the executed RESULT_JSON. Required changes, quoted:\n\n(1) "Restate H1 so that it is testable”
  46. Stage started · Paper writingAttempt 3 · agent:claude-opus-5
  47. Stage completed · Paper writing
  48. Stage started · ReviewAttempt 1 · agent:claude-opus-5
  49. Awaiting approval · Review
  50. Resume requested
  51. Resume requested
  52. Sent back for revision · ReviewRe-running from Paper writing: “Referee recommendation: major_revision. Rewrite the manuscript to address every required change below, using only numbers already produced by the executed script.\n\n(1) "Restate H1 so that it is testab”
  53. Stage started · Paper writingAttempt 4 · agent:claude-opus-5
  54. awaiting_agent · Paper writingcomplete response for paper_writing: paper_writing-complete-1.response.txt
  55. Resume requested
  56. Stage started · Paper writingAttempt 5 · agent:claude-opus-5
  57. Stage completed · Paper writing
  58. Stage started · ReviewAttempt 1 · agent:claude-opus-5
  59. awaiting_agent · Reviewcomplete_json response for review: review-complete_json-1.response.json
  60. Resume requested
  61. Stage started · ReviewAttempt 2 · agent:claude-opus-5
  62. Awaiting approval · Review
  63. Approved · Review
  64. Run completereport=/private/tmp/claude-501/-Users-haodingresearch-Desktop-auto-research/579004ae-5819-417d-918c-9d9409997567/scratchpad/studies/finance-en/runs/7af2280f389b/REPORT.md
  65. Resume requested
  66. Run completereport=/private/tmp/claude-501/-Users-haodingresearch-Desktop-auto-research/579004ae-5819-417d-918c-9d9409997567/scratchpad/studies/finance-en/runs/7af2280f389b/REPORT.md