ATH breakouts: why a more selective checklist can produce a weaker result

Historical research study · Reviewed

A longer checklist feels reassuring. Require a substantial base, reject a stock that has moved far above its average, and avoid weeks when too many charts break out together. Each condition has a plausible story. The question is whether it improves the behaviour of the complete system after cash, position limits and exits are included.

In a fresh run of the available NSE-price portfolio model, the basic ATH specification generated a historical CAGR of 25.8%, a maximum drawdown of 13.5% and 180 closed trades. Adding a requirement for a base of at least 50 recorded bars reduced CAGR to 18.2% and closed trades to 71. Yet the proportion of profitable trades rose from 44% to 63%. This is the central lesson of the study: a rule can improve the success rate of the remaining trades while reducing the return of the simulated account.

These are backtest outputs with material limitations, not results a reader should expect to earn. We read the original ATH strategy document and its dated test notes directly in Drive, checked the supplied implementations, reran the available exchange-price model, and separately rebuilt the associated event-study calculations. The retail-feed figures below are distinguished from the results reproduced for this article.

What this particular “ATH breakout” means

The portfolio model scans on Mondays. A stock qualifies when its close is at least 99.8% of the running maximum closing price in the loaded history, at or above both its 50- and 200-session moving averages, and supported by at least 260 price bars. Liquidity requires a 100-observation average turnover of at least ₹5 crore, with a minimum of 20 observations for that average. The research specification restricts the portfolio to the current NIFTY 500 list and allows up to ten positions, ranking eligible entries by 63-session price return.

“All-time” needs qualification. The supplied portfolio scripts load data from June 2018 and calculate a cumulative maximum from that point. They do not establish that a price exceeds every high in the company’s listing history, and the header’s reference to a ten-year high is not the implemented rolling-window calculation. The results belong to this operational definition.

The market gate measures the percentage of NIFTY 500 constituents above their own 100-session averages. It switches from cash to an active regime at 60% or more, switches back below 40%, and retains its state between those thresholds. For new positions, breadth must also exceed its value 20 sessions earlier. Falling breadth alone can prevent entries without immediately liquidating existing positions; liquidation occurs when the regime itself switches to cash.

For the reproduced baseline, the stock-level hard-stop threshold is 10% below entry. A trailing exit becomes active after a 10% gain and compares the close with the highest close since entry minus four times 22-session average true range. True range incorporates the high–low range and gaps relative to the preceding close. This is why a close-only substitute is not equivalent to full OHLC data for the same trailing rule.

The model assumes 0.15% transaction cost per side and a 5% annual cash rate implemented as a daily accrual. The default executions in this ATH code occur at the same close used to detect signals and exits. They are simulation conventions, not demonstrated executable fills. In particular, a 10% stop threshold is not a guarantee that losses stop at 10%.

The fresh comparison: fewer failures, less compounding

Reproduced NSE-price portfolio simulations, 1 January 2019–2 September 2026
MetricBasic ATH specificationAdd base length ≥50 bars
CAGR25.8%18.2%
Maximum drawdown−13.5%−12.1%
Closed trades18071
Profitable closed trades44%63%
Average winning trade, before transaction costs34.5%30.3%
Average losing trade, before transaction costs−9.0%−9.1%
Average positions on days with exposure8.05.0
Days with at least one position58%51%

The base variable approximates a consecutive period spent more than 2% below the running high immediately before the breakout. It is not a discretionary assessment of a chart’s shape. The implemented counter also includes a reset-bar offset, so its threshold should be read as the code’s recorded base length rather than an independently verified count of exactly 50 consecutive below-high sessions. Requiring that period to reach 50 bars removes many continuation signals—stocks repeatedly near their highs—and leaves more capital unallocated.

Measured against this baseline, the restriction sacrifices approximately 7.6 percentage points of annualised return for a 1.4-point improvement in maximum drawdown. That does not mean the lower-drawdown outcome is inherently undesirable. It means “a better entry filter” is an incomplete description: the rule changes trade frequency, exposure and the distribution of opportunities, not just the chance that an individual trade ends positive.

