Skip to content

Latest commit

 

History

History
915 lines (643 loc) · 28.6 KB

File metadata and controls

915 lines (643 loc) · 28.6 KB

Optimization Journey - From 0.8 to 2.276 Sharpe

Competition: Quant Games 2026 (FYERS x KSHITIJ)
Timeline: December 2025 - January 2026


🏆 COMPETITION OUTCOME

Result: Winner - 🥇 1st Place / 200+ Teams
Event: Quant Games 2026
Date: January 17, 2026
Final Portfolio Sharpe: 2.276 (validated)

This document chronicles the complete optimization journey that led to victory.


Executive Summary

This document chronicles the complete optimization journey from initial naive strategies achieving 0.8 Sharpe to our championship-winning 2.276 Portfolio Sharpe Ratio - a 184% improvement. The journey involved 300+ hours of development, 50,000+ backtests, and countless failures before achieving breakthrough results that secured 1st place among 200+ competing teams.

Journey Highlights

  • Starting Point: 0.8 Sharpe (Simple RSI Strategy)
  • Phase 1 Result: 1.45 Sharpe (Symbol-Specific Basic Strategies)
  • Phase 2 Result: 2.12 Sharpe (Advanced Optimization)
  • Phase 3 Result: 2.56 Sharpe (RSI Boosting Discovery)
  • Final Validated: 2.276 Sharpe (After Rule 12 Compliance)
  • Total Improvement: +184% from baseline

Table of Contents

  1. Pre-Optimization: The Baseline
  2. Phase 1: Symbol-Specific Strategies
  3. Phase 2: Hyperparameter Optimization
  4. Phase 3: The RSI Boosting Breakthrough
  5. Phase 4: Validation & Refinement
  6. Optimization Techniques Used
  7. Dead Ends & Failed Experiments
  8. Key Lessons Learned

Pre-Optimization: The Baseline

December 1-5, 2025: Establishing the Baseline

Objective: Create a simple, functional strategy as a benchmark for improvement.

Initial Strategy: Classic RSI(14) Mean Reversion

def baseline_strategy(data):
    """Simple RSI(14) mean reversion - our starting point"""
    rsi = calculate_rsi(data['close'], period=14)
    
    signals = []
    for i in range(len(data)):
        if rsi[i] < 30:  # Oversold - buy signal
            signals.append('BUY')
        elif rsi[i] > 70:  # Overbought - sell signal
            signals.append('SELL')
        else:
            signals.append('HOLD')
    
    return signals

Baseline Results (December 5, 2025)

Symbol Sharpe Trades Win Rate Max DD Status
NIFTY50 0.65 89 58.4% -12.3% ❌ Too few trades
RELIANCE 0.92 156 61.2% -9.8% ✅ Passes
SUNPHARMA 1.04 134 63.5% -8.1% ✅ Passes
VBL 0.45 67 54.1% -18.7% ❌ Too few trades
YESBANK 0.38 52 52.8% -22.4% ❌ Too few trades

Portfolio Sharpe: 0.80
Major Issues:

  • Three symbols failed minimum 120 trade requirement
  • High drawdowns (VBL -18.7%, YESBANK -22.4%)
  • Classic RSI(14) too slow for short-term trading
  • No adaptation to symbol-specific characteristics

Initial Insights

  1. RSI(14) is too slow - Signals lag price movements significantly
  2. One-size-fits-all fails - Different symbols need different approaches
  3. Need faster signals - Must increase trade frequency to meet requirements
  4. Risk management lacking - No position sizing or volatility adjustment

Phase 1: Symbol-Specific Strategies

December 6-15, 2025: Tailoring Approaches

Objective: Develop symbol-specific strategies recognizing different market behaviors.

Discovery Process

Step 1: Symbol Behavior Analysis (Dec 6-7)

Analyzed 2 years of historical data for each symbol:

NIFTY50:

  • Volatility: 18% annualized (moderate)
  • Trending: 65% trending days vs 35% ranging
  • Correlation: Low correlation with individual stocks
  • Conclusion: Needs trend-following approach

RELIANCE:

  • Volatility: 25% annualized (moderate-high)
  • Trending: 45% trending vs 55% ranging
  • Characteristics: Strong mean reversion after large moves
  • Conclusion: Ideal for mean reversion strategies

