Trading Book · research / 27 September 2026
86 skipped trades.
Could entry filters improve the result?
A detailed audit of the ₹21.94L backtest: capacity failures, 59 entry rules, changed holdings, and what survives the cost and timing checks.
Research dated 27 September 2026. Yes: lagged ADR filters improve the marked historical result with the same ₹60L limit. The strongest first-screen result is ₹24.12L at ADR 2%–5%; a later, explicitly post-screening 2%–4% test reaches ₹26.96L. Neither is a verified future return. The tighter rule's increase is entirely driven by a larger open-profit component: realized profit falls to ₹7.07L.
This research changes no production code, parameters, trades or deployments. It studies admission to the previously verified historical entry stream. It does not run the complete current production scanner.
Why the original 86 were skipped
There were 127 opportunities, 41 accepted lots and 86 capacity rejections. The simulator records 76 slots and 10 cash because it tests the twelve-slot limit first. Reconstructing both conditions shows that all 76 slot rejections also lacked enough cash. The remaining ten had a spare slot but insufficient cash for the calculated whole lot. These were not quality-filter failures.
By 15 April, the original queue had filled all twelve slots, spending ₹59,97,018.39 and leaving only ₹2,981.61. It still held those same twelve lots when LAURUSLABS arrived on 23 April and CPPLUS on 5 May. That is why later desirable entries could not be added. In another example, KIRLOSENG on 15 May had eleven occupied slots and about ₹4.93L free, but the backtest required its calculated almost-₹5L lot; it does not automatically reduce quantity to the remaining cash.
The skips were concentrated early: April 40, May 27, June 2, July 5, August 9, September 3. Under the same standalone exits, 29 skipped opportunities finish positive and 57 negative. The 86 standalone outcomes sum to ₹7.71L, but that is unfunded, includes overlapping repeated stocks, and cannot be added to the baseline while claiming the ₹60L constraint.
Any workable filter must apply to every incoming opportunity, freeing cash before future winners arrive. It cannot see those future winners or cherry-pick the profitable 29. The complete before-entry cash and holdings for each decision are in baseline-decisions.csv.
Portfolio results, with the exits held fixed
| Entry rule | P&L | Change | Realized | Open gains | Taken | Daily-close max drawdown |
|---|---|---|---|---|---|---|
| Original queue, no added filter | ₹21.94L | — | ₹10.18L | ₹11.76L | 41 | 6.26% |
| ADR 2%–5% | ₹24.12L | +₹2.18L | ₹11.06L | ₹13.06L | 34 | 5.07% |
| ADR ≤5% | ₹24.04L | +₹2.10L | ₹11.06L | ₹12.98L | 36 | 5.25% |
| ADR 3%–5% | ₹23.52L | +₹1.59L | ₹10.20L | ₹13.32L | 33 | 5.21% |
| Least MA20 extension first | ₹22.97L | +₹1.03L | ₹11.21L | ₹11.76L | 40 | 6.19% |
| ADR 2%–4% — post-screening | ₹26.96L | +₹5.02L | ₹7.07L | ₹19.89L | 25 | 5.24% |

