TradeTech Analytics

All strategies · Ironbark review page

MFS-15: multi-factor swing on the Nifty 500, review and test result

Version 1.0. Closed 2026-10-20 on development evidence. Owner: Prashant Maheshwari. Status: closed 2026-10-21. The blueprint fails on costs; the futures version passed a first test but failed the lot-aware second look at ₹50 lakh (section 11.2). The paper run was cancelled before its first decision. The 2025-10 hold-out was not opened. Capital considered: ₹20 lakh.

1. What was asked

Review, redesign, build, test and (if it survives) paper-trade the "MFS-15" blueprint: LightGBM ranks the Nifty 500 on the chance of beating the median over 5 days, Google's TabFM vetoes disagreeing names, positions are sized by ATR (1.5 ATR stop), correlated baskets are cut back, a 3% daily drawdown halts new entries, holding period 1 to 15 days.

2. Review of the blueprint (before building)

Blueprint element Finding
TabFM "reads candlestick structure, zero-shot" Not what it is. TabFM (Google Research, June 2026) is a tabular in-context learner: it is shown a table of past rows and labels and predicts new rows. It does not read charts. Used here as a second model on the same features.
TabFM licence Code is Apache-2.0 but the pretrained weights are non-commercial, non-production only. Fine for research and paper testing; not for a live trading system. A production design must work without it.
TabFM on this server Works (PyTorch CPU, 6.2 GB weights). Speed with 2 ensemble members and 600 context rows: about 0.7 s per scored row on an idle 8-core CPU (default 32 members is about 15x slower). A full 2018-2023 walk-forward at 20 candidates a day would take about 6 hours; a bounded sample was run instead (section 4.3).
Polars, Redis, APScheduler, TA-Lib, PyPortfolioOpt Not needed. Pandas/numpy already handle 682 names; state is a JSON ledger with hash-chained snapshots (the audit design used for the weekly strategies). Hierarchical risk parity was replaced by a plain rule: at most 2 positions that have 60-day return correlation above 0.6 with a candidate. No sector table exists in the data.
Dhan M1 bars Not needed for a daily-bar strategy; daily bars from the existing point-in-time panel were used.
Bracket order with 1.5 ATR stop Modelled: gap through the stop fills at the open, otherwise at the stop, with slippage.

3. What was built (research/mfs/)

4. Results (development only)

4.1 The signal is real

Rank information coefficient of the LightGBM score against the 5-day forward return: +0.065 (t 12.9) in 2018-2020, +0.051 (t 12.2) in 2021-2023. The 50 top-ranked names beat the daily average by +0.25% and +0.10% per 5 days. With zero costs the full simulated strategy made about +29% a year (drawdown 29%).

4.2 The costs remove it

Statutory delivery charges (0.24% a round trip, mostly securities transaction tax) plus slippage come to about 0.45% to 0.8% a round trip, against a gross gain of 0.25% to 0.5% a trade. The strategy trades about 400 to 600 times a year, so friction is 15% to 22% of capital a year. | 2018-2023, ₹20 lakh | CAGR | Max drawdown | |---|---|---| | Blueprint rules, 0x costs | +28.7% | 29% | | Blueprint rules, 1x costs (0.20% slippage) | -11.6% | 63% | | Blueprint rules, 2x costs | -42% | 96% | | Liquidity-tiered slippage (0.05% / 0.10% / 0.20% by traded value; an assumption), 1x | -3.3% | 45% | | Same, slower rules (hold at least 15 sessions, top 20, 3 ATR stop), 1x / 2x / 3x | +8.2% / -5.8% / -18.4% | 22% / 44% / 73% | | Nifty 500 buy and hold, same period | +12.8% | n/a | Eight slower variants were also tried (top 10 or 20, minimum hold 10 or 15, decay exit rank 60 or 150, 3 ATR stop, tiered slippage). None was positive at 2x costs in either the selection or the confirmation period (best at 2x: -9.4% and -2.8%); at 1x only the slowest were positive in the confirmation period (up to +11.7%, still below the index, with drawdowns of 20% to 35%). The ATR stop is hit by about 30% of trades at 1.5 ATR, which adds churn; removing it did not help. Disabling the correlation rule or the drawdown halt changed little.

