TradeTech Analytics

All strategies · Review page

Monthly Bollinger Band breakout on Indian equities at ₹50 lakh: build, search and test, 2006 to September 2025

Specification fixed 1 Nov 2026 before any result (research/bbm/STRATEGY_BBM.md, with dated amendments) · NSE data for every name that traded, delisted ones included · no leverage, whole shares, Indian delivery charges and liquidity-tiered slippage · research only; the period from October 2025 was never loaded · 211 configurations tried

Short answer. The baseline rule as written (first monthly close above the 20-month, 2-sigma upper band in six months; exit below the 20-month SMA or on a Supertrend flip; 20 names, ₹50 lakh, no leverage) earned 8.9% a year at 2x costs against 11.3% for the Nifty 200 over 2006-2025, with a 50.7% drawdown (index 64.0%). Structured search found combinations that look much better in the period used to choose them (the finalist: 17.0% against 9.1% in 2006-2016), but the edge shrinks to 15.9% against 14.0% in the 2017-2025 validation, to 13.0% against 14.0% when the validation is run fresh from cash on 1 January 2017, and a year-by-year re-selection gives 13.6% against 14.0%. The reality check across all 211 configurations gives p = 0.70. Verdict: fails (4 of 9 checks); no demonstrated edge over simply holding the index, and the finalist is not recommended for paper trading. What does hold up: month-end ATR exits (k = 1.0) improve the baseline, an index trend regime filter on entries lowers the drawdown (development 43% against 51%, validation 35% against 46%), and risk-based sizing scaled up to use idle cash keeps average deployment near 70% with a slightly lower validation drawdown. The portfolio-wide exit rule as specified (more than 100 breakouts among 200 stocks) never triggers: the most first-breakout signals in any month was 54 across the whole universe (43 in the 200-stock subset).

1. What was built

2. Data, universe and bias controls

3. Results for the baseline and the finalist

Equity curves of the ₹50 lakh account (log scale), drawdown against the Nifty 200, and the share of capital invested (blue) with the number of positions (red).
Equity curves of the ₹50 lakh account (log scale), drawdown against the Nifty 200, and the share of capital invested (blue) with the number of positions (red).
Calendar-year returns of the baseline, the finalist and the Nifty 200.
Calendar-year returns of the baseline, the finalist and the Nifty 200.

Baseline (as specified, 20 names, no filters), cost stress and windows

WindowCostsNet CAGRNifty 200 CAGRMax drawdownSharpeAlpha tYears aheadTradesAvg deployed
Development 2006-03 to 20161x8.4%9.1%50.5%0.46-0.2355%15087%
Development 2006-03 to 20162x8.0%9.1%50.7%0.45-0.3055%15087%
Development 2006-03 to 20163x7.5%9.1%50.9%0.43-0.3855%15187%
Validation 2017 to Sep 20251x10.5%14.0%45.3%0.57-0.4644%12298%
Validation 2017 to Sep 20252x9.9%14.0%45.9%0.54-0.5733%12498%
Validation 2017 to Sep 20253x9.6%14.0%46.3%0.53-0.6433%12298%
Full 2006-03 to 2025-091x9.4%11.3%50.5%0.52-0.4650%27292%
Full 2006-03 to 2025-092x8.9%11.3%50.7%0.50-0.5845%27492%
Full 2006-03 to 2025-093x8.5%11.3%50.9%0.48-0.6945%27392%
Fresh start 1 Jan 20171x10.8%14.0%46.8%0.59-0.2844%11898%
Fresh start 1 Jan 20172x10.5%14.0%47.4%0.57-0.3533%11898%

Finalist: rsi70+body60+rng1.0 | ATR month-end + base k1.0 + FILL N20 cap10 + regime sma10 entry + RISKFILL 1% N20 cap10

Selected on development data only, at 2x costs, by the pre-registered rule: highest Sharpe among 17 configurations passing the gates (at least 60 trades, drawdown at most 35%, CAGR above the index, at least 60% of capital deployed on average). It is the best of 211 configurations, so its development figure is optimistic by construction.