In the baseline, 79 of 180 closed trades were profitable. Average gains on winners were about 3.84 times average losses. A positive aggregate outcome can coexist with losing trades being the majority. Neither the win percentage nor the payoff ratio alone describes the path of account equity; overlapping positions, changing position sizes, cash periods and costs determine that path.

What the market gate changes

A third fresh run removed the breadth gate while retaining the same stock-selection, stop, trailing-exit and cash assumptions. CAGR rose slightly, from 25.8% to 26.7%, but maximum drawdown deepened from −13.5% to −33.4%. Days with at least one position increased from 58% to 94%, and the no-gate variant lost 21.7% during the model’s 2025 reporting window. This comparison suggests that conditional exposure accounts for much of the observed drawdown reduction. It does not establish a future loss limit.

What the two retail-feed test records say

The dated “Entry filters re-tested on clean data” note and its later “base_len/wk_count bug fixed” follow-up provide a separate comparison on GoogleFinance and Excel STOCKHISTORY data. The original retail-feed databases are absent from their referenced local paths, so these figures were verified against the documents and code definitions, but could not be independently regenerated here.

Archived entry-filter comparisons: documented CAGR, not fresh reproductions
Additional entry conditionGoogleFinanceExcel STOCKHISTORY
None: filter-test baseline26.1%30.3%
Breadth at entry ≥60%26.4%31.0%
No more than 25% above the 50-session average23.5%25.6%
No more than 15% above the 50-session average16.8%15.0%
Base length ≥50 bars16.1%17.7%
Base length ≥100 bars11.8%13.3%
Skip scans with more than 35 qualifying breakouts25.3%27.9%

The results do not support a blanket claim that avoiding extended charts improves this system. The 25% extension cap reduced documented drawdown on GoogleFinance from −14.9% to −9.8%, but worsened it on STOCKHISTORY from −12.9% to −16.1%. That is an inconsistent risk benefit accompanying lower returns on both feeds.

The small breadth-at-entry improvement is also easy to oversell. A 0.3- or 0.7-point CAGR difference within a searched historical sample is a hypothesis for subsequent testing, not proof of a free improvement. This entry threshold is separate from the 60/40 market regime: a regime can remain active below 60%, whereas the additional rule blocks new entries below that level.

The documents themselves contain version differences worth preserving rather than smoothing away. The earlier cross-feed headline reports STOCKHISTORY at 29.3% CAGR and −13.4% drawdown, while the later filter table uses 30.3% and −12.9%. We use the later table’s own baseline when discussing its filters. Without the original run files, we cannot attribute the difference confidently to a particular parameter or data revision.

A second lens: what happened after individual breakout observations?

We separately rebuilt the weekly event study from the available prices.db: 5,577,151 records covering 4,501 symbols from January 2016 to September 2026. Applying its liquidity and history conditions produced 12,019 qualifying Monday observations across 1,221 symbols, dated 7 January 2019–31 August 2026. This study uses the broader liquid universe, not the ten-position NIFTY 500 portfolio, and includes repeated observations of the same stock.

The table uses 63 subsequent recorded price bars as its approximate three-month horizon. Observations without that full forward history are excluded from the return statistics. These are gross forward price changes, with no portfolio gate exits, stops, cash return or transaction-cost deduction.

Independently recomputed 63-bar forward-return distributions
Observation groupComplete forward observationsMean returnMedian returnFraction below −15%
All qualifying ATH observations11,3015.63%1.17%13.12%
Breadth regime active8,8637.30%2.36%11.54%
Breadth regime in cash state2,438−0.43%0.00%18.87%
Above both averages; base depth ≥15%; base length ≥40 bars3615.62%0.74%18.56%
Same base filter, plus active and rising breadth16510.73%3.25%12.73%