4.3 TabFM adds nothing demonstrable

On 500 candidate rows (top 25 LightGBM names on 20 sampled days of 2023; context of 600 random rows from 2022), TabFM's probability correlated 0.63 with the LightGBM score. Vetoing the bottom half left a mean 5-day excess return of +0.20% against -0.05% for the vetoed names, but the rank correlation of both scores with the forward excess return was negative in this sample (-0.14 and -0.12), so the sample is too small and too clustered (20 days) to say anything. It cannot rescue a strategy that loses 15% to 22% a year in friction before any veto, so the full 6-hour test was not run.

5. Decision

Do not paper-trade MFS-15 and do not take it to production. The prediction model is good; the holding period is too short for Indian delivery costs. The gap is not a tuning problem: even the slowest variant needs costs below 1x to beat the index.

6. What would change the verdict (and what already exists)

7. Known limits

Survivorship (the weekly studies use a 4% and 8% a year haircut; none was needed to reach this conclusion), jump-cleaned prices, point-in-time membership by effective date, tiered slippage is an untested assumption, development-window evidence only, a mid-test setting change: the stop-out gate for the sealed test was fixed after seeing the development grid.

8. Follow-up tests of the section 6 recommendations (2026-10-20, development window)

Intraday version (buy or short at the next open, square off at the close; 5-day score and a new 1-day LightGBM; ₹20 lakh; intraday schedule, tiered slippage on both fills). The 1-day model ranks next-day open-to-close returns better (IC +0.083 and +0.090, t 15.8 and 20.7). Gross long-short results are very large (+55% to +113% a year, Sharpe about 5), which is too good to be tradable: the next-day open print is noisy and the backtest buys at it. After costs: best case (1-day model, 10 longs and 10 shorts) +1.5% in 2018-2020 and -16.1% in 2021-2023 at 1x; negative everywhere at 2x and 3x; long-only is negative at 1x. Intraday fails.

Stock-futures cost schedule (STT 0.02% on sells, ₹20 per order, slippage 0.03% / 0.05% per fill by traded value, only names with traded value of ₹100 crore a day or more as a proxy for F&O-eligible and liquid). Same signal, same rules. Slower rules (top 20, hold at least 15 sessions, 3 ATR stop, 12 names), 2018-2023 vs Nifty 500 (+13.1%, drawdown 38%, Sharpe 0.78): | Costs | CAGR | Max drawdown | Sharpe | Beta | Alpha a year (t) | |---|---|---|---|---|---| | 1x | +17.2% | 15.2% | 1.40 | 0.49 | +9.7% (3.0) | | 2x | +13.6% | 15.9% | 1.14 | 0.49 | +6.6% (2.0) | | 3x | +10.1% | 19.4% | 0.87 | 0.49 | +3.5% (1.1) | Both halves are positive at 3x (2018-2020 +4.1%, 2021-2023 +14.2%). The blueprint rules at futures costs are weaker (3x: -2.2% and +2.1%). With fewer names (6 or 4, for a ₹20 lakh account) drawdown falls to 6% to 11% and CAGR to 4% to 16% at 2x (less capital deployed). Reading: low costs are what turns the signal positive; the result is mostly lower risk (beta 0.5) with a few points of alpha, not a large edge over the index. Cautions: no futures prices were used (cash prices stand in; basis, roll cost and carry are ignored); F&O eligibility is proxied by liquidity; stock-futures lots are typically ₹5 to ₹10 lakh of contract value, so ₹20 lakh supports about 2 to 4 names at 1x notional and the 12-name result needs roughly ₹60 to ₹100 lakh; the slippage tiers are assumptions. Nine-plus rule sets have now been tried on this window, so the 2018-2023 figures are optimistic.

9. Pre-registered one-time test (written 2026-10-20 before the 2024-01 to 2025-09 predictions were produced)