WindowCostsNet CAGRNifty 200 CAGRMax drawdownSharpeAlpha tYears aheadTradesAvg deployed
Development 2006-03 to 20161x17.5%9.1%30.0%0.890.9864%11361%
Development 2006-03 to 20162x17.0%9.1%30.2%0.870.9264%11461%
Development 2006-03 to 20163x16.5%9.1%30.3%0.850.8664%11461%
Validation 2017 to Sep 20251x15.6%14.0%34.7%0.860.3956%12582%
Validation 2017 to Sep 20252x15.9%14.0%30.8%0.890.4256%12682%
Validation 2017 to Sep 20253x14.8%14.0%35.4%0.830.2556%12882%
Full 2006-03 to 2025-091x16.6%11.3%34.7%0.891.0160%23870%
Full 2006-03 to 2025-092x16.5%11.3%30.8%0.890.9860%24070%
Full 2006-03 to 2025-093x15.7%11.3%35.4%0.850.8360%24270%
Fresh start 1 Jan 20171x13.4%14.0%34.6%0.810.0333%12779%
Fresh start 1 Jan 20172x13.0%14.0%35.3%0.79-0.0533%12779%

Full-period detail (finalist, 1x costs, ₹50 lakh)

MeasureValue
CAGR (time-weighted = money-weighted; no external flows)16.6%
Final equity from ₹50 lakh₹10.17 crore
Volatility (annualised, monthly)19.5%
Maximum drawdown / longest time under a prior peak34.7% / 2.1 years
Worst month / worst year-22.4% / -20.9%
Longest losing streak (months)5
Trades / win rate / profit factor238 / 45% / 3.43
Average win / average loss / expectancy per trade₹1,136,085 / ₹-275,200 / ₹365,215
Average holding period287 calendar days
Capital deployed: average / maximum70% / 100%
Cash held: average30%
Positions: average / maximum9.7 / 20
Open risk (stop distance × value ÷ equity): average / maximum20.3% / 34.1%
Largest single stock / largest sector at a month-end33% / 57%

Baseline for comparison (1x costs)

MeasureValue
CAGR (time-weighted = money-weighted; no external flows)9.4%
Final equity from ₹50 lakh₹2.91 crore
Volatility (annualised, monthly)21.2%
Maximum drawdown / longest time under a prior peak50.5% / 4.5 years
Worst month / worst year-20.8% / -49.0%
Longest losing streak (months)4
Trades / win rate / profit factor272 / 42% / 2.17
Average win / average loss / expectancy per trade₹298,896 / ₹-99,506 / ₹67,471
Average holding period435 calendar days
Capital deployed: average / maximum92% / 100%
Cash held: average8%
Positions: average / maximum17.7 / 20
Open risk (stop distance × value ÷ equity): average / maximum23.5% / 31.6%
Largest single stock / largest sector at a month-end25% / 61%

Costs and gap risk (1x)

StrategyBrokerage, STT, exchange, stamp, DP (₹)Slippage incl. spread (₹)Gap loss on intramonth stops (₹)Costs as share of final equityRound trips
Finalist₹1,259,312₹1,025,438₹02.2%238
Baseline₹365,637₹298,418₹02.3%272

The finalist uses month-end stops, so it has no intramonth gap loss; the intramonth ATR variants in section 5 show gap losses of ₹6 lakh to ₹25 lakh over the whole path. Slippage tiers: 0.05% a fill at ₹100 crore a day traded or more, 0.10% from ₹20 crore, 0.25% below (spread included), × 1, 2 and 3 in the stress rows.

4. Is the edge real? Overfitting and multiple testing

Check (pre-registered reading)ResultValue
Validation net CAGR above Nifty 200 at 2x costs (continuous run)PASS15.9% vs 14.0%
Same, fresh start from cash on 1 Jan 2017FAIL13.0% vs 14.0%
Alpha t above 1.5 in validationFAILt = 0.42
Validation drawdown within index's + 10 pointsPASS30.8% vs index 38.2%
Development CAGR above the random-entry 90th percentilePASS17.0% vs 9.3%
Reality check p below 0.10 over 211 configurationsFAILp = 0.70
Plateau: at least 60% of neighbours ahead of the index in both periodsPASS78%
Shifted sample (first 3 years dropped) keeps the signPASS16.0% vs 15.1%
Walk-forward re-selection ahead of the indexFAIL13.6% vs 14.0%
Left and middle: CAGR distribution of 30 random-entry runs with the finalist's exits and sizing against the finalist and the index. Right: sign-flip distribution of the best t-statistic across all configurations.
Left and middle: CAGR distribution of 30 random-entry runs with the finalist's exits and sizing against the finalist and the index. Right: sign-flip distribution of the best t-statistic across all configurations.

