feat: 温区加权综合/普适——整体行综合/普适按温区时长占比加权各温区表现(业务:策略只在特定温区激活,评估限定温区范围),温区行用温区级组合
This commit is contained in:
@@ -629,6 +629,47 @@ def api_research_strategies():
|
||||
except Exception:
|
||||
pass
|
||||
for s in strats:
|
||||
# 2026-08-15 温区加权综合/普适:整体行的综合/普适 = 按温区时长占比加权各温区表现
|
||||
# (业务逻辑:策略只在特定温区激活,评估应该限定在温区范围才值得参考)
|
||||
_rws = _regime_winrates.get(s['version'], {})
|
||||
if _rws:
|
||||
_total_weight = sum((r.get('portfolio') or {}).get('total_return_pct', 0) or 0 for r in _rws.values())
|
||||
if _total_weight > 0:
|
||||
_w_cagr = sum(
|
||||
((r.get('portfolio') or {}).get('total_return_pct', 0) or 0) / _total_weight *
|
||||
((r.get('portfolio') or {}).get('cagr_pct', 0) or 0)
|
||||
for r in _rws.values())
|
||||
_w_ret = sum(
|
||||
((r.get('portfolio') or {}).get('total_return_pct', 0) or 0) / _total_weight *
|
||||
((r.get('portfolio') or {}).get('total_return_pct', 0) or 0)
|
||||
for r in _rws.values())
|
||||
_w_dd = sum(
|
||||
((r.get('portfolio') or {}).get('total_return_pct', 0) or 0) / _total_weight *
|
||||
((r.get('portfolio') or {}).get('portfolio_max_dd_pct', 0) or 0)
|
||||
for r in _rws.values())
|
||||
_w_sharpe = sum(
|
||||
((r.get('portfolio') or {}).get('total_return_pct', 0) or 0) / _total_weight *
|
||||
((r.get('portfolio') or {}).get('sharpe_ratio', 0) or 0)
|
||||
for r in _rws.values())
|
||||
_w_pf = sum(
|
||||
((r.get('portfolio') or {}).get('total_return_pct', 0) or 0) / _total_weight *
|
||||
((r.get('portfolio') or {}).get('profit_factor', 0) or 0)
|
||||
for r in _rws.values())
|
||||
# 温区加权综合分(对齐整体综合分公式:ret30+wr20+sharpe20+pf15+dd15)
|
||||
_w_wr = sum(r.get('win_rate', 0) or 0 for r in _rws.values()) / max(len(_rws), 1)
|
||||
_w_composite = round(
|
||||
min(_w_ret, 100) / 100 * 30 + _w_wr / 100 * 20 +
|
||||
min(max(_w_sharpe, 0), 20) / 20 * 20 +
|
||||
min(_w_pf, 5) / 5 * 15 +
|
||||
(1 - min(_w_dd, 50) / 50) * 15)
|
||||
s['regime_weighted'] = {
|
||||
'composite': _w_composite,
|
||||
'cagr_pct': round(_w_cagr, 1),
|
||||
'total_return_pct': round(_w_ret, 1),
|
||||
'portfolio_max_dd_pct': round(_w_dd, 1),
|
||||
'sharpe_ratio': round(_w_sharpe, 2),
|
||||
'profit_factor': round(_w_pf, 2),
|
||||
}
|
||||
s['description'] = STRATEGY_DESCRIPTIONS.get(s['version'], {})
|
||||
# 2026-08-15:STRATEGY_DESCRIPTIONS 缺策略描述时,从 strategy_research 的 name/summary 生成简化描述(说明列不再空)
|
||||
if not s['description'] and (s.get('name') or s.get('summary')):
|
||||
|
||||
Reference in New Issue
Block a user