All strategies · Ironbark review page
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.
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.
| 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. |
feat.py: 34 point-in-time daily features (returns 1 to 120 days, volatility, ATR%, gap, close position, distance to highs/lows, SMAs, RSI 2/14, MACD, volume ratio, beta, relative strength, causal wavelet-denoised slope, market-state), cross-sectional percentile ranks, label = beats the day's median 5-session return (next open to close 5 sessions later). Universe: point-in-time Nifty 500 members, average traded value at least ₹5 crore, 120 days of history.wf_lgb.py: walk-forward LightGBM, one model per calendar year trained on all earlier rows with an 8-session embargo, 3 seeds.sim.py: event-driven long-only cash-delivery simulator (ATR sizing at 0.6% of equity risk per trade, 10% position cap, 12 positions, correlation rule, 3% daily-drawdown halt, time exit at 15 sessions, rank-decay exit), Indian delivery cost schedule plus slippage, costs scaled 1x/2x/3x, cash earning repo less 1.5%.tabfm_veto_test.py: bounded TabFM test.
Windows: development 2018-01 to 2023-12 (selection 2018-2020, confirmation 2021-2023). 2024-01 to 2025-09 was reserved as a one-time test and was never run; 2025-10 onward (the sealed hold-out) was never evaluated for this strategy. Predictions for those dates were not produced.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%).
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.