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