Momentum / RISKADJ Ranked-Rotation Engine — Canonical Reference
🔴 EVERY "SHARPE" ON THIS PAGE WAS A RETURN/VOL RATIO — RELABELLED
Every ratio on this page (RISKADJ 1.13/1.29· C-BLEND 1.32· LOWVOL_MOM 1.02· the 0.89 hurdle) is computed as
mean/sd × √periodswith no risk-free rate subtracted. That is a return/vol ratio, not a Sharpe — read as a textbook Sharpe it reads high, and the absolute levels were overstated by the label alone. But the Nifty 500 buy-&-hold hurdle (0.89) is computed on the IDENTICAL basis, as is every signal measured against it — so every relative claim, every walk-forward verdict, and every gross-vs-net call on this page holds exactly as written. Nothing is re-cut and no number moves: the desk's ruling is relabel the vocabulary, change no numbers. A true-Sharpe re-cut needs a primary-source rf ingest (Guardrail #8) and is queued with the owed TR-benchmark re-cut. Read every ratio below as a return/vol ratio.
One-line definition: a monthly cross-sectional ranked-rotation backtest that sorts every liquid NSE name by RISKADJ (6-month return ÷ 3-month volatility), holds the top-25 equal-weight, and scores it net of cost, walk-forward on both halves, against a Nifty 500 buy-&-hold return/vol-0.89 hurdle — the project's internal benchmark and a gross selection lens, not a fundable net-of-cost alpha.
1. What it is
The core factor / backtest machine of the platform: the daily "surface the relevant stocks" engine of the primary-intent north star, formalized from the empirical finding that momentum is the only consistent, reliable gross forward-price signal in Indian equities (the predictive attributes findings notes).
The machine (one construction family):
1. At each monthly rebalance (22 trading days), rank every liquid name cross-sectionally by a selection signal (RISKADJ is the flagship; 8 signals are wired). 2. Take the top-25, hold equal-weight for the month. 3. Charge cost, mark monthly, and compound. 4. Split the 2012→2026 history into two walk-forward halves (2012-18 vs 2019-26); a signal "survives" only if it beats Nifty 500 return/vol 0.89 in BOTH halves with positive CAGR in each.
RISKADJ is the best of 32 tested signals and is kept as the internal benchmark to beat — every new strategy is measured against it. It is not productized as a client "buy this basket" claim; it is an analytical ranking lens that surfaces names for research. Benchmarks (Nifty 50 / Nifty 500, the 0.89 hurdle / Nifty Midcap 50) and the full 32-row leaderboard live in the ledger — see the strategy ledger § Benchmarks + Tier 1.
2. Our variation vs. the standard technique
Classic cross-sectional momentum ranks on raw 12-month return. What is ours here:
- RISKADJ = 6-mo return ÷ 3-mo volatility (not raw MOM6/MOM12). Risk-adjusting both raises return/vol and cuts drawdown vs raw momentum — raw MOM12's β≈1.33 / MaxDD≈−50% is a leveraged-beta liability, so the production form is deliberately the risk-adjusted / low-vol variant, never raw momentum as the sole ranker.
- Relative percentile liquidity gate, not a static ₹5cr floor. Names compete on a cross-sectional turnover percentile (top-40%/60% by median traded value) — the standing "no absolute-rupee thresholds" rule (percentages / ranks only). This alone lifted RISKADJ from return/vol 1.13 → 1.29.
- The C-BLEND tilt — a 50/50 rank blend of RISKADJ-percentile with the proprietary capital-allocation ("C") percentile (§4, §7), a descriptive re-sort, not a veto or standalone ranker.
- Value-in-rupees rule — all liquidity / size math uses median turnover (₹), never share count, so corporate actions can't distort the gate.
- A first-class valuation guard (
not_extended: optionally exclude names up >200% in ~5y) kept as a tested variable — the data says it slightly reduces return/vol in a momentum frame (winners keep winning), recorded as an honest tension, not applied by default.
What is not proprietary: the momentum premium itself (Fama-MacBeth λ t=3.36) is a real but generic factor. Public yardsticks (MOM12, HI52, RESID_MOM, …) are kept in a separate non-proprietary registry (the strategy ledger § Known/public factor strategies) — the proprietary claim is only what beats those yardsticks (so far: the PIT-quality / C blend cutting drawdown on top of RISKADJ).
3. How it works (methodology)
- Harness: the factory research code — the
SIGNALSmap (MOM6, MOM12, RISKADJ =mom6/(vol+ε), ACCEL, LOWVOL_MOM =0.5·rank(mom6)+0.5·rank(−vol), DELIV_MOM, QUAL_MOM, PULLBACK),build_tables(PIT feature tables per rebalance),run_strat(rank → top-N → equal-weight → net cost), walk-forwardslice_stats. Public-factor zoo + attribution inputs: the factor zoo code. - Overlays: the overlay experiment code (relative gate + PIT quality) and the c overlay code (the capital-allocation C overlay;
sel_c_blend, PITattach_c). - Two cost models — the whole honesty pivot:
- Flat (
COST_PS = 0.3%× turnover, + a 1.5× stress proxy) — the ledger's headline numbers; capacity-blind. - Participation / Almgren √-law (the cost participation code): per-side
impact = k·σ·√(order/ADV), k=0.6, ≤10% ADV/day POV cap, tiered spreads, a days-to-fill delay penalty, sized against a target AUM so impact scales with the real clip. the cblend cost recut code re-cuts the champion under this model, swapping only the cost term (reproduces the flat 1.32 exactly, so any delta is the cost model alone). - Persistence: every run is appended (never overwritten) to
research.dbvia the strategy store code →strategy_registry/strategy_runs/strategy_holdings, plusout/*.csvleaderboards.
Full parameterization + every internal weight: the calculations and weights notes and the code. Result tables are not duplicated here — see the ledger.
4. Status, validation & honesty fence
THE headline — gross vs. net (binding, must travel with every number):
- GROSS / flat-cost — the selection edge is REAL. RISKADJ ranks best of 32 at gross/flat-cost return/vol ~1.13 (static-floor baseline) to ~1.29 (relative gate), α ~+16%, and survives both walk-forward halves. It is the internal benchmark.
- NET of realistic cost — the alpha DOES NOT EXIST here. Under a participation/slippage model (~0.5×ATR, ~100%/mo turnover → ~36%/yr cost), that 1.29 collapses to ~0.09, CAGR negative, MaxDD ≈ −69% — momentum sold as a fundable strategy is a BLOCKING failure model. Nothing beats Nifty 500 buy-&-hold (0.89) net of realistic cost.
- C-BLEND 50/50 (return/vol 1.32) is FLAT-COST-ONLY and NOT fundable. The recorded "champion" (flat-cost return/vol 1.32 / MaxDD −28.2% / Calmar 1.15) nets 0.52 @₹25cr· 0.17 @₹50cr· −0.30 @₹100cr under participation cost — it beats the index at no AUM. It stays a descriptive/paper overlay (the fence), never a book.
- The ONLY participation-fundable corner is quarterly large-cap LOWVOL_MOM — net return/vol 1.02 @₹50cr (CAGR 18.1%, MaxDD −21.4%), ~breaks even ₹100–150cr, 0.61 @₹500cr → a ~₹50–100cr defensive tilt, not a scalable edge.
- It's momentum-BETA, not selection alpha (proven). Controlling for the generic momentum factor (WML) + market, RISKADJ's residual α falls to +7.3%, HAC t=1.99 → fails the t≥3 bar; WML eats 51% of the raw α. The premium is real but un-proprietary. Survivorship is second-order (+0.02 return/vol).
The doctrine (the project's core thesis — state it plainly): price strength is the only gross forward-return engine; value / quality / credibility / accumulation are veto / filter / context layers, not rankers; and no factor here is a fundable net-of-cost alpha vs the index (Nifty 500 B&H return/vol 0.89). The asset is PIT rigor + under-covered data + the analytical selection lens — not a backtested alpha strategy.
(governing): capital-allocation "C" is a RISK FILTER, not a return ranker — it works as a 50/50 rank blend / descriptive tilt, NOT a hard veto and NOT a standalone ranker; head-to-head it subsumes the 4-metric quality lens (ROCE/D-E/OPM/interest-cover). Standalone value and standalone quality do not beat the index here (QUALITY α≈0, BOOK_YIELD α −1.8% / MaxDD −82%).
Full failure-models table (BOOK_YIELD, EARN_YIELD, QUALITY-standalone, momentum-as-fundable, C-BLEND-as-book, PEAD book, …): the strategy ledger § BLOCKING FAILURE MODELS. Cite the exact recorded numbers before re-attempting any of them.
5. Where it lives (code· routes· DB· timers)
- Backtest machine (research venv, numpy): the factory research code (+ the factor zoo code, the overlay experiment code, the c overlay code, the cost realism code, the cost participation code, the cblend cost recut code, the attribution code, the strategy store code).
- Proprietary layers (app): the capital allocation code (Dataset "C"), the scoring code (14-pattern patearn quality), the fundamentals asof code (PIT reader, no look-ahead).
- Routes:
/dash/testing("Lab", under Strategies — the testing view code, the ranked registry + candidate holdings + the honest verdict) and/dash/momentum-scan(nested/dash/markets/momentum-scan, the momentum view code — the nightly scanner with three sorts: Risk-adjusted momentum· C-blend 50/50· Equal-weight ensemble). - DB (
research.db):strategy_registry/strategy_runs/strategy_holdings(backtest history),momentum_scan(nightly surface),capital_allocation_scores(nightly C, joined for the C-blend), plusout/strategy_leaderboard.csv. - Timers:
hermes-momentum-scan.timer→explosive_moves.momentum_scan(nightly; the scanner self-healsem_cache.pklwhen it lags the DB).
6. Data & provenance
- Price / momentum / volatility / liquidity: NSE bhav copy (primary source) →
adj_close,med_turn, thevol_66/ delivery / SMA feature cache (embase). This is the whole gross-momentum engine and is on fully primary data. - Quality / capital-allocation (C): PIT fundamentals from
research.db.fundamentals_history(1,983 syms × ~24y, point-in-time byreport_date), read as-of viafundamentals_asof. Provenance caveat (guardrail #8):fundamentals_historyis currently Screener-derived and under active XBRL migration remediation — see the fundamentals xbrl migration notes; do not extend the Screener dependency, and disclose it where C is shown (the live surfaces carry the Screener→XBRL disclosure). - Survivorship: the ~3,515-symbol cache is survivor-tilted; the PIT panel books a delisted name's return-to-last-price rather than dropping it, and delisting-return booking moves return/vol only +0.02 (second-order). Fundamentals coverage is narrower (~1,700 names) → value/quality reads lean on a smaller universe. True net-of-cost numbers, if anything, sit lower than recorded.
7. Terminology canon
- RISKADJ — 6-mo return ÷ 3-mo volatility (
mom6/(vol+ε)). The flagship signal and internal benchmark. - QUAL_MOM — risk-adj + delivery + low-vol blend; best Calmar of the high-return/vol set (defensive).
- LOWVOL_MOM —
0.5·rank(mom6)+0.5·rank(−vol); β≈0.82, shallowest drawdown. The only participation-fundable corner (quarterly, large-cap, wide hold-band). - MOM12 — raw 12-month momentum; highest gross return, brutal drawdown; a public yardstick, kept in the non-proprietary registry.
- C-BLEND —
0.5·RISKADJ-pctile + 0.5·C-pctile; a descriptive tilt (flat-cost champion 1.32; not fundable). - "C" (capital allocation) — Dataset-C quality: ROIIC, ROCE level+trend, dilution drag, debt-funding share, growth efficiency (the capital allocation code). A veto/filter/context layer per, consumed as a blend.
- Gross vs net — flat-cost (0.3%/turnover) vs participation/Almgren cost sized by AUM. The gap is the honesty fence.
- The 0.89 hurdle — Nifty 500 buy-&-hold return/vol; the survival bar in both halves.
- ⚠ Disambiguation: the momentum FACTOR here (a cross-sectional monthly ranker on price return ÷ vol) is distinct from RS-momentum (relative strength vs an index — strength level/strength direction, Rotation Map, Mansfield). See the relative strength notes. The patearn 14-pattern fundamental lens is the patearn notes — a quality/veto context, never a standalone ranker.
8. Decision & session history
- (2026-06-23): PIT fundamentals → backtestable patearn score; the score is a RISK FILTER, returns come from accumulation/RS. Origin of "C/quality = veto/filter, not ranker."
- 2026-06-24 overlay experiment: relative gate beat the static ₹5cr floor (return/vol 1.13 → 1.29); a PIT 50/50 quality blend cut MaxDD −42% → −29% at return/vol 1.18 — first hard proof a proprietary lens improves the risk-adjusted outcome with zero look-ahead.
- 2026-07-02 attribution + institutional panel: momentum = beta, not selection — proven (the attribution code); "sell DATA, not signals." Headline of the predictive attributes findings notes rewritten.
- 2026-07-03 C-overlay : C-BLEND 50/50 = flat-cost champion (return/vol 1.32, MaxDD −28.2%, Calmar 1.15); refined — C's working shape is a rank blend, not a hard veto; C subsumes the 4-metric quality lens.
- 2026-07-05 cost re-cut: the 1.32 is flat-cost-only; under participation cost C-BLEND is NOT fundable (0.17 @₹50cr). Fundable claim withdrawn; LOWVOL_MOM (1.02 @₹50cr) confirmed as the only corner.
9. Open items / frozen work
- Residual-alpha attribution — partially done. β-not-α is proven (the attribution code); a fuller beta/size/sector/liquidity-neutral decomposition is still queued (until run, treat momentum's direction as reliable, magnitude as provisional).
- Ensemble Steps 3–7 (frozen roadmap). Step 2 is decided (equal-weight MOM12 + HI52 + RISKADJ + LOWVOL_MOM); Steps 3 (regime gates), 4 (C/A/B veto layer), 5 (cost/turnover-aware form), 6 (productionize the daily surface), 7 (live decay monitor) remain open — one step per session, the desk steers each. See the momentum engine formalization notes.
- Untested overlays: the accumulation tape and concall-credibility on the momentum book (both descriptive-only so far).
- Gate design: a stratified / size-bucketed gate or a velocity "override lane" (to admit good sub-~₹5k-cr midcaps like PIXTRANS without flooding the book with microcaps) — an option to pursue; pure velocity wrecks the edge.
- Live check: passive re-verification of the live C-blend sort vs the recorded numbers once a few weeks of nightly
ca_pctilehistory accrue.
10. Sources of truth
- the strategy ledger — primary source: Benchmarks, BLOCKING FAILURE MODELS, Tier-1 survivors, C-BLEND / cost-reality experiments. (Full result tables live here — single source.)
- the momentum engine formalization notes — the living spec + roadmap (the two-layer truth, Steps 1–7).
- the predictive attributes findings notes — the 14-year factor study + attribution + participation-cost headline.
- the calculations and weights notes — canonical formulas + every internal weight (numbers live once, in code + here).
- the institutional panel assessment notes — the "sell data, not signals" panel verdict.
- Sibling canonical refs: the relative strength notes (RS-momentum, disambiguated)· the patearn notes (14-pattern quality lens).
- Memory:
strategy-ledger-and-benchmarks·predictive-attributes-finding·failure-models-ledger·dataset-roadmap-c-a-b. - the project's running record: § Decision log, § Session log (Sessions 37, 71, and the 2026-07-03/-05c experiments), § Key file paths (the capital allocation code, the scoring code, the fundamentals asof code).
Slow rotation — the quarterly LOWVOL_MOM anchor
The one form of this family that survived the participation-cost recut is now a live surface: /dash/momentum-scan/slow (declared child of the scanner). Rule as validated: large-cap gate (top turnover quintile, self-scaling)· LOWVOL_MOM = 0.5·pctrank(6-mo momentum) + 0.5·pctrank(−66-day vol)· top-25 equal-notional· quarterly clock· hold band ≤35 (members stay while ranked ≤35; refill from the top — the turnover discipline IS the strategy). Numbers on record: family flat-cost ~1.10 → net ~1.02 @₹50cr under the Almgren participation model; beats the index net up to ~₹100–150cr capacity; defensive beta, not selection skill. Engine: the slow rotation code (nightly --refresh, rebalances only on quarter turn; bounded slow_rotation table). View: the slow rotation view code (live rank drift computed on read; CSV; descriptive fence). Ledger anchors: §§ 2026-06-24 cost-realism· 2026-07-02 corrected participation model· 2026-07-05 C-BLEND recut.
Factor league — the classic families, ranked by our numbers
/dash/factor-league (Strategies lens): the famous "premium" strategy families ranked by the return/vol + alpha measured in OUR 14y walk-forward — not textbook claims. League order (flat-cost, ₹5cr universe, labeled): PACER-25/RISKADJ 1.13· QUAL_MOM 1.10· STEADY-25/LOWVOL_MOM 1.10 flat → NET 1.02 @₹50cr = the only net survivor and the AUTO-PORTFOLIO· SPRINTER-25/MOM12 1.06· then the failures shown with their numbers (DELIV_MOM 0.85· QUALITY 0.76 α≈0· EARN_YIELD 0.70· BOOK_YIELD 0.62 α<0 REJECTED) vs the 0.89 Nifty-500 hurdle. Live rosters (top-25) + daily churn feed: the factor league code → factor_league/factor_league_churn; view the factor league view code. Every number restates the frozen ledger; the page may not soften them.