From 2a810391800c05573749c58f9df08ea474b26211 Mon Sep 17 00:00:00 2001 From: xxm Date: Sun, 16 Aug 2026 13:17:30 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E9=9D=A2=E6=9D=BF=E7=BC=93=E5=AD=98+?= =?UTF-8?q?=E8=BF=9B=E5=8C=96=E6=9C=BA=E5=88=B6=E9=A2=84=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E8=84=9A=E6=9C=AC(precompute=5Fevolution)=E2=80=94=E2=80=94?= =?UTF-8?q?=E5=81=87=E8=AE=BE=E5=BD=92=E7=BA=B3/B=E7=BB=84/=E8=B5=84?= =?UTF-8?q?=E6=A0=BC=E6=A6=82=E8=A7=88=E5=AE=9A=E6=9C=9F=E7=AE=97=E5=AD=98?= =?UTF-8?q?json,API=E5=8F=AA=E8=AF=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- evolution/hypothesis_miner.py | 9 ++-- evolution/precompute_evolution.py | 70 +++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 evolution/precompute_evolution.py diff --git a/evolution/hypothesis_miner.py b/evolution/hypothesis_miner.py index 4c60316b..e6c9f13b 100644 --- a/evolution/hypothesis_miner.py +++ b/evolution/hypothesis_miner.py @@ -18,12 +18,14 @@ CANDIDATE_FEATURES = [ ("sec_ret20", "行业近20日涨幅", False), ] -PANEL_PATH = None # 按市场选择 +_PANEL_CACHE = {} # 模块级缓存:market -> panel(避免每次重载600万行pkl) def _load_panel(market): - """加载面板:A股 panel_12d.pkl,港股 panel_12d_hk.pkl""" - global PANEL_PATH + """加载面板:A股 panel_12d.pkl,港股 panel_12d_hk.pkl(带缓存)""" + global _PANEL_CACHE + if market in _PANEL_CACHE: + return _PANEL_CACHE[market] path = "/tmp/panel_12d_hk.pkl" if market == "hk" else "/tmp/panel_12d.pkl" p = pd.read_pickle(path) p = p.sort_values(["code", "date"]).reset_index(drop=True) @@ -31,6 +33,7 @@ def _load_panel(market): p["_key"] = p["code"].astype(str) + "_" + p["date"].astype(str) p = p.drop_duplicates(subset=["_key"]) p = p.set_index("_key") + _PANEL_CACHE[market] = p return p diff --git a/evolution/precompute_evolution.py b/evolution/precompute_evolution.py new file mode 100644 index 00000000..9ba9cc83 --- /dev/null +++ b/evolution/precompute_evolution.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +"""evolution/precompute_evolution.py — 进化机制预计算(2026-08-16) +定期(每周/每日)预计算进化机制数据,供研究Tab展示(API 只读快照,不实时重算): +1. 假设归纳(方向一):每个激活策略的归纳优化假设 +2. B组候选(方向二):由果及因挖掘的候选 +3. 策略资格概览 +输出:data/evolution_center.json +""" +import sys, os, json +from datetime import datetime + +sys.path.insert(0, "/home/hmo/MoFin") +sys.path.insert(0, "/home/hmo/MoFin/evolution") +sys.path.insert(0, "/home/hmo/MoFin/deploy/profile-scripts") + +OUT = "/home/hmo/MoFin/data/evolution_center.json" + + +def active_versions(): + try: + d = json.load(open("/home/hmo/MoFin/data/strategy_weights.json", encoding="utf-8")) + vs = list(d.get("active") or []) + vs += list(((d.get("markets") or {}).get("hk") or {}).get("active") or []) + return list(dict.fromkeys(vs)) + except Exception: + return [] + + +def main(): + print("=== 进化机制预计算开始 ===", flush=True) + from hypothesis_miner import induce_hypotheses + from strategy_qualify import evaluate_all_regimes, get_benchmarks + + out = {"generated_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "hypotheses": [], "b_group": [], "qual_overview": []} + + # 1. 假设归纳(方向一) + for v in active_versions(): + mkt = "hk" if v.startswith("hk") else "a" + try: + hs, _ = induce_hypotheses(v, mkt, period_tag="2y") + for h in hs[:3]: + out["hypotheses"].append({"strategy": v, "market": mkt, **h}) + print(f" 假设 [{v}]: {h['hypothesis'][:60]}", flush=True) + except Exception as e: + print(f" 假设 [{v}] 失败: {e}", flush=True) + + # 2. B组候选(方向二) + try: + p = json.load(open("/home/hmo/MoFin/data/b_group_candidates.json", encoding="utf-8")) + out["b_group"] = p.get("candidates", []) + print(f" B组候选: {len(out['b_group'])}", flush=True) + except Exception as e: + print(f" B组读取失败: {e}", flush=True) + + # 3. 资格概览 + for v in active_versions(): + mkt = "hk" if v.startswith("hk") else "a" + try: + q = evaluate_all_regimes(v, mkt, bench=get_benchmarks(mkt)) + out["qual_overview"].append({"strategy": v, "market": mkt, "qualification": q}) + except Exception: + pass + + with open(OUT, "w", encoding="utf-8") as f: + json.dump(out, f, ensure_ascii=False, indent=1) + print(f"写入 {OUT}: hypotheses={len(out['hypotheses'])} b_group={len(out['b_group'])} qual={len(out['qual_overview'])}") + + +if __name__ == "__main__": + main()