FundFlow · Methodology
How it relates to the research
We read the literature on every method the desk uses and applied it. This page shows where the evidence backs our choices, where our data forces honest caveats, and exactly what changed.
In short
Sector momentum is empirically real, but our blend imports short-term reversal and can crash on violent rebounds. The sample is short — treat the backtest as illustrative, not a track record.
- Sector momentum works
- Short-term reversal is a drag
- Momentum crashes on sharp rebounds
- Short, single-regime sample
Read the full methodology
FundFlow methodology — how it relates to the research
FundFlow is a sector-rotation diagnostic and illustrative backtest built on 11 SPDR sector ETFs. This page explains, plainly and without hype, where its methods sit relative to the academic and practitioner record — including where the evidence supports our choices and where our data limits force honest caveats. Everything here is educational, not investment advice.
The core engine is the defensible part
FundFlow ranks sectors by relative strength — each sector's return in excess of SPY — and holds the top names equal-weight, rebalancing roughly monthly. This is the empirically defensible engine. Moskowitz & Grinblatt (1999) showed that industry/sector momentum is a real and dominant effect: once you control for industry momentum, individual-stock momentum profits largely vanish. Ranking sectors rather than single names is therefore well-grounded. The structure we use — ~10-11 sector ETFs, top-3, equal-weight, monthly rebalance, benchmarked against the broad index — is the established template (Quantpedia's sector-rotation analog: ~13.9% CAGR, Sharpe ~0.54). Computing momentum as excess return versus SPY is itself a light form of market-neutralization that isolates relative strength, which is methodologically sound (Frazzini, Israel & Moskowitz 2012/2018 cost framework; sector-rotation practitioner literature).
That same analog carries a ~-46% historical maximum drawdown and documented "momentum crashes." So the method is plausible but is not a smooth or risk-free outperformer, and we frame it that way.
Where our signal diverges from the canon
The momentum literature is close to unanimous on two points that FundFlow's current 21-day / 63-day blend does not yet honor. First, the robust momentum horizon is intermediate — roughly 6 to 12 months — and returns, Sharpe, and robustness improve near-monotonically as the lookback extends from 1 to 12 months (Jegadeesh & Titman 1993; Novy-Marx 2012; Springer 30-year review 2022; Mamais 2025). Pure 1-month and 3-month windows are the noisy end. Second, the canonical "12-1" convention excludes the most recent month precisely to avoid short-term reversal — last-month winners tend to underperform (Jegadeesh 1990; Lehmann 1990). FundFlow currently does the opposite on both counts: it uses 1-month and 3-month windows and includes the most recent month, which imports the very reversal the skip-month exists to remove. The 21-day leg in particular sits in short-term-reversal territory.
We are candid that the cleanest fix — a 252-21 lookback, or a full 12-1 momentum factor — is data-blocked today. With only ~130 daily closes, a 252-day window is impossible. So our near-term changes are the feasible subset: add a skip to the longer (63-day) leg, down-weight or relabel the 21-day leg, and clearly mark the current short-window blend as a fast/tactical tilt rather than the momentum factor the literature validates. We note one nuance in our favor: at the sector/industry level (unlike single stocks) the most recent month carries some information, so our no-skip choice is more defensible for diversified ETFs than it would be for single names — but the 21-day leg is still the noisiest, lowest-confidence component.
Crash risk and what we can — and cannot — do about it
Momentum suffers infrequent but severe, partly forecastable crashes that cluster in "panic states" after market declines and high volatility (Daniel & Moskowitz 2016). The best-documented academic remedy, constant-volatility targeting (Barroso & Santa-Clara 2015, Sharpe ~0.53→~0.97), is structurally unavailable to FundFlow: it requires varying gross exposure above and below 1x via leverage, and we are long-only and unlevered. We state this as an honest limitation rather than implying the backtest is "risk-managed momentum." We also heed Cederburg et al. (2020): volatility-managed factors mostly fail out-of-sample, and momentum is only a partial, fragile exception.
The feasible substitute is an absolute-momentum / regime cash gate (Antonacci dual momentum; Faber's tactical allocation): hold a sector only while it is above its own trailing moving average (or its excess return is positive), otherwise route to cash. The absolute gate is the robust, drawdown-cutting component across parameter sets, and FundFlow already computes the inputs (the 50-day MA flag, breadth, and the cyclical/defensive regime line). We present it as an optional, illustrative overlay and we surface a crash-risk disclosure even where we do not change allocations.
The indicator panels: what each one honestly measures
Dispersion. The naive intuition ("wide = opportunity") is the opposite of the evidence. High cross-sectional dispersion forecasts a weaker subsequent momentum premium and clusters around regime transitions where relative-strength strategies fail (Stivers & Sun 2010, 2013; Hurst & Docherty 2016/2018; Maio 2016). Dispersion scales the size of selection outcomes — both wins and losses — not the hit rate (Gorman, Sapra & Weigand 2010). We therefore present it two-sided, as a regime/risk gauge that argues for keeping diversification, not concentrating.
Breadth. Market-internal breadth (% of sectors above their 50-day MA) is a weak standalone timing signal that whipsaws around the 50% line; its documented strength is confirmation and divergence risk-flagging, and divergences are frequently rotation rather than tops (StockCharts ChartSchool). The one breadth construct with strong, replicated forward returns is the rare Zweig thrust — which by its rarity cannot drive a frequent strategy. We also keep our internal breadth distinct from Chen-Hong-Stein (2002) "breadth of ownership," a different, holdings-based result we do not have data for.
RRG. The canonical JdK Relative Rotation Graph needs substantially more history than we have (≈66 warmup observations; it is designed for weekly bars) and its smooth clockwise rotation is partly an artifact of double-smoothing a level and its own rate-of-change (StockCharts; BennyThadikaran RRG-Lite; de Kempenaer). RS-Ratio is explicitly lagging — in StockCharts' own example it crossed its centerline ~10 weeks after the underlying price-relative turned. The robust, reusable primitives are the cross-sectional rank and the sign of the short rate-of-change; the idealized rotation is presentation. We label our view accordingly and do not treat quadrant entry as a trade trigger.
Cyclical/defensive regime line. This is the most validated piece. The discretionary-vs-staples (XLY/XLP) ratio is a well-documented risk-appetite barometer that is nearly inversely correlated with equity drawdowns; defensives lead almost only in downturns (StockCharts/Afraid-to-Trade; BlackRock 2026). We treat it as risk-on/off context, slow its confirmation to cut whipsaw, and caveat that it will be wrong at individual turns. We deliberately avoid a business-cycle "phase→sector" auto-tilt: Molchanov & Stangl find no real-time edge in that mapping once you account for the lag in knowing the phase.
The statistical reality of ~130 daily closes
This is the most load-bearing constraint. ~130 daily closes is roughly six independent 21-day rebalances spanning a single market regime — far below the hundreds-of-trades, multi-regime threshold needed to infer edge, and short single-regime samples plus multiple testing make high backtest Sharpes almost certainly overfit (Bailey & López de Prado 2014). Even the canonical 12-1 specification can post a negative net Sharpe out-of-sample in a liquid universe (one 2005-2024 study: -0.23, MDD -81% at 10 bps/side). Accordingly we suppress or heavily caveat any headline Sharpe, report the number of independent rebalances, and present costs as a sweep (0/5/10/20/40 bps per side) rather than a single number — noting that for penny-spread SPDR ETFs (~1-2 bps real spreads) our 10 bps/side assumption is conservative-to-generous (SSGA; Frazzini, Israel & Moskowitz 2012/2018). Turnover is the dominant cost lever, so we add a no-trade band — the single most effective cost-mitigation technique (Novy-Marx & Velikov 2016) — and report gross vs net side-by-side.
Summary
FundFlow's architecture is right; its signal construction and framing are what we are improving. The changes shippable today — a skip on the long leg, down-weighting the reversal-prone short leg, an absolute-momentum cash gate from signals we already compute, two-sided dispersion and breadth framing, inverse-vol sizing, a no-trade band, and explicit small-sample / cost disclosure — are all defensible on limited data. The changes that need 12+ months of history — full 12-1 momentum, a faithful JdK RRG, and any volatility targeting — are clearly data-gated and presented as forward-looking, not as a track record.
The improvement program
Each item traces to a finding in the review and was checked for feasibility against our real constraints (≈130 end-of-day sessions, 11 sectors, long-only daily data). 8 shipped this round; the rest are planned or honestly data-gated until the history is deep enough.
- FF-01Add a skip-month to the 63-day leg; down-weight or drop the 21-day legShipped
Change the 63d component of the blend from [ret(63d) - SPY(63d)] to a skip-window [ret over t-63..t-5 (or t-63..t-21) minus SPY over the same window]. Down-weight the 21d leg from 0.5 to ~0.25-0.33 (e.g. 0.30/0.70 favoring the cleaned 63d leg), OR drop it and relabel it 'short-horizon relative strength (contains mean-reversion).' Keep skip as a documented toggle and show both curves in the illustrative backtest.
Evidence Jegadeesh & Titman (1993); Jegadeesh (1990) & Lehmann (1990) short-term reversal; Novy-Marx (2012) recent-month weakest in liquid names; AlphaArchitect 'Skip-Month Mystery'; CXO Advisory (Williams test: skip ~uncertain on liquid rotation).
- FF-02Add an absolute-momentum / regime cash gate (the feasible crash protection)Shipped
Add an optional, off-by-default cash gate to the backtest: hold a selected top-3 sector only if its own close is above its 50-day MA AND/OR its 63d excess return is positive; otherwise route that sleeve to cash (0% return, no shorting). Wire the gate to the EXISTING regime line (cyclical/defensive ratio vs its MA) and breadth as the market-level switch. Report the gated curve ALONGSIDE the ungated one, never replacing it. Use the 50-day MA (a 10-month/210-day SMA is not computable on ~130 closes).
Evidence Daniel & Moskowitz (2016) 'Momentum Crashes' (panic-state forecastability); Antonacci dual momentum (absolute gate cuts drawdowns); Faber 'Quantitative Approach to Tactical Asset Allocation' (top-3, monthly, long only when SPY>10mo SMA, ~70% of rolling periods beat buy-and-hold); QuantPedia dual-vs-single momentum (all 12 params improved with absolute filter).
- FF-03Replace the single headline backtest with a small-sample disclaimer + cost/turnover transparencyShipped
Suppress (or heavily caveat) any headline Sharpe. Display: number of independent rebalances (~6 over 130 days at 21d cadence), explicit single-regime caveat, annualized one-sided turnover, gross-vs-net side-by-side, and net results at a cost SWEEP (0/5/10/20/40 bps per side) instead of one fixed 10 bps. Label 10 bps as a conservative upper bound for penny-spread SPDR ETFs (~1-2 bps real). Add a buy-and-hold-of-all-11 line alongside SPY.
Evidence Bailey & López de Prado (2014) probability of backtest overfitting / deflated Sharpe; SSRN 5367656 '12-1 Momentum 2005-2024' (net -2.79%/yr, Sharpe -0.23, MDD -81% at 10 bps/side); Frazzini, Israel & Moskowitz (2012/2018) cost ≈ turnover × per-trade cost; SSGA/ETF Action (XLK/XLF ~1-2 bps spreads, 8 bps ER).
- FF-04Add a no-trade band (buy/hold spread) to the top-3 rule to cut turnoverShipped
Replace the hard top-3 swap with hysteresis: keep a held sector while it stays in the top 4-5 by blended excess RS; only swap in a non-held sector that ranks top 2-3 (enter rank <=3, exit rank >4-5). Add a 'rebalance only on set change' skip: if the target set is unchanged after the band rule, trade nothing that period. Expose band width as a backtest parameter; track skipped vs executed rebalances.
Evidence Novy-Marx & Velikov (2016) 'A Taxonomy of Anomalies and Their Trading Costs' (buy/hold spread most effective; <50% monthly turnover survives); Frazzini, Israel & Moskowitz (2012/2018) (trade only when signal gain > cost; UMD 5.83%->1.11%/yr optimized); AlphaArchitect 'Destabilizing Rebalancing' / Kitces (~20% relative band).
- FF-05Reframe the Dispersion panel two-sided as a regime/risk indicator, not an opportunity gaugeShipped
Keep the metric (cross-sectional std of the 11 sectors' daily returns, smoothed, percentile) but change the copy: 'wide' must carry the caveat that high dispersion is tied to market transitions and forecasts WEAKER subsequent relative-strength payoffs and elevated crash risk — not stronger. State n (the percentile is computed over <6 months) and gray-out or explicitly flag the narrow/normal/wide verdict as illustrative until 1-2 years of history accrue. Add a Gorman-style note that high dispersion widens the spread between top-3 and bottom sectors SYMMETRICALLY (amplifies both correct and incorrect calls), so it justifies KEEPING equal-weight, not concentrating.
Evidence Stivers & Sun (2010, 2013) (dispersion negatively related to subsequent momentum/RS payoffs; peaks at transitions); Hurst & Docherty (2016/2018) (top dispersion quintile momentum ≈ zero); Maio (2016); Gorman, Sapra & Weigand (2010) (dispersion scales outcome size, not direction).
- FF-06Relabel/refit the RRG so it is not a mislabeled JdK construction on thin daily dataShipped
Either (a) rename the view as an 'illustrative cross-sectional snapshot' (not a JdK-faithful RRG), or (b) refit the windows to the data and say so: keep RS-Ratio = cross-sectional z-score of the relative-strength LEVEL centered at 100, but compute RS-Momentum as a z-score of a SHORT RoC (~10-day) standardized over ~20 days, and document that the canonical JdK 52-period RoC + 14-period z-score (≈66 warmup obs, designed for weekly bars) cannot run on ~130 daily closes. Add a visible note that the tails are short (<~5 plotted points), clockwise rotation is a tendency not a law, and RS-Ratio LAGS the price-relative by weeks — so surface the RoC SIGN (the leading, less-smoothed component) next to the percentile.
Evidence StockCharts ChartSchool RRG ('not a trading system'; RS-Ratio lags price-relative ~10 weeks in their worked example); BennyThadikaran RRG-Lite wiki (14-period z-score, 52-period RoC); tuhuynh27 gist (WMA(10) double-smoothing); de Kempenaer (RRG origin).
- FF-07Re-label Breadth as a confirmation/health gauge with anti-whipsaw buffers; do NOT add a breadth gateShipped
Label the breadth panel (% of 11 sectors > own 50d MA) as a CONFIRMATION/health context gauge, not a timing input. Keep 80/50/20 reference bands but add hysteresis ('broad' >55, 'narrow' <45, neutral between), mirroring StockCharts' 52.5/47.5 buffer — an 11-name series stepping 9.1% per sector across a single 50% line is very noisy. Do NOT add a 'go to cash when breadth <50%' gate; if a market-state gate is wanted, prefer the absolute-momentum gate (FF-02). Add a display-only Zweig-style breadth-THRUST annotation, explicitly noted as 'rare (~16 since 1950), not actionable on 130 days.' In product copy, separate FundFlow's market-internal breadth from Chen-Hong-Stein 'breadth of ownership' (a different, holdings-based concept) so the strong cross-sectional result is not mis-cited to justify this panel or the 0.20 MA term.
Evidence StockCharts ChartSchool 'Percent Above 50-day SMA' / 'Advance-Decline Line'; Carson Group / RealInvestmentAdvice (Zweig thrust ~16 triggers, 100% positive 6/12m); Chen, Hong & Stein (2002) (6.38%/yr ownership-breadth spread — holdings-based, distinct); leadlagreport / stockforecasttoday (divergence-as-rotation).
- FF-08Add an inverse-volatility weighting option for the top-3 (no covariance matrix)Planned
Add an optional inverse-vol weighting: weight_i ∝ 1/σ_i where σ_i is each sector's own trailing 20-40 day daily-return stdev, normalized to sum to 1. Keep equal-weight as default. Do NOT estimate a cross-sector covariance matrix (no full risk parity / min-variance). Do NOT add rank-/score-proportional weighting by the composite.
Evidence QuantPedia / CAIA 'All About Parity' (risk parity ≈ equal-weight return, more stable Sharpe); Fan et al. (arXiv 0812.2604) estimation error scales with N/T; ReSolve / Novy-Marx & Velikov (rank/magnitude weighting unhelpful beyond selection); Russell Investments (equal-weight captures most multi-factor gain).
- FF-09Add a specification-ensemble / holdings-count sensitivity view instead of one hero curveShipped
Replace the single 0.45/0.35/0.20 + 21/63 + top-3 hero curve with a small ensemble: run a grid over lookback blends ({21/63, 21/126, 63/126} as data permits), top-k in {2,3,4,5}, and staggered rebalance offsets across the 21-day cycle; report the MEDIAN curve plus a dispersion band, with turnover and single-sector concentration shown per k. Label the current single config as one draw, not 'the' result.
Evidence Newfound Research / Flirting with Models (2019) 'Fragility Case Study: Dual Momentum GEM'; AlphaArchitect short-term momentum (winners susceptible to mean reversion); Quantpedia canonical top-3-of-10.
- FF-10Tighten the cyclical/defensive regime line and add a crash-risk disclosure panelData-gated
Promote the regime line to a first-class gauge: use the discretionary-vs-staples (XLY/XLP) pairing as the canonical risk-appetite core, replace the single 20-day MA crossover with a slower confirmation (50-day MA or N consecutive days on one side) to cut whipsaw, and present it as risk-on/off context with an explicit 'will be wrong at individual turns' caveat. Separately, add a crash-risk DISCLOSURE panel driven by existing signals: when SPY<50d MA + breadth<20 + wide dispersion coincide (the Stivers-Sun transition / Daniel-Moskowitz panic signature), surface an 'elevated momentum-crash-risk regime' note. Keep it educational/contextual unless the FF-02 gate is adopted.
Evidence StockCharts / Afraid-to-Trade XLY vs XLP; BlackRock 'cyclicals vs defensives' (2026); Daniel & Moskowitz (2016); Stivers & Sun (2013) (momentum failure localized to transitions); Molchanov & Stangl 'Myth of (Business Cycle) Sector Rotation' (phase→sector map has no real-time edge — keep any phase narrative descriptive only).
Educational reference. The backtest is illustrative on a short, single-regime sample — not a track record, and not investment advice.