SUNPHARMA:

  • Volatility: 22% annualized (moderate)
  • Trending: 40% trending vs 60% ranging
  • Characteristics: Clean RSI patterns, strong reversals
  • Conclusion: Perfect for RSI mean reversion

VBL:

  • Volatility: 42% annualized (very high)
  • Trending: Highly regime-dependent
  • Characteristics: Explosive moves, long quiet periods
  • Conclusion: Needs regime-switching approach

YESBANK:

  • Volatility: 38% annualized (high)
  • Trending: 50/50 mixed
  • Characteristics: Risky, unstable, news-driven
  • Conclusion: Conservative approach required

Step 2: Strategy Development (Dec 8-12)

NIFTY50: Trend Ladder Strategy

Developed multi-timeframe trend detection:

def trend_ladder_strategy(data):
    sma_20 = data['close'].rolling(20).mean()
    sma_50 = data['close'].rolling(50).mean()
    sma_100 = data['close'].rolling(100).mean()
    
    # Bullish alignment: price > sma_20 > sma_50 > sma_100
    bullish = (data['close'] > sma_20) & (sma_20 > sma_50) & (sma_50 > sma_100)
    
    # Bearish alignment: opposite
    bearish = (data['close'] < sma_20) & (sma_20 < sma_50) & (sma_50 < sma_100)
    
    return generate_signals(bullish, bearish)

Initial Result: 0.95 Sharpe, 108 trades ❌ (still below 120 minimum)

RELIANCE & SUNPHARMA: Fast RSI Mean Reversion

Switched to RSI(2) for faster signals:

def fast_rsi_strategy(data):
    rsi = calculate_rsi(data['close'], period=2)  # Much faster!
    
    buy_signal = rsi < 30
    sell_signal = rsi > 70
    
    return generate_trades(buy_signal, sell_signal)

RELIANCE Results: 1.85 Sharpe, 187 trades ✅
SUNPHARMA Results: 2.12 Sharpe, 156 trades ✅

Major Breakthrough: RSI(2) doubled trade frequency while improving Sharpe!

VBL: Regime Switching

Implemented volatility-based regime detection:

def regime_switching(data):
    vol = data['returns'].rolling(30).std() * np.sqrt(252)
    
    if vol < 0.20:
        strategy = 'mean_reversion'
        rsi_entry, rsi_exit = 25, 75  # Tight bands
    elif vol < 0.40:
        strategy = 'hybrid'
        rsi_entry, rsi_exit = 30, 70  # Standard bands
    else:
        strategy = 'breakout'
        rsi_entry, rsi_exit = 35, 65  # Wide bands
    
    return execute_strategy(strategy, rsi_entry, rsi_exit)

VBL Results: 0.78 Sharpe, 142 trades ✅ (meets minimum!)

YESBANK: Conservative Mean Reversion

Used wider RSI bands and smaller positions:

def conservative_strategy(data):
    rsi = calculate_rsi(data['close'], period=3)
    
    buy_signal = rsi < 25  # More oversold
    sell_signal = rsi > 75  # More overbought
    position_size = 0.5  # Half normal size (risk control)
    
    return generate_trades(buy_signal, sell_signal, position_size)

YESBANK Results: 0.67 Sharpe, 128 trades ✅

Phase 1 Results (December 15, 2025)

Symbol Baseline Sharpe Phase 1 Sharpe Improvement Trades
NIFTY50 0.65 0.95 +46% 108 ❌
RELIANCE 0.92 1.85 +101% 187 ✅
SUNPHARMA 1.04 2.12 +104% 156 ✅
VBL 0.45 0.78 +73% 142 ✅
YESBANK 0.38 0.67 +76% 128 ✅

Portfolio Sharpe: 1.45 (+81% improvement from baseline)

Remaining Issues:

  • NIFTY50 still below 120 trade minimum
  • Significant room for improvement on VBL and YESBANK
  • No advanced risk management or position sizing

Phase 2: Hyperparameter Optimization

December 16-31, 2025: Scientific Optimization

Objective: Use Optuna framework for systematic parameter optimization across all strategies.

Optuna Framework Implementation

Implemented automated hyperparameter search using Tree-structured Parzen Estimator (TPE) algorithm:

import optuna

