Skip to content
✎ FeedbackNew here?
Open the V17 portfolio (time-travel) →the live surface this page describes — data, filters and history
How well testedFailed after coststhe gross reading looked real and did not survive realistic trading costRecorded: The stock layer has now been SIMULATED once — REJECTED under the pre-registered bar at realistic cost (worse return/vol, MaxDD, CAGR and wealth than V24); the ~1,973-symbol PIT-safe build remains the target for a fuller test.

Sector Rotation (RS-weighted) — Canonical Reference

🔴 SCOPE — READ BEFORE ANY NUMBER ON THIS PAGE

This strategy is HALF-BUILT. It selects SECTORS. It does NOT pick STOCKS.

Every V-number (V8…V32) and every headline stat (return/vol 0.91· α +7.1%/yr· ₹1 Cr → ₹30.35 Cr) measures the sector-selection layer ONLY — a book that holds sector indices themselves (Nifty Auto, Nifty IT, …), weighted by RS. The engine reads exactly one table, index_rows. It contains zero stock symbols — no stock_signals, no bhav copy, no symbol column. Verify in 5 seconds:

grep -ciE "stock_signals|bhav|symbol" the sector rotation v24 final research code → 0.

the desk's brief was two halves (2026-07-15): ① find every sector beating the benchmark, ② pick the top-RS STOCKS driving those sectors (≤40 names, sector-RS × stock-RS weights, per-sector stops). Only half ① is live. Half ② — the V2 constituent expression, §9 — was simulated once (run 2026-07-15) and REJECTED under its pre-registered bar at realistic cost (§9); it is not built as a live book. (Corrected 2026-09-18: this note said "never been measured", which §9's own run contradicts.)

⚠ The index expression may not even be tradeable (see §6 Instrument reality): §3-F assumes the sector legs are bought as "liquid sector ETFs/index futures", but that was asserted, never verified. Several of the 16 sectors (Media, Realty, Consumer Durables, Infrastructure, Oil & Gas) have no liquid ETF or futures instrument in India. An unknown share of the 0.91 return/vol may be unbuyable in index form. This inverts the priority: the constituent build is not a phase-2 nicety — for much of the book, buying the underlying stocks is the only executable expression, and pricing it as an ETF book understates its real cost.

