Why momentum? Stocks outperforming the index over
6 months tend to continue outperforming for another 3–6 months.
This is one of the most empirically validated signals in finance.
How EPS is adjusted — the cleaning pipeline
STEP 1
Raw Reported EPS
Yahoo Finance quarterly income statement. Includes everything the company reported — exceptional gains, write-offs, asset sales.
STEP 2
Find Exceptional Items
"Total Unusual Items" row in income statement. One-time gains or losses that don't reflect normal business operations.
STEP 3
Strip Minority Interest
Remove the portion of profit belonging to minority shareholders in subsidiaries. Only the parent's share counts.
STEP 4
Tax Adjustment
Apply India's 25% standard corporate tax rate to exceptional items to get the after-tax impact before removing them.
STEP 5
Adjusted EPS ✓
Clean recurring earnings ÷ shares outstanding. This is what feeds the scoring model and all P/E calculations.
FORWARD EPS — OPTION C (both shown)
Our Derived Forward EPS = TTM Adjusted EPS × (1 + EPS Growth Rate). Based entirely on our adjusted numbers and historical trend. Fully clean.
Analyst Consensus (Yahoo) = Aggregated analyst estimates. May include exceptional items. Shown for comparison. If divergence > 20%, a ⚠ flag appears — it means analysts see something our model doesn't (or vice versa).
⏳
Backtest not yet run
The backtest pipeline is ready but backtest_results/results.json doesn't exist yet.
Run locally:
py build_composition.py
py backtest_fetch.py # ~15-20 min, one-time
py backtest_simulate.py
git add backtest_results/ nifty50_historical_composition.json
git commit -m "Backtest results"
git push
Once backtest_results/results.json is in the repo, reload this page.
Out-of-sample backtest
—
—
Window
—
—
Portfolio Total Return
—
—
Nifty 50 Total Return
—
Buy & hold index
Total Spread
—
Portfolio − Benchmark
CAGR (Portfolio)
—
Annualised
CAGR (Benchmark)
—
Nifty 50 annualised
Annual Alpha (Jensen's)
—
Risk-adjusted excess
Beta vs Nifty
—
Market sensitivity
Sharpe (Portfolio)
—
Risk-adjusted return
Sharpe (Benchmark)
—
Index Sharpe ratio
Tracking Error
—
Annualised σ of spread
Overall Hit Rate
—
% quarters picks beat Nifty
Quarters Won / Lost
—
Positive spread vs Nifty
Cumulative NAV — Portfolio vs Nifty 50
₹10L initial capital · Equal-weighted top 25 · Rebalanced quarterly · Net of 0.20% transaction cost per side
Quarterly Spread — Portfolio minus Nifty 50 (per rebalance period)
Green = portfolio beat index that quarter · Red = underperformed · Height = spread magnitude
Per-Quarter Detail
Click any row to see that quarter's top 25 picks
#
Rebalance Date
Executed
Portfolio Return
Nifty Return
Spread
Hit Rate
NAV After
Picks
Most-Picked Stocks Across All 16 Quarters
How often each ticker appeared in the top 25, and how often it beat the index when picked
Ticker
Times Picked
Times Beat Nifty
Win Rate (when picked)
Avg Return When Picked
Avg Spread When Picked
Assumptions
Explicit parameters used in the simulation
Known Limitations
Read this before trusting any single number
1. Fundamentals restatement bias. yfinance returns latest financials, not the original filing snapshot. Companies sometimes restate numbers after the fact. Our scoring uses what Yahoo serves today, not what was actually filed on each historical rebalance date. Paid PIT databases (CRSP, S&P Capital IQ) solve this; we don't use them.
2. Small sample. 16 rebalance periods is enough to spot directional patterns but too few for statistically-reliable Sharpe or alpha estimates. Treat p-values with suspicion.
3. Execution price. We execute at next-day close (T+1 close) as a proxy for open. Real Indian open prices from yfinance are inconsistent. Live slippage may be modestly higher.
4. EPS quality is mostly PARTIAL. Yahoo doesn't always serve both exceptional items and minority interest rows. Stocks with UNVERIFIED EPS use raw Yahoo Net Income.
5. Costs not modelled. 0.20% per side captures brokerage + STT + stamp + GST roughly, but ignores bid-ask slippage on less-liquid names and any long-term-capital-gains tax consequences.
✓ Survivorship IS handled correctly. Every rebalance uses the actual historical Nifty 50 composition at that date. HDFC Ltd disappears after its July 2023 merger. ADANIENT not held before Sep 2022. Data: NSE reconstitution announcements.
⚠
Error loading backtest results
📊
Simulation Tracker — Starting April 2026
This tab will track every quarterly prediction against actual performance.
How it works: Each quarter, the top 25 stocks by score are recorded
as the "predicted outperformers." One year from now, we compare what those 25 stocks
actually returned vs the Nifty 50 index. The hit rate, alpha, and Sharpe ratio
are calculated automatically.
First prediction locked in: April 18, 2026 First result available: April 18, 2027
Come back each quarter to see if the model is working.