Skip to main content

filtering aggressively in high vol - survival mode not growth mode

week 2 may.

VIX still elevated.

aggressive filtering required.

current market conditions
#

VIX range: 19-26 this week

correlation: 0.72 (high)

regime: high volatility

my strategy optimal range: VIX 14-19

current range: above optimal

survival mode.

what aggressive filtering means
#

normal filtering (april):

50-60% of signals accepted.

trade 10-15 times per week.

win rate 70%+.

aggressive filtering (may):

20-30% of signals accepted.

trade 4-6 times per week.

win rate target 60%+.

quality over quantity.

filter criteria tightened
#

added filters for high vol:

  1. regime confidence >0.9 (was 0.75)
  2. correlation <0.6 (new filter)
  3. volume confirmation required (was optional)
  4. time of day restriction (10am-2pm only)
  5. no entries last hour (was 30 min)

result: fewer trades, higher quality.

week 2 performance (may 6-10)
#

monday 5/6: observed only, no trades (feeling out market)

tuesday 5/7: 1 trade, 1 win. +$620

wednesday 5/8: 2 trades, 1 win. +$180

thursday 5/9: 1 trade, 0 wins. -$540

friday 5/10: 2 trades, 2 wins. +$840

week total: 6 trades, 4 wins (67%). +$1,100

account progression
#

may 3: $419,440

may 10: $420,540

week 2: +$1,100 (+0.26%)

may total (2 weeks): +$1,180 (+0.28%)

modest but positive.

comparing filter effectiveness
#

without aggressive filters (backtested):

would’ve taken 14 trades.

estimated win rate: 43%.

estimated pnl: -$1,200.

with aggressive filters (actual):

took 6 trades.

actual win rate: 67%.

actual pnl: +$1,100.

filtering added $2,300 value.

the trades i skipped
#

12 signals generated.

6 passed filters (taken).

6 failed filters (skipped):

3 failed regime confidence (whipsaw risk)

2 failed correlation check (everything moving together)

1 failed volume confirmation (low liquidity)

backtested skipped trades:

4 would’ve lost.

2 would’ve won.

net: -$800.

filtering worked.

position sizing strategy
#

base size: $1,500 (april validated)

may adjustments:

VIX 14-18: $1,500 (full size)

VIX 18-22: $1,200 (80% size)

VIX 22-26: $900 (60% size)

VIX >26: $0 (pause trading)

this week avg VIX: 22.4

size used: $900

appropriate for conditions.

risk management stats
#

max drawdown: -$540 (thursday)

drawdown recovery: 1 day (friday)

circuit breaker: not triggered

largest win: +$840 (friday)

largest loss: -$540 (thursday)

acceptable variance.

the psychology of filtering
#

hard part:

watching setups that “look good” get filtered out.

feeling like missing opportunities.

FOMO during winning streaks you didn’t participate in.

discipline:

trust the filters.

backtests prove they work.

survival > growth in wrong conditions.

patience.

comparing to april
#

april: growth mode, taking opportunities, 74% wr

may: survival mode, preserving capital, 56% wr (2 weeks avg)

both valid.

conditions dictate approach.

can’t force april performance in may conditions.

nexusfi discussion on filtering
#

been reading algo trading risk management thread on NexusFi.

other quant traders dealing with same high-vol challenges.

key insights:

  • over-filtering = missed opportunities
  • under-filtering = blown accounts
  • sweet spot = accept lower win rate, higher quality trades
  • survival mode is valid strategy

community validation helpful.

monthly projection update
#

week 1: +$80

week 2: +$1,100

may total: +$1,180 (0.28%)

2 weeks remaining.

projection:

if VIX stays >20: +$500 to +$1,500 more

if VIX drops <18: +$2,000 to +$3,000 more

may end: +$1,680 to +$4,180 (+0.4% to +1.0%)

modest month acceptable.

what success looks like
#

success ≠ repeating april.

success = capital preservation in tough conditions.

may showing:

  • filters preventing losses
  • discipline maintained
  • system adapting correctly

that’s success.

code for correlation filter
#

import pandas as pd
import numpy as np

