fix: 组合按温区调度——每笔交易只在其策略适用温区入场(修正trend_down策略在trend_up温区误入)
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user