quantwave_core/regimes/india.rs
1//! India-Specific Regime Detection Helpers
2//!
3//! Provides tools to adjust regime detection for the specific dynamics of the Indian
4//! markets, such as F&O expiry days and NSE holidays.
5
6use chrono::{Datelike, NaiveDate, Weekday};
7
8/// Detects if a given date is a standard NSE Weekly Expiry.
9///
10/// Nifty/FinNifty/Midcap typically expire on Thursdays/Tuesdays/Mondays.
11/// BankNifty shifted to Wednesdays for weekly expiries.
12pub fn is_likely_nse_expiry(date: NaiveDate, symbol: &str) -> bool {
13 let weekday = date.weekday();
14 match symbol.to_uppercase().as_str() {
15 "NIFTY" => weekday == Weekday::Thu,
16 "BANKNIFTY" => weekday == Weekday::Wed,
17 "FINNIFTY" => weekday == Weekday::Tue,
18 "MIDCPNIFTY" => weekday == Weekday::Mon,
19 _ => weekday == Weekday::Thu, // Default to Thursday
20 }
21}
22
23/// A filter that suppresses volatility spikes on expiry days.
24///
25/// Use this to prevent expiry-day 'pinning' or volatility expansion from
26/// triggering false regime shifts.
27pub struct ExpiryVolFilter {
28 symbol: String,
29}
30
31impl ExpiryVolFilter {
32 pub fn new(symbol: &str) -> Self {
33 Self { symbol: symbol.to_string() }
34 }
35
36 pub fn should_suppress(&self, date: NaiveDate) -> bool {
37 is_likely_nse_expiry(date, &self.symbol)
38 }
39}