Do NOT present, quote, or promote any number on this page as a complete strategy result. It is the sector-selection half of an unfinished strategy, priced on instruments that may not exist. (Recorded 2026-07-15 after the desk caught the gap — the flaw was a FRAMING failure: the limitation was buried in §9's open items while the page led with a Sharpe ratio, so it read as finished. Ledger §2026-07-15.)

❓ THE DESK'S THREE QUESTIONS, ANSWERED PLAINLY (2026-07-15 — asked twice; answer here, not in prose below)

Q1. "You are not picking the stocks. Please confirm." CONFIRMED. You are right. This strategy has never held a single stock. The engine reads exactly one table — index_rows — and contains zero stock symbols. Verify in 5 seconds:

grep -ciE "stock_signals|bhav|symbol" the sector rotation v24 final research code → 0.

Q2. "Does that mean we are switching to a better index?" YES — that is exactly, and only, what it does. Every quarter it asks "which NSE sector indices are beating the Nifty 500 on relative strength?" and holds those indices themselves (Nifty Auto, Nifty IT, Nifty Pharma…). It rotates capital between indices. Nothing more.

Q3. "Does it imply we have already changed the company?" NO. There is no company in it, and there never was. A quarter's "holdings" are index NAMES, not businesses. The book cannot have "changed a company" because it has never held one.

⚠ THE "86" IS NOT A PERCENTAGE — it is a COUNT. You read "86" as "an 86% chance". It is not a chance, a probability, a hit-rate or a confidence. 86 = the number of quarterly rebalance dates between 2005 and 2026 (21.5 years × 4 quarters/yr = 86). "All 86 rebalances" means "all 86 quarter-start decision dates". There is no 86% anywhere in this strategy, and no percentage of any kind equals 86. (This is the second time the bare "86" has been misread — every doc now writes "86 quarterly rebalance dates", never a bare 86.)

So where the two halves stand: half ① (pick the sectors) = built, and every number on this page measures only it. Half ② (pick the top-RS stocks inside those sectors) = not built, never measured — that is the part that would hold companies, and it is now open-item #1.

🔴 TWO MORE CORRECTIONS — READ WITH THE SCOPE BANNER (ledger §2026-07-15)

① "Sharpe" on this page is really a RETURN/VOL RATIO. The engine computes mean/sd × √12 and subtracts no risk-free rate. Reconciles exactly: V21 = 16.57% CAGR ÷ 19.92% ann vol = 0.875. Against ~6.5% rf the true excess-return Sharpes are ~0.51 (V21)· 0.54 (V24)· 0.54 (V32) — ordinary, not exceptional. Nifty 50/100/500 are computed on the identical basis, so every relative claim on this page holds exactly as written; only the absolute levels were overstated (~1.7×, by the label alone). the desk 2026-07-15: relabel, numbers unchanged. A true-Sharpe re-cut needs a primary-source rf ingest (Guardrail #8) and is queued with the owed TR re-cut. Read every "Sharpe" on this page — including in the SCOPE banner above — as "return/vol ratio".

② THE LADDER'S TOP RUNGS ARE NOT STATISTICALLY DISTINGUISHABLE. The significance pass §9 owed has now run (the sector rotation significance research code, n=258 monthly, 21.5y): V24 vs V32 is UNMEASURABLE — a 0.013 gap against a 0.148 minimum-detectable-effect, 11× below the noise floor (studentized p 0.745). The §15f framing of it as "a genuine trade-off" was reading noise; V32 is retired as a distinct candidate. V24 vs V21 is NOT established either — method-dependent (p 0.038 percentile / 0.081 analytic / 0.127 studentized; the pivotal CI spans zero), and it dies under a k=9 selection correction that was measured to be fair (the nine levers' difference-series correlate at median +0.051 → genuinely distinct tests). V24 and V21 are identical in 80% of months → ~9 informative blocks; the window cannot support the claim on any method. ∴ the desk's V24 designation (§15h) stands on MECHANISM grounds — its own-percentile exit adapts to each sector's own history, replacing a fixed 70/80 that was never justified — and is correctly labelled a priors call, NOT an evidence result. /dash/sector-rotation stays on V21; nothing is promoted. (Honest limit: non-significance ≠ no effect. The design is low-power by construction — nested books correlated 0.97–0.996. This proves the rungs can't be told apart on 2005-2026, NOT that V24 is no better. Only a fresh window / true OOS can settle it — and per the SCOPE banner the honest priority is the constituent build, not more tuning of a layer that may be unbuyable in ~⅜ of sectors.)

One-line definition: a long-only, low-churn sector-rotation strategy that holds the sector INDICES themselves — it does not select stocks (see SCOPE above; the ≤40-stock constituent layer is unbuilt). Every NSE sectoral index beating Nifty 500 on trailing relative strength is held (equal-weighted, capped), entries gated on an RSI-green recovery, weights tapered off as a sector approaches its OWN historical RS peak / stretch / RS-overbought, and (V17) the un-invested residual parked in a Nifty index ETF while the index is healthy, in cash when it is not.


1. What it is

the desk's answer to "don't bet on one top sector or one day's performance": hold the WHOLE set of sectors currently outperforming the index, weight them by relative strength with deliberate balance, enter only on confirmed recovery, and — the part that makes it his — treat a sector's own RS history as its thermometer: as relative strength nears its own past extreme ("the Defence-index lesson"), the position is offloaded gradually rather than ridden over the top. V17 adds the wealth engine the base lacked: idle capital is never left dead — it earns the index while the market is above water and steps aside when it is not.

2. Our variation vs. the standard technique

Classic sector rotation picks the single top sector (or top-k by one day/one month) and swaps it wholesale. This strategy departs on the desk's axes: (a) breadth, not a winner-take-all — every index-beating sector is held, equal-weighted with a 30% cap; (b) hysteresis + quarterly cadence — a held sector survives until it clearly breaks, so churn stays ~12%/mo (the ledger's momentum-net-of-cost wall is the reason); (c) self-referential exhaustion tapers — each sector is measured against its OWN RS-peak/stretch history, never a market-wide constant (the standing no-static-threshold rule); (d) the residual sleeve — the cap structurally leaves cash when breadth is narrow; V17 makes that sleeve productive-but-defensive instead of dead.

3. How it works — THE COMPLETE V17 RULESET (definitional)

Three sleeves: the sector book, the residual sleeve, cash. Decisions at the first trading day of each month; the sector book rebuilds only on quarter month-starts; the residual sleeve switches monthly.

A. Universe & data. The 16 NSE sectoral indices (Auto· Bank· Energy· FMCG· IT· Pharma· Infrastructure· Media· Metal· PSU Bank· Realty· Financial Services· Private Bank· Oil & Gas· Consumer Durables· Healthcare), each joining as its history allows; benchmark = Nifty 500. Daily closes from index_rows (primary NSE data, Guardrail #8).

B. Relative-strength signal. At decision date d: RS(s) = 126-trading-day return of sector s − 126-day return of Nifty 500 (≈ 6 months; the 3-mo and 12-mo lookbacks tested WORSE — ledger 15/15b).

C. Membership (quarterly).

D. Weights (quarterly). 1. Equal-weight all qualifying sectors (the balanced-newcomer decision — beats rank-proportional, ledger 15b), then cap 30% per sector (over-concentration guard), redistributing to uncapped names. 2. Multiply each sector's weight by three taper factors (the gradual-offload machinery):

3. Renormalize to 1.0 and re-cap at 30%. The invested fraction is therefore min(1, 0.30 × #survivors) — with narrow breadth the book is deliberately part-cash.

E. Residual sleeve (the V17 rule; checked MONTHLY). residual = 1 − invested fraction. If Nifty 500 closes ≥ its 200-day SMA at the month-start → the residual is held in a Nifty index ETF; if below → the residual moves to cash/liquid fund and waits. The sector book is NEVER touched by this switch. If no sector qualifies at all, the entire portfolio IS the residual sleeve. (Why sleeve-only: applied to the whole book, the same 200DMA kill destroyed wealth — V9, ledger 15c. On the sleeve, a false alarm costs one month of index-vs-cash; a true alarm sidesteps the crash.)

F. Costs & instruments. 0.15%/side on every weight change (sector legs = liquid sector ETFs/index futures; sleeve = Nifty ETF ↔ liquid fund); measured one-way turnover ≈ 12.4%/mo. Monthly marks.

V8 = rules A–D + F only (residual stays in cash; the frozen champion). Exact constants (126/8%/50/21/30%/756/85th/0.35/70/80/200) are definitional here AND live in code — the sector rotation exp2 research code is the reference implementation (build_v8, taper_product, kill_on, mode DFILL); on any drift, the code is canonical.

4. Status, validation & honesty fence

CONDITIONAL — not yet a validated standalone alpha; not yet a product surface. The canonical numbers live in the strategy ledger (Studies 2026-07-15· 15b· 15c) — headline: V17 beats the like-for-like price-index Nifty 500 on wealth, return/vol AND max-drawdown simultaneously at ~12%/mo turnover; V8 (frozen) beats it on return/vol-drawdown but trails on wealth (cash drag; alpha t-stat 1.45 = NOT statistically significant). Binding fences:

5. Where it lives (code· routes· DB· timers)

6. Data & provenance

NSE index closes (index_rows, 205 indices 2004→present; primary source, Guardrail #8-clean). Point-in-time honest: every signal at date d uses closes ≤ d; entries earn the NEXT month's return; sectors join the universe only once their own history supports the signal (no backfilled hindsight membership). Price indices, not total-return — disclosed wherever numbers are shown.

Index closes are the ONLY input. No stock-level data enters this strategy at any point — see the SCOPE banner. The book's holdings are index names, not symbols.

6-bis. Instrument reality — ⚠ UNVERIFIED, and it is load-bearing

§3-F prices the sector legs as "liquid sector ETFs/index futures" at 0.15%/side. That instrument claim was asserted, never checked against actual Indian market instruments — it is the weakest assumption in the whole construct, and every V-number inherits it:

Consequence: an unknown fraction of the reported edge sits in legs that cannot be bought as an index at the modelled cost, or at all. Two live implications, both unmeasured: 1. The headline stats are optimistic by an unquantified amount — real slippage on thin/absent instruments is not in the 0.15%. 2. It re-prioritises the constituent build. If a qualifying sector has no ETF, the only way to express it is buying its constituent stocks — so §9's "V2 constituent expression" is not an enhancement to a working strategy, it is the execution path for ~⅜ of the book.

Owed work (blocking any claim of tradeability): enumerate the actual NSE/BSE ETF + futures instruments per sector with real ADV, re-cut costs per-leg from measured spreads instead of one flat 0.15%, and re-run the ladder. Until then, treat every number as an upper bound on a paper portfolio.

7. Terminology canon

8. Decision & session history

9. Open items / frozen work

🔴 #1 — THE STOCK BUILD — FIRST SIMULATION RUN (2026-07-15): REJECTED under the pre-registered bar

the desk's two-step method has now been BUILT and SIMULATED end-to-end — Step 1 (sector selection) = V24, untouched; Step 2 (stock selection, new) = rank each qualifying sector's stock universe by RS-excess vs its OWN sector composite, top 4–8/sector, portfolio capped at 33 names (his instruction: "30 to 35 stocks… about a crore"). Module: the sector stock layer research code, reproducible, run read-only against the real production DB. Universe: 268 real symbols across the 16 sectors, from genuine current NSE/niftyindices.com classification (Guardrail #8-clean) — narrower than the ~1,973-symbol PIT-safe build below (still owed), and current-day classification applied statically backward (disclosed; fails CONSERVATIVE — dead names excluded, not fabricated a performance) — a first, honest pass, not the final build.

Verdict: REJECTED, at the realistic disclosed cost (0.40%/side). Return/vol 0.775 vs V24's 0.911; MaxDD −43.2% vs V24's −37.7%; CAGR 16.7% vs 17.2%; ₹1 Cr → ₹27.47 Cr vs ₹30.35 Cr. Loses on every axis. The honest nuance: gross of realistic cost, the method DOES show real excess wealth/CAGR over V24 (₹33.99 Cr / 17.8%) — genuine gross signal from picking top-RS-within-sector names — but drawdown is worse than V24 at every cost level tested, including gross (a structural concentration effect, not a cost artifact: ~20-29 individual names are inherently riskier than the whole diversified sector index). Realistic transaction costs then erode most of the gross wealth edge (₹33.99→₹27.47→₹21.25 as the assumed cost rises 0.15%→0.40%→0.70%) — the SAME "no fundable edge beats the index net of cost" finding recorded everywhere else in this ledger, now confirmed at the within-sector stock-selection layer too. Sample current book (2026-04-01, 29 names, real holdings incl. BHARATFORG/MRPL/SHRIRAMFIN/ONGC/BSE/SBIN) and the full number set: ledger §2026-07-15.

Still owed before this is the final word (do not re-run hoping for a different number without these): the ~1,973-symbol PIT-safe classification below (this run used 268 live-only names); a real per-name ADV/impact cost model (this run used a flat 0.40%/side proxy); a significance pass on this result (same JK/bootstrap discipline as §15i). The data-feasibility spec below is UNCHANGED and remains the target build — this first pass ran the SIMPLER, immediately-available version of it, not a substitute for it.


The original spec (SCOPED 2026-07-16 — feasible, gated on ONE dataset; the target for the next iteration)

the desk's design (his words, 2026-07-15 — this is the spec, do not paraphrase it away): invest directly in stocks, because "for media, realty, consumer durables we cannot invest directly; we must invest through the stocks." Identify the top-performing stocks within the strongest sectors. Not one recently-hot name — "we need a portfolio that outperforms… we can't rely entirely on one stock, nor can we diversify excessively." The discriminator: "if a stock is performing well within its NARROW index, we will target it" — i.e. stock RS measured against its OWN sector, not the broad benchmark. A stock beating its own hot sector is a different and harder test than a stock merely carried by its sector. Same question applies when choosing among Nifty 50/100/200 — the size-index call also has to resolve down to underlying stocks (incl. V21's Next-50 sleeve).

Data audit (ledger §2026-07-16 — measured, do NOT re-derive): sector strength ✅ (index_rows 2005→2026)· stock RS-vs-own-sector vocabulary ✅ (stock_signals.rs_vs_sector_today + slopes/rsi_of_rs/rs_phase, 2011→2026, 5.97M rows)· stock prices incl. dead names ✅ (bhavcopy_rows 2004→2026, 9.39M rows). ❌ THE ONE BLOCKER: stock_index_membership holds 4 WEEKS (2026-06-17→07-14). Today's members only. 46% of the 2011 universe is dead; ZERO dead names carry any sector label. Backtesting with today's member list = survivorship fake, plausibly Sharpe 1.5–2.0 and worthless. Do not build it.

✅ Bounded: at a ₹5cr ADV floor the whole universe that ever mattered = 1,973 symbols (1,693 live + 280 dead); at ₹25cr only 113 dead. Live side = NSE industry classification (primary source, Guardrail

#8-clean, automatable). Dead side = the genuine work, but it is 280 names, not 1,500 shells.

DECIDED design — build our OWN sector composites, not index membership (ledger 16BB): a sector = every liquid stock classified in that industry at date d; we build the composite. Investable by construction (the sector IS a stock basket → kills the §6-bis untradeable-leg flaw)· wider pond (Nifty Auto ≈15 names, the Auto industry ≈60)· far less survivorship bias (a company doesn't EARN its way into "Auto" by outperforming; it earns its way into Nifty Auto — industry is not a performance filter)· membership history becomes unnecessary — the gap dissolves rather than needing a backfill.

Build order: ① PIT sector classification table for ~1,973 symbols, knowable_at-stamped (the unlock) → ② own sector composites, liquidity-floored, PIT → ③ sector layer = V24's logic on our composites → ④ stock selection: sector qualifies vs broad AND stock beats its own sector (double confirmation), ~4–8 names/sector, weight = sector weight × stock-RS rank, per-stock cap, ≤40 total, per-sector stops → ⑤ bias bound: run it twice (dead names average-performing, then worst-decile) and report the RANGE.

PRE-REGISTERED BAR (set BEFORE running — failure-ledger discipline): stock momentum is ledger-recorded as BETA not skill (t=1.99); only LOWVOL_MOM qtr large-cap cleared fundable (1.02 @₹50cr); stock legs cost more than index legs. Merely MATCHING the sector-index book = REJECTION, not a result.

#1-bis — historical note (how #1 came to be mis-filed until 2026-07-15)

Spec (the desk's original brief, 2026-07-15): take V24's qualifying sectors as the sector layer (the desk's designation, 2026-07-15) → inside each, rank constituents by stock-level RS → hold the top names up to a ≤40-stock book → weight by sector-RS × stock-RS → per-sector stops → carry the same RSI-green entry gate + hysteresis + own-percentile tapers down to the stock leg. Reuse the existing stock_signals RS columns (built; do not rebuild). Then /dash/model-portfolios integration only if it survives its own falsification round.

The honest prior — this may fail, and the ledger says so: the momentum riskadj notes + ledger's momentum-net-of-cost wall record that stock-level momentum selection is BETA, not skill (t=1.99), and only LOWVOL_MOM quarterly large-cap cleared the fundable bar (1.02 @ ₹50cr). Stock legs cost far more than index legs. A constituent build that merely matches the index book is a REJECTION, not a result — it must beat the sector ladder net of realistic stock-level costs to earn anything. Pre-register that bar before running it, per the standing failure-ledger discipline.

#2 — the rigor items on the sector layer (do not skip because #1 is more exciting)

10. Sources of truth