From 7972f6031e54ec0f214894b6e4345e5e92ed2143 Mon Sep 17 00:00:00 2001 From: hmo Date: Thu, 13 Aug 2026 12:44:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=BF=80=E6=B4=BB=E7=AD=96=E7=95=A5?= =?UTF-8?q?=E5=A7=8B=E7=BB=88=E5=9C=A8=E5=88=97=E8=A1=A8=E4=B8=AD=E2=80=94?= =?UTF-8?q?=E2=80=94=E9=BB=98=E8=AE=A42y=E5=91=A8=E6=9C=9F=E4=B8=8B?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E6=BF=80=E6=B4=BB=E7=AD=96=E7=95=A5(s2=5Fpan?= =?UTF-8?q?ic/v=5Flurk=5Fv3/v=5Fmr/v=5Fmr4/v=5Fmr=5Fsel)=E6=97=A0=E5=9B=9E?= =?UTF-8?q?=E6=B5=8B=E8=AE=B0=E5=BD=95=E8=A2=AB=E8=BF=87=E6=BB=A4,=20?= =?UTF-8?q?=E7=8E=B0=E7=94=A810y=E6=95=B0=E6=8D=AE=E8=A1=A5=E5=85=A8?= =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/server.py b/server.py index 27d2a008..5ff277c0 100644 --- a/server.py +++ b/server.py @@ -569,6 +569,28 @@ def api_research_strategies(): s['regime_winrates'] = _regime_winrates.get(s['version'], {}) # current = 当前温区激活(替代旧的 CURRENT_VERSIONS 硬编码) s['current'] = s['version'] in _active_set + + # 2026-08-13 关键修复:激活策略必须始终在列表中(即使该 period 无回测记录) + # 否则 2y 等默认周期下激活策略缺失(只显示 v_oversold)。 + # 缺失的激活策略用 10y 数据补全 summary_stats + regime_winrates。 + _existing = {s['version'] for s in strats} + _missing_active = sorted(_active_set - _existing) + if _missing_active: + try: + _s10 = list_strategies(period_tag='10y') + _by10 = {s['version']: s for s in _s10} + except Exception: + _by10 = {} + for _mv in _missing_active: + _s10 = _by10.get(_mv) + if not _s10: + continue + _entry = dict(_s10) + _entry['description'] = STRATEGY_DESCRIPTIONS.get(_mv, {}) + _entry['regime_winrates'] = _regime_winrates.get(_mv, {}) + _entry['current'] = True + _entry['note'] = f"({pt or '当前周期'}无回测记录,显示10y数据)" + strats.append(_entry) return jsonify({'strategies': strats, 'regime_active': sorted(_active_set)}) except Exception as e: return jsonify({'error': str(e)}), 500