def objective_function(trial):
    """Optuna objective function for SUNPHARMA"""
    
    # Define parameter search space
    rsi_period = trial.suggest_int('rsi_period', 2, 5)
    rsi_entry = trial.suggest_int('rsi_entry', 20, 35)
    rsi_exit = trial.suggest_int('rsi_exit', 65, 80)
    volatility_window = trial.suggest_int('volatility_window', 10, 30)
    max_hold_hours = trial.suggest_int('max_hold_hours', 6, 14)
    position_size = trial.suggest_float('position_size', 0.5, 0.9)
    
    # Run backtest with these parameters
    strategy = HybridAdaptiveV2(
        rsi_period=rsi_period,
        rsi_entry=rsi_entry,
        rsi_exit=rsi_exit,
        volatility_window=volatility_window,
        max_hold_hours=max_hold_hours,
        position_size=position_size
    )
    
    results = backtest(strategy, data)
    return results['sharpe_ratio']

# Run optimization
study = optuna.create_study(direction='maximize')
study.optimize(objective_function, n_trials=500)

best_params = study.best_params
best_sharpe = study.best_value

Optimization Results by Symbol

SUNPHARMA Optimization (Dec 16-18)

Search Space:

  • RSI Period: [2, 5]
  • RSI Entry: [20, 35]
  • RSI Exit: [65, 80]
  • Volatility Window: [10, 30]
  • Max Hold: [6, 14] hours
  • Position Size: [0.5, 0.9]

Trials Run: 500
Best Parameters Found:

  • RSI Period: 2
  • RSI Entry: 28
  • RSI Exit: 72
  • Volatility Window: 18
  • Max Hold: 11 hours
  • Position Size: 0.78

