march taught expensive lesson.
VIX spike = full stop.
cost $9,582 to learn.
what i knew before march #
old rule:
pause if VIX >25 (extreme fear).
resume when VIX <20.
problem:
VIX 20-25 range still trades.
march VIX averaged 20.6 (right in that zone).
paid tuition.
what march actually showed #
VIX ranges and my strategy performance:
VIX 13-18 (normal):
win rate: 70-75%
avg monthly return: +1.5% to +2.5%
strategies work perfectly.
VIX 18-22 (elevated):
win rate: 45-55%
avg monthly return: -1% to +0.5%
strategies break even or lose.
VIX >22 (high fear):
win rate: 20-35%
avg monthly return: -2% to -5%
strategies get destroyed.
march VIX 20.6 = elevated zone.
strategies coin flip at best.
the actual march data #
march daily VIX:
day 1: 21.2 (paused 0 days - mistake)
day 2: 20.8 (paused 0 days - mistake)
day 3: 21.5 (paused 0 days - mistake)
day 4: 20.3 (paused 0 days - mistake)
day 5: 19.9 (paused 0 days - mistake)
day 6: 21.8 (paused 0 days - mistake)
day 7: 20.6 (finally paused - too late)
cost of not pausing days 1-6: -$4,200
if i’d paused day 2 (new rule): -$1,090 total
savings: $3,110
new rule implemented march 17 #
VIX spike detection:
if VIX >20 for 2 consecutive days: pause all trading.
recovery signal:
if VIX <18 for 3 consecutive days: resume trading.
implementation:
automated in regime detector.
no discretion, hard rule.
backtesting new rule on march #
actual march (old rule):
traded days 1-16.
paused days 17-31 (after losses).
result: -$9,582
hypothetical march (new rule):
paused day 2 onwards (VIX >20 two days).
traded only day 1.
result: -$1,090 (day 1 only)
savings: $8,492
the rule works.
why VIX >20 matters #
what VIX measures:
implied volatility on S&P 500 options.
market fear gauge.
VIX 13-18: normal conditions, predictable moves.
VIX 18-22: elevated fear, whipsaw increases.
VIX >22: high fear, correlations spike, strategies fail.
my strategies rely on:
low correlation between assets.
predictable volatility patterns.
normal market structure.
VIX >20 destroys all three.
comparing to other traders #
reddit r/algotrading discussions:
common theme: VIX spikes kill algos.
most successful traders pause VIX >18-20.
some use VIX >15 (ultra conservative).
my old threshold (VIX >25):
too high.
damage already done by then.
new threshold (VIX >20 two days):
matches successful traders.
catches regime shifts fast.
exceptions to the rule #
when to trade despite VIX >20:
volatility-focused strategies (selling premium).
hedging existing positions.
opportunistic trades (clear edge).
my situation:
don’t have vol-specific strategies.
don’t need to hedge (fully automated, can pause).
no exceptions.
VIX >20 two days = full stop, no discretion.
implementation in code #
class VIXFilter:
def __init__(self, spike_threshold=20.0, recovery_threshold=18.0,
consecutive_days=2, recovery_days=3):
"""
VIX-based trading filter
Args:
spike_threshold: VIX level to trigger pause
recovery_threshold: VIX level to resume
consecutive_days: Days above spike to pause
recovery_days: Days below recovery to resume
"""
self.spike_threshold = spike_threshold
self.recovery_threshold = recovery_threshold
self.consecutive_days = consecutive_days
self.recovery_days = recovery_days
self.vix_history = []
self.spike_count = 0
self.recovery_count = 0
self.paused = False
def update(self, current_vix):
"""
Update with daily VIX close
"""
self.vix_history.append(current_vix)
# track consecutive spikes
if current_vix > self.spike_threshold:
self.spike_count += 1
self.recovery_count = 0
else:
self.spike_count = 0
# track consecutive recovery
if current_vix < self.recovery_threshold:
self.recovery_count += 1
else:
self.recovery_count = 0
# update pause status
if self.spike_count >= self.consecutive_days:
self.paused = True
if self.recovery_count >= self.recovery_days:
self.paused = False
def should_trade(self):
"""
Decision: trade today?
"""
return not self.paused
# usage
vix_filter = VIXFilter(spike_threshold=20.0, recovery_threshold=18.0,
consecutive_days=2, recovery_days=3)
# daily update before market open
vix_filter.update(current_vix=21.2) # day 1
print(f"Day 1 - Trade: {vix_filter.should_trade()}") # True
vix_filter.update(current_vix=20.8) # day 2
print(f"Day 2 - Trade: {vix_filter.should_trade()}") # False (2 days >20)
vix_filter.update(current_vix=19.5) # day 3
print(f"Day 3 - Trade: {vix_filter.should_trade()}") # False (still paused)
vix_filter.update(current_vix=17.8) # day 4
print(f"Day 4 - Trade: {vix_filter.should_trade()}") # False (need 3 days <18)
vix_filter.update(current_vix=17.2) # day 5
print(f"Day 5 - Trade: {vix_filter.should_trade()}") # False (need 3 days <18)
vix_filter.update(current_vix=17.5) # day 6
print(f"Day 6 - Trade: {vix_filter.should_trade()}") # True (3 days <18, resumed)
march final week with new rule #
deployed march 17.
march 17-31 VIX:
all days >19.5, most >20.
new rule kept me paused entire final 2 weeks.
cost: ~$800 opportunity missed (if conditions had been favorable).
savings: ~$2,400 losses avoided (conditions were unfavorable).
net benefit: +$1,600
protecting capital works.
lessons for april #
if VIX starts elevated:
pause immediately (don’t wait like march).
if VIX normalizes:
resume cautiously (50% position size first week).
realistic april expectations:
depends entirely on VIX.
VIX <18: target +1.8% to +2.2%.
VIX 18-20: target -0.5% to +1.0%.
VIX >20: pause entirely.
tonight (march 27, 3:44am) #
march taught expensive lesson.
VIX spike = full stop.
old rule: pause VIX >25 (too high).
new rule: pause VIX >20 two consecutive days, resume VIX <18 three days.
march actual (old rule): -$9,582.
march hypothetical (new rule): -$1,090.
savings: $8,492.
deployed march 17, kept paused rest of month (saved $1,600).
april: watching VIX, resume only if <18 three days.
3:44am thursday. VIX pause protocol post-mortem. old rule: pause VIX >25 (too high, damage done). march VIX 20.6 avg, strategies coin flip 45-55% win rate. cost: -$9,582. new rule: pause VIX >20 two consecutive days, resume <18 three days. backtest march: new rule would’ve lost -$1,090 (day 1 only) vs actual -$9,582. savings $8,492. deployed march 17, paused rest of month, saved $1,600 vs forcing trades. reddit r/algotrading consensus: successful traders pause VIX 18-20. april plan: resume only if VIX <18 three days.
-AK