Candidates, frozen exactly as above: F-12 (12 names, 10% cap) and F-4 (4 names, 25% cap, top 10, ₹20 lakh-feasible). Model, features and parameters unchanged; models for 2024 and 2025 are trained only on earlier data with the 8-session embargo. Period: 2024-01-01 to 2025-09-30, run once. Pass for a candidate if, at 2x costs, CAGR is positive, drawdown is at most 20% and the beta-adjusted alpha against the Nifty 500 is positive, and at 3x costs CAGR is positive. Pass leads to a paper-trading design (not live money); fail closes the idea. The 2025-10 hold-out stays sealed until the owner instructs otherwise.

10. Result of the one-time test (run 2026-10-20 under the section 9 rules) and paper run

2024-01-01 to 2025-09-30, models retrained on earlier data only. Nifty 500 price index +9.5% a year, drawdown 18.8%. | Candidate | Costs | CAGR | Max drawdown | Sharpe | Beta | Alpha a year (t) | |---|---|---|---|---|---|---| | F-12 | 1x / 2x / 3x | +18.8% / +12.1% / +8.0% | 13.6% / 14.9% / 16.3% | 1.35 / 0.92 / 0.64 | 0.75 | +10.5% (1.8) / +4.7% (0.8) / +0.9% (0.2) | | F-4 | 1x / 2x / 3x | +11.4% / +9.6% / +7.7% | 6.1% / 6.4% / 6.8% | 1.75 / 1.47 / 1.20 | 0.30 | +7.6% (2.4) / +5.9% (1.8) / +4.3% (1.3) | Both candidates meet the section 9 gate. Honest reading: positive after stressed costs and with small drawdowns, but mostly because it holds little (F-4 beta 0.3); alpha is modest and not statistically firm; the 2024-2025 window is one market regime; the result still rests on stock-futures costs applied to cash prices. Paper run (paper_mfs.py, spec paper_spec.json, frozen 2026-10-20): F-4 only, ₹20 lakh notional, first decision at the 2026-10-21 close, fills at the next open, standard costs (1x), stops on daily lows, deterministic nightly replay at 19:45 IST, model trained through 2025-09 and frozen, hash-chained signal snapshots in paper_signals/mfs/ pushed to GitHub. Reading rules for the run: judge after at least 3 months and 60 closed trades; compare fills with the 2x cost curve; the run does not test lot-size feasibility, futures basis or real slippage. Not production-ready because: no futures prices or lot sizes were used; the order-routing layer (bracket orders, state store) is not built and would need the owner's approval for any live switch; TabFM weights cannot be used commercially and were not part of the paper design.

11. Lot-aware futures version at ₹50 lakh (owner instruction 2026-10-21: Dhan futures data approved, capital ₹50 lakh)

What Dhan provides. Current stock-futures contracts for 231 underlyings with exact lot sizes, and hourly bars for the live near and next contracts back to 2026-07-29. Expired contracts are not published, so a multi-year backtest on real futures prices is not possible; the history below still uses cash prices. The 12 weeks of real futures bars were used to check assumptions: annualised close basis median 4.9% (matches a repo-like carry; modelled as repo on notional); futures open versus spot open median +0.57% with 0.9% scatter after removing carry, so single-day execution prices on futures differ from cash prices by about a percent in either direction (noise, not a bias, but it adds trade-level variance not in the backtest); near-contract traded value for large names is roughly half of the cash traded value. Lots. Median current contract value is ₹6.2 lakh (10th to 90th percentile ₹4.6 to ₹9.2 lakh). The simulator now trades whole lots of ₹6.2 lakh (stress: ₹9.2 lakh), futures accounting (no cash outlay, margin not binding below 1.5x notional), carry charged on notional, flat ₹20 plus GST per order. At ₹50 lakh one lot is about 12% of capital, so 4 to 8 names means 25% to 70% of capital in contracts and the rest in cash at repo. Universe. Names in Dhan's current F&O list. This list is known only today, so it carries look-ahead (stocks that entered F&O usually grew into it). Diagnostic: names with traded value of ₹100 crore a day or more that are not in the list gave only +4.0% and +2.1% (2x costs, few trades) against +10.9% and +14.6% for the list, so some of the result may come from the look-ahead. The 4% a year survivorship allowance used in the weekly studies is therefore applied in the gate below. Development grid (2018-2023, 2x costs, 20 combinations of names 3/4/5/6/8, leverage cap 1.0/1.5, top-N 10/20). All 20 positive in both halves; leverage cap never binds (exposure 27% to 75%). Chosen on the lower of the two halves with drawdown under 20%: A = 4 names (selection +10.9%, confirmation +14.6%, drawdown 6% and 12%) and B = 6 names (+7.9% and +18.4%, drawdown 10% and 15%) as the higher-exposure comparison. Development detail, 1x/2x/3x: A +12.3/+10.9/+7.8% and +15.6/+14.6/+12.8%; B +8.5/+7.9/+4.7% and +21.4/+18.4/+14.6%. Coarser lots (₹9.2 lakh) change little; fractional sizing is worse for A in the first half (+7.0%), so lot rounding is not what carries the result.

