feat: 普适指标重构——跨独立年份有效性(有效年占比×覆盖因子)+特例剔除检验(leave1),体现非特例宗旨

This commit is contained in:
xxm
2026-08-17 01:22:17 +08:00
parent a42a80827a
commit 4a78664f72
2 changed files with 43 additions and 13 deletions
+11 -5
View File
@@ -60,7 +60,8 @@ def _compute_regime_winrates_cached(pt, _approx_univ):
for _r in _c.execute(
"SELECT strategy, market, regime, period_tag, trades, win_rate, avg_pnl, "
"avg_hold_days, total_return_pct, cagr_pct, portfolio_max_dd_pct, capital_final, "
"positions_taken, sharpe_ratio, profit_factor, universality_months, universality_score "
"positions_taken, sharpe_ratio, profit_factor, universality_months, universality_years, "
"universality_valid_years, universality_score, universality_leave1 "
"FROM strategy_regime_perf_by_period "
"WHERE period_tag=? ORDER BY strategy, market, regime",
(_pt_use,)).fetchall():
@@ -73,7 +74,10 @@ def _compute_regime_winrates_cached(pt, _approx_univ):
_sh_v = _r[13]
_pf_v = _r[14]
_umon = _r[15]
_uscore = _r[16]
_uyears = _r[16]
_uvalid = _r[17]
_uscore = _r[18]
_uleave1 = _r[19]
_regime_winrates.setdefault(_ver, {})[_reg] = {
"trades": _r[4], "win_rate": _r[5], "avg_pnl": _r[6],
"avg_hold_days": _r[7],
@@ -86,7 +90,7 @@ def _compute_regime_winrates_cached(pt, _approx_univ):
"portfolio_max_dd_pct": _dd_v, "capital_final": _cf_v,
"positions_taken": _pt_v, "sharpe_ratio": _sh_v,
"profit_factor": _pf_v},
"universality": _approx_univ(_ver, _reg, _r[4], _umon, _uscore),
"universality": _approx_univ(_ver, _reg, _r[4], _umon, _uscore, _uyears, _uvalid, _uleave1),
}
_c.close()
except Exception:
@@ -628,11 +632,13 @@ def get_tracking():
@app.route("/api/research/strategies")
def api_research_strategies():
"""策略版本列表(含回测结果摘要,支持 period_tag 区间过滤)"""
def _approx_regime_universality(strategy, regime, trades, umon=None, uscore=None):
def _approx_regime_universality(strategy, regime, trades, umon=None, uscore=None, uyears=None, uvalid=None, uleave1=None):
"""温区级普适:优先用预计算真实值(trades entry_date 去重月份/温区总月份),
缺失时退回旧近似(信号数÷3估算,2026-08-16 修复——原估算对集中信号虚高)"""
if umon is not None and uscore is not None:
return {"months": umon, "score": uscore, "regime_total_months": 0}
return {"months": umon, "score": uscore, "years": uyears or 0,
"valid_years": uvalid or 0, "leave1_avg": uleave1,
"regime_total_months": 0}
try:
import sqlite3 as _sq6
_c6 = _sq6.connect(str(DATA_DIR / "mofin.db"), timeout=10)