results-season
Reads the price reaction to quarterly results on NSE/BSE stocks. Picks the right reaction session from the announcement time (same day for pre-market/market-hours, next NSE session for after-hours, we
Files2
View on GitHubSKILL.mdskills/results-season/SKILL.md
GitHubResults Season (NSE/BSE)
fundamental-screening reads the numbers. This skill reads the market's verdict on them. The
reaction (how far, on how much volume, where it closed, and whether it held) is more objective
than a headline beat or miss, especially in India, where consensus estimates are not freely available.
Commands
# One stock: reaction metrics, then the score (adds factor table and a plain-English read)
python3 scripts/results.py reaction --csv tcs.csv --date 2026-10-09 --timing post-market
python3 scripts/results.py score --symbol HDFCBANK --date 18-Oct-2026 --timing 14:20
# Weekly drift watch after a strong gap-up: pullback that holds the gap-day low, then a breakout
python3 scripts/results.py drift --csv dixon.csv --date 2026-07-24 --timing post-market
# Many events: symbol,date,timing CSV (+ optional file column); CSVs named SYMBOL.csv
python3 scripts/results.py scan --events q2.csv --csv-dir data/ --top 10
# Positions with results inside a holding window (feeds trading-discipline's event check)
python3 scripts/results.py calendar-check --events q2.csv --from 2026-11-02 --to 2026-11-13 --symbols TCS,INFY
Inputs follow technical-analysis (--csv, --candles, --symbol). Dates are ISO (2026-10-31) or
NSE style (31-Oct-2026); a numeric date that could be DD/MM or MM/DD is refused, never guessed.
--timing is pre-market, market-hours, post-market, or the filing time (16:05, read as IST). Every
command takes --json. Bad input exits 2 with one error: line. Use 220+ daily bars for the 200-DMA.
Which session is the reaction?
| Announced | Reaction session |
|---|---|
| Before 09:15 on a trading day | Same day: the open is the verdict |
| 09:15–15:30 | Same day. The open came before the news, so read the close, not the gap |
| 15:00–15:30 | Same day, flagged: NSE's close is the volume-weighted price of the last 30 minutes, so part of the move lands next session |
| After 15:30, or a weekend/holiday | Next NSE session (holiday list from ../fno-options-analysis/scripts/options.py) |
Some companies hold results board meetings on Saturdays, and those react on Monday. Muhurat or
special sessions in the data are skipped and flagged. Use --reaction-date to override.
Reading reaction and score
reaction reports gap %, reaction-day return, close location (0 = low, 1 = high), volume ÷ the
prior 50 sessions, ATR(14) as of the day before, follow-through at +1/3/5/10/20 sessions (vs the
reaction close and vs the pre-results close, and whether the reaction-day low held), and whether
the gap filled.
| Factor | Weight | Full marks | Why |
|---|---|---|---|
| Reaction size | 35 | close ≥ +3 ATR vs pre-results close | ATR scales the move to the stock's usual noise; the close is what the market kept |
| Volume expansion | 20 | 4× the 50-day average (1× = 0) | Funds re-rating a stock can't hide their size |
| Close strength | 15 | closed at the day's high | A faded gap means holders used the news to sell |
| Trend position | 20 | above 200-DMA (7), above 50-DMA (6), at the pre-results 52-week high (7, zero at −10%) | Gaps into new highs meet no trapped sellers |
| Fresh surprise | 10 | ≤ +10% in the 60 sessions before results (zero at +40%) | A big run-up often means the news was already priced in |
Volume, trend and fresh surprise are context, so they are multiplied by a gate: 0 for a flat or negative close and 1 from +1 ATR up. A stock in a perfect uptrend that does nothing on results earns little. Missing data (no volume, under 200 bars) drops that factor and rescales the total to 100. Grades: A ≥80, B ≥60, C ≥40, D below. The score is long-biased. A strong negative reaction is a D with a bearish read.
Reading drift
Runs only after a strong gap-up: gap or close ≥ --min-gap-pct (4%) with a green close. Weeks
start after the reaction week.
- Failed: any daily close below the gap-day low. The reaction was rejected, so drop it.
- Pullback-set: the first red weekly candle whose low stays above the gap-day low. The trigger is
that week's high, and the stop is its low minus
--stop-buffer-pct(0.5%). Further red weeks extend the pullback and lower the trigger. A week that dips under the gap-day low intraday but closes above it is noted as a shakeout. - Triggered / stopped: the later breakout above the trigger (a gap above it fills at the open),
then the stop check. Reports R so far. Expired: no entry within
--max-weeks(12).
Feed the trigger and stop to ../breakout-planner/scripts/breakout.py plan --pivot .. --stop .. for
ticks, size and GTT orders.
India context
- Deadlines (SEBI LODR Reg 33(3)): Q1–Q3 results within 45 days of quarter end (14 Aug, 14 Nov,
14 Feb). Q4 comes with the audited annual results within 60 days of the FY end (30 May).
calendar-checkprints the season deadline and flags positions with no known date. - Notice (Reg 29): the board meeting to approve results must be intimated at least 2 working days ahead, excluding the intimation and meeting days. This has applied since the 17-May-2024 amendment; it was 5 days before that. Exchange board-meeting lists therefore cover only the next few days. Re-check them during long holds.
- Timing (Sch III Part A): the outcome must be filed within 30 minutes of the meeting ending, so results can land mid-session as well as after 15:30. Use the filing timestamp.
- F&O stocks: implied volatility builds into results and collapses after (IV crush). Option
buyers can be right on direction and still lose. Compare the IV-implied move from
fno-options-analysiswith the realised ATR move here. - Non-F&O stocks have 5/10/20% price bands. A results-day upper circuit means buyers may not have been filled. A lower circuit traps holders, and stops do not fill. The script flags closes pinned at a band.
- No free consensus. Judge the numbers by YoY growth first (seasonality), then QoQ, plus margins
and management commentary (
fundamental-screening). The reaction shows how they compared with what the market expected.
How it connects
india-market-analyst: avoid fresh swing entries just before results. Runcalendar-checkbefore any multi-day plan.trading-discipline: an INSIDE row fromcalendar-checkmeans the gate gets--event yes.momentum-scanner: a grade-A gap out of a quiet base is an episodic pivot candidate.breakout-planner: a pivot within ~5 sessions of results is a coin toss. After the event, the drift trigger is a cleaner pivot.trailing-stops: manage a triggered drift trade (breakeven at 1R).
Limits
These are daily bars only: no intraday order of events, no delivery %, no option IV. Reactions to other news on the same day (block deals, index inclusion, market-wide gaps) look like results reactions, so check the NIFTY move that day. Thresholds are conventions, not fitted parameters.
Educational analysis, not investment advice.