Random entries (same number of positions each month, drawn from the same eligible stocks, same exits and sizing) earned a median of 5.1% in development and 9.3% in validation (90th percentiles 9.3% and 14.8%). The finalist's development result is above the 90th percentile; its validation result is above the 90th percentile of 14.8%. The sign-flip reality check asks whether the best of 211 configurations is better than the best you would get from noise: it is not (p = 0.70). Walk-forward re-selection each January gave 13.6% a year against 14.0% for the index.

Walk-forward: picking each year the best configuration known at the time.
Walk-forward: picking each year the best configuration known at the time.

Plateau and sensitivity

One-step change from the finalistCAGR devCAGR valExcess devExcess valDrawdown val
RSI 6514.3%18.3%5.2%4.3%33.5%
RSI 6013.2%16.7%4.1%2.6%32.7%
body 50%13.0%14.5%3.9%0.5%39.9%
body 70%14.5%8.6%5.4%-5.4%33.4%
range/ATR 1.61811.9%15.9%2.8%1.8%30.4%
range/ATR none16.4%15.4%7.3%1.4%35.0%
ATR k 1.516.4%15.7%7.3%1.7%35.1%
ATR k 2.014.9%14.7%5.8%0.7%33.7%
N 1517.3%14.7%8.2%0.7%34.6%
N 3017.0%15.9%7.9%1.9%30.8%
cap 5%12.3%13.1%3.2%-0.9%25.7%
cap 15%17.4%15.7%8.3%1.7%33.9%
risk 0.5%17.0%14.8%7.9%0.8%33.9%
risk 1.5%17.3%15.0%8.2%0.9%33.3%
regime SMA2015.9%12.8%6.8%-1.2%35.5%
regime SMA10 exit13.4%13.7%4.3%-0.3%28.8%
FILL sizing17.1%14.6%8.0%0.6%35.2%
any-direction candle17.0%15.9%7.9%1.8%30.8%

78% of the neighbours beat the index in both periods. Start-date sensitivity (fresh start from cash, 2x costs, full path to 2025-09): 2006: 16.5% against 11.3%, 2008: 12.5% against 8.2%, 2010: 15.6% against 10.7%, 2012: 17.0% against 13.9%, 2014: 17.9% against 13.3%, 2016: 15.6% against 12.9%. Other sensitivities: look-back counts only filtered breakouts: 12.0%, drawdown 34.9%, ATR through t-1 for the range filter: 16.5%, drawdown 30.8%, random signal order (mean of 10): 16.3%, drawdown 32.9%, slippage x1: 16.6%, drawdown 34.7%, slippage x3: 15.7%, drawdown 35.4%.

Parameter combinations tested

StageConfigurationsContents
A entry filters81baseline; RSI 60/65/70; body 50/60/70 (bullish, any); range/ATR 1.0/1.618/2.0/2.618/3.0; pairs; triples
B exit variants23baseline; SMA-only; Supertrend-only; ATR stops k 1.0-3.0 intramonth and month-end, as addition and as replacement
C portfolio-wide exit10threshold T 100/50/30/20/10 × share 75%/50%
D sizing and risk62EQ/FILL/RISK/RISKFILL × N 10/20/30/50 × cap 5/10/15%; risk 0.5/1.0/1.5%; sector cap 25/35%; drawdown control 15/20%; regime SMA10/SMA20 (entry-only, entry+exit)
E combinations9top 3 entry sets × top 3 exit sets (by development Sharpe)
F, G finalists26E-best × sizing × regime; then drawdown control, portfolio exit, risk sizing, sector cap

Every configuration, with returns, drawdown, win rate, profit factor, expectancy, holding period, capital deployed, positions, open risk, recovery time, worst month and year, losing streak, costs, gap loss and missed signals, is in configs.csv on the strategy page. The ten best by development Sharpe among the combinations (selection data) and how they did afterwards:

