diff --git a/evolution/b_group_miner.py b/evolution/b_group_miner.py index 12527caa..803aa325 100644 --- a/evolution/b_group_miner.py +++ b/evolution/b_group_miner.py @@ -100,6 +100,7 @@ def _simulate_verify(market, regime, panel, cond, tp=20, sl=10, maxh=40): return None sub = sub.sort_values(["code", "date"]) trades = [] + trade_details = [] for code, g in sub.groupby("code"): g = g.sort_values("date") idxs = list(g.index) @@ -121,10 +122,15 @@ def _simulate_verify(market, regime, panel, cond, tp=20, sl=10, maxh=40): if res is None: res = (fut.iloc[-1]["close"] / ep - 1) * 100 trades.append(res) + trade_details.append({"entry_date": str(g.loc[i, "date"]), "pnl_pct": round(res, 2), + "code": str(code)}) if not trades: return None wins = [x for x in trades if x > 0] - return len(trades), len(wins) / len(trades) * 100, sum(trades) / len(trades) + if not trades: + return None + return {"n": len(trades), "win_rate": len(wins) / len(trades) * 100, + "avg_pnl": sum(trades) / len(trades), "trades": trade_details} def to_entry(cond_dict): @@ -155,11 +161,12 @@ def mine(market="a", regimes=None): passed_params = [] for tp, sl, mh in [(20, 10, 40), (25, 10, 45), (30, 12, 50), (15, 8, 35)]: r = _simulate_verify(market, rg, panel, c, tp, sl, mh) - if r and r[1] >= 50 and r[2] > 0: - passed_params.append((tp, sl, mh, *r)) + if r and r["win_rate"] >= 50 and r["avg_pnl"] > 0: + passed_params.append((tp, sl, mh, r)) if passed_params: - best = max(passed_params, key=lambda x: x[5]) # (tp,sl,mh,tn,twr,tavg) -> tavg=index5 - tp, sl, mh, tn, twr, tavg = best + best = max(passed_params, key=lambda x: x[3]["avg_pnl"]) + tp, sl, mh, rd = best + tn, twr, tavg = rd["n"], rd["win_rate"], rd["avg_pnl"] if twr >= 50 and tavg > 0: cand = { "regime": rg, "market": market, "group": "B", "status": "verified", @@ -167,6 +174,7 @@ def mine(market="a", regimes=None): "avg60": avg, "excess_pp": extra, "sim_trades": tn, "sim_win_rate": round(twr, 1), "sim_avg_pnl": round(tavg, 2), "sim_tp": tp, "sim_sl": sl, "sim_maxh": mh, + "trades": rd.get("trades", []), "hypothesis": f"[{rg}] 由果及因{nf}因子: {list(cond.keys())} → 大涨率{rate}%(基线+{extra}pp)", } out["candidates"].append(cand)