Restructured hedger modules: moved CLP hedger and auto hedger into separate folders, updated data fetchers and main app, removed deprecated files
This commit is contained in:
256
clp_auto_hedger/test_enhanced_velocity.py
Normal file
256
clp_auto_hedger/test_enhanced_velocity.py
Normal file
@ -0,0 +1,256 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Enhanced test script for multi-timeframe velocity calculation with configurable thresholds
|
||||
Demonstrates the new EnhancedVelocityCalculator capabilities
|
||||
"""
|
||||
|
||||
import time
|
||||
import random
|
||||
import logging
|
||||
from enhanced_velocity_calculator import EnhancedVelocityCalculator, VelocityThresholdAnalyzer
|
||||
from velocity_config import VelocityConfig, create_default_config, VelocityTimeframe
|
||||
|
||||
# Set up logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def create_test_scenarios():
|
||||
"""Create different market scenarios for testing"""
|
||||
base_price = 3000.0
|
||||
|
||||
scenarios = {
|
||||
"Normal Trading": {
|
||||
"duration": 20,
|
||||
"noise_level": 0.0002, # 0.02% noise
|
||||
"trend": 0.0,
|
||||
"description": "Normal market conditions with small random fluctuations"
|
||||
},
|
||||
"Noisy Market": {
|
||||
"duration": 20,
|
||||
"noise_level": 0.0008, # 0.08% noise
|
||||
"trend": 0.0,
|
||||
"description": "High volatility with large random movements"
|
||||
},
|
||||
"Sharp Flash Crash": {
|
||||
"duration": 10,
|
||||
"noise_level": 0.0001,
|
||||
"trend": -0.015, # 1.5% downward over duration
|
||||
"description": "Sudden sharp price drop (emergency scenario)"
|
||||
},
|
||||
"Sustained Uptrend": {
|
||||
"duration": 30,
|
||||
"noise_level": 0.0003,
|
||||
"trend": 0.002, # 0.2% upward per interval
|
||||
"description": "Gradual sustained upward movement"
|
||||
},
|
||||
"Whale Manipulation": {
|
||||
"duration": 15,
|
||||
"noise_level": 0.0005,
|
||||
"spike_magnitude": 0.008, # 0.8% sudden spike
|
||||
"spike_timing": 8,
|
||||
"description": "Large player creates artificial spike"
|
||||
}
|
||||
}
|
||||
|
||||
return base_price, scenarios
|
||||
|
||||
|
||||
def test_enhanced_velocity_calculation():
|
||||
"""Test the enhanced velocity calculator with different scenarios"""
|
||||
print("=== Enhanced Multi-Timeframe Velocity Calculator Demo ===\n")
|
||||
|
||||
# Create enhanced configuration
|
||||
config = create_default_config()
|
||||
calculator = EnhancedVelocityCalculator(config)
|
||||
|
||||
base_price, scenarios = create_test_scenarios()
|
||||
|
||||
for scenario_name, params in scenarios.items():
|
||||
print(f"Scenario: {scenario_name}")
|
||||
print(f"Description: {params['description']}")
|
||||
print("-" * 60)
|
||||
|
||||
current_price = base_price
|
||||
total_triggers = 0
|
||||
emergency_overrides = 0
|
||||
|
||||
for i in range(params["duration"]):
|
||||
# Generate price movement
|
||||
noise = random.uniform(-params["noise_level"], params["noise_level"])
|
||||
trend_component = params.get("trend", 0)
|
||||
|
||||
# Handle special spike scenario
|
||||
if "spike_magnitude" in params and i == params["spike_timing"]:
|
||||
price_change = params["spike_magnitude"]
|
||||
print(f" *** SPIKE at second {i+1}!")
|
||||
else:
|
||||
price_change = noise + trend_component
|
||||
|
||||
# Apply price change
|
||||
current_price = current_price * (1 + price_change)
|
||||
|
||||
# Calculate enhanced velocity signal
|
||||
signal = calculator.update_price(current_price)
|
||||
|
||||
# Check for triggers
|
||||
if signal.recommendation in ["trigger_protection", "emergency_override"]:
|
||||
total_triggers += 1
|
||||
if signal.recommendation == "emergency_override":
|
||||
emergency_overrides += 1
|
||||
|
||||
trigger_type = "EMERGENCY" if signal.recommendation == "emergency_override" else "PROTECTION"
|
||||
print(f" Second {i+1:2d}: ${current_price:7.2f} | "
|
||||
f"Vel: {signal.final_velocity*100:+6.3f}% ({signal.dominant_timeframe}) | "
|
||||
f"{trigger_type}")
|
||||
elif abs(signal.final_velocity) > 0.0001: # Show interesting movements
|
||||
print(f" Second {i+1:2d}: ${current_price:7.2f} | "
|
||||
f"Vel: {signal.final_velocity*100:+6.3f}% ({signal.dominant_timeframe}) | "
|
||||
f"Conf: {signal.confidence:.2f} | {signal.market_condition}")
|
||||
|
||||
time.sleep(0.05) # Small delay for readability
|
||||
|
||||
print(f"\nResults for {scenario_name}:")
|
||||
print(f" Total velocity triggers: {total_triggers}")
|
||||
print(f" Emergency overrides: {emergency_overrides}")
|
||||
print(f" Final price: ${current_price:.2f} ({((current_price/base_price)-1)*100:+.2f}%)")
|
||||
|
||||
# Get velocity summary
|
||||
summary = calculator.get_velocity_summary()
|
||||
print(f" Market volatility: {summary['market_volatility']*100:.3f}%")
|
||||
|
||||
print("\n" + "="*70 + "\n")
|
||||
|
||||
|
||||
def test_threshold_optimization():
|
||||
"""Test threshold optimization with historical data"""
|
||||
print("=== Threshold Optimization Analysis ===\n")
|
||||
|
||||
# Generate synthetic historical data
|
||||
base_price = 3000.0
|
||||
historical_data = []
|
||||
current_price = base_price
|
||||
|
||||
# Mix of different market conditions
|
||||
for _ in range(100):
|
||||
# Randomly choose market condition
|
||||
condition = random.choice(["normal", "volatile", "flash_crash", "trend"])
|
||||
|
||||
if condition == "normal":
|
||||
change = random.uniform(-0.0002, 0.0002)
|
||||
elif condition == "volatile":
|
||||
change = random.uniform(-0.0008, 0.0008)
|
||||
elif condition == "flash_crash":
|
||||
change = random.uniform(-0.01, -0.001)
|
||||
else: # trend
|
||||
change = random.uniform(0.0001, 0.0005)
|
||||
|
||||
current_price = current_price * (1 + change)
|
||||
historical_data.append(current_price)
|
||||
|
||||
# Test different threshold configurations
|
||||
configs = {
|
||||
"Conservative": create_default_config().conservative(),
|
||||
"Normal": create_default_config(),
|
||||
"Aggressive": create_default_config().aggressive()
|
||||
}
|
||||
|
||||
thresholds_to_test = [0.0003, 0.0005, 0.0008, 0.001, 0.0015, 0.002]
|
||||
|
||||
for config_name, config in configs.items():
|
||||
print(f"Testing {config_name} Configuration:")
|
||||
print(f"Normal threshold: {config.normal_threshold*100:.3f}%")
|
||||
|
||||
calculator = EnhancedVelocityCalculator(config)
|
||||
analyzer = VelocityThresholdAnalyzer(calculator)
|
||||
|
||||
# Reset calculator for clean test
|
||||
calculator.price_history = []
|
||||
for tf_name in calculator.velocity_history:
|
||||
calculator.velocity_history[tf_name] = []
|
||||
|
||||
results = analyzer.analyze_threshold_performance(historical_data, thresholds_to_test)
|
||||
|
||||
print(f"Optimal threshold: {results['optimal_threshold']*100:.3f}%")
|
||||
print(f"Performance: {results['optimal_performance']}")
|
||||
print(f"Recommendation: {results['recommendation']}\n")
|
||||
|
||||
|
||||
def test_different_timeframe_configs():
|
||||
"""Test different timeframe configurations"""
|
||||
print("=== Timeframe Configuration Comparison ===\n")
|
||||
|
||||
# Custom timeframe configurations
|
||||
quick_response_config = create_default_config()
|
||||
quick_response_config.timeframes = [
|
||||
VelocityTimeframe("1s", 1, 0.6, 0.002, "Emergency detection"),
|
||||
VelocityTimeframe("3s", 3, 0.3, 0.001, "Quick response"),
|
||||
VelocityTimeframe("10s", 10, 0.1, 0.0005, "Trend confirmation")
|
||||
]
|
||||
|
||||
smooth_averaging_config = create_default_config()
|
||||
smooth_averaging_config.timeframes = [
|
||||
VelocityTimeframe("5s", 5, 0.3, 0.0008, "Short-term smoothing"),
|
||||
VelocityTimeframe("15s", 15, 0.4, 0.0005, "Medium-term smoothing"),
|
||||
VelocityTimeframe("30s", 30, 0.3, 0.0003, "Long-term smoothing")
|
||||
]
|
||||
|
||||
configs = {
|
||||
"Quick Response": quick_response_config,
|
||||
"Smooth Averaging": smooth_averaging_config,
|
||||
"Default Balanced": create_default_config()
|
||||
}
|
||||
|
||||
# Test with flash crash scenario
|
||||
base_price = 3000.0
|
||||
current_price = base_price
|
||||
|
||||
for config_name, config in configs.items():
|
||||
calculator = EnhancedVelocityCalculator(config)
|
||||
print(f"Testing {config_name} Configuration:")
|
||||
|
||||
# Simulate flash crash
|
||||
for i in range(10):
|
||||
if i == 3: # Flash crash at second 4
|
||||
price_change = -0.01 # 1% drop
|
||||
elif i >= 4 and i <= 6: # Continued drop
|
||||
price_change = -0.003
|
||||
else:
|
||||
price_change = random.uniform(-0.0002, 0.0002)
|
||||
|
||||
current_price = current_price * (1 + price_change)
|
||||
signal = calculator.update_price(current_price)
|
||||
|
||||
if signal.recommendation in ["trigger_protection", "emergency_override"]:
|
||||
trigger_time = i + 1
|
||||
trigger_velocity = signal.final_velocity * 100
|
||||
trigger_timeframe = signal.dominant_timeframe
|
||||
print(f" *** Trigger at second {trigger_time}: {trigger_velocity:+.3f}% ({trigger_timeframe})")
|
||||
break
|
||||
else:
|
||||
print(" No trigger detected")
|
||||
|
||||
print()
|
||||
|
||||
|
||||
def main():
|
||||
"""Run all enhanced velocity calculation tests"""
|
||||
print("Enhanced Multi-Timeframe Velocity Calculator Testing\n")
|
||||
print("="*70)
|
||||
|
||||
test_enhanced_velocity_calculation()
|
||||
test_threshold_optimization()
|
||||
test_different_timeframe_configs()
|
||||
|
||||
print("KEY Benefits of Enhanced Velocity Calculator:")
|
||||
print(" • Configurable multi-timeframe analysis")
|
||||
print(" • Market-adaptive thresholds")
|
||||
print(" • EMA smoothing for noise reduction")
|
||||
print(" • Confidence-based decision making")
|
||||
print(" • Comprehensive performance analysis")
|
||||
print(" • Flexible configuration for different risk profiles")
|
||||
print("\nThe enhanced system is ready for production deployment!")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user