feat: strategy_router双市场路由——A股按A股温区激活(不变),港股策略(hk_mr1)按港股温区激活(读markets.hk温区+strategy_regime_perf market=hk),输出strategy_weights.json加markets.hk维度

This commit is contained in:
hmo
2026-08-14 22:47:39 +08:00
parent 8bc3716f1b
commit 02c4c86b06
+49 -9
View File
@@ -40,10 +40,27 @@ FAMILY_MAP = {
"v4.0d": "trend", "v4.0e": "trend", "v4.0f": "trend", "v4.0g": "trend", "v4.0d": "trend", "v4.0e": "trend", "v4.0f": "trend", "v4.0g": "trend",
"v4.0h": "trend", "v4.1": "trend", "v5.0": "trend", "v4.0h": "trend", "v4.1": "trend", "v5.0": "trend",
"v11.0": "trend", "v11.1": "trend", "v11.0": "trend", "v11.1": "trend",
"hk_mr1": "mr", # 港股深度超卖反弹(2026-08-14 港股归因研发,trend_down 主战场)
} }
def load_regime(): def load_regime(market='a'):
"""读取当前温区。market='a'(默认,A股 smoothed 顶层,行为不变) / 'hk'(港股 markets.hk)"""
if market == 'hk':
try:
p = Path("/home/hmo/MoFin/data/market_regime_smoothed.json")
if p.exists():
d = json.loads(p.read_text(encoding="utf-8"))
mk = (d.get("markets") or {}).get("hk") or {}
if mk.get("current_regime"):
return {"regime": mk["current_regime"], "date": mk.get("current_date", "")}
except Exception:
pass
try:
from market_regime import load_market_regime
return load_market_regime(market='hk')
except Exception:
return {"regime": "unknown"}
try: try:
p = Path("/home/hmo/MoFin/data/market_regime_smoothed.json") p = Path("/home/hmo/MoFin/data/market_regime_smoothed.json")
if p.exists(): if p.exists():
@@ -59,22 +76,25 @@ def load_regime():
return {"regime": "unknown"} return {"regime": "unknown"}
def load_temp(): def load_temp(market='a'):
"""读取当前温度。market='a'(默认,A股) / 'hk'(港股)"""
try: try:
from temp_band import get_market_temp from temp_band import get_market_temp
return get_market_temp() return get_market_temp(market=market)
except Exception: except Exception:
return {"band": "unknown", "rsi": None} return {"band": "unknown", "rsi": None}
def load_regime_perf(): def load_regime_perf(market='a'):
"""读取策略-温区表现。market='a'(默认,A股,行为不变) / 'hk'(港股策略)"""
conn = None conn = None
try: try:
import sqlite3 import sqlite3
conn = sqlite3.connect("/home/hmo/MoFin/data/mofin.db", timeout=30) conn = sqlite3.connect("/home/hmo/MoFin/data/mofin.db", timeout=30)
conn.execute("PRAGMA busy_timeout=30000") conn.execute("PRAGMA busy_timeout=30000")
rows = conn.execute( rows = conn.execute(
"SELECT strategy, regime, trades, win_rate, avg_pnl FROM strategy_regime_perf" "SELECT strategy, regime, trades, win_rate, avg_pnl FROM strategy_regime_perf "
"WHERE COALESCE(market,'a')=?", (market,)
).fetchall() ).fetchall()
result = {} result = {}
for strat, reg, n, wr, pnl in rows: for strat, reg, n, wr, pnl in rows:
@@ -122,9 +142,10 @@ def route(regime, temp, perf):
def main(): def main():
regime = load_regime() # A股路由(完全不变)
temp = load_temp() regime = load_regime() # A股温区
perf = load_regime_perf() temp = load_temp() # A股温度
perf = load_regime_perf('a') # A股策略表现
weights = route(regime, temp, perf) weights = route(regime, temp, perf)
out = { out = {
"state": regime.get("regime", "unknown"), "state": regime.get("regime", "unknown"),
@@ -136,9 +157,28 @@ def main():
"updated_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "updated_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"note": "温区(平滑K=5)选策略类型 + 温度(rsi)乘数;策略全温区发信号,适用温区由实测动态决定", "note": "温区(平滑K=5)选策略类型 + 温度(rsi)乘数;策略全温区发信号,适用温区由实测动态决定",
} }
# 港股路由(2026-08-14 新增,不影响A股)——港股策略按港股温区激活
try:
hk_regime = load_regime('hk')
hk_temp = load_temp('hk')
hk_perf = load_regime_perf('hk')
if hk_perf:
hk_weights = route(hk_regime, hk_temp, hk_perf)
out["markets"] = {"hk": {
"state": hk_regime.get("regime", "unknown"),
"state_date": hk_regime.get("date", ""),
"temp_band": hk_temp.get("band", "unknown"),
"weights": hk_weights,
"active": [k for k, v in hk_weights.items() if v["matched"]],
}}
except Exception as e:
print(f"港股路由失败(不影响A股): {e}", flush=True)
OUT.write_text(json.dumps(out, ensure_ascii=False, indent=1), encoding="utf-8") OUT.write_text(json.dumps(out, ensure_ascii=False, indent=1), encoding="utf-8")
print(f"strategy_weights.json: 状态={out['state']} 温度={out['temp_band']}(rsi={out['temp_rsi']})") print(f"strategy_weights.json: 状态={out['state']} 温度={out['temp_band']}(rsi={out['temp_rsi']})")
print(f"激活策略: {out['active']}") print(f"激活策略(A股): {out['active']}")
if "markets" in out:
hk = out["markets"]["hk"]
print(f"港股温区={hk['state']} 激活策略(港股): {hk['active']}")
print("权重排名(前15:") print("权重排名(前15:")
for name, w in list(weights.items())[:15]: for name, w in list(weights.items())[:15]:
mark = "" if w["matched"] else "观察" mark = "" if w["matched"] else "观察"