feat(backtest): 支持5m/15m周期回测(ashare适配绕vnpy Interval enum)
ashare_engine override load_data: 5m/15m 直查 dbbardata 转 BarData(MINUTE), 绕过 vnpy Interval enum 限制(原生只认 d/1h/1m)。cta_engine +interval 参数, 5m/15m 映射 MINUTE 过父类校验。api(schema/routes)+orchestrator 透传 interval。 顺带修 cta_engine DB路径污染(yaml NAS路径在Win VPS误解析→改读vt_setting.json)。 测试: 15m 600519一年 3888bars total_return-0.22 sharpe-2.04; 5m 11664bars; 日线未回归(237bars)。
This commit is contained in:
@@ -32,7 +32,8 @@ class Orchestrator:
|
||||
|
||||
async def submit_cta(self, strategy_class, symbol: str, params: dict,
|
||||
start: str, end: str, cfg, benchmark: str = "hs300",
|
||||
capital: float = 1_000_000, position_pct: float = 0.95) -> str:
|
||||
capital: float = 1_000_000, position_pct: float = 0.95,
|
||||
interval: str = "d") -> str:
|
||||
"""Submit a CTA backtesting task asynchronously"""
|
||||
# Stable uuid up front → reused as the persisted DB task_id, so runner-id ==
|
||||
# DB task_id (durable across restarts; previously used id(params) memory addr).
|
||||
@@ -48,6 +49,7 @@ class Orchestrator:
|
||||
benchmark=benchmark,
|
||||
capital=capital,
|
||||
position_pct=position_pct,
|
||||
interval=interval,
|
||||
)
|
||||
await self._notify_stage(task_id, "排队中")
|
||||
|
||||
@@ -55,7 +57,7 @@ class Orchestrator:
|
||||
fut: Future = self.pool.submit_work(
|
||||
task_id, _cta_worker, spec["strategy_class"], spec["symbol"],
|
||||
spec["params"], spec["start"], spec["end"], spec["cfg"], spec["benchmark"],
|
||||
self.db_path, task_id, spec["capital"], spec["position_pct"]
|
||||
self.db_path, task_id, spec["capital"], spec["position_pct"], spec["interval"]
|
||||
)
|
||||
|
||||
task = self.pool.get_task(task_id)
|
||||
@@ -194,10 +196,10 @@ class Orchestrator:
|
||||
|
||||
|
||||
# Module-level worker functions (must be top-level for ProcessPoolExecutor pickle)
|
||||
def _cta_worker(strategy_class, symbol: str, params: dict, start: str, end: str, cfg, benchmark: str, db_path: str, task_id: str, capital: float = 1_000_000, position_pct: float = 0.95) -> any:
|
||||
def _cta_worker(strategy_class, symbol: str, params: dict, start: str, end: str, cfg, benchmark: str, db_path: str, task_id: str, capital: float = 1_000_000, position_pct: float = 0.95, interval: str = "d") -> any:
|
||||
"""Worker for CTA backtest (lazy import, spawn-friendly)"""
|
||||
from sanguo_backtest.cta_engine import run_cta_backtest
|
||||
return run_cta_backtest(strategy_class, symbol, params, start, end, cfg, db_path, benchmark=benchmark, task_id=task_id, capital=capital, position_pct=position_pct)
|
||||
return run_cta_backtest(strategy_class, symbol, params, start, end, cfg, db_path, benchmark=benchmark, task_id=task_id, capital=capital, position_pct=position_pct, interval=interval)
|
||||
|
||||
|
||||
def _opt_worker(strategy_class, symbol: str, grid: dict, start: str, end: str, cfg, db_path: str, task_id: str) -> any:
|
||||
|
||||
Reference in New Issue
Block a user