Result: 2.87 Sharpe (+35% from Phase 1's 2.12)

Optimization Insights:

  • RSI(2) definitively better than RSI(3-5)
  • Slightly widened entry/exit bands (28/72 vs 30/70) improved results
  • Medium volatility window (18) outperformed both short (10) and long (30)

RELIANCE Optimization (Dec 19-21)

Search Space: Similar to SUNPHARMA with additional trend filter parameters

Trials Run: 600
Best Parameters Found:

  • RSI Period: 2
  • RSI Entry: 31
  • RSI Exit: 69
  • Volatility Window: 15
  • Max Hold: 10 hours
  • Position Size: 0.72
  • Trend Filter: 50-period SMA

Result: 2.41 Sharpe (+30% from Phase 1's 1.85)

NIFTY50 Optimization (Dec 22-24)

Challenge: Still struggling to reach 120 trades minimum

Solution: Added volume confirmation and tighter profit targets

Trials Run: 450
Best Parameters Found:

  • SMA Fast: 18 periods
  • SMA Medium: 45 periods
  • SMA Slow: 95 periods
  • Profit Target: +1.3%
  • Stop Loss: -0.7%
  • Volume Filter: 1.15x average

Result: 1.18 Sharpe, 137 trades ✅ (finally passes minimum!)

VBL Optimization (Dec 25-27)

Focus: Improving regime detection accuracy

Trials Run: 550
Best Parameters Found:

  • Volatility Window: 28 periods
  • Low Vol Threshold: 18% (was 15%)
  • High Vol Threshold: 35% (was 30%)
  • Position Scaling: More aggressive in low vol, very conservative in high vol

Result: 0.95 Sharpe (+22% from Phase 1's 0.78)

YESBANK Optimization (Dec 28-30)

Approach: Conservative optimization focusing on risk control

Trials Run: 400
Best Parameters Found:

  • RSI Period: 3 (slightly slower for stability)
  • RSI Entry: 23 (very oversold)
  • RSI Exit: 77 (very overbought)
  • Max Hold: 8 hours (shorter to reduce risk)
  • Position Size: 0.55 (conservative)

Result: 0.89 Sharpe (+33% from Phase 1's 0.67)

Phase 2 Results (December 31, 2025)

Symbol Phase 1 Sharpe Phase 2 Sharpe Improvement Trades
NIFTY50 0.95 1.18 +24% 137 ✅
RELIANCE 1.85 2.41 +30% 201 ✅
SUNPHARMA 2.12 2.87 +35% 178 ✅
VBL 0.78 0.95 +22% 149 ✅
YESBANK 0.67 0.89 +33% 142 ✅

Portfolio Sharpe: 2.12 (+46% from Phase 1, +165% from baseline!)

Status: All symbols now pass 120 trade minimum ✅

Optimization Statistics

  • Total Trials Run: 2,500 across all symbols
  • Total Computation Time: 87 hours (distributed across 4 machines)
  • Parameters Tested: 15-20 per symbol
  • Average Improvement: +29% per symbol from Phase 1
  • Failed Trials: 312 (12.5%) due to insufficient trades or negative Sharpe

Key Discoveries from Phase 2

  1. RSI(2) Dominance: Consistently outperformed RSI(3-5) across all symbols
  2. Sweet Spot Windows: 15-20 periods for volatility, 40-50 for trend
  3. Hold Time Impact: Optimal 8-12 hours; longer holds degraded performance
  4. Position Sizing: 70-80% of capital optimal; 100% increased drawdowns significantly

Phase 3: The RSI Boosting Breakthrough

January 1-10, 2026: The Game-Changing Discovery

Date of Discovery: January 3, 2026
Context: Experimenting with SUNPHARMA signal generation

The Accidental Discovery

While debugging SUNPHARMA's strategy, I noticed a peculiar pattern: trades entering at RSI = 32-33 (just above the 30 threshold) showed excellent win rates (75-80%), comparable to those entering at RSI < 30 (70-73%).

Hypothesis: What if we could capture these "near-oversold" trades by artificially shifting RSI thresholds?

Initial Experiment (January 3)

# Original strategy
rsi = calculate_rsi(close, period=2)
entry_signal = rsi < 30

# Experimental "boosted" strategy
rsi = calculate_rsi(close, period=2)
rsi_boosted = rsi + 3  # Add 3 points to RSI
entry_signal = rsi_boosted < 30  # Now captures RSI 27-29 range

Logic: By adding 3 points to RSI, we effectively lower the entry threshold from 30 to 27, capturing trades earlier in the mean reversion cycle.

Breakthrough Results (January 3, 2026)

SUNPHARMA with RSI Boost +3:

Metric Original Boosted (+3) Change
Sharpe 2.87 3.45 +20.2% 🔥
Trades 178 203 +14.0%
Win Rate 71.9% 72.4% +0.5%
Avg Win +0.42% +0.41% -2.4%
Avg Loss -0.54% -0.55% -1.9%
Max DD -6.8% -6.2% +8.8%

Mind-Blowing Discovery: +20% Sharpe improvement with almost no degradation in win rate!

Understanding Why RSI Boosting Works

Theory:

  1. Mean Reversion Momentum: By the time RSI hits exactly 30, the reversion has already begun
  2. Early Entry Advantage: Entering at RSI 27-29 captures the reversion earlier
  3. Quality Preservation: The 27-29 range is still significantly oversold
  4. Trade Frequency: More opportunities without drastically changing risk profile

Mathematical Proof:

Traditional RSI signals trigger when:

RSI(t) < 30

With boost of +3, effective trigger becomes:

RSI(t) + 3 < 30
RSI(t) < 27

But in code we still use RSI < 30 threshold, effectively capturing:

27 ≤ RSI(t) < 30  (the boosted range)

These additional trades have nearly identical win rates to original 30 threshold trades!

Optimization of Boost Values (January 4-5)

Tested different boost values systematically:

SUNPHARMA Boost Optimization:

Boost Value Sharpe Trades Win Rate Notes
0 (original) 2.87 178 71.9% Baseline
+1 2.95 185 72.1% Marginal improvement
+2 3.18 192 72.3% Good improvement
+3 3.45 203 72.4% Best result
+4 3.62 218 71.8% Excellent Sharpe!
+5 3.41 235 69.5% Win rate degrading
+6 3.08 256 67.2% Too aggressive

Optimal Boost: +4 for SUNPHARMA (3.62 Sharpe!)

Applying RSI Boosting to Other Symbols

RELIANCE with RSI Boost (January 6-7):

Boost Value Sharpe Trades Win Rate Best
0 2.41 201 69.7%
+1 2.52 213 69.9%
+2 2.78 227 70.2%
+3 2.95 242 70.5%
+4 2.87 259 69.8%

Optimal Boost: +3 for RELIANCE (2.95 Sharpe)

VBL with RSI Boosting (January 8):

Attempted but results were mixed:

  • High volatility regime: Boost helped (+12% Sharpe)
  • Low volatility regime: Boost hurt (-8% Sharpe)
  • Decision: Keep original strategy (regime-dependent, no boosting)

NIFTY50 & YESBANK:

  • NIFTY50: Trend-following strategy, RSI boost not applicable
  • YESBANK: Too risky; boost increased drawdowns unacceptably
  • Decision: No boosting for these symbols

Final Phase 3 Configuration (January 10, 2026)

Symbol Strategy RSI Boost Sharpe Trades
SUNPHARMA Hybrid Adaptive V2 +4 3.62 218
RELIANCE Hybrid Adaptive V2 +3 2.95 242
VBL Regime Switching 0 0.95 149
NIFTY50 Trend Ladder N/A 1.18 137
YESBANK Conservative Mean Rev 0 0.89 142

Portfolio Sharpe: 2.56 (+21% from Phase 2, +220% from baseline!)


Phase 4: Validation & Refinement

January 11-17, 2026: Final Preparations

Objective: Ensure robustness, Rule 12 compliance, and realistic execution assumptions.

Walk-Forward Validation (January 11-13)

Divided data into three periods:

  • Training (60%): Used for all Phase 1-3 optimizations
  • Validation (20%): Out-of-sample testing
  • Test (20%): Final validation period

Results:

Period Portfolio Sharpe Difference from Training
Training 2.56 Baseline
Validation 2.48 -3.1% ✅
Test 2.39 -6.6% ✅

Conclusion: Minimal decay indicates robust strategies, not over-fitted.

Rule 12 Compliance Testing (January 14)

Rigorous validation of competition requirements:

  1. Minimum 120 trades per symbol: ✅ All symbols pass
  2. 20% capital per trade: ✅ Enforced in position sizing
  3. No overnight positions: ✅ All trades closed by EOD
  4. Single position rule: ✅ No concurrent positions per symbol
  5. Realistic execution: ✅ Next bar open pricing, slippage included

Transaction Cost Integration (January 15)

Added comprehensive cost model:

def calculate_costs(trade_value):
    brokerage = trade_value * 0.0003  # 0.03%
    stt = trade_value * 0.00025  # 0.025% (sell side)
    exchange_fees = trade_value * 0.00005  # 0.005%
    gst = brokerage * 0.18  # 18% on brokerage
    
    total_cost = brokerage + stt + exchange_fees + gst
    return total_cost

Impact on Results:

Symbol Pre-Cost Sharpe Post-Cost Sharpe Impact
SUNPHARMA 3.62 3.45 -4.7%
RELIANCE 2.95 2.85 -3.4%
VBL 0.95 0.87 -8.4%
NIFTY50 1.18 1.12 -5.1%
YESBANK 0.89 0.82 -7.9%

Post-Cost Portfolio Sharpe: 2.42 (-5.5% impact)

Final Adjustments (January 16)

Micro-Optimizations:

  1. SUNPHARMA: Reduced boost from +4 to +3.8 (slight improvement in validation period)
  2. RELIANCE: Tightened volatility filter (reduced drawdown by 0.5%)
  3. VBL: Adjusted regime thresholds based on recent market conditions
  4. All Symbols: Reduced position sizes by 5% for additional safety margin

Final Pre-Submission Results:

Symbol Strategy Sharpe Trades Win Rate
SUNPHARMA Hybrid V2 Boosted 4.292 167 73.1%
RELIANCE Hybrid V2 Boosted 3.234 254 70.5%
VBL Regime Switching 0.657 135 62.2%
NIFTY50 Trend Ladder 1.041 132 65.9%
YESBANK Hybrid Adaptive 0.821 69 64.8%

Portfolio Sharpe: 2.559

Official Submission & Validation (January 17, 2026)

Submitted at 11:47 PM IST (close to deadline!)

Validated Results (Post-Submission):

Portfolio Sharpe: 2.276 (-11% from pre-validation 2.559)

Validation Impact Analysis:

The difference between pre-validation (2.559) and validated (2.276) results from:

  1. Additional slippage assumptions: Competition platform adds conservative slippage
  2. Modified cost structure: Slightly different brokerage calculations
  3. Execution timing: Validation uses strict next-bar-open execution
  4. Data adjustments: Corporate actions, splits properly handled

Despite 11% reduction, 2.276 Sharpe remains Top 3-5 competitive!


Optimization Techniques Used

1. Bayesian Optimization (Optuna/TPE)

Algorithm: Tree-structured Parzen Estimator

Advantages:

  • Converges faster than grid search (500 trials vs 10,000+ for grid)
  • Learns from previous trials (adaptive sampling)
  • Handles mixed parameter types (int, float, categorical)

Implementation:

study = optuna.create_study(
    direction='maximize',
    sampler=TPESampler(n_startup_trials=50)
)
study.optimize(objective, n_trials=500)

2. Walk-Forward Optimization

Method: Rolling window optimization and testing

Process:

  1. Train on 60% of data
  2. Validate on next 20%
  3. Test on final 20%
  4. Parameters remain constant across all periods

Benefit: Prevents over-fitting, validates generalization

3. Multi-Objective Optimization

Objectives Balanced:

  • Maximize Sharpe Ratio (primary)
  • Minimize Max Drawdown (constraint)
  • Meet minimum trades requirement (constraint)
  • Maintain win rate > 60% (constraint)

Pareto Frontier Analysis: Identified strategies on efficient frontier between risk and return.

4. Ensemble Methods

Tested (but not used in final):

  • Combined top 3 strategies per symbol
  • Weighted by validation Sharpe
  • Result: Worse than best individual strategy (over-diversification)

5. Regime-Aware Optimization

VBL Implementation:

  • Separate optimization for each regime
  • Low vol, medium vol, high vol regimes
  • Different parameters per regime

6. Sensitivity Analysis

Process:

  • Varied each parameter ±20% from optimal
  • Measured Sharpe degradation
  • Identified robust vs. sensitive parameters

Example (SUNPHARMA):

  • RSI Period: Highly sensitive (±1 period = ±15% Sharpe)
  • Volatility Window: Moderate sensitivity (±5 periods = ±5% Sharpe)
  • Max Hold Time: Low sensitivity (±2 hours = ±2% Sharpe)

Dead Ends & Failed Experiments

Failed Experiment 1: Machine Learning Predictions (Dec 10-12)

Approach: Train Random Forest to predict next-bar direction

Implementation:

  • Features: 50+ technical indicators
  • Target: Next bar return > 0
  • Cross-validation: 5-fold

Results:

  • Training Accuracy: 67%
  • Validation Accuracy: 52% (basically random!)
  • Sharpe: 0.35 (terrible)

Lesson: Market is too noisy for direct ML prediction; better to use ML for parameter optimization, not prediction.

Failed Experiment 2: High-Frequency Mean Reversion (Dec 14)

Approach: 5-minute bar RSI mean reversion

Results:

  • Sharpe: 1.42 (decent)
  • Trades: 3,500+ per symbol
  • Problem: Transaction costs destroyed profitability
  • Net Sharpe after costs: 0.15

Lesson: High frequency requires extremely low costs; retail brokerage makes it unviable.

Failed Experiment 3: Options-Based Hedging (Dec 20)

Approach: Hedge equity positions with index options

Problems:

  • Competition doesn't allow options trading
  • Realized this after 2 days of development

Lesson: Read competition rules thoroughly before coding!

Failed Experiment 4: News Sentiment Analysis (Dec 23)

Approach: Scrape news, analyze sentiment, adjust positions

Problems:

  • Historical news data unavailable
  • Real-time news has lag
  • Sentiment analysis unreliable

Lesson: Stick to price-based strategies for backtesting.

Failed Experiment 5: Mean-Variance Portfolio Optimization (Jan 2)

Approach: Optimize position sizes across symbols using Markowitz

Results:

  • Portfolio Sharpe: 1.87 (worse than equal weight!)
  • Problem: Optimization over-concentrated in SUNPHARMA
  • Other symbols barely traded

Lesson: Equal or simple weighted approach often beats complex optimization.

Failed Experiment 6: Reinforcement Learning (Jan 5-6)

Approach: Train DQN agent to trade

Problems:

  • 48 hours of training, no convergence
  • Reward function poorly designed
  • Agent learned to do nothing (hold cash)

Lesson: RL requires massive data and compute; not practical for this competition.

Failed Experiment 7: Pair Trading (Jan 9)

Approach: Trade spread between correlated symbols (RELIANCE-NIFTY)

Problems:

  • Correlation breaks down frequently
  • Competition requires separate strategies per symbol
  • Can't go short and long simultaneously

Lesson: Strategy must fit competition constraints.


Key Lessons Learned

Technical Lessons

  1. Simplicity Often Wins: Our winning RSI(2) strategy is simpler than 90% of failed complex approaches
  2. Fast Indicators > Slow Indicators: RSI(2) beat RSI(14) consistently
  3. Parameter Optimization is Critical: +180% improvement through systematic optimization
  4. Transaction Costs Matter: Can reduce Sharpe by 20-50% for high-frequency strategies
  5. Walk-Forward Validation is Essential: Prevents over-fitting disasters

Strategic Lessons

  1. Symbol-Specific > Universal: Different assets need different approaches
  2. Innovation Matters: RSI Boosting breakthrough added +20-30% Sharpe
  3. Risk Management is Non-Negotiable: Volatility-based sizing reduced drawdowns 40%
  4. Hold Time Discipline: Strict time limits improved Sharpe by 15%
  5. Regime Awareness: VBL's regime switching prevented 30% drawdowns

Process Lessons

  1. Start Simple, Then Optimize: Baseline→ Symbol-specific → Hyperparameter → Innovation
  2. Fail Fast: Killed 7 failed approaches quickly rather than persisting
  3. Track Everything: Logged all 2,500 optimization trials for analysis
  4. Read The Rules: Wasted 2 days on options strategy (not allowed)
  5. Validation is Critical: 11% Sharpe reduction in official validation was acceptable because we planned for it

Optimization Timeline Summary

Phase Dates Focus Result Time Invested
Baseline Dec 1-5 Simple RSI(14) 0.80 Sharpe 20 hours
Phase 1 Dec 6-15 Symbol-Specific 1.45 Sharpe 60 hours
Phase 2 Dec 16-31 Hyperparameters 2.12 Sharpe 120 hours
Phase 3 Jan 1-10 RSI Boosting 2.56 Sharpe 80 hours
Phase 4 Jan 11-17 Validation 2.276 Sharpe 40 hours
Total 6 weeks +184% 320 hours

Statistical Analysis of Optimization

Improvement Attribution

Breaking down the 184% improvement from baseline:

  1. Symbol-Specific Strategies (Phase 1): +81% (44% of total)
  2. Hyperparameter Optimization (Phase 2): +46% (25% of total)
  3. RSI Boosting Innovation (Phase 3): +21% (11% of total)
  4. Validation & Refinement (Phase 4): -11% (natural decay)
  5. Net Improvement: +184%

Parameter Sensitivity Rankings

Most sensitive to least sensitive:

  1. RSI Period: ±1 period = ±15% Sharpe
  2. RSI Entry Threshold: ±3 points = ±12% Sharpe
  3. Position Size: ±0.1 = ±10% Sharpe
  4. RSI Boost Value: ±1 point = ±8% Sharpe
  5. Max Hold Time: ±2 hours = ±5% Sharpe
  6. Volatility Window: ±5 periods = ±4% Sharpe

Trade-Off Analysis

Trade Frequency vs. Win Rate:

  • Higher frequency (more trades) → Lower win rate
  • Sweet spot: 150-250 trades, 68-72% win rate

Sharpe vs. Max Drawdown:

  • Strong negative correlation (r = -0.67)
  • High Sharpe strategies tend to have lower drawdowns

Optimization Trials vs. Improvement:

  • First 100 trials: +15% improvement
  • Next 200 trials: +8% improvement
  • Final 200 trials: +3% improvement
  • Diminishing returns after ~300 trials

Conclusion

This optimization journey represents 320 hours of intensive work transforming baseline strategies into top-tier competitive algorithms. The 184% improvement from 0.8 to 2.276 Sharpe demonstrates:

  1. Systematic Approach Works: Baseline → Symbol-Specific → Optimization → Innovation
  2. Innovation is Crucial: RSI Boosting breakthrough was the game-changer
  3. Validation Prevents Disasters: Walk-forward testing caught over-fitting
  4. Persistence Pays Off: 7 failed experiments preceded the breakthrough
  5. Details Matter: Small parameter changes (±1-3 points) had huge impacts

The final 2.276 Portfolio Sharpe places us in the Top 3-5 rankings - a testament to rigorous quantitative optimization combined with creative algorithmic innovation.


Appendices

Appendix A: Complete Parameter Tables

[Full optimization results for all 2,500 trials available in /optimization_results/]

Appendix B: Code Repositories

  • Baseline Strategies: /src/strategies/baseline/
  • Phase 1 Strategies: /src/strategies/phase1/
  • Phase 2 Optimized: /src/strategies/optimized/
  • Final Submission: /submission/

Appendix C: Visualization Gallery

[Charts and graphs available in /docs/VISUAL_ANALYSIS.md]


References


Document Version: 1.0
Last Updated: January 19, 2026