StageConfigurationCAGR devDD devSharpe devCAGR valDD valSharpe valDeployed
Grsi70+body60+rng1.0 | ATR month-end + base k1.0 + FILL N20 cap10 + regime sma10 entry + RISKFILL 1% N20 cap1017.0%30.2%0.8715.9%30.8%0.8970%
Frsi70+body60+rng1.0 | ATR month-end + base k1.0 + FILL N20 cap10 + regime sma10 entry17.1%30.2%0.8714.6%35.2%0.8270%
Grsi70+body60+rng1.0 | ATR month-end + base k1.0 + FILL N20 cap10 + regime sma10 entry + pwx T20 share7517.1%30.2%0.8714.6%35.2%0.8270%
Grsi70+body60+rng1.0 | ATR month-end + base k1.0 + FILL N20 cap10 + regime sma10 entry + pwx T100 share75 (spec)17.1%30.2%0.8714.6%35.2%0.8270%
Grsi70+body60+rng1.0 | ATR month-end + base k1.0 + FILL N20 cap10 + regime sma10 entry + pwx T10 share5017.1%30.2%0.8714.6%35.2%0.8270%
Frsi70+body60+rng1.0 | ATR month-end only k1.0 + FILL N20 cap10 + regime sma10 entry16.8%30.2%0.8612.3%35.3%0.7173%
Frsi70+body60+rng1.0 | ATR month-end + base k1.5 + FILL N20 cap10 + regime sma10 entry16.6%34.1%0.8615.1%35.5%0.8476%
Grsi70+body60+rng1.0 | ATR month-end + base k1.0 + FILL N20 cap10 + regime sma10 entry + RISK 1% N20 cap1010.1%19.6%0.8410.6%21.2%0.8448%
Grsi70+body60+rng1.0 | ATR month-end + base k1.0 + FILL N20 cap10 + regime sma10 entry + sector cap 25%16.5%30.2%0.8415.4%32.0%0.8369%
Ersi70+body60+rng1.0 | ATR month-end + base k1.015.6%30.2%0.8013.8%36.8%0.7275%

5. What each choice does

Entry filters

Left: development against validation CAGR for 81 entry-filter sets. Right: full-period CAGR by filter family.
Left: development against validation CAGR for 81 entry-filter sets. Right: full-period CAGR by filter family.

Baseline 8.0% in development and 9.9% in validation (2x costs). 79% of the 81 entry sets beat the baseline in validation but only 15% did so in development: the filters mostly helped in 2017-2025 and not in 2006-2016, so no filter is robustly better. Strong-candle filters and wide-range filters cut trade counts and capital use (a range of at least 2.618 × ATR leaves average deployment near 66%). The best filter set on development, RSI ≥ 70 with a bullish body of at least 60%, and range ≥ 1.0 × ATR, is the one carried into the combinations; its development lead over the baseline is not matched in a stable way across neighbouring filter values.

Exits

Exit variants applied to the baseline entry.
Exit variants applied to the baseline entry.

Month-end ATR stops with k = 1.0 (previous close minus one ATR) are the only exit change that improves both periods materially (10.0% development, 16.1% validation as an addition to the baseline exits). Intramonth stops monitored on daily bars were worse at tight k: whipsaw exits at k = 1.0 produce 722 round trips instead of 274, higher costs and a gap loss of about ₹17.8 lakh in the run; wider k (2.5-3.0) rarely trigger and change little. Stop-only exits with wide k (2.0-3.0) leave positions in falling trends too long (drawdown 39-68%) and trade very little (12-90 round trips).

Portfolio-wide exit and re-entry rule

Threshold T and shareTimes triggeredCAGR (2x)Max drawdownRound trips
T100 share7508.9%50.7%274
T100 share5008.9%50.7%274
T50 share7508.9%50.7%274
T50 share5008.9%50.7%274
T30 share7518.3%50.7%288
T30 share5018.3%50.7%288
T20 share75410.9%45.9%321
T20 share50410.9%45.9%321
T10 share7566.3%58.8%359
T10 share501212.2%42.6%407

As specified (T = 100, 75%) the rule never fires: with the first-breakout-in-six-months condition, the most qualifying signals in any month was 54 across the whole universe (43 among the 200 largest). Lower thresholds do fire (T = 20: 4 times; T = 10: 6 to 12 times) but the effect is inconsistent (CAGR from 6% to 12% across the ten settings) and not distinguishable from noise. Exits execute at the next month's open, so the gap between the month-end close and that open is borne by the account; it is inside the trade-level exit prices.

Sizing, concentration and capital utilisation

Each point is one sizing configuration: average capital deployed against CAGR and against maximum drawdown.
Each point is one sizing configuration: average capital deployed against CAGR and against maximum drawdown.

Position sizing mostly trades return for utilisation: pure risk-based sizing (stop distance from the SMA or Supertrend, clipped to 5-35%; 0.5-1.5% of equity at risk) deploys 46%-91% of capital across the settings, generally with lower drawdown and lower return than the equal-slot rules (chart); scaling the risk-sized positions up pro rata to use the idle cash (RISKFILL), capped per stock, brings deployment to 56%-93%. Equal-slot sizing with 50 slots deploys most capital at a lower drawdown than 10 slots (diversification), at the cost of more small positions. The per-stock cap rows (5-15%) and the sector cap rows (25%, 35%) are in the configuration table; sector classification covers only names in the current index list, so the sector cap cannot constrain delisted names. Portfolio drawdown controls (no new entries below −15% or −20% until the drawdown halves) kept the account out of the market for long stretches (average deployment 23%-36%) and gave up most of the return: not recommended.

