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:
- regime confidence >0.9 (was 0.75)
- correlation <0.6 (new filter)
- volume confirmation required (was optional)
- time of day restriction (10am-2pm only)
- 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