Skip to main content

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}