All results start with ₹60L, use at most twelve simultaneous lots and ₹5L purchase cost per lot, and retain ₹40k initial structural risk sizing. No capital is added. The unchanged winning exit policy is: initial structural stop 8% below entry; disaster protection at 95% of that structural stop; close breach exits at the next open; ratchet to 97% of the 20 post-entry closes once available; no breakeven, target or eight-week hold. Entry-session exclusion, the historical entry prices and the September 22 terminal mark remain unchanged. Closed sales include 0.5% slippage; this headline table excludes other fees and terminal liquidation costs.
Results count repeated entries as separate lots, including multiple positions in the same stock. They are not annualized returns. Drawdown uses daily closing equity and does not capture worse intraday drawdown. Realized and open columns must be distinguished.
The first screen contained 59 declared simple policies, covering ADR, trend, momentum, relative strength versus NIFTYBEES, proximity to highs, extension, turnover, prior volume, dry-up, ETFs, duplicate positions and same-date ranking. The 2%–5% rule won that screen. Subsequent neighboring thresholds and combinations are saved separately as post-screening diagnostics; 2%–4% was discovered in those follow-ups. This sequence is explicit so that a later maximum is not presented as a rule chosen beforehand.
The actual filters
For an entry on date D, use only the twenty completed trading sessions strictly before D:
ADR20 = 100 × mean((session_high − session_low) / session_close)
Candidate A: require 2 ≤ ADR20 ≤ 5
Candidate B: require 2 ≤ ADR20 ≤ 4 # explored after the initial screen
Both bounds are inclusive. Require twenty valid bars; reject when this feature is unavailable. Retain original arrival order for the primary ADR tests. This is the average high-low range divided by close, not ATR, not a close-to-close change proxy, and not the entry day's completed range. GSPCROP and RSL have fewer than twenty prior sessions and are rejected by these rules; the baseline retains them. A history-only rejection makes ₹15.29L, so the ADR result is not simply an IPO-history exclusion.
The broad result is driven more by the upper edge than the precise lower edge: ADR ≤5% alone makes ₹24.04L, only about ₹8,040 below 2%–5%. There is little evidence here that a precisely 2% floor is essential. A 3%–5% band makes ₹23.52L. The production snapshot already configured entry.adr_min_pct=3 and entry.adr_max_pct=5; the ₹21.94L winning exit backtest did not impose that entry gate. Testing one gate on the old book does not reproduce all the other production entry requirements.
A separate ranking rule sorts candidates available on the same date by ascending 100 × (prior_close / prior_SMA20 − 1), missing values last, and keeps the existing cash and slot checks. It returns ₹22.97L, but is sensitive to cash assumptions. This score is signed: stocks below the average rank earlier; it is not the absolute distance to the average. The date-only book cannot establish when candidates actually became available intraday, so this is a batch-ranking diagnostic.
Which missed trades became possible?
The 2%–5% portfolio keeps 23 original lots, newly admits 11 skipped lots (eight positive and three negative), and loses 18 original admissions. New lots contribute ₹3.24L; the displaced original lots had contributed ₹1.06L, producing the ₹2.18L net increase. Newly admitted positives include LAURUSLABS on 10 July (+₹1.53L), AVALON on 7 August (+₹0.84L), and LAURUSLABS on 28 July (+₹0.75L). Seventeen original lots fail the new gate; another loses capacity through the changed portfolio path. The rule still misses several of the largest early winners.
The 2%–4% portfolio keeps twelve original lots, newly admits thirteen skipped lots (seven positive and six negative), and displaces 29 original admissions. The new lots contribute ₹9.18L and the removed original lots had contributed ₹4.16L, giving the ₹5.02L net increase. It captures the earlier LAURUSLABS opportunity and SHILPAMED, but also rejects some profitable KIRLOSENG, INDSWFTLAB and TDPOWERSYS lots.
| Skipped opportunity | Hypothetical lot P&L | ADR before entry | Result with 2%–4% filter |
|---|---|---|---|
| LAURUSLABS · 2026-04-23 | ₹3.92L | 2.69% | taken |
| ATHERENERG · 2026-04-27 | ₹3.16L | 5.50% | filter |
| LAURUSLABS · 2026-05-08 | ₹3.16L | 2.69% | slots |
| SHILPAMED · 2026-08-05 | ₹2.95L | 3.44% | taken |
| CPPLUS · 2026-05-05 | ₹2.07L | 4.66% | filter |
| KIRLOSENG · 2026-05-15 | ₹1.94L | 3.94% | cash |
| KIRLOSENG · 2026-04-27 | ₹1.67L | 4.33% | filter |
| LAURUSLABS · 2026-07-10 | ₹1.53L | 3.13% | taken |
This table is an after-the-fact explanation, not an input to selection. A positive missed trade can still be rejected by the improved portfolio, and a newly accepted trade can lose money.
The ₹26.96L result has ₹19.89L open in only three stock names: three LAURUSLABS lots, two WELCORP lots and one SHILPAMED lot. Its open-profit increase exceeds its total improvement because realized profit falls from ₹10.18L to ₹7.07L. Its best five lots contribute ₹22.88L. This remains a concentrated outcome, even though its daily-close drawdown is smaller than baseline.
Detailed substitutions: validation.json; adr_2_to_5-trades.csv; posthoc_adr_2_to_4-trades.csv.
Explore all 86 skipped trades
Sorted by hypothetical standalone outcome for explanation only. These outcomes include open marks and are not jointly fundable. “Slots” is the first recorded rejection; it can overlap a cash shortage. “Filter” means the new entry gate rejected the setup. A different admission path can keep a qualifying trade out for lack of capacity.
86 of 86 skipped trades shown.
| ID | Stock | Entry date | Baseline reason | Slots used | Cash before | Prior ADR | Standalone P&L | With 2%–5% | With 2%–4% |
|---|---|---|---|---|---|---|---|---|---|
| 32 | LAURUSLABS | 2026-04-23 | slots | 12 | ₹2,982 | 2.69% | ₹3.92L | slots | taken |
| 41 | ATHERENERG | 2026-04-27 | slots | 12 | ₹2,982 | 5.50% | ₹3.16L | filter | filter |
| 65 | LAURUSLABS | 2026-05-08 | slots | 12 | ₹2,982 | 2.69% | ₹3.16L | cash | slots |
| 113 | SHILPAMED | 2026-08-05 | slots | 12 | ₹78,222 | 3.44% | ₹2.95L | slots | taken |
| 58 | CPPLUS | 2026-05-05 | slots | 12 | ₹2,982 | 4.66% | ₹2.07L | slots | filter |
| 73 | KIRLOSENG | 2026-05-15 | cash | 11 | ₹493,113 | 3.94% | ₹1.94L | cash | cash |
| 42 | KIRLOSENG | 2026-04-27 | slots | 12 | ₹2,982 | 4.33% | ₹1.67L | slots | filter |
| 99 | LAURUSLABS | 2026-07-10 | slots | 12 | ₹124,975 | 3.13% | ₹1.53L | taken | taken |
| 62 | HONASA | 2026-05-07 | slots | 12 | ₹2,982 | 3.62% | ₹1.13L | cash | slots |
| 98 | RUBICON | 2026-07-10 | slots | 12 | ₹124,975 | 5.33% | ₹1.00L | filter | filter |
| 14 | CLEANMAX | 2026-04-16 | slots | 12 | ₹2,982 | 5.40% | ₹0.88L | filter | filter |
| 115 | AVALON | 2026-08-07 | slots | 12 | ₹78,222 | 4.73% | ₹0.84L | taken | filter |
| 108 | LAURUSLABS | 2026-07-28 | slots | 12 | ₹143,070 | 2.89% | ₹0.75L | taken | taken |
| 53 | SUNFLAG | 2026-05-04 | slots | 12 | ₹2,982 | 4.92% | ₹0.67L | slots | filter |
| 39 | SENORES | 2026-04-27 | slots | 12 | ₹2,982 | 4.10% | ₹0.52L | slots | filter |
| 116 | AVALON | 2026-08-07 | slots | 12 | ₹78,222 | 4.73% | ₹0.50L | slots | filter |
| 112 | UNIPARTS | 2026-08-04 | slots | 12 | ₹78,222 | 3.91% | ₹0.50L | slots | taken |
| 20 | AEQUS | 2026-04-17 | slots | 12 | ₹2,982 | 5.06% | ₹0.46L | filter | filter |
| 51 | BELRISE | 2026-04-30 | slots | 12 | ₹2,982 | 3.32% | ₹0.25L | slots | slots |
| 15 | SYRMA | 2026-04-16 | slots | 12 | ₹2,982 | 4.16% | ₹0.24L | taken | filter |
| 89 | ADANIENSOL | 2026-06-05 | cash | 11 | ₹496,194 | 4.69% | ₹0.23L | taken | filter |
| 64 | CGPOWER | 2026-05-07 | slots | 12 | ₹2,982 | 3.17% | ₹0.23L | cash | slots |
| 76 | GVT&D | 2026-05-18 | cash | 11 | ₹493,805 | 3.84% | ₹0.22L | taken | taken |
| 107 | VADILALIND | 2026-07-28 | slots | 12 | ₹143,070 | 3.25% | ₹0.16L | taken | taken |
| 49 | MCX | 2026-04-28 | slots | 12 | ₹2,982 | 3.08% | ₹0.12L | slots | slots |
| 97 | RPTECH | 2026-07-09 | slots | 12 | ₹124,975 | 6.18% | ₹0.06L | filter | filter |
| 70 | ADANIPOWER | 2026-05-14 | cash | 11 | ₹493,113 | 4.07% | ₹0.05L | taken | filter |
| 74 | ADANIPOWER | 2026-05-15 | cash | 11 | ₹493,113 | 4.14% | ₹0.04L | cash | filter |
| 50 | SGMART | 2026-04-28 | slots | 12 | ₹2,982 | 4.96% | ₹0.01L | slots | filter |
| 126 | GOLDBEES | 2026-09-11 | slots | 12 | ₹125,641 | 1.12% | ₹-0.01L | filter | filter |
| 33 | KINGFA | 2026-04-23 | slots | 12 | ₹2,982 | 3.27% | ₹-0.01L | slots | taken |
| 30 | NMDC | 2026-04-22 | slots | 12 | ₹2,982 | 2.98% | ₹-0.06L | slots | taken |
| 29 | RISHABH | 2026-04-17 | slots | 12 | ₹2,982 | 6.33% | ₹-0.09L | filter | filter |
| 114 | AETHER | 2026-08-06 | slots | 12 | ₹78,222 | 3.82% | ₹-0.10L | slots | slots |
| 18 | GMDCLTD | 2026-04-16 | slots | 12 | ₹2,982 | 4.13% | ₹-0.11L | slots | filter |
| 125 | MON100 | 2026-09-10 | slots | 12 | ₹125,641 | 0.91% | ₹-0.11L | filter | filter |
| 124 | NIFTYBEES | 2026-09-07 | slots | 12 | ₹125,641 | 1.24% | ₹-0.12L | filter | filter |
| 26 | TENNIND | 2026-04-17 | slots | 12 | ₹2,982 | 3.97% | ₹-0.13L | slots | taken |
| 57 | JUNIORBEES | 2026-05-05 | slots | 12 | ₹2,982 | 2.03% | ₹-0.15L | slots | slots |
| 17 | QPOWER | 2026-04-16 | slots | 12 | ₹2,982 | 5.50% | ₹-0.15L | filter | filter |
| 83 | LLOYDSME | 2026-05-25 | slots | 12 | ₹6,938 | 3.31% | ₹-0.17L | taken | taken |
| 36 | GLENMARK | 2026-04-24 | slots | 12 | ₹2,982 | 3.23% | ₹-0.17L | slots | slots |
| 52 | ADANIPOWER | 2026-05-04 | slots | 12 | ₹2,982 | 4.13% | ₹-0.18L | slots | filter |
| 22 | EMMVEE | 2026-04-17 | slots | 12 | ₹2,982 | 6.01% | ₹-0.20L | filter | filter |
| 72 | LLOYDSME | 2026-05-14 | cash | 11 | ₹493,113 | 3.26% | ₹-0.21L | cash | taken |
| 12 | SILVERCASE | 2026-04-15 | slots | 12 | ₹2,982 | 5.56% | ₹-0.21L | filter | filter |
| 16 | ICICIAMC | 2026-04-16 | slots | 12 | ₹2,982 | 4.62% | ₹-0.22L | taken | filter |
| 44 | TATASTEEL | 2026-04-27 | slots | 12 | ₹2,982 | 2.21% | ₹-0.27L | slots | slots |
| 43 | GPIL | 2026-04-27 | slots | 12 | ₹2,982 | 3.67% | ₹-0.27L | slots | slots |
| 28 | NATCOPHARM | 2026-04-17 | slots | 12 | ₹2,982 | 3.66% | ₹-0.27L | slots | taken |
| 119 | PSUBNKBEES | 2026-08-14 | slots | 12 | ₹78,222 | 2.17% | ₹-0.37L | slots | slots |
| 13 | LENSKART | 2026-04-15 | slots | 12 | ₹2,982 | 4.21% | ₹-0.39L | taken | filter |
| 67 | CHENNPETRO | 2026-05-08 | slots | 12 | ₹2,982 | 4.82% | ₹-0.41L | cash | filter |
| 47 | IMFA | 2026-04-28 | slots | 12 | ₹2,982 | 4.67% | ₹-0.42L | slots | filter |
| 118 | ITBEES | 2026-08-14 | slots | 12 | ₹78,222 | 2.95% | ₹-0.42L | slots | slots |
| 24 | SMSPHARMA | 2026-04-17 | slots | 12 | ₹2,982 | 5.19% | ₹-0.42L | filter | filter |
| 56 | BRITANNIA | 2026-05-05 | slots | 12 | ₹2,982 | 2.48% | ₹-0.43L | slots | slots |
| 117 | BHARATFORG | 2026-08-07 | slots | 12 | ₹78,222 | 2.16% | ₹-0.43L | slots | slots |
| 19 | CEINSYS | 2026-04-16 | slots | 12 | ₹2,982 | 7.42% | ₹-0.44L | filter | filter |
| 71 | JAYNECOIND | 2026-05-14 | cash | 11 | ₹493,113 | 5.02% | ₹-0.45L | filter | filter |
| 31 | PFOCUS | 2026-04-22 | slots | 12 | ₹2,982 | 6.49% | ₹-0.45L | filter | filter |
| 54 | MACPOWER | 2026-05-04 | slots | 12 | ₹2,982 | 5.98% | ₹-0.46L | filter | filter |
| 55 | LINDEINDIA | 2026-05-04 | slots | 12 | ₹2,982 | 3.06% | ₹-0.46L | slots | slots |
| 37 | AUBANK | 2026-04-24 | slots | 12 | ₹2,982 | 3.25% | ₹-0.46L | slots | slots |
| 48 | NATIONALUM | 2026-04-29 | slots | 12 | ₹2,982 | 3.14% | ₹-0.46L | slots | slots |
| 25 | SHRIPISTON | 2026-04-17 | slots | 12 | ₹2,982 | 4.88% | ₹-0.47L | slots | filter |
| 121 | MOREALTY | 2026-08-20 | slots | 12 | ₹122,114 | 2.23% | ₹-0.47L | slots | slots |
| 27 | GMDCLTD | 2026-04-17 | slots | 12 | ₹2,982 | 4.67% | ₹-0.47L | slots | filter |
| 60 | SANSERA | 2026-05-07 | slots | 12 | ₹2,982 | 4.47% | ₹-0.49L | cash | filter |
| 46 | STEELCAS | 2026-04-28 | slots | 12 | ₹2,982 | 5.30% | ₹-0.50L | filter | filter |
| 23 | PFOCUS | 2026-04-17 | slots | 12 | ₹2,982 | 6.19% | ₹-0.50L | filter | filter |
| 66 | ARFIN | 2026-05-08 | slots | 12 | ₹2,982 | 4.63% | ₹-0.51L | cash | filter |
| 35 | ABSLAMC | 2026-04-24 | slots | 12 | ₹2,982 | 4.39% | ₹-0.51L | slots | filter |
| 86 | BHEL | 2026-05-29 | cash | 11 | ₹455,046 | 3.83% | ₹-0.51L | slots | cash |
| 85 | VEDL | 2026-05-26 | slots | 12 | ₹6,938 | 4.12% | ₹-0.52L | slots | filter |
| 87 | VEDL | 2026-06-01 | cash | 11 | ₹455,046 | 3.99% | ₹-0.54L | slots | cash |
| 40 | SARDAEN | 2026-04-27 | slots | 12 | ₹2,982 | 3.33% | ₹-0.57L | slots | slots |
| 84 | POCL | 2026-05-26 | slots | 12 | ₹6,938 | 5.41% | ₹-0.61L | filter | filter |
| 45 | ROSSTECH | 2026-04-27 | slots | 12 | ₹2,982 | 6.12% | ₹-0.65L | filter | filter |
| 69 | MACPOWER | 2026-05-14 | cash | 11 | ₹493,113 | 5.38% | ₹-0.65L | filter | filter |
| 21 | SAKAR | 2026-04-23 | slots | 12 | ₹2,982 | 5.62% | ₹-0.65L | filter | filter |
| 59 | JAINREC | 2026-05-07 | slots | 12 | ₹2,982 | 3.63% | ₹-0.65L | cash | slots |
| 34 | RHETAN | 2026-04-24 | slots | 12 | ₹2,982 | 3.33% | ₹-0.65L | slots | slots |
| 63 | APEX | 2026-05-07 | slots | 12 | ₹2,982 | 5.99% | ₹-0.65L | filter | filter |
| 61 | APEX | 2026-05-07 | slots | 12 | ₹2,982 | 5.99% | ₹-0.65L | filter | filter |
| 38 | RHETAN | 2026-04-24 | slots | 12 | ₹2,982 | 3.33% | ₹-0.65L | slots | slots |
Every added and displaced lot
These are portfolio substitutions, not one-to-one swaps. Earlier decisions change which later lots can fit. Removed trades can be profitable; newly admitted trades can lose. Amounts use the same modeled exits and September 22 mark.
ADR 2%–5%: newly admitted — 11 lots, ₹3.24L contribution
| Stock | Entry date | Prior ADR | Lot P&L | Exit / mark status | New decision |
|---|---|---|---|---|---|
| LAURUSLABS | 2026-07-10 | 3.13% | ₹1.53L | open | taken |
| AVALON | 2026-08-07 | 4.73% | ₹0.84L | close_stop | taken |
| LAURUSLABS | 2026-07-28 | 2.89% | ₹0.75L | open | taken |
| SYRMA | 2026-04-16 | 4.16% | ₹0.24L | close_stop | taken |
| ADANIENSOL | 2026-06-05 | 4.69% | ₹0.23L | close_stop | taken |
| GVT&D | 2026-05-18 | 3.84% | ₹0.22L | close_stop | taken |
| VADILALIND | 2026-07-28 | 3.25% | ₹0.16L | close_stop | taken |
| ADANIPOWER | 2026-05-14 | 4.07% | ₹0.05L | close_stop | taken |
| LLOYDSME | 2026-05-25 | 3.31% | ₹-0.17L | close_stop | taken |
| ICICIAMC | 2026-04-16 | 4.62% | ₹-0.22L | close_stop | taken |
| LENSKART | 2026-04-15 | 4.21% | ₹-0.39L | close_stop | taken |
ADR 2%–5%: displaced baseline — 18 lots, ₹1.06L contribution
| Stock | Entry date | Prior ADR | Lot P&L | Exit / mark status | New decision |
|---|---|---|---|---|---|
| INDSWFTLAB | 2026-07-20 | 5.53% | ₹1.92L | disaster | filter |
| CUPID | 2026-07-24 | 5.69% | ₹1.06L | disaster | filter |
| ATHERENERG | 2026-08-03 | 4.29% | ₹1.04L | open | slots |
| BAJAJCON | 2026-05-20 | 5.23% | ₹0.47L | close_stop | filter |
| AMAGI | 2026-07-08 | 6.72% | ₹0.44L | close_stop | filter |
| GSPCROP | 2026-04-15 | Unavailable | ₹0.20L | close_stop | filter |
| RSL | 2026-04-15 | Unavailable | ₹0.08L | close_stop | filter |
| SENORES | 2026-06-24 | 5.07% | ₹0.01L | close_stop | filter |
| JUNIORBEES | 2026-09-07 | 1.93% | ₹-0.07L | open | filter |
| MOMENTUM50 | 2026-08-18 | 1.91% | ₹-0.18L | close_stop | filter |
| AEQUS | 2026-07-03 | 6.52% | ₹-0.21L | close_stop | filter |
| BUILDPRO | 2026-04-15 | 6.45% | ₹-0.30L | close_stop | filter |
| GALAPREC | 2026-07-02 | 5.50% | ₹-0.44L | close_stop | filter |
| POCL | 2026-05-25 | 5.33% | ₹-0.51L | close_stop | filter |
| MARKSANS | 2026-06-23 | 5.39% | ₹-0.55L | close_stop | filter |
| PRECWIRE | 2026-06-04 | 5.84% | ₹-0.58L | close_stop | filter |
| SANDHAR | 2026-06-19 | 6.58% | ₹-0.65L | disaster | filter |
| JAINREC | 2026-05-18 | 5.05% | ₹-0.65L | disaster | filter |
ADR 2%–4% (post-screening): newly admitted — 13 lots, ₹9.18L contribution
| Stock | Entry date | Prior ADR | Lot P&L | Exit / mark status | New decision |
|---|---|---|---|---|---|
| LAURUSLABS | 2026-04-23 | 2.69% | ₹3.92L | open | taken |
| SHILPAMED | 2026-08-05 | 3.44% | ₹2.95L | open | taken |
| LAURUSLABS | 2026-07-10 | 3.13% | ₹1.53L | open | taken |
| LAURUSLABS | 2026-07-28 | 2.89% | ₹0.75L | open | taken |
| UNIPARTS | 2026-08-04 | 3.91% | ₹0.50L | close_stop | taken |
| GVT&D | 2026-05-18 | 3.84% | ₹0.22L | close_stop | taken |
| VADILALIND | 2026-07-28 | 3.25% | ₹0.16L | close_stop | taken |
| KINGFA | 2026-04-23 | 3.27% | ₹-0.01L | close_stop | taken |
| NMDC | 2026-04-22 | 2.98% | ₹-0.06L | close_stop | taken |
| TENNIND | 2026-04-17 | 3.97% | ₹-0.13L | close_stop | taken |
| LLOYDSME | 2026-05-25 | 3.31% | ₹-0.17L | close_stop | taken |
| LLOYDSME | 2026-05-14 | 3.26% | ₹-0.21L | close_stop | taken |
| NATCOPHARM | 2026-04-17 | 3.66% | ₹-0.27L | disaster | taken |
ADR 2%–4% (post-screening): displaced baseline — 29 lots, ₹4.16L contribution
| Stock | Entry date | Prior ADR | Lot P&L | Exit / mark status | New decision |
|---|---|---|---|---|---|
| KIRLOSENG | 2026-05-13 | 4.09% | ₹1.97L | close_stop | filter |
| INDSWFTLAB | 2026-07-20 | 5.53% | ₹1.92L | disaster | filter |
| TDPOWERSYS | 2026-04-15 | 4.66% | ₹1.46L | close_stop | filter |
| CUPID | 2026-07-24 | 5.69% | ₹1.06L | disaster | filter |
| ATHERENERG | 2026-08-03 | 4.29% | ₹1.04L | open | filter |
| APARINDS | 2026-05-21 | 4.05% | ₹0.62L | close_stop | filter |
| UTLSOLAR | 2026-04-15 | 4.43% | ₹0.53L | close_stop | filter |
| BAJAJCON | 2026-05-20 | 5.23% | ₹0.47L | close_stop | filter |
| AMAGI | 2026-07-08 | 6.72% | ₹0.44L | close_stop | filter |
| GSPCROP | 2026-04-15 | Unavailable | ₹0.20L | close_stop | filter |
| RRKABEL | 2026-07-27 | 4.48% | ₹0.17L | close_stop | filter |
| TALBROAUTO | 2026-06-23 | 4.99% | ₹0.12L | close_stop | filter |
| RSL | 2026-04-15 | Unavailable | ₹0.08L | close_stop | filter |
| PHARMABEES | 2026-08-26 | 2.49% | ₹0.04L | open | slots |
| SENORES | 2026-06-24 | 5.07% | ₹0.01L | close_stop | filter |
| JUNIORBEES | 2026-09-07 | 1.93% | ₹-0.07L | open | filter |
| RPTECH | 2026-07-27 | 4.62% | ₹-0.13L | disaster | filter |
| MOMENTUM50 | 2026-08-18 | 1.91% | ₹-0.18L | close_stop | filter |
| AEQUS | 2026-07-03 | 6.52% | ₹-0.21L | close_stop | filter |
| BUILDPRO | 2026-04-15 | 6.45% | ₹-0.30L | close_stop | filter |
| GALAPREC | 2026-07-02 | 5.50% | ₹-0.44L | close_stop | filter |
| BHEL | 2026-05-21 | 4.07% | ₹-0.47L | close_stop | filter |
| POCL | 2026-05-25 | 5.33% | ₹-0.51L | close_stop | filter |
| MARKSANS | 2026-06-23 | 5.39% | ₹-0.55L | close_stop | filter |
| PSPPROJECT | 2026-07-14 | 4.39% | ₹-0.55L | close_stop | filter |
| PRECWIRE | 2026-06-04 | 5.84% | ₹-0.58L | close_stop | filter |
| SANDHAR | 2026-06-19 | 6.58% | ₹-0.65L | disaster | filter |
| MARKSANS | 2026-07-15 | 4.16% | ₹-0.65L | disaster | filter |
| JAINREC | 2026-05-18 | 5.05% | ₹-0.65L | disaster | filter |
Costs, cash timing and entry order
| Rule | Original | Same lots, modeled costs deducted | Costs affect admissions | Sale cash next date | Both delayed cash and costs |
|---|---|---|---|---|---|
| Original queue, no added filter | ₹21.94L | ₹21.24L | ₹18.90L | ₹20.17L | ₹17.90L |
| ADR 2%–5% | ₹24.12L | ₹23.50L | ₹23.25L | ₹19.94L | ₹19.42L |
| ADR 3%–5% | ₹23.52L | ₹22.95L | ₹20.84L | ₹20.24L | ₹18.79L |
| Least MA20 extension first | ₹22.97L | ₹22.29L | ₹17.32L | ₹14.80L | ₹10.65L |
| ADR 2%–4% — post-screening | ₹26.96L | ₹26.40L | ₹28.00L | ₹23.28L | ₹27.58L |
The modeled cost is 0.25% of entry notional, plus a 0.5% liquidation haircut on remaining open holdings, in addition to the original closed-sale slippage. It is a sensitivity assumption, not a reconstructed broker fee bill. The same-lots column just deducts that drag. The next column charges it when sizing the funded portfolio and can change later admissions. Therefore the funded cost scenario can occasionally make more money by forcing a different selection, as happens for 2%–4%; costs themselves do not create that increase.
“Sale cash next date” disallows recycling any sale proceeds into another entry on the same calendar date. It is an execution-timing stress, not a claim about actual broker settlement rules. The 2%–5% advantage disappears in that scenario alone: ₹19.94L versus baseline ₹20.17L. The 2%–4% follow-up remains ahead at ₹23.28L. Ranking alone deteriorates sharply, so I would not combine it with the ADR filter and assume its benefits add. The tested 2%–5% + least-extension combination makes ₹23.77L, below the standalone ₹24.12L; 3%–5% + that ranking makes ₹21.42L.
I also used 200 paired random permutations of opportunities within each entry date. Every pair uses the same ordering for its filtered and unfiltered portfolio:
| Rule | Median P&L | 10th–90th percentile | Beats matched baseline queue |
|---|---|---|---|
| Original queue, no added filter | ₹17.51L | ₹13.48L–₹22.57L | — |
| ADR 2%–5% | ₹23.51L | ₹22.16L–₹23.96L | 189/200 |
| ADR 3%–5% | ₹21.42L | ₹20.94L–₹23.25L | 145/200 |
| Least MA20 extension first | ₹22.97L | ₹22.97L–₹22.97L | 194/200 |
| ADR 2%–4% — post-screening | ₹26.96L | ₹26.96L–₹26.96L | 200/200 |
These permutations only stress admission order on the same historical path. They are not 200 independent market samples, confidence intervals or a probability of future success. The 2%–4% outcome is identical across these shuffles because the tested same-date permutations do not change its admitted set. Deterministic ranking also removes most ordering variability by definition.
Concentration sensitivity reruns the funded ledger after removing a stock's opportunities, allowing other entries to replace it. Without WELCORP, baseline is ₹11.91L, ADR 2%–5% is ₹13.88L, and ADR 2%–4% is ₹15.06L. Without LAURUSLABS, the last strategy is ₹20.37L. Prohibiting simultaneous duplicate stocks changes 2%–4% to ₹16.47L; that is a different position policy, not a free improvement.
Temporal checks and what they establish
| ADR band | Full-period P&L | Apr–Jun P&L, marked June 30 | Jul–Sep new entries, fresh account |
|---|---|---|---|
| 2%–4% | ₹26.96L | ₹7.37L | ₹5.50L |
| 2%–4.5% | ₹22.57L | ₹8.91L | ₹6.73L |
| 2%–5% | ₹24.12L | ₹11.25L | ₹6.74L |
| 2%–5.5% | ₹23.07L | ₹10.11L | ₹4.35L |
| 2%–6% | ₹13.56L | ₹7.35L | ₹5.78L |
The later-entry column starts a fresh ₹60L account on July 1. The first column carries all holdings continuously. The separate cohorts cannot be added to reconstruct the full-period result. All training marks were truncated at the training cutoff; no eventual September profit was used to rank a June strategy.
Using April–June data alone selected least MA20 extension, not the full-period winning ADR band. Freezing that selected rule for new July-onward entries while retaining the existing holdings leaves the account at ₹21.94L, identical to baseline. Monthly rule selection from prior data and continuous holdings returns ₹22.40L, only about ₹45,940 above baseline. The 2%–4% follow-up would not have looked superior at June 30: its ₹7.37L was below baseline ₹10.08L and 2%–5%'s ₹11.25L.
So there is evidence for testing a volatility filter, but no untouched forward validation of the exact 4% threshold. The sample had already been examined before this work, and the original exit policy itself was selected on it. Selecting the best of many backtests risks fitting this particular history; see the primary research on backtest overfitting. No PBO statistic or independent significance test is claimed here.
Practical conclusion
Use ADR ≤5% as the clearest broad finding from the initial screen; the existing 3%–5% band and the wider 2%–5% band are both sensible candidates for a fixed forward comparison. Treat 2%–4% as the higher-return challenger, with its materially lower realized profit and concentrated open gains visible alongside total P&L. Freeze the alternatives before collecting new outcomes, and evaluate actual fees, fill timing, available cash and per-stock exposure using the same versioned no-breakeven exit policy.
I would not tighten production to 4% solely to obtain the historical ₹26.96L number. There is also no evidence here for adding every familiar quality gate: trend-stack filtering returned ₹14.59L, prior-volume ≥1× returned ₹6.84L, prior-volume ≥1.5× returned ₹5.20L, and RS60 above the benchmark returned ₹14.73L. Those are results on this supplied book, not universal judgments about those factors.
The research cannot assess historical fundamental, earnings, market-regime or sector/RS-percentile filters without their point-in-time inputs. It also cannot value trades absent from the supplied historical book. The full production scanner must be replayed on an archived universe before any of these numbers can be called a production expectation.
All 59 first-screen results
Every declared candidate is shown, including weak and negative results. Rows are sorted by full-period P&L; this ordering was not known before testing. “Later cohort” uses a fresh ₹60L account for July–September entries and cannot be added to the first-period result.
| # | Entry rule (all inputs lagged) | Full P&L | Taken | Filtered | Apr–Jun | Later cohort |
|---|---|---|---|---|---|---|
| 1 | ADR20 (%) ≥ 2; ADR20 (%) ≤ 5 | ₹24.12L | 34 | 42 | ₹11.25L | ₹6.74L |
| 2 | ADR20 (%) ≤ 5 | ₹24.04L | 36 | 37 | ₹11.25L | ₹6.66L |
| 3 | ADR20 (%) ≥ 3; ADR20 (%) ≤ 5 | ₹23.52L | 33 | 57 | ₹10.18L | ₹6.41L |
| 4 | Rank signed MA20 extension, lowest first | ₹22.97L | 40 | 0 | ₹11.56L | ₹5.61L |
| 5 | No extra entry filter; original row order | ₹21.94L | 41 | 0 | ₹10.08L | ₹5.39L |
| 6 | Rank relative 60-session return, highest first | ₹21.86L | 38 | 0 | ₹9.00L | ₹5.39L |
| 7 | Rank 60-session return, highest first | ₹21.86L | 38 | 0 | ₹9.00L | ₹5.39L |
| 8 | ADR20 (%) ≥ 3; ADR20 (%) ≤ 6 | ₹21.57L | 36 | 33 | ₹7.51L | ₹6.27L |
| 9 | ADR20 (%) ≥ 3; ADR20 (%) ≤ 6; 60-session return minus NIFTYBEES (pp) ≥ 0 | ₹21.47L | 34 | 37 | ₹7.86L | ₹6.27L |
| 10 | ADR20 (%) ≥ 3; ADR20 (%) ≤ 6; Rank relative 60-session return, highest first | ₹21.32L | 36 | 33 | ₹8.17L | ₹6.27L |
| 11 | Close / 60-session high (%) ≥ 90 | ₹20.66L | 38 | 16 | ₹6.67L | ₹5.39L |
| 12 | 60-session return (%) ≥ 0 | ₹20.55L | 39 | 13 | ₹6.99L | ₹5.39L |
| 13 | 60-session return minus NIFTYBEES (pp) ≥ 10 | ₹20.32L | 39 | 25 | ₹6.99L | ₹5.26L |
| 14 | Extension above SMA20 (%) ≥ 0; SMA20 > SMA50 required; Rank relative 60-session return, highest first | ₹20.19L | 40 | 31 | ₹8.83L | ₹5.90L |
| 15 | Close / 20-session high (%) ≥ 90 | ₹19.67L | 40 | 11 | ₹6.80L | ₹5.39L |
| 16 | 20-session return (%) ≥ 0 | ₹19.45L | 41 | 13 | ₹6.80L | ₹6.22L |
| 17 | 60-session return (%) ≥ 20 | ₹18.94L | 40 | 48 | ₹6.99L | ₹5.89L |
| 18 | ETF excluded; Rank relative 60-session return, highest first | ₹18.89L | 37 | 14 | ₹8.26L | ₹5.73L |
| 19 | Rank 20-session return, highest first | ₹18.50L | 40 | 0 | ₹8.03L | ₹5.39L |
| 20 | 60-session return minus NIFTYBEES (pp) ≥ 5 | ₹18.21L | 39 | 20 | ₹7.49L | ₹5.26L |
| 21 | Extension above SMA20 (%) ≥ 0; Extension above SMA20 (%) ≤ 15 | ₹18.06L | 39 | 21 | ₹8.06L | ₹5.32L |
| 22 | Extension above SMA20 (%) ≥ 0; Extension above SMA20 (%) ≤ 10 | ₹18.01L | 36 | 41 | ₹6.37L | ₹5.37L |
| 23 | One held lot per stock | ₹17.99L | 41 | 0 | ₹8.96L | ₹5.80L |
| 24 | Extension above SMA20 (%) ≤ 15 | ₹17.74L | 42 | 7 | ₹9.58L | ₹5.39L |
| 25 | ADR20 (%) ≥ 3; ADR20 (%) ≤ 8 | ₹17.71L | 38 | 22 | ₹7.41L | ₹5.61L |
| 26 | ADR20 (%) ≥ 3 | ₹17.71L | 38 | 22 | ₹7.41L | ₹5.61L |
| 27 | ETF excluded | ₹17.55L | 39 | 14 | ₹7.15L | ₹5.73L |
| 28 | Extension above SMA20 (%) ≥ 0 | ₹17.41L | 40 | 16 | ₹7.41L | ₹5.32L |
| 29 | Rank turnover, highest first | ₹17.31L | 42 | 0 | ₹10.44L | ₹5.61L |
| 30 | ADR20 (%) ≥ 3; ADR20 (%) ≤ 6; Extension above SMA20 (%) ≥ 0; SMA20 > SMA50 required | ₹17.31L | 37 | 51 | ₹5.02L | ₹6.27L |
| 31 | Extension above SMA50 (%) ≥ 0 | ₹16.59L | 41 | 11 | ₹6.73L | ₹5.40L |
| 32 | 20-session return (%) ≥ 5 | ₹15.74L | 40 | 30 | ₹4.95L | ₹6.82L |
| 33 | Rank proximity to 20-session high, highest first | ₹15.51L | 43 | 0 | ₹8.70L | ₹5.61L |
| 34 | 20-session median turnover (₹Cr) ≥ 1 | ₹15.29L | 41 | 2 | ₹7.91L | ₹5.39L |
| 35 | Close / 20-session high (%) ≥ 95 | ₹15.13L | 35 | 50 | ₹3.48L | ₹6.80L |
| 36 | ADR20 (%) ≥ 2 | ₹15.07L | 40 | 7 | ₹7.91L | ₹5.30L |
| 37 | 60-session return minus NIFTYBEES (pp) ≥ 0 | ₹14.73L | 41 | 8 | ₹7.58L | ₹5.39L |
| 38 | Extension above SMA20 (%) ≥ 0; SMA20 > SMA50 required; SMA50 rising over 20 sessions required | ₹14.60L | 41 | 33 | ₹4.50L | ₹5.32L |
| 39 | Extension above SMA20 (%) ≥ 0; SMA20 > SMA50 required | ₹14.59L | 42 | 31 | ₹4.49L | ₹5.32L |
| 40 | 20-session median turnover (₹Cr) ≥ 10 | ₹14.52L | 42 | 21 | ₹7.75L | ₹6.43L |
| 41 | ADR20 (%) ≥ 2; ADR20 (%) ≤ 6 | ₹13.56L | 41 | 18 | ₹7.35L | ₹5.78L |
| 42 | ADR20 (%) ≤ 6 | ₹13.48L | 43 | 13 | ₹7.35L | ₹5.70L |
| 43 | 20-session return (%) ≥ 10 | ₹13.46L | 38 | 46 | ₹-0.16L | ₹5.67L |
| 44 | 60-session return (%) ≥ 10 | ₹13.06L | 41 | 31 | ₹3.89L | ₹5.26L |
| 45 | Extension above SMA20 (%) ≥ 0; SMA20 > SMA50 required; Extension above SMA20 (%) ≤ 10 | ₹12.88L | 34 | 49 | ₹5.42L | ₹5.37L |
| 46 | Close / 60-session high (%) ≥ 95 | ₹12.76L | 35 | 57 | ₹1.61L | ₹6.80L |
| 47 | Extension above SMA20 (%) ≤ 10 | ₹12.56L | 42 | 27 | ₹8.54L | ₹5.16L |
| 48 | 20-session median turnover (₹Cr) ≥ 5 | ₹11.80L | 45 | 14 | ₹8.25L | ₹5.11L |
| 49 | Extension above SMA20 (%) ≤ 5 | ₹10.86L | 30 | 69 | ₹5.89L | ₹7.91L |
| 50 | 60-session return minus NIFTYBEES (pp) ≥ 0; Extension above SMA20 (%) ≤ 10 | ₹10.11L | 41 | 31 | ₹6.31L | ₹5.16L |
| 51 | Extension above SMA20 (%) ≥ 0; Extension above SMA20 (%) ≤ 5 | ₹8.30L | 28 | 83 | ₹3.32L | ₹8.40L |
| 52 | Prior volume / preceding 20 mean ≥ 1 | ₹6.84L | 20 | 91 | ₹1.75L | ₹5.10L |
| 53 | Close / 20-session high (%) ≥ 98 | ₹6.06L | 21 | 102 | ₹0.79L | ₹3.29L |
| 54 | 5-session mean volume / 20-session mean ≤ 0.8 | ₹5.88L | 36 | 67 | ₹4.70L | ₹3.95L |
| 55 | Prior volume / preceding 20 mean ≥ 1.5 | ₹5.20L | 18 | 105 | ₹1.34L | ₹4.19L |
| 56 | ADR20 (%) ≥ 4; ADR20 (%) ≤ 8 | ₹4.17L | 40 | 58 | ₹2.28L | ₹5.04L |
| 57 | ADR20 (%) ≥ 4 | ₹4.17L | 40 | 58 | ₹2.28L | ₹5.04L |
| 58 | Prior volume / preceding 20 mean ≥ 2 | ₹1.58L | 14 | 113 | ₹-1.67L | ₹3.58L |
| 59 | 5-session mean volume / 20-session mean ≤ 1 | ₹-1.84L | 44 | 47 | ₹-1.60L | ₹5.52L |
Relative strength here is the difference between two 60-session percentage returns, not a point-in-time universe percentile. Volume and turnover use completed prior sessions. Missing required features fail a gate and rank last. Multiple conditions in a row are ANDed. The exact machine-readable definitions are in candidate-library.json.
Reproduction and verification
The public evidence package includes all 127 pre-entry feature rows, frozen exits, policy definitions, decisions, ledgers and results. Download this directory from the repository and run the standard-library verifier:
python3 replay.py
This public verifier reproduces the funded allocation for all 59 first-screen policies and the post-screening 2%–4% rule from the supplied features and exits. It does not independently reconstruct the indicators or stop exits. The original offline analysis and independent ledger checks described below used the raw historical panels and service code; those local dependencies are not bundled here. The raw market-data panel has not been redistributed.
The baseline reproduces ₹21,93,571.011622429, 41 accepted, 76 slot-labeled skips and ten cash-only skips. All 127 singleton exits match the earlier source replay by date and price. Every feature timestamp is strictly before entry; all available ADR values were independently recomputed from the raw OHLC frame. Known splits are normalized. No entry-day high, low, close or volume is used in selection.
The separate prior-audit ledger independently verifies all 59 first-screen portfolios and 17 uniquely named post-screening checks, including their accepted-trade order for the first screen. Selected fee scenarios also match. In every funded run, cash stays nonnegative, simultaneous lots never exceed twelve and purchase-cost exposure stays within ₹60L. Maximum exposure is a cost-basis constraint; account market value can exceed ₹60L through gains.
Data has not been re-fetched or independently authenticated against an exchange in this follow-up. Historical fills and the known entry-price/data-quality limitations from the prior audit remain. The original analysis used local trusted historical inputs and test settings with no broker/database/network calls. The public package contains source filenames and hashes, with machine-specific paths removed. Provenance and missing-history cases are in validation.json.
Files: declared first-screen rules; all 59 results; post-screening sensitivities; cost, timing and concentration checks; all 127 lagged features and outcomes; all 86 skips, ranked retrospectively.
For context only, the unfunded ADR-bucket diagnostics below show every supplied opportunity without cash constraints. Repeated stocks and overlapping holdings mean these sums are not executable portfolios:
| Prior ADR bucket | Opportunities | Positive terminal outcomes | Standalone P&L sum, unfunded |
|---|---|---|---|
| <2% | 5 | 0 | ₹-0.50L |
| 2%–<3% | 15 | 6 | ₹5.44L |
| 3%–<4% | 36 | 19 | ₹20.34L |
| 4%–<5% | 34 | 18 | ₹6.26L |
| 5%–<6% | 24 | 8 | ₹0.82L |
| ≥6% | 11 | 2 | ₹-2.99L |
| Missing 20 sessions | 2 | 2 | ₹0.28L |
Download the evidence
Download the complete evidence package (ZIP) Read the package notes
The package contains the 127 frozen feature/outcome rows, all decision and trade ledgers, daily equity, all filter results, costs and timing checks, the public allocation verifier, and file hashes. It does not contain raw historical OHLC panels, credentials, account identifiers or private service source code.
Browse individual files
- README.md
- adr_2_to_5-daily-equity.csv
- adr_2_to_5-decisions.csv
- adr_2_to_5-trades.csv
- adr_3_to_5-daily-equity.csv
- adr_3_to_5-decisions.csv
- adr_3_to_5-trades.csv
- adr_3_to_6-daily-equity.csv
- adr_3_to_6-decisions.csv
- adr_3_to_6-trades.csv
- adr_le_5-daily-equity.csv
- adr_le_5-decisions.csv
- adr_le_5-trades.csv
- all-policy-results.csv
- baseline-daily-equity.csv
- baseline-decisions.csv
- baseline-trades.csv
- candidate-library.json
- execution-and-concentration.csv
- extended-robustness.csv
- features-and-outcomes.csv
- independent-ledger-checks.csv
- manifest.json
- monthly-switch-decisions.csv
- monthly-switch-trades.csv
- one_lot_per_stock-daily-equity.csv
- one_lot_per_stock-decisions.csv
- one_lot_per_stock-trades.csv
- paired-queue-tests.csv
- posthoc-independent-checks.csv
- posthoc-sensitivity-checks.csv
- posthoc_adr_2_to_4-daily-equity.csv
- posthoc_adr_2_to_4-decisions.csv
- posthoc_adr_2_to_4-trades.csv
- queue-robustness.csv
- rank_low_extension-daily-equity.csv
- rank_low_extension-decisions.csv
- rank_low_extension-trades.csv
- rank_rs60-daily-equity.csv
- rank_rs60-decisions.csv
- rank_rs60-trades.csv
- replay.py
- report.md
- selection-results.png
- skipped-trades-ranked-after-the-fact.csv
- stocks_only-daily-equity.csv
- stocks_only-decisions.csv
- stocks_only-trades.csv
- summary.json
- trend_stack-daily-equity.csv
- trend_stack-decisions.csv
- trend_stack-trades.csv
- validation.json