diff --git a/deploy/profile-scripts/hk_backtest.py b/deploy/profile-scripts/hk_backtest.py index 3224feee..ed661cd4 100644 --- a/deploy/profile-scripts/hk_backtest.py +++ b/deploy/profile-scripts/hk_backtest.py @@ -15,6 +15,7 @@ import sys import argparse import collections +import sqlite3 from datetime import datetime, timedelta import pandas as pd @@ -24,8 +25,22 @@ sys.path.insert(0, "/home/hmo/MoFin") # strategy_lab.portfolio_sim(纯函数 from hk_strategies import HK_STRATEGIES, get_hk_strategy PANEL = "/tmp/panel_12d_hk.pkl" +DB = "/home/hmo/MoFin/data/mofin.db" COST = 0.0015 # 港股往返费率近似(佣金+印花税) +# 港股温区映射(组合按温区调度用) +_REGIME_CACHE = None + + +def load_regime_map(): + global _REGIME_CACHE + if _REGIME_CACHE is None: + conn = sqlite3.connect(DB) + _REGIME_CACHE = dict(conn.execute( + "SELECT date, regime FROM market_regime WHERE market='hk'").fetchall()) + conn.close() + return _REGIME_CACHE + def load_panel(): p = pd.read_pickle(PANEL) @@ -130,6 +145,7 @@ def main(): versions = [args.version] if args.version else list(HK_STRATEGIES.keys()) all_trades = [] + rm = load_regime_map() # 港股温区映射(组合温区调度) for v in versions: strat = get_hk_strategy(v) if not strat: @@ -140,6 +156,11 @@ def main(): if not trades: print(" 无交易\n", flush=True) continue + # 温区调度:只保留策略适用温区的交易(组合正确性关键) + reg = strat.get("regime", "all") + if reg != "all" and args.version is None: + trades = [t for t in trades if rm.get(t["entry_date"]) == reg] + print(f" 温区调度({reg}): 保留 {len(trades)} 笔", flush=True) m = portfolio_metrics(trades, slots=args.slots) print(f" 交易{m['trades']} 胜率{m['win_rate']:.0f}% 组合年化{m['cagr']}% " f"近1年{m['year1']:+.1f}% 近6月{m['month6']:+.1f}% 近3月{m['month3']:+.1f}%\n", flush=True)