fix: 资格基准按市场区分——港股用下跌市时段基准(A股仍全年),修复港股策略bench误用A股基准
This commit is contained in:
@@ -651,7 +651,10 @@ def api_research_strategies():
|
||||
from strategy_qualify import get_benchmarks as _qbench, evaluate_all_regimes as _qeval, is_available as _qavail, load_availability as _qload
|
||||
except Exception:
|
||||
_qbench = _qeval = _qavail = _qload = None
|
||||
_qbench_data = _qbench() if _qbench else {}
|
||||
# 2026-08-16 基准按市场:A股=全年大盘,港股=下跌市时段基准(老莫确认口径)
|
||||
_qbench_a = _qbench('a') if _qbench else {}
|
||||
_qbench_hk = _qbench('hk') if _qbench else {}
|
||||
_qbench_data = _qbench_a # 默认 A股(兼容旧逻辑)
|
||||
pt = request.args.get('period_tag')
|
||||
strats = list_strategies(period_tag=pt)
|
||||
# 2026-08-13 温区自适应:为每个策略附加各温区表现(strategy_regime_perf)
|
||||
@@ -797,7 +800,8 @@ def api_research_strategies():
|
||||
s['best_regime'] = _best_regime_map.get(s['version'])
|
||||
# 2026-08-16 资格评估(标准A)——per-regime,策略可适应多个温区
|
||||
_mkt_v = (s.get('market') or 'a') if (s.get('market') or 'a') != 'all' else 'a'
|
||||
_quals = _qeval(s['version'], _mkt_v, bench=_qbench_data) if _qeval else {}
|
||||
_qbench_for_mkt = _qbench_hk if _mkt_v == 'hk' else _qbench_a
|
||||
_quals = _qeval(s['version'], _mkt_v, bench=_qbench_for_mkt) if _qeval else {}
|
||||
s['qualification'] = {}
|
||||
for _rg, _q in _quals.items():
|
||||
s['qualification'][_rg] = {
|
||||
@@ -805,8 +809,8 @@ def api_research_strategies():
|
||||
'short_ok': _q.get('short_ok'),
|
||||
'cagr_10y': _q.get('cagr_10y'), 'cagr_2y': _q.get('cagr_2y'),
|
||||
'cagr_1y': _q.get('cagr_1y'),
|
||||
'bench_10y': _qbench_data.get('10y'), 'bench_2y': _qbench_data.get('2y'),
|
||||
'bench_1y': _qbench_data.get('1y'),
|
||||
'bench_10y': _qbench_for_mkt.get('10y'), 'bench_2y': _qbench_for_mkt.get('2y'),
|
||||
'bench_1y': _qbench_for_mkt.get('1y'),
|
||||
}
|
||||
# ── 2026-08-16 资格判定用【策略自身适应温区 best_regime】的 qualification ──
|
||||
# (bug修复:原用当前市场温区,趋势市策略在当前温区(如trend_down)无资格数据→误判不合格)
|
||||
@@ -848,7 +852,7 @@ def api_research_strategies():
|
||||
s['state'] = 'unavailable'
|
||||
s['state_reason'] = '长期不合格(10y适应温区年化%s%%<大盘%s%%)' % (
|
||||
round(_cur_regime_q['cagr_10y'], 1) if _cur_regime_q and _cur_regime_q.get('cagr_10y') is not None else '?',
|
||||
_qbench_data.get('10y'))
|
||||
_qbench_for_mkt.get('10y'))
|
||||
elif _qual_ok_2:
|
||||
s['state'] = 'available'
|
||||
s['state_reason'] = '长期+近期达标,待当下确认'
|
||||
@@ -864,11 +868,11 @@ def api_research_strategies():
|
||||
if not _m_ok and _l_ok:
|
||||
s['qual_warning'] = '⚠️近期转差: 2y年化%s%%<大盘%s%%' % (
|
||||
round(_cur_regime_q['cagr_2y'], 1) if _cur_regime_q.get('cagr_2y') is not None else '?',
|
||||
_qbench_data.get('2y'))
|
||||
_qbench_for_mkt.get('2y'))
|
||||
if _cur_regime_q and not s.get('manual_available') and _s_ok:
|
||||
s['qual_warning'] = '🔄近期回升: 1y年化%s%%>大盘%s%%,可考虑重新启用' % (
|
||||
round(_cur_regime_q['cagr_1y'], 1) if _cur_regime_q.get('cagr_1y') is not None else '?',
|
||||
_qbench_data.get('1y'))
|
||||
_qbench_for_mkt.get('1y'))
|
||||
|
||||
# 2026-08-13 关键修复:激活策略必须始终在列表中(即使该 period 无回测记录)
|
||||
# 否则 2y 等默认周期下激活策略缺失(只显示 v_oversold)。
|
||||
|
||||
Reference in New Issue
Block a user