perf: 面板缓存+进化机制预计算脚本(precompute_evolution)——假设归纳/B组/资格概览定期算存json,API只读
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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()
|
||||
Reference in New Issue
Block a user