Worked sizing examples for the ₹50 lakh account (finalist rules: RISKFILL, 1% risk, 20 names, 10% cap)

Method. (1) Equity E = cash + positions at the prior close. (2) Stop distance d = (signal close − max(SMA20, Supertrend line)) ÷ signal close, clipped to 5-35%. (3) Risk-based amount = 1% × E ÷ d, capped at 10% × E. (4) RISKFILL multiplies the risk-sized amounts by one factor so that the month's new positions together use the available cash, never exceeding the 10% cap. (5) Shares = floor(amount ÷ (open × (1 + slippage) × (1 + charges))), at the raw open price. (6) Rupee risk = cost × d. Examples taken from the finalist's actual signals:

MonthStockEquitySignal closeStop refStop dist.Risk-sized10% capTargetOpenSharesCost incl. fees% of equity₹ at risk (% equity)
2018-02LT₹38,150,6771,2821,01620.8%₹1,837,418₹3,815,068₹1,837,4181,458.90677₹989,6352.6%0.54%
2018-03CHOLAFIN₹36,721,40027321122.8%₹1,607,571₹3,672,140₹3,672,1401,461.102507₹3,672,08010.0%2.28%
2023-01IOB₹45,685,309332135.0%₹1,305,295₹4,568,531₹1,305,29532.4013₹4220.0%0.00%

Example reading: with E = ₹50,00,000, a stock whose stop reference is 12% below the signal close gets 1% × 50,00,000 ÷ 12% = ₹4.17 lakh; if only two signals appear and cash is plentiful, RISKFILL scales both up (up to the 10% cap = ₹5 lakh each), so about 20% of capital is deployed rather than about 17%. When many signals compete for few free slots, the liquidity ranking decides and the rest are counted as missed (278 of 562 signals in the finalist run at 2x).

6. Regimes, trades and concentration

Using the Nifty 200 against its 10-month average as the regime: in 169 bullish months the finalist earned 30.2% a year against 28.2% for the index (positive in 70% of months); in 65 bearish months -16.9% against -27.3% (49% positive). The finalist's regime filter holds back entries in bear regimes but does not exit open positions (the 'exit' variants are in the search table).

Trade-level view of the finalist at 2x costs: return distribution, holding periods, net P&L by exit reason.
Trade-level view of the finalist at 2x costs: return distribution, holding periods, net P&L by exit reason.

The best 10 names produced 78% of net trading P&L across 198 names traded; breakout strategies make money from a small share of large winners (win rate 45%). Net P&L by sector (names with a current classification):

SectorTradesNet P&LAverage trade
Capital Goods15₹29,907,91659.3%
Consumer Services5₹20,671,877111.0%
Chemicals11₹8,455,44946.7%
Healthcare18₹8,240,70330.8%
Fast Moving Consumer Goods15₹5,221,35533.0%
Oil Gas & Consumable Fuels9₹4,811,15947.1%
Financial Services31₹2,361,86810.5%
Construction6₹2,233,14123.7%

7. Recommendation and limits

  1. Do not paper-trade or fund the finalist. Its edge over the Nifty 200 is not distinguishable from selection among 211 configurations (reality check p = 0.70; fresh-start validation 13.0% against 14.0%).
  2. If a monthly Bollinger breakout is used at all, the supported refinements are: the month-end ATR(14) stop at k = 1.0 as an additional exit, an index trend regime filter on entries, and risk-based sizing scaled to use idle cash with a 10% per-stock cap and 20 names. Drawdown controls and the intramonth stop at tight k are not supported.
  3. The portfolio-wide exit as specified cannot trigger; a lower threshold needs its own pre-registered study.
  4. These results are not independently validated: the same data pipeline, a point-in-time stand-in for the index, price-only returns, heuristic corporate-action handling, T+0 cash recycling, daily-bar stop assumptions (a session whose low touches the stop is assumed filled) and a sealed period that remains unopened.

Files: research/bbm/ (prep.py, sim.py, run_search.py, final.py, export_bbm.py, report_bbm.py, results/), data/research/panel_sf.parquet.


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.