-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrun.py
More file actions
173 lines (137 loc) · 4.45 KB
/
Copy pathrun.py
File metadata and controls
173 lines (137 loc) · 4.45 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
"""
DMR-ML - 命令行入口
支持命令行运行回测和启动Web界面
用法:
# 启动Web界面
python run.py web
# 运行回测
python run.py backtest
# 生成今日信号
python run.py signal
Author: Kai
"""
import sys
import subprocess
from datetime import datetime, timedelta, timezone
# 北京时区 (UTC+8)
BEIJING_TZ = timezone(timedelta(hours=8))
def get_beijing_now() -> datetime:
"""获取北京时间"""
return datetime.now(BEIJING_TZ)
def run_web():
"""启动 Web 界面"""
print("=" * 60)
print("🚀 启动 DMR-ML Web 界面")
print("-" * 60)
print("访问地址: http://localhost:8000")
print("按 Ctrl+C 停止服务")
print("=" * 60)
subprocess.run([sys.executable, "-m", "uvicorn", "web.api:app", "--host", "0.0.0.0", "--port", "8000"])
def run_backtest():
"""运行策略回测"""
from config import get_config
from data_service import get_data_service
from models import MLRiskModel
from backtest_engine import BacktestEngine
from reports import ReportGenerator
print("=" * 60)
print("📊 DMR-ML 策略回测")
print("-" * 60)
print(f"运行时间(北京时间): {get_beijing_now().strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 60)
# 加载数据
print("\n>>> 加载市场数据...")
data_service = get_data_service()
df300, df1000 = data_service.get_aligned_data()
print(f"数据范围: {df300.index[0].strftime('%Y-%m-%d')} 至 {df300.index[-1].strftime('%Y-%m-%d')}")
print(f"数据条数: {len(df300)}")
# 训练ML模型
ml_model = MLRiskModel()
ml_probs = ml_model.fit_predict(df300)
# 参数优化
engine = BacktestEngine()
best_params, best_result, _ = engine.optimize_parameters(df300, df1000, ml_probs)
# 运行回测
print(f"\n>>> 基于最优参数执行回测...")
result_ml = engine.run_backtest(
df300, df1000,
best_params[0], best_params[1],
ml_probs=ml_probs,
strategy_name="DMR-ML"
)
result_base = engine.run_backtest(
df300, df1000,
best_params[0], best_params[1],
ml_probs=None,
strategy_name="DMR"
)
# 生成报告
report = ReportGenerator(result_ml)
report.print_summary()
# 策略对比
print("\n" + "=" * 60)
print("策略对比")
print("-" * 60)
print(f"{'指标':<15} | {'DMR-ML':<15} | {'DMR':<15}")
print("-" * 60)
print(f"{'累计收益':<15} | {result_ml.total_return:<15.2%} | {result_base.total_return:<15.2%}")
print(f"{'年化收益':<15} | {result_ml.annual_return:<15.2%} | {result_base.annual_return:<15.2%}")
print(f"{'最大回撤':<15} | {result_ml.max_drawdown:<15.2%} | {result_base.max_drawdown:<15.2%}")
print(f"{'夏普比率':<15} | {result_ml.sharpe_ratio:<15.2f} | {result_base.sharpe_ratio:<15.2f}")
print("=" * 60)
def run_signal():
"""生成今日交易信号"""
from config import get_config
from data_service import get_data_service
from models import MLRiskModel
from reports import SignalGenerator
print("=" * 60)
print("📌 DMR-ML 今日信号")
print("=" * 60)
# 加载数据
data_service = get_data_service()
df300, df1000 = data_service.get_aligned_data()
# 训练ML模型
print(">>> 训练ML模型...")
ml_model = MLRiskModel()
ml_probs = ml_model.fit_predict(df300, verbose=False)
# 生成信号
config = get_config()
signal_gen = SignalGenerator(
df300, df1000, ml_probs,
config.strategy.default_momentum_window,
config.strategy.default_ma_window
)
signal_gen.print_signal()
def main():
"""主入口"""
if len(sys.argv) < 2:
print("""
DMR-ML 机器学习量化交易系统
用法:
python run.py <command>
命令:
web 启动Web界面
backtest 运行策略回测
signal 生成今日信号
help 显示帮助信息
示例:
python run.py web
python run.py backtest
python run.py signal
""")
return
command = sys.argv[1].lower()
if command == "web":
run_web()
elif command == "backtest":
run_backtest()
elif command == "signal":
run_signal()
elif command == "help":
main() # 显示帮助
else:
print(f"未知命令: {command}")
print("使用 'python run.py help' 查看帮助")
if __name__ == "__main__":
main()