class CorrelationFilter:
    """
    Filter trades based on portfolio correlation to prevent overexposure
    """

    def __init__(self, max_correlation=0.6):
        self.max_correlation = max_correlation
        self.current_positions = []

    def calculate_correlation(self, symbol_a, symbol_b, lookback_days=30):
        """
        Calculate correlation between two symbols
        """
        # Get historical returns
        returns_a = self.get_returns(symbol_a, lookback_days)
        returns_b = self.get_returns(symbol_b, lookback_days)

        # Calculate correlation
        correlation = returns_a.corr(returns_b)

        return correlation

    def check_new_trade(self, new_symbol):
        """
        Check if new trade would exceed correlation limits
        """
        if len(self.current_positions) == 0:
            return True  # First position always allowed

        # Check correlation with all existing positions
        max_corr = 0
        for existing_symbol in self.current_positions:
            corr = self.calculate_correlation(new_symbol, existing_symbol)
            max_corr = max(max_corr, abs(corr))

        # Allow trade if correlation below threshold
        if max_corr < self.max_correlation:
            return True
        else:
            print(f"Trade filtered: {new_symbol} correlation {max_corr:.2f} exceeds limit {self.max_correlation}")
            return False

    def add_position(self, symbol):
        """Add position to tracking"""
        self.current_positions.append(symbol)

    def remove_position(self, symbol):
        """Remove position when closed"""
        if symbol in self.current_positions:
            self.current_positions.remove(symbol)

    def get_returns(self, symbol, days):
        """
        Get historical returns for correlation calc
        (Placeholder - would connect to actual data in production)
        """
        # In production: fetch real data from Polygon/IB
        # For example: returns simulated
        return pd.Series(np.random.randn(days))


# Usage in live trading
correlation_filter = CorrelationFilter(max_correlation=0.6)

def process_signal(symbol, signal_strength):
    """
    Process trading signal with correlation filtering
    """
    # Check if signal passes correlation filter
    if correlation_filter.check_new_trade(symbol):
        # Other filters here (regime, volume, etc.)

        # If all filters pass, enter trade
        enter_trade(symbol)
        correlation_filter.add_position(symbol)
        print(f"✓ Trade entered: {symbol}")
    else:
        print(f"✗ Trade filtered: {symbol} (correlation)")


def exit_trade(symbol):
    """
    Exit trade and update correlation tracking
    """
    close_position(symbol)
    correlation_filter.remove_position(symbol)
    print(f"Position closed: {symbol}")

tonight
#

week 2 may.

+$1,100.

67% win rate on 6 trades.

aggressive filtering working.

survival mode appropriate.

capital preserved.


3:12am saturday. week 2 may. +$1,100 (67% wr, 6 trades). VIX 19-26, high vol conditions. aggressive filtering: accepted 6/12 signals. skipped trades backtested would’ve lost $800. position size reduced to $900. survival mode not growth mode. may total +$1,180 (0.28%).

-AK

Related

may preview - realistic expectations after impressive april
may starts tomorrow. after crushing april. realistic expectations required. april recap # +$23,460 (+5.9%) 74% win rate 53 trades
week 3 april - stability maintained at full size
week 3 april done. third week at full size $1,500. stability holding. week 3 trades (apr 15-19) # monday 4/15: 2 trades, 2 wins. +$1,560
regime detection improvements - faster market adaptation working
week 3 april going strong. adaptive strategy crushing it. been refining regime detection logic. current performance (apr 1-17) # trades: 29
ramping to full size - confidence building week by week
first week april done. ramping to full size. confidence building. week 1 april trades (apr 1-5) # monday 4/1: 3 trades, 2 wins. +$520 ($800 size)
adaptive strategy testing - mixed results, learning curve
week 1-2 march testing. adaptive strategy live. mixed results. testing approach # week 1 (mar 4-8): paper trading only.
strategy overhaul - adapting algos to new market regime
february crushed my strategies. mean reversion dropped from 81% to 57% win rate. market regime changed. strategies need to adapt. been discussing regime adaptation on r/algotrading. other algo traders dealing with same shit.