Market mood (fear and greed; bull and bear): pre-registered specification
Written 2026-10-02, before any result below was computed. Committed to git before the first run; the commit hash is the freeze. Any later change to a component, window, threshold, sample or test is logged at the bottom with its date and reason, and the original result is kept. Brief: docs/briefs/barometers.md.
What was learnt from the benchmark
The Aftermarket Report’s Fear & Greed (AMR, FEAR_GREED_RISK_PREREGISTRATION.md and _RESULTS.md) was tested as a return forecast (12 versions, none survived) and as a risk forecast (three hypotheses, all failed: fearful readings arrive in rough months, and the score added nothing beyond last month’s volatility or the VIX). Its sample was 2017–2024, about 1,900 sessions. What we change:
- One job per index, tested as that job. Describing the market is not a forecast and is not tested as one.
- Longer samples. Components are built on their longest clean history (most from 2004–2008), so the tests cover 2008, 2011, 2015–16, 2020 and 2024–26.
- Harder baselines. Any risk claim must beat trailing volatility at three horizons, the US VIX and the 200-day rule together.
- Tails tested separately from the whole range.
- Two engines, two ideas. The design reading of the reference indices (below) is that “fear and greed” (CNN) is built mostly from the price tape, while “bull and bear” (BofA) is built mostly from positioning and flows, and is used only at its extremes. They are different questions, so they get different engines and pages, sharing one framework.
Reference indices (methods as their publishers describe them)
- CNN Fear & Greed: seven equally weighted indicators, 0–100: S&P 500 against its 125-day average; NYSE 52-week highs against lows; McClellan volume summation; the 5-day put/call ratio; the junk-bond spread; the VIX against its 50-day average; stocks against Treasuries over 20 days. Each is scored by how far it sits from its own average relative to its usual spread.
- BofA Bull & Bear Indicator (Hartnett): 0–10, built from fund flows, positioning (hedge-fund and long-only), credit technicals and global equity breadth. Used as a contrarian signal: 8 or above is a “sell”, 2 or below a “buy”. The exact weights are not public.
- AAII, Investors Intelligence: surveys; no Indian equivalent with history. Citi Panic/Euphoria: proprietary. Neither is replicated.
Shared framework
- Percentile, expanding window only. Each component on session t is the percentile rank of its value among all its own values from its first date to t inclusive (ties averaged), scaled 0–1. A component’s percentile is defined only after 756 sessions (36 months for monthly inputs) of its own history. No future value ever enters.
- Signed so high = greed / bullish. The sign of each component is fixed below, before any data is seen.
- Composite = equal-weighted mean of the available component percentiles. No fitted weights, ever.
- Publication lags. A value is used only from the first session on which it was public: exchange end-of-day data on its own date; NSE participant OI and MTF on their own date (published the same evening); AMFI monthly flows 15 calendar days after the month ends; IPO heat at the completed month-end; FRED VIX on the next Indian session (US close is after the Indian close).
- Contribution to today’s reading = (component percentile − 0.5) / number of components, so contributions sum to (composite − 0.5).
Fear and greed (the tape): /fear-and-greed/
Job: describe the state of the Indian equity tape in one number whose parts are all visible. Secondary job, tested: forecast risk. Score 0–100.
| # | Component | Measure (Nifty 500 total return unless stated) | High means | From |
|---|---|---|---|---|
| 1 | Momentum | Close against its 125-session average, % | Greed | 1995 |
| 2 | Price strength | (52-week highs − 52-week lows) / universe, liquid NSE universe | Greed | 2004 |
| 3 | Participation | Share of the liquid universe above its 50-day average | Greed | 2004 |
| 4 | Volatility | 20-session realised volatility / 252-session realised volatility (sign reversed) | Fear when high, so it enters as 1 − percentile | 1995 |
| 5 | Safe-haven demand | 20-session return of Nifty 500 minus that of the NSE 5-year G-sec index, points | Greed | 2001 |
| 6 | Risk appetite | 20-session return of Nifty Smallcap 250 minus Nifty 100, points | Greed | 2005 |
- The liquid NSE universe is
compute/breadth.py’s (point-in-time, survivorship-free). It is used from 2004-01, when it first holds 300 stocks. - Not included, and why: put/call ratio (NSE option data from 2020 only, and in India the OI ratio’s sign is contested because writers dominate); junk-bond spreads (corporate bond yields are withheld for licence reasons); the US VIX (kept out so that it can be a baseline in the risk test); India VIX (not ingested).
- Published when at least 4 of 6 components are defined (from about 2004). Tested only where all 6 are defined (from about April 2008).
- Bands (CNN’s): 0–25 extreme fear, 25–45 fear, 45–55 neutral, 55–75 greed, 75–100 extreme greed. The score’s own expanding percentile is shown beside it, because a mean of percentiles bunches towards 50.
Bull and bear (positioning and flows): /bull-bear/
Job: flag extremes only. Score 0–10 (mean component percentile × 10). The whole range is shown but only its tails are tested.
| # | Component | Measure | High means | From |
|---|---|---|---|---|
| 1 | Fund flows | Equity-oriented mutual fund net inflows, last 3 months, / equity AUM 3 months earlier (AMFI via IDH, CMMFNIFTEQ11M, CMMFAUMTEQ11M) | Bullish | 1999 |
| 2 | Futures positioning | FII long share of index futures open interest (NSE participant OI) | Bullish | 2012 |
| 3 | Leverage | Change over 126 sessions in the MTF book as a share of market value (bps) | Bullish | 2017-06 (the regime change in leverage.md) |
| 4 | New issues | IPO heat (ipo/heat: listings count and median listing gain, 12-month window), completed months | Bullish | 2016 |
| 5 | Index breadth | Share of NSE indices above their 200-day average (BofA uses global index breadth) | Bullish | 1995 |
- Not included, and why: DII flows (their sign is contested: domestic institutions buy falls); FPI daily flows (NSDL daily only from 2021 in the warehouse); PCR (see above).
- Published when at least 3 of 5 components are defined (about 2015 on). The sample is short. The tests below are run anyway and the page says plainly how few independent episodes there are.
- Zones: the top and bottom decile of the score’s own expanding history (needs 756 sessions of score). BofA’s fixed 8 and 2 lines are drawn as a reference.
Targets and baselines (shared by every risk test, also used by the trend barometer)
On session t, for the Nifty 500 total-return index:
rv_fwd= annualised standard deviation of daily log returns over sessions t+1…t+21. Modelled aslog(rv_fwd).dd5= 1 if any close in t+1…t+21 is at least 5% below the close of t.dd10= 1 if any close in t+1…t+63 is at least 10% below the close of t.- Baseline B0 (all known at t): log realised volatility over the last 5, 21 and 63 sessions (a HAR model), log US VIX (FRED
VIXCLS, the last US close before t), and a dummy for Nifty 500 below its 200-session average. - Model: OLS for
log(rv_fwd); linear probability model fordd5anddd10. Coefficient on the score scaled 0–1.
Hypotheses: fear and greed (family of 5; Bonferroni α = 0.05/5 = 0.01)
- FG-H1. The score adds to B0 in forecasting
log(rv_fwd). Two-sided. - FG-H2. The score adds to B0 in forecasting
dd5. Two-sided. - FG-H3. The score adds to B0 in forecasting
dd10. Two-sided. - FG-H4a. Sessions in the score’s bottom decile (expanding) are followed by a higher mean 63-session Nifty 500 return than all sessions. One-sided.
- FG-H4b. Sessions in the top decile are followed by a lower mean 63-session return than all sessions. One-sided.
Two-sided for H1–H3 because both stories exist (fear clusters with turbulence; greed is complacency), and no sign is assumed.
Hypotheses: bull and bear (family of 3; α = 0.05/3 = 0.0167)
- BB-H1. Sessions in the top zone are followed by a lower mean 63-session Nifty 500 return than all sessions in the sample. One-sided.
- BB-H2. Sessions in the bottom zone are followed by a higher mean 63-session return. One-sided.
- BB-H3. The score adds to B0 plus the fear-and-greed score in forecasting
dd10. Two-sided.
Inference and pass bars
- Regressions (FG-H1–H3, BB-H3): Newey-West standard errors with lags equal to the forward window (21 or 63). A hypothesis passes only if all four hold: (1) p below α on the full test sample; (2) the same sign in both halves (split at the sample’s middle date); (3) out of sample, an expanding-window refit each January from 2016 (2020 for BB-H3), the model with the score has lower mean squared error (Brier score for the drawdown flags) than B0 alone over 2016 to the latest full forward window; (4) the same sign in the non-overlapping sample (every 21st or 63rd session from the first).
- Tails (FG-H4, BB-H1–H2): difference in means against all sessions; p from a circular block bootstrap (block 63 sessions, 10,000 draws, seed 20261002) of the zone-membership series against returns. Passes only if: (1) p below α; (2) the same sign in both halves; (3) at least 8 independent episodes in the zone (an episode is a run of zone sessions separated by at least 63 sessions from the previous one). With fewer than 8 the result is “untestable”, not a pass.
- Returns over the whole range are not claimed. Spearman correlations of each score with forward 21, 63 and 252-session returns are reported with HAC t-statistics, labelled descriptive.
What each outcome lets the page say
- Risk hypothesis passes: “readings like today’s have been followed by rougher months, beyond what volatility, the VIX and the 200-day rule already said”, with the effect size.
- Fails: the page says the score describes and does not forecast, and credits trailing volatility for any risk sentence.
- Tails pass: the zone is described as historically informative, with the episode count. Fail or untestable: said plainly.
“What happened next” (descriptive, every reading band)
For each band: sessions, independent periods (greedy non-overlapping windows of the horizon), median and inter-quartile range of forward 21, 63 and 252-session Nifty 500 total returns, hit rate (share positive), and the median worst fall within the window. Shown under every reading with the sentence that most bands are noise, wherever the bands’ ranges overlap.
Not tested, stated in advance
No other horizon, threshold, index, component subset, weighting or model form. Anything tried later is labelled exploratory. A daily log of the scores starts with the first publication; the live verdict comes after 250 sessions against pass bar (3).
Results log
Implementation notes, 2026-10-02, written before the first run
- Session calendar: NSE equity sessions (the dates of the bhavcopy breadth table).
- Index breadth starts when at least 20 NSE indices have a 200-day average (first in 2004-01); with fewer, one or two indices would swing it from 0 to 100.
- Equity fund flows use IDH’s latest vintage of each month (AMFI rarely revises; noted as a small look-ahead risk).
- MTF book is carried forward at most three sessions over gaps.
2026-10-02: first run (data to 1 Oct 2026)
Ran as specified; no rule changed after results were seen.
Fear and greed (tested sample 2008-05-08 to the last full forward window, 4,538 sessions):
- FG-H1, forward volatility beyond B0: coefficient -0.036, p = 0.74; out of sample worse. Fail.
- FG-H2, a 5% fall within 21 sessions: -0.232, p = 0.031 (bar 0.01); same sign in both halves, out of sample slightly better, non-overlapping same sign. Fail on the significance bar only.
- FG-H3, a 10% fall within 63 sessions: p = 0.29; out of sample worse. Fail.
- FG-H4a, bottom decile (extreme fear) → higher 63-session return: +4.6 points against all sessions (8.1% vs 3.5%), p = 0.0061, 14 episodes, both halves positive. Pass.
- FG-H4b, top decile (extreme greed) → lower return: the opposite happened (+4.1 points). Fail.
- Whole range, descriptive: Spearman with forward 63-session return 0.12 (HAC t 1.7).
Bull and bear (published from 2015-01; zones defined from 2018):
- BB-H1 top zone: 4 episodes. Untestable (fewer than 8).
- BB-H2 bottom zone: 7 episodes, +3.6 points, p = 0.045. Untestable.
- BB-H3, a 10% fall beyond B0 and fear and greed: p = 0.18. Fail.
Reading: the tape index does not forecast risk beyond volatility, the VIX and the 200-day rule, as AMR found on a shorter sample. Its one informative region is extreme fear, which has been followed by better-than-usual three-month returns in both halves of the sample. Extreme greed has not been followed by worse ones.
2026-10-03: audit notes (register rows R7–R10, BT3); no result changed
- R8, logged late: the bull-and-bear “new issues” component uses
ipo/heatas built incompute/ipo.py, whose window is 3 months, not the 12 months written above. The results above were computed with the 3-month window. It is kept, to avoid a change after results; this note is the record. - R7: the MTF same-evening publication lag is unverified. If NSE publishes the next day, the component has a one-session look-ahead on a 126-session change.
- R9, FG-H4a: reproduced independently (p = 0.0067). The block length was then varied: 126 sessions gives p = 0.0073 (9 episodes), 252 gives p = 0.009 (6 episodes).
- Across the site’s 35 confirmatory tests (D3 in
audit_deepening_spec.md), FG-H4a does not survive Holm’s correction (p 0.0061 against a bar of 0.0016), but it does survive Benjamini–Hochberg at a 10% false-discovery rate. - The page should say so.
- Across the site’s 35 confirmatory tests (D3 in
- D2: both “what happened next” tables now carry 90% intervals and an “inside noise” flag.