fix: auto_init_availability按市场评估——港股策略探测strategy_research.market,避免误标不可用致港股表全空

This commit is contained in:
xxm
2026-08-16 08:25:10 +08:00
parent 7c1f70f0b7
commit 2d8291057b
+28 -4
View File
@@ -106,9 +106,25 @@ def save_availability(data):
AVAIL_JSON.write_text(json.dumps(data, ensure_ascii=False, indent=1), encoding="utf-8")
def auto_init_availability(versions, bench=None):
def _strategy_market(version):
"""探测策略市场:strategy_research.market'hk'=港股,否则 A股)"""
try:
conn = sqlite3.connect(str(DATA_DIR / "mofin.db"), timeout=5)
r = conn.execute(
"SELECT market FROM strategy_research WHERE version=? AND COALESCE(market,'')!='' "
"ORDER BY id DESC LIMIT 1", (version,)).fetchone()
conn.close()
if r and r[0] == "hk":
return "hk"
except Exception:
pass
return "a"
def auto_init_availability(versions, bench=None, market_by_version=None):
"""新策略按标准 A 自动初始化可用性(一般默认可用;长期不合格则不可用)
已存在的手动状态不动。返回新增的默认可用策略。
market_by_version: dict {version: 'a'|'hk'},缺省按 strategy_research.market 探测
"""
bench = bench or get_benchmarks()
avail = load_availability()
@@ -116,12 +132,20 @@ def auto_init_availability(versions, bench=None):
for v in versions:
if v in avail:
continue
ev = evaluate_strategy(v, "a", bench=bench)
mkt = (market_by_version or {}).get(v) or _strategy_market(v)
ev = evaluate_strategy(v, mkt, bench=bench)
# 默认:长期合格即可用(A 标准);长期不合格(10y跑不赢大盘)默认不可用
default_avail = bool(ev and ev["long_ok"])
# 无评估数据(如港股策略在 hk 也无温区数据)→ 默认可用(不误杀新策略)
default_avail = True if ev is None else bool(ev["long_ok"])
if ev is None:
note = "自动初始化:无温区数据,默认可用"
elif default_avail:
note = "自动初始化(标准A)"
else:
note = "自动初始化:长期不合格(10y<大盘)"
avail[v] = {
"available": default_avail,
"note": "自动初始化(标准A)" if default_avail else "自动初始化:长期不合格(10y<大盘)",
"note": note,
"updated_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
}
changed.append((v, default_avail))