feat: evolution_engine接入数据归纳假设——优先归纳假设变体(加条件规避),无假设才回退参数变体
This commit is contained in:
@@ -29,6 +29,7 @@ from datetime import datetime, timedelta
|
||||
|
||||
sys.path.insert(0, "/home/hmo/MoFin")
|
||||
sys.path.insert(0, "/home/hmo/MoFin/deploy/profile-scripts")
|
||||
sys.path.insert(0, "/home/hmo/MoFin/evolution")
|
||||
|
||||
DB = os.environ.get("MOFIN_DB", "/home/hmo/MoFin/data/mofin.db")
|
||||
WEIGHTS_JSON = "/home/hmo/MoFin/data/strategy_weights.json"
|
||||
@@ -172,6 +173,54 @@ def get_parent_cagr(conn, version, market, period_tag=BT_PERIOD_TAG):
|
||||
return None, None
|
||||
|
||||
|
||||
def generate_hypothesis_variants(version, market, base_config, period_tag=BT_PERIOD_TAG):
|
||||
"""2026-08-16 数据归纳假设变体:从交易数据归纳可描述条件 → 生成加条件的策略版本
|
||||
假设格式:{feature, direction(max/min), threshold} → 对应入场条件
|
||||
返回 [{version, name, config, change_desc, evidence, hypothesis}]
|
||||
"""
|
||||
try:
|
||||
from hypothesis_miner import induce_hypotheses
|
||||
hs, _ = induce_hypotheses(version, market, period_tag=period_tag)
|
||||
except Exception:
|
||||
hs = []
|
||||
variants = []
|
||||
for h in hs[:MAX_VARIANTS_TEST]:
|
||||
feat = h["feature"]
|
||||
direction = h["direction"]
|
||||
threshold = h["threshold"]
|
||||
# 映射到策略 config 的字段(A股 entry.filters/mr,港股 entry 顶层)
|
||||
cfg = copy.deepcopy(base_config)
|
||||
if market == "hk":
|
||||
entry = cfg.get("entry", {})
|
||||
else:
|
||||
entry = cfg.get("entry", {})
|
||||
# 字段名映射:面板字段 → 策略字段(多数同名,A股 mr 下)
|
||||
key = feat
|
||||
target = entry
|
||||
# A股 config 是 {entry:{filters,mr}} 结构,找可放的位置
|
||||
if market != "hk":
|
||||
if "mr" in entry:
|
||||
target = entry["mr"]
|
||||
elif "filters" in entry:
|
||||
target = entry["filters"]
|
||||
if direction == "max":
|
||||
target[key + "_max"] = threshold
|
||||
else:
|
||||
target[key + "_min"] = threshold
|
||||
vname = f"evo_{version}_{key}_{direction}{threshold}"
|
||||
variants.append({
|
||||
"version": vname,
|
||||
"name": f"自进化-{version}-规避{key}{direction}{threshold}",
|
||||
"config": cfg,
|
||||
"change_desc": f"[数据归纳] {h['hypothesis']}",
|
||||
"evidence": h.get("evidence", ""),
|
||||
"hypothesis": h.get("hypothesis", ""),
|
||||
"field": key,
|
||||
"delta": 0,
|
||||
})
|
||||
return variants
|
||||
|
||||
|
||||
def generate_variants(version, market, config):
|
||||
"""生成变体参数建议:单变量 ±20%,最多 MAX_VARIANTS 个
|
||||
返回 [{version, name, config, change_desc, field, delta}]"""
|
||||
@@ -330,7 +379,10 @@ def run_evolution():
|
||||
if not base:
|
||||
log(f" {v} 无港股策略定义,跳过")
|
||||
continue
|
||||
variants = generate_variants(v, mkt, base)
|
||||
# 2026-08-16 优先数据归纳假设,无则参数变体
|
||||
variants = generate_hypothesis_variants(v, mkt, base)
|
||||
if not variants:
|
||||
variants = generate_variants(v, mkt, base)
|
||||
verify_fn = verify_variant_hk
|
||||
else:
|
||||
try:
|
||||
@@ -339,7 +391,10 @@ def run_evolution():
|
||||
except ValueError:
|
||||
log(f" {v} 不在标准回测体系(scanner 类策略),跳过变体研究")
|
||||
continue
|
||||
variants = generate_variants(v, mkt, base["config"])
|
||||
# 2026-08-16 优先数据归纳假设,无则参数变体
|
||||
variants = generate_hypothesis_variants(v, mkt, base["config"])
|
||||
if not variants:
|
||||
variants = generate_variants(v, mkt, base["config"])
|
||||
verify_fn = verify_variant_a
|
||||
if not variants:
|
||||
log(f" {v} 无可用变体字段,跳过")
|
||||
|
||||
Reference in New Issue
Block a user