Skip to main content

VIX spike trading pause - lessons from march disaster, when to stop

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

Related

year-end portfolio rebalance - reducing crypto exposure
rebalancing for 2025. reducing crypto allocation. more conservative positioning. current allocation (november) # options: 60% ($267,660) SPX puts, QQQ calls, sector ETFs.
thanksgiving week - pause, family time approaching
thanksgiving week here. pausing wed-fri. not interested in holiday volume lottery. week 4 pre-thanksgiving # mon nov 18: +$160, 1 trade, 100% wr
election day - pause executed
election day. markets open. i’m paused. current status # balance: $445,200 (from fri nov 1 +$420) today: watching, not trading
election week - pause, conservative positioning
election nov 5. pausing trading nov 4-5. zero interest in election volatility gambling. week 1 november update # nov 1 starting balance: $444,780
first week february - choppy conditions, tighter risk
first week february done. choppy as expected. tighter risk working. week 1 february trades (feb 1-2, 5-7) # thursday 2/1: 2 trades, 1 win. +$480
first day full risk - testing my psychology
ramped to 0.5% risk thursday. first 2 days at full size. psychology test passed. wednesday 11/15 - final day 0.25% risk # trades: 2 setups, both winners