Skip to main content

fall volatility algo adaptation - regime detection update

first real trading days since vacation.

volatility already picking up. VIX hit 16.2 today.

time to adapt.

the seasonal shift
#

summer algo settings don’t work in fall.

learned this the hard way in 2023. lost $40k in september-october because I didn’t adjust.

summer mode (june-august):

smaller position sizes (0.5% risk per trade)

wider stops (more noise in thin markets)

longer DTE options (theta grind)

avoid futures (whipsaw city)

fall mode (september-november):

normal position sizes (1.0% risk per trade)

tighter stops (cleaner price action)

shorter DTE options (capture vol expansion)

futures back in play (trend days return)

regime detection logic
#

been refining this for 2 years now.

core idea: use multiple volatility metrics to detect regime, not just VIX.

import numpy as np
import pandas as pd
from dataclasses import dataclass
from typing import Literal

@dataclass
class RegimeState:
    regime: Literal['low_vol', 'normal', 'high_vol', 'crisis']
    confidence: float
    vix_level: float
    vol_of_vol: float
    correlation: float

class RegimeDetector:
    def __init__(self, lookback: int = 20):
        self.lookback = lookback
        self.history = []

    def calculate_vol_of_vol(self, vix_series: pd.Series) -> float:
        """volatility of volatility - key regime indicator"""
        if len(vix_series) < self.lookback:
            return 0.0
        returns = vix_series.pct_change().dropna()
        return returns.tail(self.lookback).std() * np.sqrt(252)

    def calculate_correlation(self, spy: pd.Series, qqq: pd.Series) -> float:
        """SPY/QQQ correlation - dispersion indicator"""
        if len(spy) < self.lookback:
            return 1.0
        spy_ret = spy.pct_change().dropna().tail(self.lookback)
        qqq_ret = qqq.pct_change().dropna().tail(self.lookback)
        return spy_ret.corr(qqq_ret)

    def detect(self, vix: float, vix_history: pd.Series,
               spy: pd.Series, qqq: pd.Series) -> RegimeState:
        vol_of_vol = self.calculate_vol_of_vol(vix_history)
        correlation = self.calculate_correlation(spy, qqq)

        # regime classification
        if vix < 14 and vol_of_vol < 0.8:
            regime = 'low_vol'
            confidence = min(1.0, (14 - vix) / 4 + (0.8 - vol_of_vol))
        elif vix > 25 or vol_of_vol > 1.5:
            regime = 'high_vol'
            confidence = min(1.0, (vix - 25) / 10 + (vol_of_vol - 1.5))
        elif vix > 35:
            regime = 'crisis'
            confidence = 0.95
        else:
            regime = 'normal'
            confidence = 0.7

        return RegimeState(
            regime=regime,
            confidence=confidence,
            vix_level=vix,
            vol_of_vol=vol_of_vol,
            correlation=correlation
        )

today’s detection
#

ran the detector on close.

VIX: 16.2

vol of vol: 0.92 (elevated from summer 0.6)

SPY/QQQ correlation: 0.71 (normal)

detected regime: normal (transitioning from low_vol)

confidence: 0.68

what this means for trading
#

regime shifted from ’low_vol’ to ’normal'.

activating fall mode settings:

  1. position size back to 1.0% risk
  2. DTE shortened to 14-21 days
  3. ES futures algo unpaused
  4. premium targets increased 15%

community insight
#

been discussing seasonal adaptation on NexusFi lately. some traders there use much more complex regime models - multi-factor ML stuff.

mine’s simple but works. 83% of the edge is just having a regime model at all.

tomorrow
#

cpi data coming in 8 days. usually volatility ramps into number releases.

watching for vol expansion this week.


2:38am wednesday. first real trading since vacation. volatility picking up - VIX 16.2, vol of vol elevated to 0.92. regime detector showing transition from low_vol to normal. activating fall mode: 1% position sizing, shorter DTE, futures back on.

-AK

Related

earnings volatility - how my algos adapt to quarterly chaos
earnings week chaos. GOOGL, TSLA, META all this week. how my algos handle it. the earnings problem # normal day: VIX 15, predictable ranges, clean signals
building volatility regime detection
need to stop trading when volatility spikes. building detection system. the problem # this week VIX spiked 18% in 2 days. my strategies got stopped out twice.
order flow analysis - adapting strategies for summer thin volume
summer volume creates different market microstructure. adapting order flow analysis to account for it. the summer volume problem # normal month volume: 4.2M SPX options contracts/day
adaptive position sizing - regime-based approach
position sizing makes or breaks algo trading. been refining adaptive approach last 6 months. finally working consistently. the problem with static sizing # most algo traders:
regime detection - walk-forward validation improving accuracy
regime detection upgraded. walk-forward validation running. accuracy improving. the problem # static regime parameters: optimized on historical data.
regime detection filtering framework - how i adapt to market conditions
august forcing me to rely on filters. figured worth explaining how regime detection works. learned a lot from options selling regime discussions on NexusFi about adapting to conditions. the problem # strategies don’t work in all conditions.