Files
sanguo_vnpy/test/backtest/run_guanyu_backtest.py
T
2026-04-11 21:18:55 +08:00

103 lines
3.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
在Docker容器内直接执行关羽的策略回测
不经过HTTP API,直接在容器内运行
"""
# ============================================
# 导入完整RPC服务代码(复用run_strategy_backtest函数)
# ============================================
import types
import sys
# 复制完整的RPC服务代码
with open("/Users/chufeng/.openclaw/workspace-jiangwei/final_rpc_correct.py", 'r', encoding='utf-8') as f:
rpc_code = f.read()
# 执行RPC服务代码,但不启动服务
exec(rpc_code, globals())
# 不会自动启动RPC服务,因为我们已经定义了run_strategy_backtest
print("=" * 80)
print("🚀 RPC服务代码加载完成,准备执行回测")
print("=" * 80)
# ============================================
# 读取关羽的策略代码
# ============================================
risk_control_file = "/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live/strategies/factors-dynamic-weight-timing-20260327/risk_control.py"
strategy_file = "/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live/strategies/factors-dynamic-weight-timing-20260327/main_strategy_single_file.py"
with open(risk_control_file, 'r', encoding='utf-8') as f:
risk_control_code = f.read()
with open(strategy_file, 'r', encoding='utf-8') as f:
strategy_code = f.read()
# 合并代码
full_strategy_code = f"{risk_control_code}\n\n# ========== 主策略 ==========\n\n{strategy_code}"
print(f"✅ 风控代码: {len(risk_control_code)} 字符")
print(f"✅ 主策略代码: {len(strategy_code)} 字符")
# ============================================
# 执行回测
# ============================================
print("\n" + "=" * 80)
print("开始执行回测...")
print("=" * 80)
result = run_strategy_backtest(
strategy_code=full_strategy_code,
symbol="510300.SSE",
interval="1d",
start=1609459200, # 2021-01-01
end=1772515200, # 2026-03-01
capital=1000000,
rate=3e-5,
slippage=0.002,
size=10000,
pricetick=0.001,
data_source="sqlite"
)
# ============================================
# 打印结果
# ============================================
print("\n" + "=" * 80)
print("回测结果:")
print("=" * 80)
if "error" in result:
print(f"❌ 回测失败: {result.get('error')}")
if "traceback" in result:
print("\n错误堆栈:")
print(result["traceback"])
sys.exit(1)
if "statistics" in result:
stats = result["statistics"]
print(f"\n📊 绩效指标:")
print(f" 总收益率: {stats.get('total_return', 0):.2%}")
print(f" 年化收益率: {stats.get('annual_return', 0):.2%}")
print(f" 最大回撤: {stats.get('max_drawdown', 0):.2%}")
print(f" 夏普比率: {stats.get('sharpe_ratio', 0):.2f}")
print(f" 总交易次数: {stats.get('total_trades', 0)}")
print(f" 胜率: {stats.get('win_rate', 0):.2%}")
print(f" 盈亏比: {stats.get('profit_loss_ratio', 0):.2f}")
if "trades" in result:
trades = result["trades"]
print(f"\n📝 交易记录: 共 {len(trades)}")
for idx, trade in enumerate(trades[:10], 1):
print(f" {idx}. {trade.get('datetime')} {trade.get('direction')} {trade.get('symbol')} @ {trade.get('price')} × {trade.get('volume')}")
if len(trades) > 10:
print(f" ... 还有 {len(trades) - 10}")
print("\n" + "=" * 80)
print("✅ 回测执行完成!")
print("=" * 80)