-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmain_demo.py
More file actions
333 lines (262 loc) · 12.1 KB
/
Copy pathmain_demo.py
File metadata and controls
333 lines (262 loc) · 12.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
"""
Main Demo - Trading Strategy Framework with BTC/USDT Testing
This demo showcases the complete trading strategy framework with:
1. BTC/USDT data generation and testing
2. Strategy backtesting across different market conditions
3. Optimization and analysis capabilities
4. Performance reporting
Run this demo to see all features working together.
"""
import pandas as pd
import numpy as np
import logging
from datetime import datetime
from typing import Dict, List
# Import framework modules
from models import StrategyParams, TradeResult
from strategy import MomentumStrategy, create_default_strategy, create_custom_strategy
from btc_data_generator import generate_btc_usdt_data, get_btc_usdt_test_scenarios, validate_ohlcv_data
# Import new modules
from backtesting import BacktestingEngine, BacktestConfig
from optimization import OptimizationEngine, OptimizationConfig, PARAMETER_GRIDS
from analysis import DatabaseManager, ReportGenerator
def setup_logging():
"""Setup logging for the demo."""
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
return logging.getLogger(__name__)
def demo_btc_data_generation(logger):
"""Demonstrate BTC/USDT data generation and validation."""
logger.info("=== BTC/USDT DATA GENERATION ===")
# Generate different market scenarios
scenarios = get_btc_usdt_test_scenarios()
for name, data in scenarios.items():
logger.info(f"📊 {name.replace('_', ' ').title()} Scenario:")
logger.info(f" - Periods: {len(data)}")
logger.info(f" - Price Range: ${data['close'].min():.2f} - ${data['close'].max():.2f}")
logger.info(f" - Price Change: {((data['close'].iloc[-1] / data['close'].iloc[0]) - 1) * 100:.1f}%")
# Validate data
is_valid, message = validate_ohlcv_data(data)
logger.info(f" - Validation: {'✅ PASS' if is_valid else '❌ FAIL'}")
if not is_valid:
logger.warning(f" {message}")
return scenarios
def demo_strategy_testing(logger, scenarios: Dict[str, pd.DataFrame]):
"""Test strategy on different BTC market scenarios."""
logger.info("\n=== STRATEGY TESTING ON BTC/USDT ===")
# Define different strategy configurations for crypto
crypto_strategies = {
'conservative': StrategyParams(
smooth_type="SMA",
smoothing_length=20,
rsi_length_long=14,
enable_longs=True,
enable_shorts=False,
sl_percent_long=2.0,
use_rsi_filter=False, # Simplify to get trades
use_trend_filter=True
),
'aggressive': StrategyParams(
smooth_type="EMA",
smoothing_length=12,
rsi_length_long=10,
enable_longs=True,
enable_shorts=True,
sl_percent_long=3.0,
sl_percent_short=2.5,
use_rsi_filter=False, # Simplify to get trades
use_atr_filter=False
),
'scalping': StrategyParams(
smooth_type="EMA",
smoothing_length=8,
rsi_length_long=7,
enable_longs=True,
enable_shorts=True,
sl_percent_long=1.5,
sl_percent_short=1.5,
use_rsi_filter=False # Simplify to get trades
)
}
results = {}
for strategy_name, params in crypto_strategies.items():
logger.info(f"\n🚀 Testing {strategy_name.upper()} strategy:")
results[strategy_name] = {}
for scenario_name, data in scenarios.items():
try:
strategy = MomentumStrategy(params)
result_df = strategy.run_strategy(data)
trades = strategy.executed_trades
# Calculate basic metrics
if trades:
total_pnl = sum(trade.pnl for trade in trades)
winning_trades = len([t for t in trades if t.pnl > 0])
win_rate = winning_trades / len(trades)
total_return = total_pnl # PnL is already a percentage
results[strategy_name][scenario_name] = {
'trades': len(trades),
'win_rate': win_rate,
'total_return': total_return,
'total_pnl': total_pnl
}
logger.info(f" 📈 {scenario_name}: {len(trades)} trades, "
f"{win_rate:.1%} win rate, {total_return:.2%} return")
else:
results[strategy_name][scenario_name] = {
'trades': 0, 'win_rate': 0, 'total_return': 0, 'total_pnl': 0
}
logger.info(f" 📊 {scenario_name}: No trades generated")
except Exception as e:
logger.error(f" ❌ {scenario_name}: Error - {e}")
results[strategy_name][scenario_name] = None
return results
def demo_backtesting_engine(logger):
"""Demonstrate enhanced backtesting capabilities."""
logger.info("\n=== ENHANCED BACKTESTING ENGINE ===")
# Generate BTC data for backtesting
btc_data = generate_btc_usdt_data(
periods=1000,
base_price=30000,
volatility=0.03,
seed=42
)
# Configure backtesting
backtest_config = BacktestConfig(
commission_rate=0.001, # 0.1% commission
slippage_bps=5.0, # 5 basis points slippage
initial_capital=50000.0 # $50k starting capital
)
engine = BacktestingEngine(backtest_config)
# Test different parameter sets
param_grid = {
'smooth_type': ['EMA', 'SMA'],
'smoothing_length': [20, 50],
'sl_percent_long': [2.0, 3.0],
'enable_shorts': [True, False]
}
logger.info("🔍 Running parameter optimization...")
try:
optimization_results = engine.parameter_optimization(
btc_data, param_grid, '1h', 'BTCUSDT', max_workers=2
)
if optimization_results:
best_result = max(optimization_results, key=lambda x: x.performance.profit_factor)
logger.info(f"✅ Optimization completed: {len(optimization_results)} combinations tested")
logger.info(f"🏆 Best result: PF={best_result.performance.profit_factor:.2f}, "
f"WR={best_result.performance.win_rate:.1%}")
return optimization_results[:5] # Return top 5
else:
logger.warning("⚠️ No optimization results generated")
return []
except Exception as e:
logger.error(f"❌ Backtesting failed: {e}")
return []
def demo_optimization_and_analysis(logger, btc_results):
"""Demonstrate optimization and analysis capabilities."""
logger.info("\n=== OPTIMIZATION & ANALYSIS ===")
if not btc_results:
logger.warning("⚠️ Skipping analysis - no backtesting results available")
return
try:
# Setup database and analysis
db_manager = DatabaseManager("btc_demo_results.db")
# Save results to database
logger.info("💾 Saving results to database...")
saved_count = 0
for result in btc_results:
try:
db_manager.save_backtest_result(result)
saved_count += 1
except Exception as e:
logger.warning(f"Failed to save result: {e}")
logger.info(f"✅ Saved {saved_count} results to database")
# Generate analysis reports
report_generator = ReportGenerator(db_manager)
logger.info("📊 Generating analysis reports...")
# Generate summary report
summary_file = report_generator.generate_summary_report("btc_strategy_summary.txt")
logger.info(f"📄 Summary report: {summary_file}")
# Generate detailed analysis
detailed_file = report_generator.generate_detailed_analysis("btc_strategy_detailed.csv")
logger.info(f"📋 Detailed analysis: {detailed_file}")
# Get performance statistics
stats = db_manager.get_performance_statistics()
logger.info("📈 Database Statistics:")
logger.info(f" - Total Results: {stats['total_results']}")
logger.info(f" - Profitable Strategies: {stats['profitable_strategies']}")
logger.info(f" - Best Profit Factor: {stats['max_profit_factor']:.2f}")
logger.info(f" - Average Win Rate: {stats['avg_win_rate']:.1%}")
except Exception as e:
logger.error(f"❌ Analysis failed: {e}")
def demo_summary(logger, strategy_results):
"""Display comprehensive demo summary."""
logger.info("\n" + "=" * 60)
logger.info("🎉 DEMO SUMMARY")
logger.info("=" * 60)
logger.info("✅ COMPLETED DEMONSTRATIONS:")
logger.info(" 1. 📊 BTC/USDT Data Generation - Multiple market scenarios")
logger.info(" 2. 🚀 Strategy Testing - Conservative, Aggressive, Scalping")
logger.info(" 3. 🔍 Enhanced Backtesting - Parameter optimization")
logger.info(" 4. 📈 Analysis & Reporting - Database storage and reports")
logger.info("\n📊 STRATEGY PERFORMANCE OVERVIEW:")
if strategy_results:
for strategy_name, scenarios in strategy_results.items():
total_trades = sum(r['trades'] for r in scenarios.values() if r)
avg_win_rate = np.mean([r['win_rate'] for r in scenarios.values() if r and r['trades'] > 0])
avg_return = np.mean([r['total_return'] for r in scenarios.values() if r])
logger.info(f" 🎯 {strategy_name.upper()}:")
logger.info(f" - Total Trades: {total_trades}")
logger.info(f" - Avg Win Rate: {avg_win_rate:.1%}")
logger.info(f" - Avg Return: {avg_return:.2%}")
logger.info("\n🎯 KEY ACHIEVEMENTS:")
logger.info(" ✅ Generated realistic BTC/USDT market data")
logger.info(" ✅ Tested strategies across bull/bear/sideways markets")
logger.info(" ✅ Demonstrated parameter optimization")
logger.info(" ✅ Saved results to database for analysis")
logger.info(" ✅ Generated professional reports")
logger.info("\n📁 GENERATED FILES:")
files_to_check = [
"btc_strategy_summary.txt",
"btc_strategy_detailed.csv",
"btc_demo_results.db"
]
for filename in files_to_check:
try:
import os
if os.path.exists(filename):
size = os.path.getsize(filename)
logger.info(f" ✅ {filename} ({size} bytes)")
else:
logger.info(f" ⚠️ {filename} (not found)")
except Exception:
logger.info(f" ❓ {filename} (unknown)")
logger.info("\n🚀 NEXT STEPS:")
logger.info(" 1. Review generated reports for strategy insights")
logger.info(" 2. Experiment with different parameter combinations")
logger.info(" 3. Add real-time data feeds for live trading")
logger.info(" 4. Implement additional cryptocurrencies")
def main():
"""Main demo function."""
print("🚀 Trading Strategy Framework - BTC/USDT Demo")
print("=" * 60)
logger = setup_logging()
logger.info("Starting comprehensive trading strategy demo...")
try:
# 1. Generate and validate BTC data
scenarios = demo_btc_data_generation(logger)
# 2. Test strategies on different market conditions
strategy_results = demo_strategy_testing(logger, scenarios)
# 3. Demonstrate enhanced backtesting
btc_backtest_results = demo_backtesting_engine(logger)
# 4. Show optimization and analysis capabilities
demo_optimization_and_analysis(logger, btc_backtest_results)
# 5. Display comprehensive summary
demo_summary(logger, strategy_results)
logger.info("\n🎉 Demo completed successfully!")
except Exception as e:
logger.error(f"❌ Demo failed: {e}")
raise
if __name__ == "__main__":
main()