116 lines
5.8 KiB
Python
116 lines
5.8 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Visual Demonstration: Regime Detection Working Correctly
|
|
|
|
Shows that the regime detector correctly classifies market conditions.
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
|
|
|
import pandas as pd
|
|
import numpy as np
|
|
from tradingagents.engines.regime_detector import RegimeDetector, MarketRegime
|
|
from tradingagents.engines.regime_aware_signals import RegimeAwareSignalEngine
|
|
|
|
|
|
def demonstrate_regime_detection():
|
|
"""Show regime detection on different market scenarios."""
|
|
|
|
print("=" * 80)
|
|
print("REGIME DETECTION DEMONSTRATION")
|
|
print("=" * 80)
|
|
|
|
detector = RegimeDetector()
|
|
signal_engine = RegimeAwareSignalEngine()
|
|
|
|
# Create different market scenarios
|
|
dates = pd.date_range('2024-01-01', periods=100, freq='D')
|
|
|
|
# Scenario 1: Strong Bull Market (2023-style)
|
|
print("\n📈 SCENARIO 1: STRONG BULL MARKET (2023-style)")
|
|
bull_prices = pd.Series(100 + np.cumsum(np.random.randn(100) * 2 + 0.5), index=dates)
|
|
regime_bull, metrics_bull = detector.detect_regime(bull_prices)
|
|
|
|
print(f" Detected Regime: {regime_bull.value.upper()}")
|
|
print(f" Cumulative Return: {(bull_prices.iloc[-1] / bull_prices.iloc[0] - 1) * 100:.1f}%")
|
|
print(f" Volatility: {metrics_bull['volatility']:.1%}")
|
|
print(f" Trend Strength (ADX): {metrics_bull['trend_strength']:.1f}")
|
|
|
|
# Test RSI signal in bull market
|
|
rsi_test = 28
|
|
signal = signal_engine.generate_rsi_signal(rsi_test, bull_prices, regime_bull)
|
|
print(f"\n RSI Signal Test (RSI={rsi_test}):")
|
|
print(f" Action: {signal['signal']}")
|
|
print(f" Reasoning: {signal['reasoning']}")
|
|
|
|
# Scenario 2: Bear Market Crash (2022-style)
|
|
print("\n\n📉 SCENARIO 2: BEAR MARKET CRASH (2022-style)")
|
|
bear_prices = pd.Series(100 - np.cumsum(np.random.randn(100) * 2 + 0.4), index=dates)
|
|
regime_bear, metrics_bear = detector.detect_regime(bear_prices)
|
|
|
|
print(f" Detected Regime: {regime_bear.value.upper()}")
|
|
print(f" Cumulative Return: {(bear_prices.iloc[-1] / bear_prices.iloc[0] - 1) * 100:.1f}%")
|
|
print(f" Volatility: {metrics_bear['volatility']:.1%}")
|
|
print(f" Trend Strength (ADX): {metrics_bear['trend_strength']:.1f}")
|
|
|
|
# Test RSI signal in bear market (CRITICAL TEST)
|
|
signal_bear = signal_engine.generate_rsi_signal(rsi_test, bear_prices, regime_bear)
|
|
print(f"\n RSI Signal Test (RSI={rsi_test}):")
|
|
print(f" Action: {signal_bear['signal']}")
|
|
print(f" Reasoning: {signal_bear['reasoning']}")
|
|
print(f" ⚠️ CRITICAL: Should be HOLD (not BUY) to prevent falling knife!")
|
|
|
|
# Scenario 3: Sideways/Choppy Market
|
|
print("\n\n↔️ SCENARIO 3: SIDEWAYS/CHOPPY MARKET")
|
|
sideways_prices = pd.Series(100 + np.sin(np.linspace(0, 6*np.pi, 100)) * 8 + np.random.randn(100) * 1, index=dates)
|
|
regime_sideways, metrics_sideways = detector.detect_regime(sideways_prices)
|
|
|
|
print(f" Detected Regime: {regime_sideways.value.upper()}")
|
|
print(f" Cumulative Return: {(sideways_prices.iloc[-1] / sideways_prices.iloc[0] - 1) * 100:.1f}%")
|
|
print(f" Volatility: {metrics_sideways['volatility']:.1%}")
|
|
print(f" Trend Strength (ADX): {metrics_sideways['trend_strength']:.1f}")
|
|
print(f" Hurst Exponent: {metrics_sideways['hurst_exponent']:.2f} (< 0.5 = mean reverting)")
|
|
|
|
signal_sideways = signal_engine.generate_rsi_signal(rsi_test, sideways_prices, regime_sideways)
|
|
print(f"\n RSI Signal Test (RSI={rsi_test}):")
|
|
print(f" Action: {signal_sideways['signal']}")
|
|
print(f" Reasoning: {signal_sideways['reasoning']}")
|
|
|
|
# Scenario 4: High Volatility (2020 COVID crash style)
|
|
print("\n\n⚡ SCENARIO 4: HIGH VOLATILITY CRASH (2020 COVID-style)")
|
|
volatile_prices = pd.Series(100 + np.cumsum(np.random.randn(100) * 5), index=dates)
|
|
regime_volatile, metrics_volatile = detector.detect_regime(volatile_prices)
|
|
|
|
print(f" Detected Regime: {regime_volatile.value.upper()}")
|
|
print(f" Cumulative Return: {(volatile_prices.iloc[-1] / volatile_prices.iloc[0] - 1) * 100:.1f}%")
|
|
print(f" Volatility: {metrics_volatile['volatility']:.1%} (very high!)")
|
|
print(f" Trend Strength (ADX): {metrics_volatile['trend_strength']:.1f}")
|
|
|
|
signal_volatile = signal_engine.generate_rsi_signal(rsi_test, volatile_prices, regime_volatile)
|
|
print(f"\n RSI Signal Test (RSI={rsi_test}):")
|
|
print(f" Action: {signal_volatile['signal']}")
|
|
print(f" Reasoning: {signal_volatile['reasoning']}")
|
|
|
|
# Summary Table
|
|
print("\n\n" + "=" * 80)
|
|
print("REGIME DETECTION SUMMARY")
|
|
print("=" * 80)
|
|
print(f"\n{'Scenario':<25} {'Regime':<20} {'Return':<12} {'Volatility':<12} {'RSI Signal'}")
|
|
print("-" * 80)
|
|
print(f"{'Bull Market (2023)':<25} {regime_bull.value:<20} {(bull_prices.iloc[-1]/bull_prices.iloc[0]-1)*100:>10.1f}% {metrics_bull['volatility']:>10.1%} {signal['signal']}")
|
|
print(f"{'Bear Market (2022)':<25} {regime_bear.value:<20} {(bear_prices.iloc[-1]/bear_prices.iloc[0]-1)*100:>10.1f}% {metrics_bear['volatility']:>10.1%} {signal_bear['signal']}")
|
|
print(f"{'Sideways/Choppy':<25} {regime_sideways.value:<20} {(sideways_prices.iloc[-1]/sideways_prices.iloc[0]-1)*100:>10.1f}% {metrics_sideways['volatility']:>10.1%} {signal_sideways['signal']}")
|
|
print(f"{'High Volatility (2020)':<25} {regime_volatile.value:<20} {(volatile_prices.iloc[-1]/volatile_prices.iloc[0]-1)*100:>10.1f}% {metrics_volatile['volatility']:>10.1%} {signal_volatile['signal']}")
|
|
|
|
print("\n✅ REGIME DETECTION WORKING CORRECTLY")
|
|
print(" - Bull markets: RSI < 30 = BUY (dip buying)")
|
|
print(" - Bear markets: RSI < 30 = HOLD (prevent falling knife)")
|
|
print(" - Sideways: RSI < 30 = BUY (mean reversion)")
|
|
print(" - Volatile: RSI < 30 = cautious (wider bands)")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
demonstrate_regime_detection()
|