initial-import: 2026-04-11 21:18:55

This commit is contained in:
cfdaily
2026-04-11 21:18:55 +08:00
commit 5e6b2d73eb
264 changed files with 117047 additions and 0 deletions
+99
View File
@@ -0,0 +1,99 @@
#!/usr/bin/env python3
"""
简单测试 - 缩短区间(只1年)验证交易生成
"""
# 兼容性
import types
import sys
vnpy_app = types.ModuleType('vnpy.app')
sys.modules['vnpy.app'] = vnpy_app
for name in ['cta_strategy', 'cta_backtester']:
mod = types.ModuleType(f'vnpy.app.{name}')
sys.modules[f'vnpy.app.{name}'] = mod
setattr(vnpy_app, name, mod)
from vnpy_ctastrategy import CtaTemplate, BarGenerator, ArrayManager
from vnpy_ctabacktester import BacktesterEngine
from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.constant import Exchange, Direction
from datetime import datetime
sys.modules['vnpy.app.cta_strategy'].CtaTemplate = CtaTemplate
sys.modules['vnpy.app.cta_backtester'].BacktesterEngine = BacktesterEngine
# 策略
class SimpleTestStrategy(CtaTemplate):
author = "test"
parameters = []
variables = ["in_position"]
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
self.bg = BarGenerator(self.on_bar)
self.am = ArrayManager(100)
self.in_position = False
def on_init(self):
self.load_bar(1000)
print("策略初始化完成")
def on_bar(self, bar):
self.am.update_bar(bar)
if not self.am.inited:
return
if not self.in_position:
self.buy(bar.close_price, 10000)
self.in_position = True
print(f"买入 @ {bar.close_price:.2f}")
self.put_event()
# 初始化引擎
print("初始化引擎...")
event_engine = EventEngine()
main_engine = MainEngine(event_engine)
backtester_engine = BacktesterEngine(main_engine, event_engine)
backtester_engine.classes["SimpleTestStrategy"] = SimpleTestStrategy
# 运行回测 - 缩短区间(只1年)减少内存
print("开始回测...")
try:
backtester_engine.run_backtesting(
class_name="SimpleTestStrategy",
vt_symbol="510300.SSE",
interval="1d",
start=datetime(2025, 1, 1),
end=datetime(2026, 3, 1),
rate=3e-5,
slippage=0.002,
size=10000,
pricetick=0.001,
capital=1000000,
setting={}
)
result = backtester_engine.get_result_statistics()
print("\n" + "="*60)
print("回测结果:")
print(f"总收益率: {result.get('total_return', 0):.2%}")
print(f"年化收益率: {result.get('annual_return', 0):.2%}")
print(f"最大回撤: {result.get('max_drawdown', 0):.2%}")
print(f"夏普比率: {result.get('sharpe_ratio', 0):.2f}")
print(f"总交易次数: {result.get('total_trades', 0)}")
print(f"胜率: {result.get('win_rate', 0):.2%}")
trades = backtester_engine.get_all_trades()
print(f"\n交易记录: {len(trades)}")
for t in trades:
direction_str = "LONG" if t.direction == Direction.LONG else "SHORT"
print(f" {t.datetime.date()} {direction_str} @ {t.price:.2f} × {t.volume}")
print("\n✅ 回测完成!")
except Exception as e:
print(f"❌ 失败: {e}")
import traceback
traceback.print_exc()