fix: 组合按温区调度——每笔交易只在其策略适用温区入场(修正trend_down策略在trend_up温区误入)

This commit is contained in:
hmo
2026-08-15 03:12:41 +08:00
parent 46794959a2
commit dfb5ead698
+21
View File
@@ -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)