feat: 温区加权综合/普适——整体行综合/普适按温区时长占比加权各温区表现(业务:策略只在特定温区激活,评估限定温区范围),温区行用温区级组合
This commit is contained in:
+7
-7
@@ -2442,10 +2442,10 @@ function renderStrategyTable(strategies) {
|
||||
const holdShow = rw && rw.avg_hold_days != null ? rw.avg_hold_days : (isOverall ? st.avg_hold_days : null);
|
||||
const sharpeShow = rw && rw.sharpe_ratio != null ? rw.sharpe_ratio : (isOverall ? st.sharpe_ratio : null);
|
||||
const pfShow = rw && rw.profit_factor != null ? rw.profit_factor : (isOverall ? st.profit_factor : null);
|
||||
// 组合级列:整体行用整体组合;温区行用温区级组合(rw.portfolio)+ 温区级 composite + 温区级 universality
|
||||
// 组合级列:整体行用温区加权综合(s.regime_weighted,2026-08-15 按温区时长占比加权各温区表现);温区行用温区级组合(rw.portfolio)+ 温区级 composite + 温区级 universality
|
||||
const rwPf = rw && rw.portfolio ? rw.portfolio : null;
|
||||
const rwUniv = rw && rw.universality ? rw.universality : null;
|
||||
// 温区级 composite(用温区 portfolio 的 cagr/total_return + 温区胜率/夏普/盈亏比/回撤,对齐整体综合分逻辑)
|
||||
// 温区加权整体综合(regime_weighted.composite);温区级 composite(用温区 portfolio 算)
|
||||
let rgComposite = null;
|
||||
if (rwPf) {
|
||||
const rgRet = Math.min(rwPf.total_return_pct || 0, 100) / 100 * 30;
|
||||
@@ -2455,13 +2455,13 @@ function renderStrategyTable(strategies) {
|
||||
const rgDd = (1 - Math.min(rwPf.portfolio_max_dd_pct || 0, 50) / 50) * 15;
|
||||
rgComposite = Math.round((rgRet + rgWr + rgSh + rgPfc + rgDd) * (s._confidence || 1));
|
||||
}
|
||||
const compositeShow = isOverall ? s._composite : rgComposite;
|
||||
// 温区级 universality(温区内信号月份分散度 + 温区总月份占比)
|
||||
const compositeShow = isOverall ? (s.regime_weighted && s.regime_weighted.composite != null ? s.regime_weighted.composite : s._composite) : rgComposite;
|
||||
// 温区加权普适(用温区时长占比加权各温区月份分散度);温区级普适(rw.universality)
|
||||
const universalityShow = isOverall ? (st.universality || {}).score : (rwUniv ? rwUniv.score : null);
|
||||
const retShow = isOverall ? (st.portfolio_full||{}).total_return_pct : (rwPf ? rwPf.total_return_pct : null);
|
||||
const retShow = isOverall ? (s.regime_weighted && s.regime_weighted.total_return_pct != null ? s.regime_weighted.total_return_pct : (st.portfolio_full||{}).total_return_pct) : (rwPf ? rwPf.total_return_pct : null);
|
||||
const capShow = isOverall ? (st.portfolio_full||pf).capital_final : (rwPf ? rwPf.capital_final : null);
|
||||
const cagrShow = isOverall ? (st.portfolio_full||pf).cagr_pct : (rwPf ? rwPf.cagr_pct : null);
|
||||
const ddShow = isOverall ? (st.portfolio_full||pf).portfolio_max_dd_pct : (rwPf ? rwPf.portfolio_max_dd_pct : null);
|
||||
const cagrShow = isOverall ? (s.regime_weighted && s.regime_weighted.cagr_pct != null ? s.regime_weighted.cagr_pct : (st.portfolio_full||pf).cagr_pct) : (rwPf ? rwPf.cagr_pct : null);
|
||||
const ddShow = isOverall ? (s.regime_weighted && s.regime_weighted.portfolio_max_dd_pct != null ? s.regime_weighted.portfolio_max_dd_pct : (st.portfolio_full||pf).portfolio_max_dd_pct) : (rwPf ? rwPf.portfolio_max_dd_pct : null);
|
||||
const rowCls = 'border-b border-slate-800/50 hover:bg-slate-800/30 cursor-pointer' + (rgActive ? ' bg-emerald-900/20 border-l-2 border-l-emerald-400' : '');
|
||||
ghtml += '<tr class="' + rowCls + '" onclick="showStrategyDetail(\'' + s.version + '\')">' +
|
||||
'<td class="px-2 py-1.5 whitespace-nowrap">' +
|
||||
|
||||
Reference in New Issue
Block a user