-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
130 lines (109 loc) · 5.05 KB
/
main.py
File metadata and controls
130 lines (109 loc) · 5.05 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
import argparse
import sys
from data_loader import load_data, make_synthetic_orderbook, get_real_market_data
from backtester import Backtester
from strategies.mean_reversion import MeanReversionStrategy
from strategies.momentum import MomentumStrategy
from strategies.market_making import MarketMakingStrategy
from metrics import compute_performance_metrics
from data_quality import print_data_quality_report
STRATEGIES = {
'mean_reversion': MeanReversionStrategy,
'momentum': MomentumStrategy,
'market_making': MarketMakingStrategy,
}
def parse_args(argv=None):
p = argparse.ArgumentParser(description='Professional Intraday Trading Strategy Backtester')
# Data source options
p.add_argument('--symbol', type=str, default='AAPL', help='Stock symbol to trade (default: AAPL)')
p.add_argument('--csv', type=str, help='Path to CSV with order book data')
p.add_argument('--synthetic', action='store_true', help='Use synthetic data instead of real market data')
p.add_argument('--period', type=str, default='5d', choices=['1d', '5d', '1mo', '3mo'],
help='Period for Yahoo Finance data (default: 5d)')
# Strategy options
p.add_argument('--strategy', type=str, default='mean_reversion', choices=STRATEGIES.keys(),
help='Trading strategy to use (default: mean_reversion)')
p.add_argument('--lookback', type=int, default=60, help='Lookback period for strategy (default: 60)')
p.add_argument('--threshold', type=float, default=0.5, help='Strategy threshold parameter (default: 0.5)')
p.add_argument('--max-position', type=int, default=100, help='Maximum position size (default: 100)')
# Backtesting parameters
p.add_argument('--latency-ms', type=int, default=50, help='Order latency in milliseconds (default: 50)')
p.add_argument('--fee-per-share', type=float, default=0.0005, help='Fee per share (default: 0.0005)')
p.add_argument('--slippage-bps', type=float, default=2.0, help='Slippage in basis points (default: 2.0)')
# Output options
p.add_argument('--no-plot', action='store_true', help='Disable plotting')
p.add_argument('--data-quality', action='store_true', help='Show detailed data quality assessment')
return p.parse_args(argv)
def main(argv=None):
args = parse_args(argv)
print("🚀 Professional Trading Bot - Quant Research Framework")
print("=" * 65)
# Load data based on user preference
if args.csv:
print(f"📁 Loading data from CSV: {args.csv}")
data = load_data(args.csv)
print(f"✅ Loaded {len(data)} ticks from CSV")
elif args.synthetic:
print("🎲 Generating synthetic market data...")
data = make_synthetic_orderbook(symbol=args.symbol)
print(f"✅ Generated {len(data)} synthetic ticks")
else:
# Default: Get real market data from Yahoo Finance
data = get_real_market_data(symbol=args.symbol, period=args.period)
# Show data quality assessment
if args.data_quality or not (args.csv or args.synthetic):
print_data_quality_report(data)
print(f"\n⚙️ Strategy Configuration:")
print(f" • Strategy: {args.strategy}")
print(f" • Lookback: {args.lookback}")
print(f" • Threshold: {args.threshold}")
print(f" • Max Position: {args.max_position}")
print(f" • Latency: {args.latency_ms}ms")
print(f" • Fees: ${args.fee_per_share:.4f}/share")
print(f" • Slippage: {args.slippage_bps:.1f} bps")
# Build strategy
Strategy = STRATEGIES[args.strategy]
strategy = Strategy(
lookback=args.lookback,
threshold=args.threshold,
max_position=args.max_position
)
# Run backtest
print(f"\n🔄 Running backtest...")
bt = Backtester(
data=data,
strategy=strategy,
latency_ms=args.latency_ms,
fee_per_share=args.fee_per_share,
slippage_bps=args.slippage_bps,
)
results = bt.run()
# Performance metrics
metrics = compute_performance_metrics(results)
print(f"\n📈 Performance Results:")
print("=" * 40)
for k, v in metrics.items():
if isinstance(v, float):
if 'ratio' in k.lower() or 'rate' in k.lower():
print(f"{k.replace('_', ' ').title()}: {v:.3f}")
elif 'drawdown' in k.lower():
print(f"{k.replace('_', ' ').title()}: {v:.2%}")
elif 'volatility' in k.lower():
print(f"{k.replace('_', ' ').title()}: {v:.2%}")
else:
print(f"{k.replace('_', ' ').title()}: {v:.2f}")
else:
print(f"{k.replace('_', ' ').title()}: {v}")
# Generate plots
if not args.no_plot:
print(f"\n📊 Generating performance plots...")
try:
from plotting import plot_results
plot_results(results, metrics)
except ImportError as e:
print(f"⚠️ Plotting unavailable: {e}")
except Exception as e:
print(f"⚠️ Plotting failed: {e}")
return 0
if __name__ == '__main__':
raise SystemExit(main())