Momentum, third review, and trend by speed: pre-registered specification
Written 2026-10-15, before any result below was computed; the commit that adds this file is the freeze. Changes after results are logged at the bottom with the date and the reason. Brief: docs/briefs/momentum_v3_and_trend_speeds.md. Builds on momentum_barometer_spec.md (MO-H1 to MO-H5: the stock momentum premium passed, the blend failed MO-H2, the crash flag MO-H3 was directionally strong at p 0.035 against a bar of 0.0167, sector rotation failed) and trend_models_v2_spec.md (TM-H1 to TM-H7: volatility scaling, slow/fast turning points, Markov switching, the 52-week high across sectors and variance ratios all failed on index trend). The 24-vote trend score of trend_barometer_spec.md stays as registered; nothing here changes it.
The study’s working folder is research/studies/momentum-and-trend-speed/ (the simplified desk, docs/plans/research_desk.md); this file is its frozen plan.
What the literature says, and what I expect
Every reference below was checked on 2026-10-15 against the publisher’s or RePEc’s record (title, authors, journal, volume, year) and its abstract; where only the abstract was seen, the claim cited is the abstract’s.
- Da, Gurun and Warachka, “Frog in the Pan: Continuous Information and Momentum”, Review of Financial Studies 27(7), 2014, pp. 2171–2218. Investors under-react to information that arrives continuously in small amounts. Momentum is 5.94% (over the paper’s six-month holding period) among stocks whose formation-period return came from many small moves, against −2.07% among stocks with a similar formation return made of a few large moves. Their measure of information discreteness is ID = sign(PRET) × (% of days with a negative return − % with a positive return) over the formation window; a low ID is continuous information.
- Barroso and Santa-Clara, “Momentum Has Its Moments”, Journal of Financial Economics 116(1), 2015, pp. 111–120. Momentum’s risk varies and is predictable from its own recent realised variance; scaling the winners-minus-losers factor to a constant target volatility nearly eliminates its crashes and roughly doubles its Sharpe ratio. Their estimate is the realised variance of the factor’s daily returns over the previous 126 sessions.
- Cederburg, O’Doherty, Wang and Yan, “On the Performance of Volatility-Managed Portfolios”, Journal of Financial Economics 138(1), 2020 (verified for
trend_models_v2_spec.md): across 103 equity strategies, volatility-managed versions do not beat the unmanaged ones out of sample. This is the sceptical prior; TM-H1 here found scaling hurt long-only index trend rules. - Daniel and Moskowitz, “Momentum Crashes”, Journal of Financial Economics 122(2), 2016 (verified for
trend_models_v2_spec.md): momentum crashes follow market falls, when markets rebound. MO-H3’s flag comes from this paper. - Novy-Marx, “Is Momentum Really Momentum?”, Journal of Financial Economics 103(3), 2012, pp. 429–453. In US stocks, momentum comes mainly from returns 12 to 7 months before formation; strategies on the most recent months (6 to 2) earn less.
- Goyal and Wahal, “Is Momentum an Echo?”, Journal of Financial and Quantitative Analysis 50(6), 2015, pp. 1237–1267. In 37 countries outside the US there is no robust evidence that 12-to-7 beats 6-to-2; in the US the “echo” is largely a carry-over of the short-term reversal from month −2. Expectation for MO-H9, stated now: fail.
- Mackic (Man AHL), “The Need for Speed in Trend-Following Strategies”, Man Group, 4 January 2023. Double exponentially weighted moving-average crossovers at five speeds across the 50 most liquid futures and FX markets, 1995 to August 2022, each speed scaled to 10% volatility. Risk-adjusted returns rise with slower speeds; skewness and the return in the worst quintile of S&P 500 one- and three-month returns (“crisis alpha”) improve with faster speeds; the fastest and slowest speeds correlate 0.17; Man favours a tilt toward fast speeds for defensive use. Costs fall hardest on fast speeds (“efficient execution is the gatekeeper to being able to trade fast”), and the crisis gains come from all asset classes, bonds most before 2022.
Why the Man result may not carry over here. Their speeds are long/short, so a fast model can be short in a crash; mine are long or cash. Their crisis gains lean on bond longs and equity shorts across 50 markets; mine are one market at a time, with gold and the G-sec index the only non-equity markets. They pay institutional execution costs and no tax on trading; my replays pay 0.10% each way and a resident investor’s capital-gains tax, and a faster rule realises gains more often. Expectation for Part B, stated now: the fast sub-score cuts the worst fall and the loss in the market’s worst months, earns no more before tax than the slow one, and earns less after tax; a fast-tilted blend is not reliably different from the equal blend (the registered score); no speed beats buying and holding after deflation.
Part A: stock momentum (the barometer’s instrument)
Data and universe (unchanged from momentum_barometer_spec.md)
The point-in-time liquid NSE universe, month-end panel, adjusted bhavcopy closes (price returns), eligibility, quintile construction, partial-month exclusion and dating conventions of compute/barometers_momentum.py, as run in production. Formation months from the first month-end with 300 eligible stocks to the last completed month. Long-short is Q5 − Q1, equal weight, gross. Long-only is Q5 net of 0.25% each way against the universe’s equal weight. Newey-West t with 6 lags, one-sided where stated. “Both halves” splits the formation months at their calendar middle.
Daily inputs (new). Daily returns per stock are close-to-close on its own consecutive adjusted bars (equity_prices_adjusted, ETFs and SME excluded). The daily return of a portfolio formed at month-end t is that of buy-and-hold equal initial weights from the close of t (value = the mean over its stocks of close/close at t; a stock that stops trading is held flat), so its daily returns compound exactly to the monthly return the barometer uses.
Multiple testing for Part A
α = 0.05/4 = 0.0125 for each of MO-H6 to MO-H9. Trials added to the momentum family’s deflated-Sharpe count (16 in MO-H1: 7 signals × 2 holding schemes, plus the 2 sector trials of the first run): MO-H6 2 (one- and six-month holding), MO-H7 2 (long-only, one- and three-month holding, as MO-H1), MO-H8 3 (estimation windows of 63, 126 and 252 sessions), MO-H9 2 (12-to-7 and 6-to-2). N = 16 + 9 = 25. The variance of trial Sharpe ratios for the deflated Sharpe ratio is taken, as in MO-H1, over the long-only excess series (the 14 of MO-H1 plus MO-H7’s 2). MO-H5’s sector rotation keeps its own count of 3; nothing here adds to it.
MO-H6: frog in the pan, the double sort (tested)
- ID for each stock at month-end t: over the daily returns in the r12_1 window (after the close of month-end t−12, to the close of month-end t−1), ID = sign(PRET) × (share of days with a negative return − share with a positive return), PRET = r12_1; zero-return days count in the denominator only. At least 150 daily returns in the window.
- Sort: among eligible stocks with r12_1 and ID, quintiles by r12_1 (the barometer’s rule). Within Q5 and within Q1 separately, terciles by ID. Continuous momentum = (Q5, lowest-ID tercile) − (Q1, lowest-ID tercile); discrete momentum = (Q5, highest-ID tercile) − (Q1, highest-ID tercile). Equal weight, gross.
- Test: the mean monthly return of continuous minus discrete momentum, one-month holding, is above zero. Passes if the one-sided Newey-West p < 0.0125 and the mean is positive in both halves.
- Reported with it: the six-month holding version (six overlapping sleeves, Jegadeesh and Titman; the paper’s horizon), each leg’s mean return, and the four-cell means.
MO-H7: a seventh flavour in the blend (tested; the joining bar)
- Flavour
fip(continuous-path momentum): share of positive days minus share of negative days over the r12_1 window (= −sign(PRET) × ID). High for a stock that rose through many small up days. - Blend 7: the barometer’s blend rule over seven flavours (z-score, winsorise at ±3, re-standardise, equal-weight mean of the available flavours, at least 4).
- Passes, and
fipjoins the published blend, only if all hold:- the mean monthly blend-7 long-short minus blend-6 long-short is above zero, one-sided Newey-West p < 0.0125;
- that difference is positive in both halves;
- blend 7’s long-short worst fall is no deeper than blend 6’s;
- the deflated Sharpe ratio of blend 7’s long-only Q5 (one-month) against the universe is above 0.95, N = 25.
- Reported with it:
fip’s average cross-sectional correlation with the six flavours; the three-month tranched long-only; turnover.
MO-H8: the volatility-managed momentum factor (a factor reading, with a stated bar)
- Factor: the published blend long-short (Q5 − Q1 by the six-flavour blend, one-month, gross). Its daily returns per the daily-inputs rule above.
- Estimate at formation t: σ̂ = √(252 × mean of the squared daily factor returns over the 126 sessions to t). Only portfolios formed before t enter, so σ̂ is known at t. The first scaled month is the first with 126 daily factor returns.
- Scaled factor: return in month t+1 = (12% / σ̂_t) × the factor’s return in month t+1. No cap on the weight (as Barroso and Santa-Clara); the largest and median weights are reported. A constant target does not change the Sharpe ratio; for the worst month and the crash months the scaled series is also shown rescaled to the unscaled series’ full-sample volatility (ex post, for comparison only).
- “Volatility management helps” passes if all hold: the Sharpe ratio of the scaled factor minus that of the unscaled one, on the same months, is above zero with a one-sided 6-month block-bootstrap p < 0.0125 (2,000 resamples, seed 20261015); the difference is positive in both halves; and it is positive with the 63- and 252-session windows too.
- Reported either way: Sharpe, skew, worst month, worst fall, the mean in MO-H3’s flagged months (24-month Nifty 500 return below zero), and the worst ten months of each.
- It is a reading of the factor, not a product: a gross long-short with leverage that moves monthly; the page says so. The site carries the current σ̂, its percentile in its own history and the weight it implies, whether or not the test passes.
MO-H9: intermediate against recent momentum (tested; expected to fail)
- r12_7 = P(t−7)/P(t−12) − 1 and r6_2 = P(t−2)/P(t−6) − 1 on month-end prices, eligible universe, quintile long-short, one-month holding.
- Passes if the mean monthly long-short of r12_7 minus that of r6_2 is above zero, one-sided Newey-West p < 0.0125, positive in both halves. Each leg’s mean and t are reported.
Part B: trend by speed
Data (as trend_models_v2_spec.md)
- Markets: the investable markets of
compute/trend_section.load_markets(NSE indices, gold, the 5-year G-sec index) with a known launch date, scored post-launch only; a market counts with at least 756 post-launch sessions (TM-H1’s rule). Signals may warm up on pre-launch history; only post-launch returns are scored. - Signals: the registered 24 votes (
barometers_trend.signals) on the excess-return level over the 91-day T-bill. No new signal types or horizons. - Sub-scores: fast = share of the 8 votes at 21 and 42 sessions that are up, × 100; medium = the 8 at 63 and 126; slow = the 8 at 189 and 252. The equal blend of the three is the registered 24-vote score (full). Tilt = 0.5 fast + 0.3 medium + 0.2 slow. All five are defined only where all 24 votes exist, so every strategy on a market starts on the same day.
- Strategies, long or cash per market: exposure = sub-score / 100;
trend.backtest(signal at close t, traded at close t+1); costs as the existing replays (0.10% of value traded each way; fund costs equity 0.15%, gold 0.50%, G-sec 0.20%, cash 0.20% a year). Buying and holding is the base. - After tax: the lab’s engine via
aftertax.after_tax_wealth(30% slab, no surcharge, FIFO lots, set-off, final liquidation), on each market’s post-launch exposure path. Each change of exposure (steps of 1/8, or 1/24 for full) is a trade. - Measures per market: CAGR, Sharpe over cash (daily, √252), worst fall, skew of calendar-month returns, one-way turnover a year (Σ|Δexposure| / years), share of time invested, pre-cost Sharpe (trading cost added back), after-tax CAGR. Summaries are medians across markets, with Nifty 500 as the worked example.
- Inference: stationary bootstrap over dates jointly across markets (block 21 sessions, 2,000 resamples, seed 20261015), as TM-H1; “both halves” splits each market’s post-launch period at its middle date. Months for B2 are resampled in blocks of 6 months.
- Multiple testing: Holm across SP-H1, SP-H2 and SP-H4 at family α = 0.05. Trials added to the trend family’s deflated-Sharpe count (107 after
trend_models_v2_spec.md): fast, medium, slow and tilt, N = 111. The full ensemble is already counted. The trial-Sharpe variance is taken over the five (fast, medium, slow, full, tilt).
B1. How do the speeds differ? (measurement, with SP-H1 and SP-H3)
The table of measures above for fast, medium, slow, full and tilt, against buying and holding. Expected: median after-cost Sharpe of slow at or above fast’s; fast has the highest turnover.
- SP-H1, drawdown (tested): median across markets of (worst fall of fast − worst fall of slow), both as negative percentages, is above zero (fast shallower), with the one-sided bootstrap p < its Holm level and positive in both halves.
- SP-H3, tax (descriptive bar): the median across markets of (after-tax CAGR of fast − of slow) is below zero, and fast trails slow after tax on at least two-thirds of markets. The pre-tax gap is reported beside it.
B2. Crisis behaviour (Man’s Figure 1, with SP-H2)
- Portfolio per speed: the equal-weight average, each calendar month, of the monthly returns of the counted markets’ strategies that are in sample that month. Also buying and holding. Also Nifty 500’s own strategies alone.
- Buckets: quintiles of Nifty 500’s total-return monthly return over the sample months (1-month), and of its 3-month return ending at each month-end (3-month, overlapping, against each strategy’s 3-month return over the same window).
- SP-H2, crisis (tested): in Nifty 500’s worst 1-month quintile, the mean monthly return of fast minus slow is above zero, one-sided block-bootstrap p below its Holm level, positive in both halves (split at the calendar middle of the months).
- Reported: the mean return of every strategy in all five quintiles, for 1 and 3 months, with intervals.
B3. A fast-tilted blend (SP-H4)
- SP-H4 (tested, two-sided): median across markets of Sharpe(tilt) − Sharpe(full); the bootstrap interval excludes zero and the sign holds in both halves. The worst-fall gap and the after-tax gap are reported. Expected: fail (the two scores share most of their votes’ weight).
SP-H5. Does any speed beat buying and holding? (tested; expected to fail)
For each of fast, medium, slow and tilt: the deflated Sharpe ratio of the equal-weight cross-market daily series of (strategy − buying and holding) is above 0.95 with N = 111, and the median Sharpe gap against buying and holding has its 95% interval above zero.
Descriptive readings on the trend pages (no trials)
- Each market’s fast, medium and slow sub-scores today on
/trend/tables and/trend/[slug]/, with their history on the market page. - “Speeds disagree” when the fast and slow sub-scores point opposite ways by a majority: one at 62.5 or above (5 of 8 votes up) and the other at 37.5 or below. Fast up and slow down reads “short-term bounce in a longer downtrend”; the reverse, “short-term dip in a longer uptrend”. A description, with the SP results beside it.
Part C: what reaches the site
- Momentum barometer: the MO-H8 factor reading either way, labelled a reading of a gross long-short factor;
fipin the blend only if MO-H7 passes; a frog-in-the-pan reading only if MO-H6 passes. Every result goes on the page’s evidence section. - Trend pages: the sub-scores and the disagreement flag; the SP results on
/trend/evidence/. - One standalone research piece under
/research/covering both parts, in the first person, linked from/momentum-barometer/and/trend/evidence/. Headline numbers are recomputed by a model of another family from this plan alone (step 4), and one review pass by another family (step 6).
Not tested, stated in advance
No other ID windows, tercile counts, holding periods, volatility targets, caps, speed groupings, tilt weights, signal types or universes. No long/short or volatility-scaled version of the speed strategies (TM-H1 already rejected scaling here). No industry-neutral or size-split momentum. No exponential crossovers as in Man’s note: the speeds are groupings of the registered votes. Anything tried after the first results is exploratory and labelled so.
Results log
Implementation notes, Part A, 2026-10-15, written before its first run
(Freeze commit: written as 61466ed on the branch; rebased onto main before release as 34295db, with this file and the plan byte-identical; the author date (15 Oct 2026, 10:29 IST) is unchanged.)
Code: pipeline/tipsheet/compute/momentum_v3.py, reusing barometers_momentum’s panel, flavours, quintiles and long-only functions unchanged.
- ID window: the daily returns dated in the 11 calendar months whose month-ends are t−11 … t−1 (the sessions after month-end t−12 up to month-end t−1). A stock’s daily return is on its own consecutive bars, so a return across a suspension is one day.
- Terciles within Q5 and Q1 by rank (ties broken by order, as the barometer’s quintiles).
- Six-month holding: each month’s return is the mean of the six sleeves formed in the last six months, each sleeve’s stocks’ returns in that month (a stock that stopped trading earns zero), as
long_onlydoes for tranches. - Daily factor returns (MO-H8): for each formation month, the daily return of each leg’s equal-initial-weight buy-and-hold value from the formation close to the next formation close, Q5 minus Q1. σ̂ at t uses the daily factor returns on sessions up to and including t. The one-sided bootstrap p is the share of the 2,000 resampled Sharpe gaps at or below zero. The neighbourhood windows use 200 resamples (only their point estimates enter the bar).
Implementation notes, Part B, 2026-10-15, written before its first run
Code: pipeline/tipsheet/compute/trend_speeds.py, on trend_v2.Panel (TM-H1’s markets, levels, cash and post-launch starts).
- Nifty 500 has no known launch date (
docs/methods/trend_momentum.md), so it is not in the counted post-launch sample. The worked example is its full history from the first day with all 24 votes, labelled a description. - Buying and holding on each market is scored on the same days as the strategies (from the first full grid, post-launch).
- SP-H1 bootstrap: dates resampled jointly across markets (stationary, block 21); each market’s worst fall recomputed on the resampled path (days outside its sample contribute nothing). The one-sided p is the share of resampled median gaps at or below zero. Both halves are point estimates.
- SP-H2: calendar months, the first (partial) month and any incomplete last month dropped. Quintile labels come from the full sample; months are resampled in circular blocks of six over the whole calendar and the worst-quintile mean recomputed on each resample. The per-quintile intervals in the reported table use 500 resamples.
- SP-H4: the two-sided p is twice the smaller tail share of the resampled median Sharpe gaps.
- SP-H5: the base is each market’s buying and holding on the strategies’ days; the trial-Sharpe variance is over the five equal-weight daily (strategy − buying and holding) series.
Results, 2026-10-15 (data to 13 October 2026)
Ran as specified; nothing changed after results were seen. Raw output in .cache/research/momentum-and-trend-speed/, frozen in docs/research/results/momentum_v3.json; study facts in research/studies/momentum-and-trend-speed/results/results.json. The independent recalculation (gemini-flash-high, from this plan’s definitions alone) matched all 18 headline facts; the look-ahead probes on σ̂ and the ID window passed.
Part A (formation months Dec 2003 to Aug 2026, 263 months).
- MO-H6, frog in the pan: pass, by a hair. Continuous momentum 2.22% a month against discrete 1.34%; the difference 0.88% a month, Newey-West t 2.25, one-sided p 0.0121 against a bar of 0.0125. Positive in both halves, but much smaller in the second (1.33% then 0.46%). The six-month holding version: 0.76% a month, p 0.0087, 0.81% and 0.71% in the halves. Cells: continuous winners 2.31%, continuous losers 0.09%, discrete winners 2.02%, discrete losers 0.68% a month; the gap comes mostly from the losers’ side (continuous losers kept losing more). Cells hold a median of 42 stocks.
- MO-H7,
fipas a seventh flavour: fail. Blend 7 minus blend 6: −0.02% a month (p 0.64), negative in both halves; Sharpe 1.04 against 1.07; worst fall −54.0% against −53.8%. The long-only deflated Sharpe ratio was 0.977 (N = 25), so only conditions 1–3 failed.fipstays out of the published blend. On its own its long-short earned 1.07% a month (Sharpe 0.67); its correlation with 12-1 was 0.55. - MO-H8, volatility-managed momentum: pass. 256 months from Feb 2005. Sharpe 1.43 against 1.02, gap 0.41 (95% interval 0.15 to 0.60; no resample at or below zero); 0.47 and 0.25 in the halves; windows 63 and 252 give +0.51 and +0.27. At the plain factor’s volatility, the managed factor’s worst month was −24.5% against −45.0% (May 2009), its worst fall −32% against −54%, skew −0.43 against −2.15, and in the 29 months after a negative two-year market return it averaged −0.91% a month against −1.55%. Weights ran from 0.40 to 1.88 (median 1.09). This is the opposite of the sceptical prior and of TM-H1, where scaling hurt long-only index trend; a gross long-short factor, not a product.
- MO-H9, 12-to-7 against 6-to-2: fail, as expected. 12-to-7 long-short 0.94% a month (t 2.55), 6-to-2 1.40% (t 5.57); the difference −0.46% (p 0.91). Recent momentum is stronger here, as Goyal and Wahal found outside the US.
Part B (79 launch-dated investable markets with three post-launch years; sessions from Sept 1999 to 13 Oct 2026; median 10.5 years per market).
| Median across markets | Fast | Medium | Slow | Full (registered) | Tilt 50/30/20 | Buying and holding |
|---|---|---|---|---|---|---|
| CAGR after costs | 10.9% | 11.0% | 10.1% | 10.6% | 10.8% | 12.9% |
| Sharpe over cash | 0.47 | 0.49 | 0.36 | 0.45 | 0.46 | 0.45 |
| Worst fall | −16.9% | −17.7% | −20.9% | −16.2% | −15.7% | −38.0% |
| Skew of monthly returns | 0.98 | 0.67 | 0.40 | 0.82 | 0.89 | −0.34 |
| Turnover a year (one-way) | 16.2× | 8.4× | 5.8× | 9.9× | 11.6× | 0 |
| After-tax CAGR | 8.5% | 9.2% | 9.1% | 8.9% | 8.7% | 11.9% |
- SP-H1, drawdown: fail (near miss). Fast’s worst fall was 4.2 points shallower than slow’s at the median (interval −0.1 to 9.8), shallower on 75% of markets, positive in both halves (2.0, 4.6); one-sided p 0.027, above its Holm level (0.0167).
- SP-H2, crisis months: fail. In Nifty 500’s worst fifth of months (65 months, Nifty 500 −8.2% on average) the equal-weight portfolio of fast rules lost 1.88% a month, slow 2.46%, the registered score 2.18% and buying and holding 6.49%. Fast minus slow +0.57 points (interval −0.32 to 1.54), p 0.10; positive in both halves. The three-month version: +0.22 points. Every speed cut the crisis loss by about two-thirds against holding; the speeds differ little from each other.
- SP-H3, tax: fail. Before tax fast beat slow by 0.93 points a year at the median; after tax it trailed by 0.32 points, but on only 53% of markets (two-thirds needed). Tax erased fast’s lead; it did not reverse it reliably.
- SP-H4, tilt against the equal blend: fail, as expected. Sharpe +0.011 (interval −0.033 to 0.059), p 0.72.
- SP-H5, against buying and holding: fail for every speed. Median Sharpe gaps fast +0.04, medium +0.08, slow −0.11, tilt +0.09, every interval spanning zero; deflated Sharpe 0.23, 0.38, 0.30, 0.29 (N = 111). After tax every speed trailed holding by 2.7 to 3.7 points a year at the median and beat it on at most 15% of markets.
- Expectation that slow earns more: wrong. After costs, fast’s median Sharpe exceeded slow’s by 0.09 (interval −0.18 to 0.39), ahead on 67% of markets. Man’s ordering did not appear here, long-only and one market at a time.
- Nifty 500, full history from Jan 1996 (description; launch date unknown): fast 15.5% a year after costs, medium 14.3%, slow 11.2%, the registered score 13.8%, buying and holding 13.8%; worst falls −25%, −39%, −42%, −33%, −67%; turnover 14.6×, 7.6×, 5.7×, 8.9×; after tax 11.5%, 11.3%, 9.6%, 10.7% against 13.6% for holding.
Summary. Two of the four momentum questions passed: momentum built from many small moves outlasted momentum built from a few big ones (narrowly), and scaling the momentum factor by its own recent volatility cut its crashes roughly in half and raised its Sharpe ratio from 1.0 to 1.4. Neither intermediate momentum nor a seventh flavour helped. For trend by speed, every speed cut the worst falls and crisis losses by about two-thirds against holding, and fast rules cut them a little more than slow ones, but no difference between speeds cleared its bar, a fast tilt made no difference, and after tax every speed trailed buying and holding by about three points a year.