diff --git a/deploy/profile-scripts/regime_perf_by_period.py b/deploy/profile-scripts/regime_perf_by_period.py
index 538cdad0..c3dc0e3b 100644
--- a/deploy/profile-scripts/regime_perf_by_period.py
+++ b/deploy/profile-scripts/regime_perf_by_period.py
@@ -169,7 +169,6 @@ def process_period(conn, market, period_tag):
_univ_score = _univ_years = _univ_valid = _univ_leave1 = 0
_ed_list = [t.get("entry_date", "")[:4] for t in reg_trades if t.get("entry_date")]
if len(_ed_list) >= 5:
- from collections import defaultdict
_yr = defaultdict(list)
for _y, _t in zip(_ed_list, reg_trades):
_yr[_y].append(_t.get("profit_pct", 0))
diff --git a/static/index.html b/static/index.html
index 9ccf3bfe..5b6a184d 100644
--- a/static/index.html
+++ b/static/index.html
@@ -2549,7 +2549,7 @@ function renderStrategyTable(strategies) {
'
' + (st.sizing_slots ? st.sizing_slots + '仓' : '10仓') + (st.conviction_model ? '' : '') + ' | ' +
'' + ((s.description && s.description.title) ? '' : '—') + ' | ' +
cell('composite', compositeShow, v => v + (s._confidence != null && s._confidence < 1 ? '×' + s._confidence.toFixed(2) + '' : ''), 'font-bold text-amber-300') +
- cell('universality_score', universalityShow, v => v + '/' + (isOverall ? (st.universality || {}).months : (rwUniv ? rwUniv.months + '/' + (rwUniv.regime_total_months || '?') : '?')) + '月') +
+ cell('universality_score', universalityShow, v => v + '' + (isOverall ? ('/' + ((st.universality || {}).valid_years || 0) + '年有效') : (rwUniv ? ('/' + (rwUniv.valid_years || 0) + '年有效') : '?')) + '') +
cell('full_return_pct', retShow, v => v + '%', 'font-bold text-amber-300') +
cell('capital_final', capShow, v => '¥' + (v/10000).toFixed(0) + '万') +
cell('cagr_pct', cagrShow, v => v + '%', hl(cagrShow, best.cagr_pct)) +
@@ -2599,6 +2599,7 @@ function renderStrategyTable(strategies) {
const ddV = rwPf ? rwPf.portfolio_max_dd_pct : null;
const univ = rw.universality ? rw.universality.score : null;
const univM = rw.universality ? (rw.universality.months + '/' + (rw.universality.regime_total_months || '?')) : null;
+ const univYears = rw.universality ? ((rw.universality.valid_years || 0) + '/' + (rw.universality.years || 0) + '年') : null;
// ── 2026-08-16 行状态按【该表温区 rg】独立判定(老莫反复强调)──
const qg = (s.qualification || {})[rg];
const rLong = qg && qg.long_ok, rMid = qg && qg.mid_ok, rShort = qg && qg.short_ok;
@@ -2637,7 +2638,7 @@ function renderStrategyTable(strategies) {
cell('composite', comp, v => v, 'font-bold text-amber-300') +
cell('sharpe_ratio', rw.sharpe_ratio != null ? rw.sharpe_ratio : null, v => v) +
cell('profit_factor', rw.profit_factor != null ? rw.profit_factor : null, v => v) +
- cell('universality_score', univ, v => v + '/' + (univM || '?') + '月') +
+ cell('universality_score', univ, v => v + '' + (univYears || '') + '') +
cell('portfolio_max_dd_pct', ddV, v => v + '%', '') +
' | ';
};