Indian-trading-skills backtest-expert
git clone https://github.com/ajeeshworkspace/indian-trading-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/ajeeshworkspace/indian-trading-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/backtest-expert" ~/.claude/skills/ajeeshworkspace-indian-trading-skills-backtest-expert && rm -rf "$T"
skills/backtest-expert/SKILL.mdBacktest Expert — Indian Market Strategy Validation
Core Philosophy
"Find strategies that break the least, not profit the most."
A strategy that survives stress testing across multiple market regimes, transaction cost assumptions, and parameter perturbations is far more valuable than one that shows spectacular returns on a single optimized parameter set. Overfitting is the silent killer of trading accounts.
6-Step Backtesting Workflow
Step 1: State the Hypothesis (1 Sentence Edge)
Before writing a single line of code, articulate why the strategy should work in one clear sentence.
Good hypotheses:
- "Stocks that gap up >3% on above-average volume after consolidation tend to continue higher for 2-5 days on NSE."
- "Nifty 50 stocks that revert to their 20-day mean after RSI drops below 30 produce positive expectancy within 5 trading sessions."
- "Selling strangles on Bank Nifty on Wednesday expiry with delta <0.15 captures time decay faster than gamma risk materializes."
Bad hypotheses:
- "This indicator combination looks good on the chart." (no edge articulated)
- "I saw someone on Twitter making money with this." (no reasoning)
Ask yourself:
- What behavioral or structural edge am I exploiting?
- Why would this edge persist? (Structural > Behavioral > Statistical)
- Who is on the other side of this trade, and why are they losing?
Step 2: Codify Rules (No Ambiguity)
Every rule must be binary — a computer must be able to execute it without interpretation.
Rule Categories
| Category | What to Define | Example |
|---|---|---|
| Universe | Which stocks/instruments | Nifty 200 constituents, F&O stocks only, market cap >5000 Cr |
| Entry | Exact trigger conditions | Close > 20 EMA AND RSI(14) crosses above 40 AND volume > 1.5x 20-day avg |
| Exit — Target | Profit-taking rule | Close 3% above entry OR trailing stop of 1.5 ATR |
| Exit — Stop | Loss-cutting rule | Close below entry-day low OR 2% fixed stop |
| Exit — Time | Maximum holding period | Exit after 10 trading sessions if neither target nor stop hit |
| Position Sizing | How much capital per trade | 5% of equity per position, max 10 concurrent positions |
| Filters | When NOT to trade | Skip if stock is in F&O ban period, skip 2 days around results |
India-Specific Rules to Consider
- Circuit limits: Stocks hitting upper/lower circuit cannot be exited. Define handling.
- F&O ban period: Stocks crossing 95% MWPL cannot add fresh F&O positions.
- T+1 settlement: Cash equity settles next trading day (changed from T+2 in 2023).
- Pre-open session: 9:00-9:08 AM orders, 9:08-9:15 AM matching. Define if you use pre-open.
- Muhurat trading: Special Diwali session — include or exclude?
- Corporate actions: Adjust for splits, bonuses, dividends, rights issues.
Step 3: Run Initial Backtest
Minimum Requirements
| Parameter | Minimum | Recommended |
|---|---|---|
| Time period | 5 years | 8-10+ years |
| Number of trades | 100 | 200+ |
| Market regimes covered | 2 (bull + bear) | 4+ (bull, bear, sideways, high-vol) |
| Data quality | Adjusted for corporate actions | Survivorship-bias-free universe |
Indian Market Regimes to Cover
| Regime | Period Examples | Characteristics |
|---|---|---|
| Bull market | 2014-2017, 2020-2021 | Nifty trending up, broad participation |
| Bear market | 2008, 2020 (Mar), 2022 (Jun) | Sharp drawdowns, high correlation |
| Sideways/Range | 2018-2019, 2023 H1 | Nifty in 10% range, stock-specific moves |
| High volatility | 2008, 2020, Budget days | India VIX > 25 |
| Low volatility | 2017, 2021 H2 | India VIX < 15 |
| Pre/Post Budget | Every Feb 1 | Gap moves, policy-driven sectors |
| Election cycle | 2014, 2019, 2024 | Uncertainty then rally pattern |
| Monsoon impact | Jun-Sep annually | Agri, FMCG, rural economy impact |
| RBI policy shifts | Rate hike/cut cycles | Banking, NBFC, rate-sensitive sectors |
| Global crude shock | 2018, 2022 | INR weakness, OMC impact, inflation |
Key Metrics to Record
Returns: CAGR, total return, monthly returns distribution Risk: Max drawdown, average drawdown, drawdown duration, Calmar ratio Efficiency: Sharpe ratio (use 6% risk-free for India), Sortino ratio Trade quality: Win rate, avg win/loss, profit factor, expectancy per trade Consistency: % profitable months, worst month, longest losing streak
Step 4: Stress Test (Spend 80% of Your Time Here)
This is where most backtests fail — and where the real value lies.
4a. Parameter Sensitivity
Perturb every parameter by +/-20% and check if performance degrades gracefully or collapses.
| Parameter | Base | -20% | -10% | +10% | +20% | Verdict |
|---|---|---|---|---|---|---|
| EMA period | 20 | 16 | 18 | 22 | 24 | Stable if all profitable |
| RSI threshold | 40 | 32 | 36 | 44 | 48 | Fragile if only 40 works |
| Stop loss % | 2% | 1.6% | 1.8% | 2.2% | 2.4% | Check drawdown impact |
Rule of thumb: If the strategy only works with exact parameter values, it is overfit. You want a "plateau" of profitability, not a "peak."
4b. Execution Friction (India-Specific Costs)
Apply realistic transaction costs:
| Cost Component | Delivery (CNC) | Intraday (MIS) | F&O |
|---|---|---|---|
| Brokerage | ~₹20/order or 0.03% | ~₹20/order or 0.03% | ~₹20/order |
| STT | 0.1% (buy+sell) | 0.025% (sell only) | 0.0125% (sell, options) |
| Exchange charges | 0.00345% (NSE) | 0.00345% (NSE) | 0.05% (options) |
| GST | 18% on brokerage+exchange | 18% on brokerage+exchange | 18% on brokerage+exchange |
| Stamp duty | 0.015% (buy) | 0.003% (buy) | 0.003% (buy) |
| SEBI charges | 0.0001% | 0.0001% | 0.0001% |
| Slippage | 0.05-0.1% large-cap | 0.1-0.2% mid-cap | 0.1-0.3% options |
Total round-trip cost estimates:
- Delivery large-cap: ~0.3-0.5%
- Intraday large-cap: ~0.1-0.2%
- F&O (options): ~0.15-0.4%
- Small-cap delivery: ~0.5-1.0% (wider spreads)
4c. Time Robustness
- Split data into 3-year rolling windows. Is the strategy profitable in each?
- Check year-by-year returns. Is any single year driving total performance?
- Remove the best month. Is the strategy still positive?
4d. Sample Size Validation
- Minimum 30 trades for any statistical claim (even this is weak)
- 100+ trades: Moderate confidence
- 200+ trades: Good confidence
- Use the t-test: Is average trade return significantly different from zero?
Step 5: Out-of-Sample Validation (Walk-Forward Analysis)
Never skip this step.
Walk-Forward Method for Indian Markets
- In-sample period: Train on 5 years of data (e.g., 2015-2019)
- Out-of-sample period: Test on next 1-2 years (e.g., 2020-2021)
- Roll forward: Move window, retrain on 2016-2020, test on 2021-2022
- Combine: Aggregate all out-of-sample periods for true performance estimate
Walk-Forward Efficiency (WFE):
WFE = Out-of-Sample Return / In-Sample Return
- WFE > 50%: Good — strategy generalizes
- WFE 30-50%: Acceptable — some overfitting present
- WFE < 30%: Poor — likely overfit
Paper Trading Validation
Before deploying capital, paper trade for at least:
- 30 trades minimum
- 2 months minimum
- Cover at least one volatile period (expiry week, results season, RBI policy)
Step 6: Evaluate Results (Deploy / Refine / Abandon)
Use the evaluation script to get an objective score:
python3 evaluate_backtest.py \ --total-trades 150 \ --win-rate 62 \ --avg-win-pct 1.8 \ --avg-loss-pct 1.2 \ --max-drawdown-pct 15 \ --years-tested 8 \ --num-parameters 3 \ --slippage-tested
Decision Framework
| Score | Verdict | Action |
|---|---|---|
| 80-100 | Deploy | Size small initially (25% of intended), scale up over 50+ live trades |
| 60-79 | Refine | Identify weakest dimension, address it, re-test |
| 40-59 | Refine with caution | Multiple issues — may not be salvageable |
| 0-39 | Abandon | Fundamental edge likely does not exist. Document lessons and move on. |
Before Deploying
- Strategy has positive expectancy after ALL costs
- Survived parameter sensitivity testing
- Walk-forward efficiency > 50%
- Maximum drawdown is psychologically tolerable
- Sample size > 100 trades
- No more than 3-4 free parameters
- Slippage and transaction costs included
- Paper traded for 30+ trades
- Written trade plan with exact rules
- Risk management plan for live trading (position sizing, max daily loss, max drawdown circuit breaker)
Using Broker MCP Tools for Backtesting Support
While the MCP tools are not backtesting engines, they support the process. Use whichever broker is connected:
Groww MCP (if connected)
: Fetch OHLCV data for strategy development and spot-checkingfetch_historical_candle_data
: Calculate indicators (SMA, EMA, RSI, MACD, Bollinger, SuperTrend, etc.) on historical dataget_historical_technical_indicators
: Identify candle patterns in historical dataget_historical_candlestick_patterns
: Screen for universe construction (PE, ROE, market cap filters)fetch_stocks_fundamental_data
: Natural language screening for universe buildingfetch_fundamentals_screener
: Technical screening for strategy ideasfetch_technical_screener
: Current price for live validationget_ltp
: Discover momentum and volume patternsfetch_market_movers_and_trending_stocks_funds
Zerodha Kite MCP (if connected)
: Fetch OHLCV candle data for strategy developmentget_historical_data
/get_ltp
: Current prices for live validationget_quotes
: Find instruments for universe constructionsearch_instruments
/get_holdings
: Verify live portfolio against strategy signalsget_positions
Quick Reference: Red Flags
| Red Flag | Why It Matters |
|---|---|
| CAGR > 50% with no drawdowns | Too good to be true — check for look-ahead bias |
| Win rate > 80% | Likely not accounting for slippage or adverse fills |
| Only works on specific parameters | Overfitting — no edge, just noise |
| < 50 trades in backtest | Statistically meaningless |
| No losing months in 5+ years | Data error or survivorship bias |
| Strategy stops working after 2020 | Market structure may have changed (T+1, algo proliferation) |
| Uses > 5 parameters | Degrees of freedom too high — curve-fitted |
| No transaction costs modeled | Real returns could be negative |
| Tested on Nifty 50 only | Survivorship bias in universe selection |
Files in This Skill
— CLI scoring tool for backtest evaluationscripts/evaluate_backtest.py
— Comprehensive backtesting methodology for Indian marketsreferences/methodology.md
— Common failure patterns and documentation frameworkreferences/failed_tests.md