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:
- position size back to 1.0% risk
- DTE shortened to 14-21 days
- ES futures algo unpaused
- 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