11.1 Pre-registered second look at 2024-01-01 to 2025-09-30 (written before it was run)

This period was already used once (section 10, ₹20 lakh, different lot and capital model); it is therefore not untouched. The 2025-10 hold-out stays sealed. Candidates A and B exactly as above, ₹50 lakh, models unchanged. Pass for a candidate if all of: (1) CAGR at 2x costs minus 4% a year is above 0; (2) CAGR at 3x costs minus 4% a year is above 0; (3) drawdown at 2x is at most 20%; (4) beta-adjusted alpha against the Nifty 500 price index at 2x (before the allowance) is above 0. Pass leads to a paper run at ₹50 lakh with real lot sizes and the live F&O list; the hold-out opens only once the paper run has history and the page carries the full test data (owner instruction 2026-10-21).

11.2 Result of the second look (run 2026-10-21 under the 11.1 rules)

2024-01-01 to 2025-09-30, ₹50 lakh, whole lots, Dhan's current F&O list, Nifty 500 price index +9.4% a year (drawdown 18.8%): | Candidate | Costs | CAGR | After 4% allowance | Max drawdown | Sharpe | Beta | Alpha (t) | |---|---|---|---|---|---|---|---| | A (4 names) | 1x / 2x / 3x | +6.4% / +4.7% / +2.5% | +2.4% / +0.7% / -1.5% | 5.8% / 7.2% / 9.2% | 0.90 / 0.68 / 0.37 | 0.30 | +3.4% (0.8) / +1.8% (0.4) / -0.4% (-0.1) | | B (6 names) | 1x / 2x / 3x | +1.9% / -1.4% / -5.6% | -2.1% / -5.4% / -9.6% | 15.0% / 16.4% / 20.0% | 0.24 / -0.10 / -0.53 | 0.46 | -2.4% / -5.6% / -10.1% | Both fail the gate (A fails condition 2, the 3x test after the allowance; B fails conditions 1, 2 and 4). Development, same rules, 2018-2023 at 2x: A +13.0% (alpha t 4.2), B +13.9%. Average trade return: +0.93% in development, +0.17% in the reserved period. The earlier ₹20 lakh cash-price result (section 10) is superseded because it ignored lot sizes and used a liquidity proxy for the F&O list. Decision. Do not paper-trade or productionise. Paper run cancelled (cron removed) before its first decision on 2026-10-21; paper_mfs.py and paper_spec.json remain as the plumbing for any later candidate and are marked superseded. The 2025-10 hold-out stays sealed. Test data: full equity, trades (with signal columns), fills, audit checks and all configurations are on the review page. If this is revisited: the only route to a real futures backtest is to collect futures prices from now on (nightly daily bars for the live contracts); about a year of data would be needed. A nightly collection job is cheap but has not been started (needs approval).


Research and education only. Hypothetical and back-tested results have inherent limitations and do not guarantee future results. Not investment advice; the publisher is not presented as a SEBI-registered investment adviser or research analyst.