The base-depth measure is the distance from the running high to the lowest close in the preceding 120-observation window. This stricter combination leaves only 361 complete observations, compared with 11,301 initially, while its mean return is almost unchanged and its loss frequency is higher. The active-and-rising subset looks stronger, but its 165 observations are a much smaller, selected sample.

Mean returns consistently exceed medians, indicating that large positive outcomes pull the average above the experience of a typical observation. Repeated weekly signals overlap in their forward holding periods, and many stocks respond to the same market episodes. Treating every observation as independent would exaggerate the strength of the evidence. These descriptive differences do not establish statistical significance or a causal effect of breadth.

What still prevents a confident performance claim

The archived notes report random-selection controls that use the same exposure and exit rules: approximately 21% and 23% CAGR on GoogleFinance, and 23.5% and 25.4% on STOCKHISTORY. Those documented runs suggest that substantial performance came from the surrounding rules and market period, rather than the ATH condition alone. The available notes do not provide enough seed-level evidence to turn the apparent incremental benefit into a precise statistical estimate.

The reproduced model also uses current index membership and a preliminary liquidity screen based on lifetime average turnover. Both can let later information influence the historical opportunity set. It truncates the price history used to define highs, and its adjusted-close series is combined with high–low inputs whose corporate-action consistency needs validation. The original documents flag unresolved demerger adjustments. Agreement between data vendors would not remove shared universe or modelling biases.

Execution descriptions need particular care. The research document calls one sensitivity test a next-day-open fill, but the supplied scripts’ --entry-lag 1 actually fills at the next recorded session’s close; it does not lag the exit logic. We therefore do not reproduce that document’s “no lookahead” claim. The locally rerun figures remain same-close simulations. Likewise, the old saved event-study log has 10,808 observations; the present database produces 12,019. Its older statistics cannot simply be attached to today’s dataset.

The defensible lesson is about testing a checklist. A condition should be judged by its effect on the complete process, including how often it leaves capital idle and which large outcomes it removes. In this research, higher trade accuracy did not translate into higher account growth. That finding is useful even while the absolute performance numbers remain provisional.

Sources and reproducibility

Primary records reviewed: “ATH Breakout Strategy” revision 4; “2026-09-03 (late) — Entry filters re-tested on clean data”; “2026-09-03 (late 2) — base_len/wk_count bug fixed; base & crowd filters tested”; and “2026-09-03 (night) — GoogleFinance full OHLC in; strategy = 3 real feeds”. The editorial evidence archive preserves their fetched text and source URLs. Code reviewed: ath_portfolio2.py, ath_xl.py, ath_gfx.py and ath_breadth.py under /opt/investezee/breadth/.

The fresh portfolio runs used a copy of ath_portfolio2.py with read-only database connections and the same current-NIFTY-500 restriction applied earlier in loading to reduce memory use. Signal, sizing and exit rules were unchanged. Both daily account-value files and closed-trade files were retained. The independent event study processes one symbol at a time and preserves every sampled observation and its forward returns.

OPENBLAS_NUM_THREADS=1 /opt/investezee/venv/bin/python3 /tmp/ath_n500_audit.py \
  --universe n500 --hardstop 0.10 --atrk 4 --cash-yield 0.05 --gate long-rising

# Base comparison: same arguments, plus --min-base 50.
# Gate comparison: replace --gate long-rising with --gate off.
# Each run writes /tmp/ath_pf_equity.csv and /tmp/ath_pf_trades.csv;
# archive those files before starting the next run.

SELECT COUNT(*), COUNT(DISTINCT symbol), MIN(d), MAX(d) FROM px;

# Exact per-symbol input query used by the independent event study:
SELECT d, adj_close, close, turnover_cr
FROM px WHERE symbol = :symbol ORDER BY d;

# For each symbol and horizon w = 63, 126 or 189 recorded bars:
forward_return = adjusted_close.shift(-w) / adjusted_close - 1