Эх сурвалжийг харах

feat(web-app): 扩展债/股/多资产看板与利差/供需/基本面数据更新

- 新增债-利率利差模块页面
- 更新债(资金面/供需/政策面)、股(美股/港股)、多资产(可转债/衍生品/基金)、基本面需求等模块的 mock 数据与展示
- 调整首页 mock 与 SideNav 导航
ligb 6 өдөр өмнө
parent
commit
bb13b40986

+ 1 - 1
web-app/src/components/SideNav.vue

@@ -1,6 +1,6 @@
 <template>
   <aside class="sidebar">
-    <div class="sb-label">导航 · 单列树</div>
+    <div class="sb-label">导航</div>
 
     <template v-if="state.topMenus.length">
       <div

+ 41 - 43
web-app/src/views/bond/funding/data.js

@@ -77,7 +77,7 @@ async function loadLatestByCode(code, list) {
 
 // ===== Mock 兜底数据 =====
 
-// DR007 日度(近 5 年)
+// DR007 日度(近 5 年,底稿末值 2026-09-29 = 1.40028)
 function mockDr007() {
   const arr = []
   const events = [
@@ -89,27 +89,25 @@ function mockDr007() {
     { date: '2024-07-22', v: 1.65 },
     { date: '2024-09-27', v: 1.55 },
     { date: '2025-05-08', v: 1.45 },
-    { date: '2026-09-30', v: 1.40 },
+    { date: '2026-09-29', v: 1.40028 },
   ]
   const start = new Date('2022-01-01')
-  const end = new Date('2026-09-30')
+  const end = new Date('2026-09-29')
   for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {
     let cv = 2.10
     for (const ev of events) {
       if (new Date(ev.date) <= d) cv = ev.v
     }
     if (d.getDay() === 0 || d.getDay() === 6) continue
-    // 增加随机扰动
-    cv = +(cv + (Math.random() - 0.5) * 0.10).toFixed(2)
     const y = d.getFullYear()
     const m = String(d.getMonth() + 1).padStart(2, '0')
     const dd = String(d.getDate()).padStart(2, '0')
-    arr.push([`${y}-${m}-${dd}`, Math.max(1.0, Math.min(2.5, cv))])
+    arr.push([`${y}-${m}-${dd}`, +cv.toFixed(5)])
   }
   return arr
 }
 
-// Shibor 3M 日度
+// Shibor 3M 日度(底稿末值 2026-09-29 ≈ 1.43)
 function mockShibor3M() {
   const arr = []
   const events = [
@@ -121,21 +119,20 @@ function mockShibor3M() {
     { date: '2024-12-31', v: 1.70 },
     { date: '2025-06-30', v: 1.55 },
     { date: '2025-12-31', v: 1.50 },
-    { date: '2026-09-30', v: 1.45 },
+    { date: '2026-09-29', v: 1.4300 },
   ]
   const start = new Date('2022-01-01')
-  const end = new Date('2026-09-30')
+  const end = new Date('2026-09-29')
   for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {
     let cv = 2.40
     for (const ev of events) {
       if (new Date(ev.date) <= d) cv = ev.v
     }
     if (d.getDay() === 0 || d.getDay() === 6) continue
-    cv = +(cv + (Math.random() - 0.5) * 0.08).toFixed(2)
     const y = d.getFullYear()
     const m = String(d.getMonth() + 1).padStart(2, '0')
     const dd = String(d.getDate()).padStart(2, '0')
-    arr.push([`${y}-${m}-${dd}`, Math.max(1.0, Math.min(3.0, cv))])
+    arr.push([`${y}-${m}-${dd}`, +cv.toFixed(5)])
   }
   return arr
 }
@@ -432,44 +429,45 @@ function mockPsl() {
   ]
 }
 
-// 买断式逆回购月度净投放(6m + 3m)
-function mockRepo6mNet() {
+// 买断式逆回购月度余额(6m / 3m,亿元)
+// 2024-10 工具落地后余额持续累积,2026-08 起进入压降阶段。
+function mockRepo6mBal() {
   return [
-    ['2024-10-31', 5000], ['2024-11-30', 3000], ['2024-12-31', 3000],
-    ['2025-01-31', 3000], ['2025-02-28', 2500], ['2025-03-31', 2000],
-    ['2025-04-30', 500], ['2025-05-31', 500], ['2025-06-30', -500],
-    ['2025-07-31', -1000], ['2025-08-31', -500], ['2025-09-30', -500],
-    ['2025-10-31', -500], ['2025-11-30', -500], ['2025-12-31', -500],
-    ['2026-01-31', -500], ['2026-02-28', -200], ['2026-03-31', -300],
-    ['2026-04-30', -300], ['2026-05-31', -200], ['2026-06-30', -200],
-    ['2026-07-31', -200], ['2026-08-31', -100], ['2026-09-30', -100],
+    ['2024-10-31', 5000], ['2024-11-30', 8000], ['2024-12-31', 11000],
+    ['2025-01-31', 14000], ['2025-02-28', 16500], ['2025-03-31', 18500],
+    ['2025-04-30', 19500], ['2025-05-31', 20000], ['2025-06-30', 19500],
+    ['2025-07-31', 18500], ['2025-08-31', 18000], ['2025-09-30', 17500],
+    ['2025-10-31', 17000], ['2025-11-30', 16500], ['2025-12-31', 16000],
+    ['2026-01-31', 15000], ['2026-02-28', 14000], ['2026-03-31', 13000],
+    ['2026-04-30', 12500], ['2026-05-31', 12000], ['2026-06-30', 11500],
+    ['2026-07-31', 11000], ['2026-08-31', 10000], ['2026-09-30', 5000],
   ]
 }
-function mockRepo3mNet() {
+function mockRepo3mBal() {
   return [
-    ['2024-11-30', 3000], ['2024-12-31', 2500],
-    ['2025-01-31', 2500], ['2025-02-28', 2500], ['2025-03-31', 2000],
-    ['2025-04-30', 500], ['2025-05-31', 200], ['2025-06-30', -200],
-    ['2025-07-31', -500], ['2025-08-31', -300], ['2025-09-30', -200],
-    ['2025-10-31', -200], ['2025-11-30', -200], ['2025-12-31', -200],
-    ['2026-01-31', -300], ['2026-02-28', -200], ['2026-03-31', -300],
-    ['2026-04-30', -300], ['2026-05-31', -200], ['2026-06-30', -200],
-    ['2026-07-31', -200], ['2026-08-31', -100], ['2026-09-30', -100],
+    ['2024-10-31', 3000], ['2024-11-30', 6000], ['2024-12-31', 8500],
+    ['2025-01-31', 11000], ['2025-02-28', 13500], ['2025-03-31', 15500],
+    ['2025-04-30', 16000], ['2025-05-31', 16200], ['2025-06-30', 16000],
+    ['2025-07-31', 15500], ['2025-08-31', 15200], ['2025-09-30', 15000],
+    ['2025-10-31', 14800], ['2025-11-30', 14500], ['2025-12-31', 14000],
+    ['2026-01-31', 13000], ['2026-02-28', 12000], ['2026-03-31', 11000],
+    ['2026-04-30', 10500], ['2026-05-31', 10000], ['2026-06-30', 9000],
+    ['2026-07-31', 7000], ['2026-08-31', 5000], ['2026-09-30', 5000],
   ]
 }
 
-// 国债净买入额月度
+// 国债净买入额月度(亿元,央行口径,底稿 2026-08=500)
 function mockBondBuy() {
   return [
-    ['2024-07-31', 800], ['2024-08-31', 1200], ['2024-09-30', 1500],
-    ['2024-10-31', 1800], ['2024-11-30', 2200], ['2024-12-31', 2500],
-    ['2025-01-31', 2800], ['2025-02-28', 3000], ['2025-03-31', 3200],
-    ['2025-04-30', 3000], ['2025-05-31', 2800], ['2025-06-30', 2500],
-    ['2025-07-31', 2300], ['2025-08-31', 2100], ['2025-09-30', 2000],
-    ['2025-10-31', 1900], ['2025-11-30', 1800], ['2025-12-31', 1700],
-    ['2026-01-31', 1600], ['2026-02-28', 1500], ['2026-03-31', 1400],
-    ['2026-04-30', 1300], ['2026-05-31', 1200], ['2026-06-30', 1100],
-    ['2026-07-31', 1000], ['2026-08-31', 900],
+    ['2024-08-31', 2000], ['2024-09-30', 2400], ['2024-10-31', 2600],
+    ['2024-11-30', 2800], ['2024-12-31', 3000],
+    ['2025-01-31', 3200], ['2025-02-28', 3000], ['2025-03-31', 2800],
+    ['2025-04-30', 2600], ['2025-05-31', 2400], ['2025-06-30', 2200],
+    ['2025-07-31', 2000], ['2025-08-31', 1800], ['2025-09-30', 1600],
+    ['2025-10-31', 1400], ['2025-11-30', 1200], ['2025-12-31', 1100],
+    ['2026-01-31', 1000], ['2026-02-28',  900], ['2026-03-31',  800],
+    ['2026-04-30',  800], ['2026-05-31',  700], ['2026-06-30',  700],
+    ['2026-07-31',  600], ['2026-08-31',  500], ['2026-09-30',  400],
   ]
 }
 
@@ -478,9 +476,9 @@ const mock = {
   shibor3m: { name: 'Shibor:3M',                   unit: '%',    source: '全国银行间同业拆借中心', code: 'M0010042', series: mockShibor3M() },
   mlf:      { name: 'MLF期末余额',                  unit: '亿元', source: '中国人民银行',         code: 'M5515072', series: mockMlf() },
   psl:      { name: 'PSL期末余额',                  unit: '亿元', source: '中国人民银行',         code: 'M5528822', series: mockPsl() },
-  repo6m:   { name: '买断式逆回购:6个月·月度净投放', unit: '亿元', source: '中国人民银行',         code: 's4',       series: mockRepo6mNet() },
-  repo3m:   { name: '买断式逆回购:3个月·月度净投放', unit: '亿元', source: '中国人民银行',         code: 's3',       series: mockRepo3mNet() },
-  bondBuy:  { name: '国债净买入额:1个月',            unit: '亿元', source: 'Wind',                code: 'Y9767477', series: mockBondBuy() },
+  repo6m:   { name: '买断式逆回购:6个月·期末余额', unit: '亿元', source: '中国人民银行',         code: 's4',       series: mockRepo6mBal() },
+  repo3m:   { name: '买断式逆回购:3个月·期末余额', unit: '亿元', source: '中国人民银行',         code: 's3',       series: mockRepo3mBal() },
+  bondBuy:  { name: '国债净买入额:1个月·月度净买入', unit: '亿元', source: 'Wind',                code: 'Y9767477', series: mockBondBuy() },
 }
 
 function mockSeries(key) { return mock[key]?.series || [] }

+ 15 - 14
web-app/src/views/bond/funding/index.vue

@@ -117,8 +117,8 @@
     <section class="section">
       <div class="section-hd">
         <span class="dot"></span>
-        <h2>买断式逆回购 · 月度净投放规模</h2>
-        <span class="meta">月度 · 中国人民银行</span>
+        <h2>买断式逆回购 · 期末余额</h2>
+        <span class="meta">月度 · 中国人民银行 · 口径:余额</span>
         <span class="meta-spacer"></span>
         <span class="meta">最新 6m {{ formatYi(repo6mLatest) }} · 3m {{ formatYi(repo3mLatest) }} 亿元</span>
       </div>
@@ -127,7 +127,7 @@
           <div class="card-head">
             <div class="title">
               <span class="ic">图</span>
-              <span class="title-text">买断式逆回购 · 6m + 3m 月度净投放</span>
+              <span class="title-text">买断式逆回购 · 6m + 3m 期末余额(口径:余额)</span>
             </div>
           </div>
           <div class="card-body">
@@ -144,13 +144,13 @@
           <div class="card-body">
             <div class="kv-list">
               <div class="kv"><span class="k">6m 编码</span><span class="v">s4</span></div>
-              <div class="kv"><span class="k">6m 最新净投放</span><span class="v strong">{{ formatYi(repo6mLatest) }} 亿元</span></div>
+              <div class="kv"><span class="k">6m 最新余额</span><span class="v strong">{{ formatYi(repo6mLatest) }} 亿元</span></div>
               <div class="kv"><span class="k">3m 编码</span><span class="v">s3</span></div>
-              <div class="kv"><span class="k">3m 最新净投放</span><span class="v strong">{{ formatYi(repo3mLatest) }} 亿元</span></div>
-              <div class="kv"><span class="k">合计</span><span class="v strong">{{ formatYi(repoTotal) }} 亿元</span></div>
+              <div class="kv"><span class="k">3m 最新余额</span><span class="v strong">{{ formatYi(repo3mLatest) }} 亿元</span></div>
+              <div class="kv"><span class="k">合计余额</span><span class="v strong">{{ formatYi(repoTotal) }} 亿元</span></div>
             </div>
             <div class="note">
-              买断式逆回购是 2024 年新增的中长期流动性投放工具,央行通过 6 个月 / 3 个月期限搭配,丰富投放渠道;正数为净投放、负数为净回笼。{{ repoComment }}。
+              买断式逆回购是 2024 年新增的中长期流动性投放工具,央行通过 6 个月 / 3 个月期限搭配,丰富投放渠道;本页采用「余额」口径(与国债净买入「净买入」口径不同)。{{ repoComment }}。
             </div>
           </div>
         </div>
@@ -162,7 +162,7 @@
       <div class="section-hd">
         <span class="dot"></span>
         <h2>国债买卖 · 月度净买入规模</h2>
-        <span class="meta">月度 · Wind</span>
+        <span class="meta">月度 · Wind · 口径:净买入</span>
         <span class="meta-spacer"></span>
         <span class="meta">最新 {{ formatYi(bondBuyLatest) }} 亿元 · {{ formatDate(bondBuyLatest?.date) }}</span>
       </div>
@@ -171,7 +171,7 @@
           <div class="card-head">
             <div class="title">
               <span class="ic">图</span>
-              <span class="title-text">国债月度净买入额</span>
+              <span class="title-text">国债月度净买入额(口径:净买入)</span>
             </div>
           </div>
           <div class="card-body">
@@ -190,12 +190,13 @@
               <div class="kv"><span class="k">指标编码</span><span class="v">Y9767477</span></div>
               <div class="kv"><span class="k">数据源</span><span class="v">Wind</span></div>
               <div class="kv"><span class="k">频率</span><span class="v">月度</span></div>
-              <div class="kv"><span class="k">起始日期</span><span class="v">2024-07-31</span></div>
+              <div class="kv"><span class="k">口径</span><span class="v">月度净买入</span></div>
+              <div class="kv"><span class="k">起始日期</span><span class="v">2024-08-31</span></div>
               <div class="kv"><span class="k">最近观测</span><span class="v">{{ formatDate(bondBuyLatest?.date) }}</span></div>
               <div class="kv"><span class="k">最新读数</span><span class="v strong">{{ formatYi(bondBuyLatest) }} 亿元</span></div>
             </div>
             <div class="note">
-              央行于 2024 年 8 月起开展国债买卖操作,作为流动性管理工具与货币政策框架的有益补充。
+              央行于 2024 年 8 月起开展国债买卖操作,作为流动性管理工具与货币政策框架的有益补充;本页采用「净买入」口径。
             </div>
           </div>
         </div>
@@ -296,9 +297,9 @@ const kpis = computed(() => ([
   { label: 'Shibor 3M', icon: '🌀', value: shibor3mLatest.value?.value, unit: '%', date: formatDate(shibor3mLatest.value?.date), tag: '中端', sign: false },
   { label: 'MLF 余额', icon: '💵', value: mlfLatest.value?.value, unit: '亿元', date: formatDate(mlfLatest.value?.date), tag: '中期投放', sign: true },
   { label: 'PSL 余额', icon: '🧱', value: pslLatest.value?.value, unit: '亿元', date: formatDate(pslLatest.value?.date), tag: '政策性投放', sign: true },
-  { label: '买断式逆回购 6M', icon: '🔁', value: repo6mLatest.value?.value, unit: '亿元', date: formatDate(repo6mLatest.value?.date), tag: '月度净投放', sign: true },
-  { label: '买断式逆回购 3M', icon: '🔂', value: repo3mLatest.value?.value, unit: '亿元', date: formatDate(repo3mLatest.value?.date), tag: '月度净投放', sign: true },
-  { label: '国债净买入', icon: '📥', value: bondBuyLatest.value?.value, unit: '亿元', date: formatDate(bondBuyLatest.value?.date), tag: '央行买债', sign: true },
+  { label: '买断式逆回购 6M', icon: '🔁', value: repo6mLatest.value?.value, unit: '亿元', date: formatDate(repo6mLatest.value?.date), tag: '余额', sign: true },
+  { label: '买断式逆回购 3M', icon: '🔂', value: repo3mLatest.value?.value, unit: '亿元', date: formatDate(repo3mLatest.value?.date), tag: '余额', sign: true },
+  { label: '国债净买入', icon: '📥', value: bondBuyLatest.value?.value, unit: '亿元', date: formatDate(bondBuyLatest.value?.date), tag: '净买入', sign: true },
   { label: 'MLF+PSL 合计', icon: '🏦', value: mlfPslSum.value, unit: '亿元', date: formatDate(mlfLatest.value?.date), tag: '中长期投放', sign: true },
 ]))
 

+ 6 - 4
web-app/src/views/bond/policy/index.vue

@@ -124,7 +124,7 @@
         <h2>央行历次降准 · 大型机构存款准备金率走势</h2>
         <span class="meta">月度 · 中国人民银行</span>
         <span class="meta-spacer"></span>
-        <span class="meta">当前 {{ formatPct2(rrrLatest) }} · 较 2008 年累计下调 {{ rrrCumBp }}bp</span>
+        <span class="meta">当前 {{ formatPct2(rrrLatest) }} · 较 2019/09 累计下调 {{ rrrCumBp }}bp</span>
       </div>
       <div class="card-grid cols-2-1">
         <div class="card">
@@ -362,10 +362,12 @@ const govDebtLatest    = computed(() => latestOf(govDebtSeries.value))
 
 const rrrCumBp = computed(() => {
   if (!rrrSeries.value.length || rrrLatest.value == null) return null
-  const first = rrrSeries.value[0][1]
   const last = rrrLatest.value.value
-  if (typeof first !== 'number' || typeof last !== 'number') return null
-  return Math.round((first - last) * 100)
+  if (typeof last !== 'number') return null
+  // 基期:2019-09-16 全面降准后大型机构 RRR = 13.0%
+  // 现行 9.0%,累计下调 400bp 与公开历史一致
+  const baseline = 13.0
+  return Math.round((baseline - last) * 100)
 })
 
 const kpis = computed(() => ([

+ 235 - 0
web-app/src/views/bond/rate-spread/index.vue

@@ -43,6 +43,49 @@
              @click="yieldSel = b">{{ b }}</a>
         </div>
       </div>
+
+      <div class="card-grid cols-1">
+        <div class="card">
+          <div class="card-head">
+            <div class="title">
+              <span class="ic">表</span>
+              <span class="title-text">国债收益率 · 最新值与近 2 年分位数</span>
+            </div>
+            <span class="meta">% · 近 2 年 · Q10 / Q25 / Q50 / Q75 / Q90</span>
+          </div>
+          <div class="card-body">
+            <div class="quantile-table-wrap">
+              <table class="quantile-tbl">
+                <thead>
+                  <tr>
+                    <th class="th-label">期限</th>
+                    <th class="num">最新</th>
+                    <th class="num">Q10</th>
+                    <th class="num">Q25</th>
+                    <th class="num">Q50</th>
+                    <th class="num">Q75</th>
+                    <th class="num">Q90</th>
+                    <th>分位</th>
+                  </tr>
+                </thead>
+                <tbody>
+                  <tr v-for="r in yieldQuantileRows" :key="r.label">
+                    <td class="td-label">{{ r.label }}</td>
+                    <td class="num td-cur">{{ fPct2(r.current) }}</td>
+                    <td class="num">{{ fPct2(r.q10) }}</td>
+                    <td class="num">{{ fPct2(r.q25) }}</td>
+                    <td class="num">{{ fPct2(r.q50) }}</td>
+                    <td class="num">{{ fPct2(r.q75) }}</td>
+                    <td class="num">{{ fPct2(r.q90) }}</td>
+                    <td><span :class="['rank-pill', rankPillCls(r.rank)]">{{ r.rank || '—' }}</span></td>
+                  </tr>
+                </tbody>
+              </table>
+            </div>
+          </div>
+        </div>
+      </div>
+
       <div class="card-grid cols-2-1">
         <div class="card">
           <div class="card-head">
@@ -119,6 +162,49 @@
              @click="spreadSel = b">{{ b }}</a>
         </div>
       </div>
+
+      <div class="card-grid cols-1">
+        <div class="card">
+          <div class="card-head">
+            <div class="title">
+              <span class="ic">表</span>
+              <span class="title-text">3Y 信用利差 · 最新值与近 2 年分位数</span>
+            </div>
+            <span class="meta">% · 近 2 年 · Q10 / Q25 / Q50 / Q75 / Q90</span>
+          </div>
+          <div class="card-body">
+            <div class="quantile-table-wrap">
+              <table class="quantile-tbl">
+                <thead>
+                  <tr>
+                    <th class="th-label">评级</th>
+                    <th class="num">最新</th>
+                    <th class="num">Q10</th>
+                    <th class="num">Q25</th>
+                    <th class="num">Q50</th>
+                    <th class="num">Q75</th>
+                    <th class="num">Q90</th>
+                    <th>分位</th>
+                  </tr>
+                </thead>
+                <tbody>
+                  <tr v-for="r in spreadQuantileRows" :key="r.label">
+                    <td class="td-label">{{ r.label }}</td>
+                    <td class="num td-cur">{{ fPct2(r.current) }}</td>
+                    <td class="num">{{ fPct2(r.q10) }}</td>
+                    <td class="num">{{ fPct2(r.q25) }}</td>
+                    <td class="num">{{ fPct2(r.q50) }}</td>
+                    <td class="num">{{ fPct2(r.q75) }}</td>
+                    <td class="num">{{ fPct2(r.q90) }}</td>
+                    <td><span :class="['rank-pill', rankPillCls(r.rank)]">{{ r.rank || '—' }}</span></td>
+                  </tr>
+                </tbody>
+              </table>
+            </div>
+          </div>
+        </div>
+      </div>
+
       <div class="card-grid cols-2-1">
         <div class="card">
           <div class="card-head">
@@ -193,6 +279,49 @@
              @click="creditTermSel = b">{{ b }}</a>
         </div>
       </div>
+
+      <div class="card-grid cols-1">
+        <div class="card">
+          <div class="card-head">
+            <div class="title">
+              <span class="ic">表</span>
+              <span class="title-text">信用债期限利差(3Y-1Y) · 最新值与近 2 年分位数</span>
+            </div>
+            <span class="meta">% · 近 2 年 · Q10 / Q25 / Q50 / Q75 / Q90</span>
+          </div>
+          <div class="card-body">
+            <div class="quantile-table-wrap">
+              <table class="quantile-tbl">
+                <thead>
+                  <tr>
+                    <th class="th-label">评级</th>
+                    <th class="num">最新</th>
+                    <th class="num">Q10</th>
+                    <th class="num">Q25</th>
+                    <th class="num">Q50</th>
+                    <th class="num">Q75</th>
+                    <th class="num">Q90</th>
+                    <th>分位</th>
+                  </tr>
+                </thead>
+                <tbody>
+                  <tr v-for="r in creditTermQuantileRows" :key="r.label">
+                    <td class="td-label">{{ r.label }}</td>
+                    <td class="num td-cur">{{ fPct2(r.current) }}</td>
+                    <td class="num">{{ fPct2(r.q10) }}</td>
+                    <td class="num">{{ fPct2(r.q25) }}</td>
+                    <td class="num">{{ fPct2(r.q50) }}</td>
+                    <td class="num">{{ fPct2(r.q75) }}</td>
+                    <td class="num">{{ fPct2(r.q90) }}</td>
+                    <td><span :class="['rank-pill', rankPillCls(r.rank)]">{{ r.rank || '—' }}</span></td>
+                  </tr>
+                </tbody>
+              </table>
+            </div>
+          </div>
+        </div>
+      </div>
+
       <div class="card-grid cols-2-1">
         <div class="card">
           <div class="card-head">
@@ -233,6 +362,49 @@
              @click="rateTermSel = b">{{ b }}</a>
         </div>
       </div>
+
+      <div class="card-grid cols-1">
+        <div class="card">
+          <div class="card-head">
+            <div class="title">
+              <span class="ic">表</span>
+              <span class="title-text">利率债期限利差 · 最新值与近 2 年分位数</span>
+            </div>
+            <span class="meta">% · 近 2 年 · Q10 / Q25 / Q50 / Q75 / Q90</span>
+          </div>
+          <div class="card-body">
+            <div class="quantile-table-wrap">
+              <table class="quantile-tbl">
+                <thead>
+                  <tr>
+                    <th class="th-label">期限利差</th>
+                    <th class="num">最新</th>
+                    <th class="num">Q10</th>
+                    <th class="num">Q25</th>
+                    <th class="num">Q50</th>
+                    <th class="num">Q75</th>
+                    <th class="num">Q90</th>
+                    <th>分位</th>
+                  </tr>
+                </thead>
+                <tbody>
+                  <tr v-for="r in rateTermQuantileRows" :key="r.label">
+                    <td class="td-label">{{ r.label }}</td>
+                    <td class="num td-cur">{{ fPct2(r.current) }}</td>
+                    <td class="num">{{ fPct2(r.q10) }}</td>
+                    <td class="num">{{ fPct2(r.q25) }}</td>
+                    <td class="num">{{ fPct2(r.q50) }}</td>
+                    <td class="num">{{ fPct2(r.q75) }}</td>
+                    <td class="num">{{ fPct2(r.q90) }}</td>
+                    <td><span :class="['rank-pill', rankPillCls(r.rank)]">{{ r.rank || '—' }}</span></td>
+                  </tr>
+                </tbody>
+              </table>
+            </div>
+          </div>
+        </div>
+      </div>
+
       <div class="card-grid cols-2-1">
         <div class="card">
           <div class="card-head">
@@ -417,6 +589,17 @@ function rankCls(rank) {
   return 'flat'
 }
 
+function rankPillCls(rank) {
+  if (!rank) return 'rank-flat'
+  if (rank.startsWith('极低')) return 'rank-very-low'
+  if (rank.startsWith('偏低')) return 'rank-low'
+  if (rank.startsWith('中位以下')) return 'rank-mid-low'
+  if (rank.startsWith('中位以上')) return 'rank-mid-high'
+  if (rank.startsWith('偏高')) return 'rank-high'
+  if (rank.startsWith('极高')) return 'rank-very-high'
+  return 'rank-flat'
+}
+
 const kpis = computed(() => ([
   { label: '国债 10Y',  icon: '📈', value: yieldsLatest.value.gz?.['10Y'], unit: '%',
     date: formatDate(yieldsLatest.value.gz?.date), tag: yieldQuantileRows.value.find(r => r.label === '10Y')?.rank || '—',
@@ -668,6 +851,58 @@ const spreadComment = computed(() => {
   font-weight: 600;
 }
 
+/* === 分位数表 === */
+.quantile-table-wrap { overflow-x: auto; }
+.quantile-tbl {
+  width: 100%;
+  border-collapse: separate;
+  border-spacing: 0;
+  font-size: 12px;
+  font-variant-numeric: tabular-nums;
+}
+.quantile-tbl thead th {
+  background: #F5F7FB;
+  color: var(--mut, #6B7A96);
+  font-weight: 600;
+  padding: 8px 10px;
+  border-bottom: 1px solid var(--line, #E4E9F2);
+  text-align: right;
+  white-space: nowrap;
+}
+.quantile-tbl thead th.th-label { text-align: left; }
+.quantile-tbl tbody td {
+  padding: 8px 10px;
+  border-bottom: 1px solid var(--line, #E4E9F2);
+  text-align: right;
+  white-space: nowrap;
+}
+.quantile-tbl tbody tr:last-child td { border-bottom: none; }
+.quantile-tbl tbody tr:hover { background: #FAFBFE; }
+.quantile-tbl .td-label {
+  text-align: left;
+  font-weight: 500;
+  color: var(--ink, #1A2438);
+}
+.quantile-tbl .td-cur {
+  font-weight: 700;
+  color: var(--brand-d, #0E3A96);
+}
+.rank-pill {
+  display: inline-block;
+  padding: 2px 8px;
+  border-radius: 9px;
+  font-size: 11px;
+  font-weight: 600;
+  white-space: nowrap;
+}
+.rank-pill.rank-very-low { background: #D6EBDF; color: #1F5C3E; }
+.rank-pill.rank-low { background: #ECF6F1; color: #2F7A55; }
+.rank-pill.rank-mid-low { background: #F7F9FD; color: #6B7A96; }
+.rank-pill.rank-flat { background: #F7F9FD; color: #6B7A96; }
+.rank-pill.rank-mid-high { background: #FEF1F1; color: #B14A4A; }
+.rank-pill.rank-high { background: #FCE6E6; color: #A63333; }
+.rank-pill.rank-very-high { background: #F8D7D7; color: #8B1F1F; }
+
 .footer {
   padding: 18px 24px 12px;
   color: #98A5BD;

+ 5 - 5
web-app/src/views/bond/supply-demand/data.js

@@ -97,7 +97,7 @@ function mockRateBond() {
     ['2025-05-31',  7000], ['2025-06-30',  9800], ['2025-07-31',  6200], ['2025-08-31',  8000],
     ['2025-09-30',  7300], ['2025-10-31',  4500], ['2025-11-30',  3500], ['2025-12-31',  2700],
     ['2026-01-31',  3800], ['2026-02-28',  2500], ['2026-03-31',  4800], ['2026-04-30',  5500],
-    ['2026-05-31',  7400], ['2026-06-30', 10400], ['2026-07-31',  6500], ['2026-08-31',  8500],
+    ['2026-05-31',  7400], ['2026-06-30', 10400], ['2026-07-31',  6500], ['2026-08-31', 19213],
   ]
   return { issue, mature }
 }
@@ -115,7 +115,7 @@ function mockCreditBond() {
     ['2025-05-31',  6800], ['2025-06-30',  7500], ['2025-07-31',  6300], ['2025-08-31',  8200],
     ['2025-09-30',  7800], ['2025-10-31',  6500], ['2025-11-30',  7200], ['2025-12-31',  5800],
     ['2026-01-31',  6800], ['2026-02-28',  3800], ['2026-03-31',  9200], ['2026-04-30',  7800],
-    ['2026-05-31',  7500], ['2026-06-30',  8200], ['2026-07-31',  7000], ['2026-08-31',  8800],
+    ['2026-05-31',  7500], ['2026-06-30',  8200], ['2026-07-31',  7000], ['2026-08-31',  7971],
   ]
   const mature = [
     ['2023-01-31',  3500], ['2023-02-28',  2200], ['2023-03-31',  4800], ['2023-04-30',  5200],
@@ -128,7 +128,7 @@ function mockCreditBond() {
     ['2025-05-31',  6800], ['2025-06-30',  5500], ['2025-07-31',  4800], ['2025-08-31',  5800],
     ['2025-09-30',  6500], ['2025-10-31',  6200], ['2025-11-30',  6800], ['2025-12-31',  7800],
     ['2026-01-31',  5200], ['2026-02-28',  3500], ['2026-03-31',  6200], ['2026-04-30',  7000],
-    ['2026-05-31',  7500], ['2026-06-30',  6200], ['2026-07-31',  5500], ['2026-08-31',  6500],
+    ['2026-05-31',  7500], ['2026-06-30',  6200], ['2026-07-31',  5500], ['2026-08-31',  6148],
   ]
   return { issue, mature }
 }
@@ -146,7 +146,7 @@ function mockFinBond() {
     ['2025-05-31',  4800], ['2025-06-30',  5200], ['2025-07-31',  4200], ['2025-08-31',  5000],
     ['2025-09-30',  5200], ['2025-10-31',  4500], ['2025-11-30',  5000], ['2025-12-31',  4200],
     ['2026-01-31',  4500], ['2026-02-28',  2800], ['2026-03-31',  6200], ['2026-04-30',  5500],
-    ['2026-05-31',  5200], ['2026-06-30',  5800], ['2026-07-31',  4800], ['2026-08-31',  5500],
+    ['2026-05-31',  5200], ['2026-06-30',  5800], ['2026-07-31',  4800], ['2026-08-31',  5317],
   ]
   const mature = [
     ['2023-01-31',  1800], ['2023-02-28',  1200], ['2023-03-31',  2500], ['2023-04-30',  2800],
@@ -159,7 +159,7 @@ function mockFinBond() {
     ['2025-05-31',  3800], ['2025-06-30',  3000], ['2025-07-31',  2600], ['2025-08-31',  3200],
     ['2025-09-30',  3600], ['2025-10-31',  3400], ['2025-11-30',  3800], ['2025-12-31',  4500],
     ['2026-01-31',  2800], ['2026-02-28',  2000], ['2026-03-31',  3500], ['2026-04-30',  4000],
-    ['2026-05-31',  4200], ['2026-06-30',  3500], ['2026-07-31',  3000], ['2026-08-31',  3800],
+    ['2026-05-31',  4200], ['2026-06-30',  3500], ['2026-07-31',  3000], ['2026-08-31',  1837],
   ]
   return { issue, mature }
 }

+ 8 - 8
web-app/src/views/fundamental/demand/data.js

@@ -436,30 +436,30 @@ const mock = {
       { group: '餐饮', sub: '餐饮消费', s17: 2.6, s18: 2.4, delta: -0.2 },
     ],
   },
-  // §2.4 出口 · 美元 当月同比
+  // §2.4 出口 · 美元 累计同比(用于内需结构截面)
   exportYoy: {
-    name: '中国:出口金额:当月同比(美元)',
+    name: '中国:出口金额:累计同比(美元)',
     windCode: 'M0000607',
     unit: '%', frequency: '月', source: '海关总署',
     series: [
       ['2022-12-31', -9.9], ['2023-03-31', 14.8], ['2023-06-30', -8.3], ['2023-09-30', -2.4],
       ['2023-12-31', 2.3], ['2024-03-31', -3.1], ['2024-06-30', 7.0], ['2024-09-30', 5.9],
       ['2024-12-31', 10.5], ['2025-03-31', 12.2], ['2025-06-30', 5.7], ['2025-09-30', 8.2],
-      ['2025-12-31', 6.4], ['2026-02-28', 39.6], ['2026-03-31', 2.5], ['2026-04-30', 14.0],
-      ['2026-05-31', 19.2], ['2026-06-30', 26.9], ['2026-07-31', 23.9], ['2026-08-31', 25.0],
+      ['2025-12-31', 6.4], ['2026-02-28', 21.8], ['2026-03-31', 14.7], ['2026-04-30', 14.5],
+      ['2026-05-31', 15.5], ['2026-06-30', 17.5], ['2026-07-31', 18.5], ['2026-08-31', 19.3],
     ],
   },
-  // §2.4 进口 · 美元 当月同比
+  // §2.4 进口 · 美元 累计同比
   importYoy: {
-    name: '中国:进口金额:当月同比(美元)',
+    name: '中国:进口金额:累计同比(美元)',
     windCode: 'M0000609',
     unit: '%', frequency: '月', source: '海关总署',
     series: [
       ['2022-12-31', -7.5], ['2023-03-31', -1.4], ['2023-06-30', -6.8], ['2023-09-30', -1.5],
       ['2023-12-31', 0.4], ['2024-03-31', -1.9], ['2024-06-30', -2.6], ['2024-09-30', 0.1],
       ['2024-12-31', 0.8], ['2025-03-31', -4.3], ['2025-06-30', 1.3], ['2025-09-30', 8.0],
-      ['2025-12-31', 6.4], ['2026-02-28', 14.7], ['2026-03-31', 28.4], ['2026-04-30', 25.3],
-      ['2026-05-31', 27.4], ['2026-06-30', 35.8], ['2026-07-31', 27.5], ['2026-08-31', 28.2],
+      ['2025-12-31', 6.4], ['2026-02-28', 20.8], ['2026-03-31', 23.6], ['2026-04-30', 24.1],
+      ['2026-05-31', 24.8], ['2026-06-30', 26.7], ['2026-07-31', 26.8], ['2026-08-31', 27.0],
     ],
   },
   // §2.4 美国 ISM 制造业 PMI

+ 10 - 10
web-app/src/views/fundamental/demand/index.vue

@@ -3,7 +3,7 @@
     <header class="page-hd">
       <div>
         <div class="page-title">需求看板</div>
-        <div class="page-sub">基本面 · 需求 · 投资 / 消费 / 出口 · 数据源 国家统计局 · 海关总署 · Wind · 累计同比 + 当月同比</div>
+        <div class="page-sub">基本面 · 需求 · 投资 / 消费 / 出口 · 数据源 国家统计局 · 海关总署 · Wind · 累计同比</div>
       </div>
       <div class="page-actions">
         <button class="btn" @click="reload" :disabled="loading">
@@ -292,9 +292,9 @@
       <div class="section-hd">
         <span class="dot"></span>
         <h2>需求 · 出口部分</h2>
-        <span class="meta">月度 · 海关总署 · 美元口径</span>
+        <span class="meta">月度 · 海关总署 · 美元口径 · 累计同比 %</span>
         <span class="meta-spacer"></span>
-        <span class="meta">出口当月 {{ formatPct(exportYoyLatest) }} · 进口当月 {{ formatPct(importYoyLatest) }} · ISM {{ formatNum(ismPmiLatest?.value) }}</span>
+        <span class="meta">出口累计 {{ formatPct(exportYoyLatest) }} · 进口累计 {{ formatPct(importYoyLatest) }} · ISM {{ formatNum(ismPmiLatest?.value) }}</span>
       </div>
 
       <div class="card-grid cols-2-1">
@@ -302,7 +302,7 @@
           <div class="card-head">
             <div class="title">
               <span class="ic">图</span>
-              <span class="title-text">出口 vs 进口 · 当月同比</span>
+              <span class="title-text">出口 vs 进口 · 累计同比</span>
             </div>
             <div class="acts">
               <span class="meta tag-r" v-if="exportYoyLatest && importYoyLatest">
@@ -328,16 +328,16 @@
               <div class="kv"><span class="k">数据源</span><span class="v">{{ exportYoyMeta?.source || '海关总署' }}</span></div>
               <div class="kv"><span class="k">频率</span><span class="v">月</span></div>
               <div class="kv"><span class="k">最近观测</span><span class="v">{{ formatDate(exportYoyLatest?.date) }}</span></div>
-              <div class="kv"><span class="k">出口当月</span><span class="v strong">{{ formatPct(exportYoyLatest) }}</span></div>
-              <div class="kv"><span class="k">进口当月</span><span class="v">{{ formatPct(importYoyLatest) }}</span></div>
-              <div class="kv"><span class="k">同比差 (出−进)</span>
+              <div class="kv"><span class="k">出口累计</span><span class="v strong">{{ formatPct(exportYoyLatest) }}</span></div>
+              <div class="kv"><span class="k">进口累计</span><span class="v">{{ formatPct(importYoyLatest) }}</span></div>
+              <div class="kv"><span class="k">累计差 (出−进)</span>
                 <span :class="['v', tradeSpread >= 0 ? 'up' : 'down']">
                   {{ tradeSpread >= 0 ? '+' : '' }}{{ tradeSpread.toFixed(1) }}pct
                 </span>
               </div>
             </div>
             <div class="note">
-              美元口径进出口反映外部需求与外贸顺差变化。{{ tradeComment }}。
+              美元口径进出口累计同比反映外部需求与外贸顺差变化。{{ tradeComment }}。
             </div>
           </div>
         </div>
@@ -592,8 +592,8 @@ onMounted(reload)
 const kpis = computed(() => ([
   { label: '固定资产投资 累计', icon: '🏗️', value: faiYoyLatest.value?.value, unit: '%', date: formatDate(faiYoyLatest.value?.date), tag: '整体投资', sign: true },
   { label: '社零 当月同比', icon: '🛍️', value: retailMomYoyLatest.value?.value, unit: '%', date: formatDate(retailMomYoyLatest.value?.date), tag: '消费动能', sign: true },
-  { label: '出口 美元当月', icon: '🚢', value: exportYoyLatest.value?.value, unit: '%', date: formatDate(exportYoyLatest.value?.date), tag: '外需景气', sign: true },
-  { label: '进口 美元当月', icon: '📦', value: importYoyLatest.value?.value, unit: '%', date: formatDate(importYoyLatest.value?.date), tag: '内需修复', sign: true },
+  { label: '出口 美元累计', icon: '🚢', value: exportYoyLatest.value?.value, unit: '%', date: formatDate(exportYoyLatest.value?.date), tag: '外需景气', sign: true },
+  { label: '进口 美元累计', icon: '📦', value: importYoyLatest.value?.value, unit: '%', date: formatDate(importYoyLatest.value?.date), tag: '内需修复', sign: true },
   { label: '城镇调查失业率', icon: '👥', value: unemploymentLatest.value?.value, unit: '%', date: formatDate(unemploymentLatest.value?.date), tag: '就业压力', sign: false },
 ]))
 

+ 4 - 4
web-app/src/views/home/index.vue

@@ -144,7 +144,7 @@
                 <span class="dot" style="background:#1552D0" />
                 <span class="flag-t">美国 · 历史资产表现</span>
               </div>
-              <span class="chip blue">阶段 3 · 过热</span>
+              <!-- <span class="chip blue">阶段 3 · 过热</span> -->
             </div>
             <RankHeatmap :rows="usRows" :stages="usStages" />
           </div>
@@ -179,7 +179,7 @@
           <div class="tag">占位 · 全宽</div>
         </div>
         <PlaceholderCard title="综合排序建议" subtitle="结合基本面、流动性、资产估值与中微观信息的综合排序(待补充)。">
-          <table class="rank-tbl">
+          <!-- <table class="rank-tbl">
             <thead>
               <tr>
                 <th style="width:40px">排名</th>
@@ -204,7 +204,7 @@
                 <td>{{ (r.weight * 100).toFixed(0) }}%</td>
               </tr>
             </tbody>
-          </table>
+          </table> -->
         </PlaceholderCard>
       </div>
     </section>
@@ -279,7 +279,7 @@ function renderParagraph(text, highlights) {
   highlights.forEach((h) => {
     if (out.includes(h.label)) {
       const cls = h.type === 'up' ? 'hl-up' : 'hl-dn'
-      out = out.replace(h.label, `</b> <b class="${cls}">${h.label} ${h.value}</b> <b>`)
+      out = out.replace(h.label, `<span class="${cls}">${h.label}</span>`)
     }
   })
   return out

+ 0 - 3
web-app/src/views/home/mock.js

@@ -14,9 +14,6 @@ export const STAGES = [
   { id: 6, code: 'VI',  name: '货币扩张', factor: '货币宽松 · 信用收缩 · 增长扩张', color: '#E13B3B' },
 ]
 
-// 各阶段在 2007 年以来的占比(用以描述阶段持续时长)
-export const STAGE_DURATIONS = [18.4, 14.2, 9.5, 16.8, 13.5, 27.6]
-
 // 中国/美国当前周期定位
 export const CYCLE_CN = {
   country: '中国',

+ 122 - 97
web-app/src/views/multiasset/convertible/data.js

@@ -33,67 +33,66 @@ export const BOND_STATS = {
 
 // 近 60 个交易日的日度隐含利差(序列)
 export const BOND_RECENT = [
-  ['2026-06-15', -0.020934],
-  ['2026-06-16', -0.022569],
-  ['2026-06-17', -0.022903],
-  ['2026-06-18', -0.018734],
-  ['2026-06-22', -0.014853],
-  ['2026-06-23', -0.014214],
-  ['2026-06-24', -0.013695],
-  ['2026-06-25', -0.015119],
-  ['2026-06-26', -0.015944],
-  ['2026-06-29', -0.014597],
-  ['2026-06-30', -0.011827],
-  ['2026-07-01', -0.012190],
-  ['2026-07-02', -0.011059],
-  ['2026-07-03', -0.010058],
-  ['2026-07-04', -0.009310],
-  ['2026-07-07', -0.007483],
-  ['2026-07-08', -0.009678],
-  ['2026-07-09', -0.009869],
-  ['2026-07-10', -0.009881],
-  ['2026-07-11', -0.011908],
-  ['2026-07-14', -0.010902],
-  ['2026-07-15', -0.012700],
-  ['2026-07-16', -0.010589],
-  ['2026-07-17', -0.008915],
-  ['2026-07-18', -0.009267],
-  ['2026-07-21', -0.009227],
-  ['2026-07-22', -0.010797],
-  ['2026-07-23', -0.010199],
-  ['2026-07-24', -0.008980],
-  ['2026-07-25', -0.010828],
-  ['2026-07-28', -0.012431],
-  ['2026-07-29', -0.011788],
-  ['2026-07-30', -0.010798],
-  ['2026-07-31', -0.013867],
-  ['2026-08-01', -0.014420],
-  ['2026-08-04', -0.014318],
-  ['2026-08-05', -0.014643],
-  ['2026-08-06', -0.016371],
-  ['2026-08-07', -0.017891],
-  ['2026-08-08', -0.014213],
-  ['2026-08-11', -0.012737],
-  ['2026-08-12', -0.010796],
-  ['2026-08-13', -0.014176],
-  ['2026-08-14', -0.017852],
-  ['2026-08-15', -0.018724],
-  ['2026-08-18', -0.015919],
-  ['2026-08-19', -0.012433],
-  ['2026-08-20', -0.016197],
-  ['2026-08-21', -0.014875],
-  ['2026-08-22', -0.019372],
-  ['2026-08-25', -0.019725],
-  ['2026-08-26', -0.018097],
-  ['2026-08-27', -0.019090],
-  ['2026-08-28', -0.019954],
-  ['2026-08-29', -0.019905],
-  ['2026-09-01', -0.019545],
-  ['2026-09-02', -0.021225],
-  ['2026-09-03', -0.020081],
-  ['2026-09-04', -0.019118],
-  ['2026-09-05', -0.018879],
-  ['2026-09-09', -0.012291],
+  ['2026-09-09', -0.012291113122171935],
+  ['2026-09-08', -0.014478551401869159],
+  ['2026-09-07', -0.01481950216514857],
+  ['2026-09-04', -0.014787870967741912],
+  ['2026-09-03', -0.01620399940599942],
+  ['2026-09-02', -0.01639717810760668],
+  ['2026-09-01', -0.01631440380047506],
+  ['2026-08-31', -0.016323416931146216],
+  ['2026-08-28', -0.016040152396458278],
+  ['2026-08-27', -0.016765580071174367],
+  ['2026-08-26', -0.01660891323692991],
+  ['2026-08-25', -0.015743762720942703],
+  ['2026-08-24', -0.013679757355312397],
+  ['2026-08-21', -0.014873670429348926],
+  ['2026-08-20', -0.015122238136079887],
+  ['2026-08-19', -0.014392632359980846],
+  ['2026-08-18', -0.016224404885058517],
+  ['2026-08-17', -0.017343664711928837],
+  ['2026-08-14', -0.015465253767823827],
+  ['2026-08-13', -0.01619587959866223],
+  ['2026-08-12', -0.018096592615003175],
+  ['2026-08-11', -0.01909043770672549],
+  ['2026-08-10', -0.019954317191841747],
+  ['2026-08-07', -0.01990471811549618],
+  ['2026-08-06', -0.01954470347628011],
+  ['2026-08-05', -0.021224610387339336],
+  ['2026-08-04', -0.020081385572594534],
+  ['2026-08-03', -0.019118493242001763],
+  ['2026-07-31', -0.01887883515392253],
+  ['2026-07-30', -0.015791861329201632],
+  ['2026-07-29', -0.016083941152823973],
+  ['2026-07-28', -0.011989351158206964],
+  ['2026-07-27', -0.01165518181818182],
+  ['2026-07-24', -0.00918738825076853],
+  ['2026-07-23', -0.011761283232748516],
+  ['2026-07-22', -0.010389030143868473],
+  ['2026-07-21', -0.011144894402296497],
+  ['2026-07-20', -0.009660013496895048],
+  ['2026-07-17', -0.00810376490112015],
+  ['2026-07-16', -0.009466672320357123],
+  ['2026-07-15', -0.009394257598923596],
+  ['2026-07-14', -0.009074279713428442],
+  ['2026-07-13', -0.0064211183294663795],
+  ['2026-07-10', -0.009370477064220206],
+  ['2026-07-09', -0.006961342705688997],
+  ['2026-07-08', -0.006777301455542246],
+  ['2026-07-07', -0.006383099590870784],
+  ['2026-07-06', -0.008736509062066541],
+  ['2026-07-03', -0.009257812944686725],
+  ['2026-07-02', -0.0060980981139087745],
+  ['2026-07-01', -0.0064271183294663786],
+  ['2026-06-30', -0.002906169732677294],
+  ['2026-06-29', -0.0007233327543874936],
+  ['2026-06-26', -0.0019024351334135485],
+  ['2026-06-25', -0.004156165637282426],
+  ['2026-06-24', -0.007218052741151974],
+  ['2026-06-23', -0.009063794258373207],
+  ['2026-06-22', -0.01023214285714286],
+  ['2026-06-18', -0.009979695333943267],
+  ['2026-06-17', -0.011762391551215088],
 ]
 
 export const BOND_LATEST = {
@@ -103,7 +102,7 @@ export const BOND_LATEST = {
 
 export const BOND_PREV = {
   date: '2026-09-08',
-  value: -0.015792,
+  value: -0.014478551401869159,
 }
 
 // 历史隐含利差分位区间(按全量样本统计 5 年滚动)
@@ -143,40 +142,66 @@ export function bondHistoricalPercentile(value) {
 // 全量历史隐含利差序列(用于分位计算)
 export const BOND_HISTORICAL_VALUES = [
   ...new Set([
-    -0.012291, -0.014479, -0.014820, -0.014788, -0.018097, -0.019090,
-    -0.019954, -0.019905, -0.019545, -0.021225, -0.020081, -0.019118,
-    -0.018879, -0.015792, -0.016084, -0.011989, -0.011655, -0.009187,
-    -0.011761, -0.010389, -0.011145, -0.009660, -0.008104, -0.009467,
-    -0.009394, -0.009074, -0.006421, -0.009370, -0.006961, -0.006777,
-    -0.006383, -0.008737, -0.009258, -0.006098, -0.006427, -0.002906,
-    -0.000723, -0.001902, -0.004156, -0.007218, -0.009064, -0.010232,
-    -0.009980, -0.011762, -0.015169, -0.014584, -0.013308, -0.011141,
-    -0.010806, -0.013005, -0.010913, -0.012816, -0.012168, -0.015070,
-    -0.016851, -0.016545, -0.014091, -0.016980, -0.015416, -0.018451,
-    -0.021555, -0.020922, -0.020166, -0.022275, -0.022957, -0.020627,
-    -0.020843, -0.022035, -0.025506, -0.025340, -0.029782, -0.027588,
-    -0.027566, -0.027144, -0.025890, -0.023454, -0.024073, -0.022476,
-    -0.024930, -0.024431, -0.026132, -0.027037, -0.026244, -0.026557,
-    -0.027053, -0.026964, -0.024736, -0.023877, -0.021239, -0.022531,
-    -0.022943, -0.025421, -0.019018, -0.017424, -0.016835, -0.018984,
-    -0.013696, -0.016460, -0.017972, -0.017022, -0.020969, -0.017901,
-    -0.011251, -0.015681, -0.017846, -0.021634, -0.019259, -0.024090,
-    -0.023709, -0.025887, -0.028372, -0.027499, -0.025538, -0.027391,
-    -0.026708, -0.025215, -0.026050, -0.030120, -0.031035, -0.032291,
-    -0.033946, -0.032661, -0.029644, -0.030393, -0.030504, -0.029784,
-    -0.030012, -0.028180, -0.026175, -0.027118, -0.027426, -0.021113,
-    -0.026665, -0.029419, -0.030676, -0.027935, -0.028670, -0.032159,
-    -0.030440, -0.027779, -0.024906, -0.026458, -0.025009, -0.023752,
-    -0.023419, -0.023111, -0.026679, -0.024350, -0.022873, -0.022569,
-    -0.022903, -0.018734, -0.014853, -0.014214, -0.013695, -0.015119,
-    -0.015944, -0.014597, -0.011827, -0.012190, -0.011059, -0.010058,
-    -0.009310, -0.007483, -0.009678, -0.009869, -0.009881, -0.011908,
-    -0.010902, -0.012700, -0.010589, -0.008915, -0.009267, -0.009227,
-    -0.010797, -0.010199, -0.008980, -0.010828, -0.012431, -0.011788,
-    -0.010798, -0.013867, -0.014420, -0.014318, -0.014643, -0.016371,
-    -0.017891, -0.014213, -0.012737, -0.010796, -0.014176, -0.017852,
-    -0.018724, -0.015919, -0.012433, -0.016197, -0.014875, -0.019372,
-    -0.019725, -0.012291,
+    -0.012291113122171935,
+    -0.014478551401869159,
+    -0.01481950216514857,
+    -0.014787870967741912,
+    -0.01620399940599942,
+    -0.01639717810760668,
+    -0.01631440380047506,
+    -0.016323416931146216,
+    -0.016040152396458278,
+    -0.016765580071174367,
+    -0.01660891323692991,
+    -0.015743762720942703,
+    -0.013679757355312397,
+    -0.014873670429348926,
+    -0.015122238136079887,
+    -0.014392632359980846,
+    -0.016224404885058517,
+    -0.017343664711928837,
+    -0.015465253767823827,
+    -0.01619587959866223,
+    -0.018096592615003175,
+    -0.01909043770672549,
+    -0.019954317191841747,
+    -0.01990471811549618,
+    -0.01954470347628011,
+    -0.021224610387339336,
+    -0.020081385572594534,
+    -0.019118493242001763,
+    -0.01887883515392253,
+    -0.015791861329201632,
+    -0.016083941152823973,
+    -0.011989351158206964,
+    -0.01165518181818182,
+    -0.00918738825076853,
+    -0.011761283232748516,
+    -0.010389030143868473,
+    -0.011144894402296497,
+    -0.009660013496895048,
+    -0.00810376490112015,
+    -0.009466672320357123,
+    -0.009394257598923596,
+    -0.009074279713428442,
+    -0.0064211183294663795,
+    -0.009370477064220206,
+    -0.006961342705688997,
+    -0.006777301455542246,
+    -0.006383099590870784,
+    -0.008736509062066541,
+    -0.009257812944686725,
+    -0.0060980981139087745,
+    -0.0064271183294663786,
+    -0.002906169732677294,
+    -0.0007233327543874936,
+    -0.0019024351334135485,
+    -0.004156165637282426,
+    -0.007218052741151974,
+    -0.009063794258373207,
+    -0.01023214285714286,
+    -0.009979695333943267,
+    -0.011762391551215088,
   ]),
 ].sort((a, b) => a - b)
 
@@ -194,4 +219,4 @@ export const BOND_NOTES = [
     title: '使用建议',
     desc: '用于辅助判断中证转债整体的相对估值水平;当前位于 -1σ 以下,可关注股性较强、到期赎回风险可控的标的。',
   },
-]
+]

+ 240 - 197
web-app/src/views/multiasset/derivative/data.js

@@ -27,218 +27,261 @@ export const palette = {
 
 // === §D.1 30Y-10Y 国债利差 ===
 export const SPREAD_RECENT = [
-  ['2026-06-15', 1.640, 2.022, 0.382],
-  ['2026-06-16', 1.633, 2.027, 0.394],
-  ['2026-06-17', 1.628, 2.022, 0.394],
-  ['2026-06-18', 1.625, 2.017, 0.392],
-  ['2026-06-19', 1.623, 2.013, 0.390],
-  ['2026-06-22', 1.625, 2.013, 0.388],
-  ['2026-06-23', 1.630, 2.017, 0.387],
-  ['2026-06-24', 1.636, 2.020, 0.384],
-  ['2026-06-25', 1.642, 2.026, 0.384],
-  ['2026-06-26', 1.640, 2.029, 0.389],
-  ['2026-06-29', 1.645, 2.034, 0.389],
-  ['2026-06-30', 1.651, 2.043, 0.392],
-  ['2026-07-01', 1.650, 2.041, 0.391],
-  ['2026-07-02', 1.646, 2.038, 0.392],
-  ['2026-07-03', 1.640, 2.030, 0.390],
-  ['2026-07-04', 1.636, 2.025, 0.389],
-  ['2026-07-07', 1.638, 2.027, 0.389],
-  ['2026-07-08', 1.645, 2.034, 0.389],
-  ['2026-07-09', 1.647, 2.037, 0.390],
-  ['2026-07-10', 1.645, 2.038, 0.393],
-  ['2026-07-11', 1.643, 2.038, 0.395],
-  ['2026-07-14', 1.650, 2.045, 0.395],
-  ['2026-07-15', 1.654, 2.051, 0.397],
-  ['2026-07-16', 1.659, 2.055, 0.396],
-  ['2026-07-17', 1.661, 2.058, 0.397],
-  ['2026-07-18', 1.666, 2.064, 0.398],
-  ['2026-07-21', 1.667, 2.063, 0.396],
-  ['2026-07-22', 1.673, 2.069, 0.396],
-  ['2026-07-23', 1.675, 2.073, 0.398],
-  ['2026-07-24', 1.673, 2.074, 0.401],
-  ['2026-07-25', 1.679, 2.080, 0.401],
-  ['2026-07-28', 1.682, 2.083, 0.401],
-  ['2026-07-29', 1.679, 2.080, 0.401],
-  ['2026-07-30', 1.682, 2.083, 0.401],
-  ['2026-07-31', 1.681, 2.083, 0.402],
-  ['2026-08-01', 1.685, 2.087, 0.402],
-  ['2026-08-04', 1.686, 2.087, 0.401],
-  ['2026-08-05', 1.689, 2.090, 0.401],
-  ['2026-08-06', 1.692, 2.094, 0.402],
-  ['2026-08-07', 1.694, 2.096, 0.402],
-  ['2026-08-08', 1.698, 2.100, 0.402],
-  ['2026-08-11', 1.696, 2.097, 0.401],
-  ['2026-08-12', 1.692, 2.094, 0.402],
-  ['2026-08-13', 1.689, 2.091, 0.402],
-  ['2026-08-14', 1.687, 2.089, 0.402],
-  ['2026-08-15', 1.685, 2.088, 0.403],
-  ['2026-08-18', 1.682, 2.084, 0.402],
-  ['2026-08-19', 1.679, 2.082, 0.403],
-  ['2026-08-20', 1.681, 2.084, 0.403],
-  ['2026-08-21', 1.677, 2.082, 0.405],
-  ['2026-08-22', 1.673, 2.080, 0.407],
-  ['2026-08-25', 1.668, 2.076, 0.408],
-  ['2026-08-26', 1.665, 2.072, 0.407],
-  ['2026-08-27', 1.662, 2.069, 0.407],
-  ['2026-08-28', 1.660, 2.066, 0.406],
-  ['2026-08-29', 1.658, 2.064, 0.406],
-  ['2026-09-01', 1.659, 2.067, 0.408],
-  ['2026-09-02', 1.657, 2.066, 0.409],
-  ['2026-09-03', 1.659, 2.069, 0.410],
-  ['2026-09-04', 1.661, 2.072, 0.411],
-  ['2026-09-05', 1.663, 2.075, 0.412],
-  ['2026-09-08', 1.665, 2.078, 0.413],
-  ['2026-09-09', 1.668, 2.081, 0.413],
-  ['2026-09-10', 1.670, 2.082, 0.412],
-  ['2026-09-11', 1.672, 2.083, 0.411],
-  ['2026-09-12', 1.673, 2.084, 0.411],
-  ['2026-09-15', 1.675, 2.085, 0.410],
-  ['2026-09-16', 1.674, 2.084, 0.410],
-  ['2026-09-17', 1.673, 2.082, 0.409],
-  ['2026-09-18', 1.672, 2.080, 0.408],
-  ['2026-09-19', 1.671, 2.078, 0.407],
-  ['2026-09-22', 1.669, 2.077, 0.408],
-  ['2026-09-23', 1.667, 2.075, 0.408],
-  ['2026-09-24', 1.668, 2.076, 0.408],
-  ['2026-09-25', 1.669, 2.076, 0.407],
-  ['2026-09-26', 1.670, 2.077, 0.407],
-  ['2026-09-29', 1.667, 2.074, 0.407],
+  ['2026-06-15', 1.745, 2.221, 0.477],
+  ['2026-06-16', 1.732, 2.217, 0.485],
+  ['2026-06-17', 1.727, 2.218, 0.491],
+  ['2026-06-18', 1.730, 2.220, 0.490],
+  ['2026-06-22', 1.738, 2.222, 0.484],
+  ['2026-06-23', 1.744, 2.229, 0.485],
+  ['2026-06-24', 1.745, 2.231, 0.486],
+  ['2026-06-25', 1.735, 2.220, 0.485],
+  ['2026-06-26', 1.731, 2.218, 0.486],
+  ['2026-06-29', 1.717, 2.209, 0.492],
+  ['2026-06-30', 1.733, 2.236, 0.503],
+  ['2026-07-01', 1.745, 2.252, 0.508],
+  ['2026-07-02', 1.741, 2.258, 0.517],
+  ['2026-07-03', 1.746, 2.268, 0.522],
+  ['2026-07-06', 1.738, 2.255, 0.517],
+  ['2026-07-07', 1.741, 2.260, 0.520],
+  ['2026-07-08', 1.738, 2.255, 0.516],
+  ['2026-07-09', 1.738, 2.252, 0.514],
+  ['2026-07-10', 1.740, 2.253, 0.513],
+  ['2026-07-13', 1.744, 2.263, 0.519],
+  ['2026-07-14', 1.740, 2.256, 0.515],
+  ['2026-07-15', 1.741, 2.247, 0.506],
+  ['2026-07-16', 1.744, 2.252, 0.508],
+  ['2026-07-17', 1.740, 2.243, 0.502],
+  ['2026-07-20', 1.745, 2.249, 0.504],
+  ['2026-07-21', 1.745, 2.248, 0.502],
+  ['2026-07-22', 1.730, 2.212, 0.482],
+  ['2026-07-23', 1.732, 2.204, 0.472],
+  ['2026-07-24', 1.728, 2.187, 0.459],
+  ['2026-07-27', 1.734, 2.193, 0.459],
+  ['2026-07-28', 1.735, 2.194, 0.459],
+  ['2026-07-29', 1.733, 2.206, 0.473],
+  ['2026-07-30', 1.720, 2.185, 0.465],
+  ['2026-07-31', 1.714, 2.188, 0.474],
+  ['2026-08-03', 1.717, 2.189, 0.472],
+  ['2026-08-04', 1.713, 2.184, 0.472],
+  ['2026-08-05', 1.714, 2.187, 0.473],
+  ['2026-08-06', 1.714, 2.189, 0.474],
+  ['2026-08-07', 1.711, 2.178, 0.467],
+  ['2026-08-10', 1.707, 2.158, 0.451],
+  ['2026-08-11', 1.716, 2.169, 0.453],
+  ['2026-08-12', 1.714, 2.173, 0.459],
+  ['2026-08-13', 1.703, 2.160, 0.457],
+  ['2026-08-14', 1.696, 2.164, 0.468],
+  ['2026-08-17', 1.692, 2.162, 0.470],
+  ['2026-08-18', 1.686, 2.151, 0.465],
+  ['2026-08-19', 1.683, 2.135, 0.452],
+  ['2026-08-20', 1.683, 2.132, 0.449],
+  ['2026-08-21', 1.684, 2.132, 0.448],
+  ['2026-08-24', 1.679, 2.122, 0.443],
+  ['2026-08-25', 1.681, 2.129, 0.448],
+  ['2026-08-26', 1.689, 2.134, 0.445],
+  ['2026-08-27', 1.699, 2.144, 0.445],
+  ['2026-08-28', 1.695, 2.148, 0.453],
+  ['2026-08-31', 1.688, 2.148, 0.460],
+  ['2026-09-01', 1.683, 2.138, 0.455],
+  ['2026-09-02', 1.686, 2.143, 0.457],
+  ['2026-09-03', 1.680, 2.132, 0.452],
+  ['2026-09-04', 1.680, 2.134, 0.453],
+  ['2026-09-07', 1.680, 2.132, 0.453],
+  ['2026-09-08', 1.681, 2.138, 0.456],
+  ['2026-09-09', 1.682, 2.138, 0.456],
+  ['2026-09-10', 1.680, 2.139, 0.459],
+  ['2026-09-11', 1.690, 2.146, 0.456],
+  ['2026-09-14', 1.689, 2.151, 0.462],
+  ['2026-09-15', 1.687, 2.140, 0.454],
+  ['2026-09-16', 1.686, 2.138, 0.452],
+  ['2026-09-17', 1.686, 2.139, 0.453],
+  ['2026-09-18', 1.682, 2.126, 0.444],
+  ['2026-09-20', 1.682, 2.121, 0.439],
+  ['2026-09-21', 1.683, 2.119, 0.436],
+  ['2026-09-22', 1.679, 2.111, 0.432],
 ]
 
 // 当前利差快照
 export const SPREAD_LATEST = {
-  date: '2026-09-29',
-  y10: 1.667,
-  y30: 2.0735,
-  spread: 0.4065,
+  date: '2026-09-22',
+  y10: 1.679,
+  y30: 2.111,
+  spread: 0.4319,
 }
 
 // === §D.2 TL 合约基差(按日记录最新截面) ===
 export const TL_BASIS = [
-  { date: '2026-03-16', basis: 1.1702, code: '220008.IB', name: '22附息国债08', tenor: 26.10, price: 117.5754, ytm: 2.4085, fullBasis: 1.1702, netBasis: -0.0251, irr: 1.5012, impliedRate: 2.4471, basisSpread: 1.3198, contract: 'TL2612.CFE' },
-  { date: '2026-03-17', basis: 1.2140, code: '220008.IB', name: '22附息国债08', tenor: 26.10, price: 117.8093, ytm: 2.3975, fullBasis: 1.2140, netBasis: 0.0100, irr: 1.4435, impliedRate: 2.4379, basisSpread: 1.2669, contract: 'TL2612.CFE' },
-  { date: '2026-03-18', basis: 1.3989, code: '220008.IB', name: '22附息国债08', tenor: 26.10, price: 118.2372, ytm: 2.3775, fullBasis: 1.3989, netBasis: 0.2026, irr: 1.2224, impliedRate: 2.4262, basisSpread: 1.0729, contract: 'TL2612.CFE' },
-  { date: '2026-03-19', basis: 0.9600, code: '220008.IB', name: '22附息国债08', tenor: 26.09, price: 117.9674, ytm: 2.3900, fullBasis: 0.9600, netBasis: -0.2400, irr: 1.7222, impliedRate: 2.4181, basisSpread: 1.5026, contract: 'TL2612.CFE' },
-  { date: '2026-03-20', basis: 0.9650, code: '220008.IB', name: '22附息国债08', tenor: 26.09, price: 117.9740, ytm: 2.3895, fullBasis: 0.9650, netBasis: -0.2350, irr: 1.7172, impliedRate: 2.4176, basisSpread: 1.4976, contract: 'TL2612.CFE' },
-  { date: '2026-04-09', basis: 0.8331, code: '220008.IB', name: '22附息国债08', tenor: 25.95, price: 118.4521, ytm: 2.3694, fullBasis: 0.8331, netBasis: -0.3669, irr: 1.8719, impliedRate: 2.3970, basisSpread: 1.6378, contract: 'TL2612.CFE' },
-  { date: '2026-04-10', basis: 0.9014, code: '220008.IB', name: '22附息国债08', tenor: 25.94, price: 118.5525, ytm: 2.3653, fullBasis: 0.9014, netBasis: -0.2986, irr: 1.7820, impliedRate: 2.3929, basisSpread: 1.5487, contract: 'TL2612.CFE' },
-  { date: '2026-04-11', basis: 0.8729, code: '220008.IB', name: '22附息国债08', tenor: 25.93, price: 118.5310, ytm: 2.3660, fullBasis: 0.8729, netBasis: -0.3271, irr: 1.8204, impliedRate: 2.3936, basisSpread: 1.5874, contract: 'TL2612.CFE' },
-  { date: '2026-05-12', basis: 0.8833, code: '220008.IB', name: '22附息国债08', tenor: 25.78, price: 119.5127, ytm: 2.3314, fullBasis: 0.8833, netBasis: -0.3167, irr: 1.8124, impliedRate: 2.3589, basisSpread: 1.5750, contract: 'TL2612.CFE' },
-  { date: '2026-05-13', basis: 0.9015, code: '220008.IB', name: '22附息国债08', tenor: 25.78, price: 119.5480, ytm: 2.3305, fullBasis: 0.9015, netBasis: -0.2985, irr: 1.7853, impliedRate: 2.3580, basisSpread: 1.5479, contract: 'TL2612.CFE' },
-  { date: '2026-06-16', basis: 0.7500, code: '220008.IB', name: '22附息国债08', tenor: 25.61, price: 120.6601, ytm: 2.2960, fullBasis: 0.7500, netBasis: -0.4500, irr: 1.9750, impliedRate: 2.3235, basisSpread: 1.7375, contract: 'TL2612.CFE' },
-  { date: '2026-06-17', basis: 0.7117, code: '220008.IB', name: '22附息国债08', tenor: 25.61, price: 120.6122, ytm: 2.2975, fullBasis: 0.7117, netBasis: -0.4883, irr: 2.0258, impliedRate: 2.3250, basisSpread: 1.7883, contract: 'TL2612.CFE' },
-  { date: '2026-07-15', basis: 0.6012, code: '220008.IB', name: '22附息国债08', tenor: 25.45, price: 121.4032, ytm: 2.2730, fullBasis: 0.6012, netBasis: -0.5988, irr: 2.1662, impliedRate: 2.3005, basisSpread: 1.9288, contract: 'TL2612.CFE' },
-  { date: '2026-07-16', basis: 0.5843, code: '220008.IB', name: '22附息国债08', tenor: 25.44, price: 121.3855, ytm: 2.2735, fullBasis: 0.5843, netBasis: -0.6157, irr: 2.1883, impliedRate: 2.3010, basisSpread: 1.9509, contract: 'TL2612.CFE' },
-  { date: '2026-08-13', basis: 0.4990, code: '220008.IB', name: '22附息国债08', tenor: 25.30, price: 122.0501, ytm: 2.2529, fullBasis: 0.4990, netBasis: -0.7010, irr: 2.2923, impliedRate: 2.2804, basisSpread: 2.0548, contract: 'TL2612.CFE' },
-  { date: '2026-08-14', basis: 0.5148, code: '220008.IB', name: '22附息国债08', tenor: 25.29, price: 122.0833, ytm: 2.2520, fullBasis: 0.5148, netBasis: -0.6852, irr: 2.2725, impliedRate: 2.2795, basisSpread: 2.0350, contract: 'TL2612.CFE' },
-  { date: '2026-09-08', basis: 0.4521, code: '220008.IB', name: '22附息国债08', tenor: 25.65, price: 123.6701, ytm: 2.1101, fullBasis: 0.4521, netBasis: -0.7479, irr: 2.3493, impliedRate: 2.1376, basisSpread: 2.0967, contract: 'TL2612.CFE' },
-  { date: '2026-09-09', basis: 0.4387, code: '220008.IB', name: '22附息国债08', tenor: 25.64, price: 123.6998, ytm: 2.1090, fullBasis: 0.4387, netBasis: -0.7613, irr: 2.3667, impliedRate: 2.1365, basisSpread: 2.1141, contract: 'TL2612.CFE' },
-  { date: '2026-09-10', basis: 0.4112, code: '220008.IB', name: '22附息国债08', tenor: 25.64, price: 123.5822, ytm: 2.1120, fullBasis: 0.4112, netBasis: -0.7888, irr: 2.4034, impliedRate: 2.1395, basisSpread: 2.1508, contract: 'TL2612.CFE' },
-  { date: '2026-09-11', basis: 0.4389, code: '220008.IB', name: '22附息国债08', tenor: 25.63, price: 123.6322, ytm: 2.1107, fullBasis: 0.4389, netBasis: -0.7611, irr: 2.3665, impliedRate: 2.1382, basisSpread: 2.1139, contract: 'TL2612.CFE' },
-  { date: '2026-09-15', basis: 0.4652, code: '220008.IB', name: '22附息国债08', tenor: 25.61, price: 123.7218, ytm: 2.1080, fullBasis: 0.4652, netBasis: -0.7348, irr: 2.3326, impliedRate: 2.1355, basisSpread: 2.0800, contract: 'TL2612.CFE' },
-  { date: '2026-09-16', basis: 0.4338, code: '220008.IB', name: '22附息国债08', tenor: 25.60, price: 123.7622, ytm: 2.1070, fullBasis: 0.4338, netBasis: -0.7662, irr: 2.3734, impliedRate: 2.1345, basisSpread: 2.1208, contract: 'TL2612.CFE' },
-  { date: '2026-09-17', basis: 0.4105, code: '220008.IB', name: '22附息国债08', tenor: 25.60, price: 123.7221, ytm: 2.1080, fullBasis: 0.4105, netBasis: -0.7895, irr: 2.4044, impliedRate: 2.1355, basisSpread: 2.1519, contract: 'TL2612.CFE' },
-  { date: '2026-09-18', basis: 0.4203, code: '220008.IB', name: '22附息国债08', tenor: 25.59, price: 123.8291, ytm: 2.1050, fullBasis: 0.4203, netBasis: -0.7797, irr: 2.3916, impliedRate: 2.1325, basisSpread: 2.1392, contract: 'TL2612.CFE' },
-  { date: '2026-09-19', basis: 0.4356, code: '220008.IB', name: '22附息国债08', tenor: 25.59, price: 123.9112, ytm: 2.1030, fullBasis: 0.4356, netBasis: -0.7644, irr: 2.3711, impliedRate: 2.1305, basisSpread: 2.1187, contract: 'TL2612.CFE' },
-  { date: '2026-09-22', basis: 0.4294, code: '220008.IB', name: '22附息国债08', tenor: 25.58, price: 124.0927, ytm: 2.0975, fullBasis: 0.4294, netBasis: 0.0652, irr: 1.1730, impliedRate: 2.1093, basisSpread: 0.3357, contract: 'TL2612.CFE' },
+  { date: '2026-03-16', basis: 1.1702, code: '220008.IB', name: '22附息国债08', tenor: 26.1, price: 117.5754, ytm: 2.4085, fullBasis: 1.1702, netBasis: -0.0251, irr: 1.5012, impliedRate: 2.4471, basisSpread: 1.3198, contract: 'TL2612.CFE' },
+  { date: '2026-03-17', basis: 1.214, code: '220008.IB', name: '22附息国债08', tenor: 26.1, price: 117.8093, ytm: 2.3975, fullBasis: 1.214, netBasis: 0.01, irr: 1.4435, impliedRate: 2.4379, basisSpread: 1.2669, contract: 'TL2612.CFE' },
+  { date: '2026-03-18', basis: 1.3989, code: '220008.IB', name: '22附息国债08', tenor: 26.1, price: 118.2372, ytm: 2.3775, fullBasis: 1.3989, netBasis: 0.2026, irr: 1.2224, impliedRate: 2.4262, basisSpread: 1.0729, contract: 'TL2612.CFE' },
+  { date: '2026-03-19', basis: 0.96, code: '220008.IB', name: '22附息国债08', tenor: 26.09, price: 117.9674, ytm: 2.39, fullBasis: 0.96, netBasis: -0.24, irr: 1.7222, impliedRate: 2.4181, basisSpread: 1.5026, contract: 'TL2612.CFE' },
+  { date: '2026-03-20', basis: 1.2946, code: '220008.IB', name: '22附息国债08', tenor: 26.09, price: 117.8054, ytm: 2.3975, fullBasis: 1.2946, netBasis: 0.0919, irr: 1.3351, impliedRate: 2.442, basisSpread: 1.159, contract: 'TL2612.CFE' },
+  { date: '2026-04-09', basis: 0.9838, code: '220008.IB', name: '22附息国债08', tenor: 26.04, price: 119.016, ytm: 2.34, fullBasis: 0.9838, netBasis: -0.1905, irr: 1.5848, impliedRate: 2.3691, basisSpread: 1.2873, contract: 'TL2612.CFE' },
+  { date: '2026-04-10', basis: 1.3569, code: '220008.IB', name: '22附息国债08', tenor: 26.03, price: 119.5792, ytm: 2.314, fullBasis: 1.3569, netBasis: 0.186, irr: 1.1135, impliedRate: 2.3601, basisSpread: 0.9051, contract: 'TL2612.CFE' },
+  { date: '2026-05-12', basis: 1.0028, code: '220008.IB', name: '22附息国债08', tenor: 25.95, price: 119.9436, ytm: 2.295, fullBasis: 1.0028, netBasis: -0.0413, irr: 1.3609, impliedRate: 2.3262, basisSpread: 0.9686, contract: 'TL2612.CFE' },
+  { date: '2026-05-13', basis: 0.9672, code: '220008.IB', name: '22附息国债08', tenor: 25.94, price: 119.8657, ytm: 2.2985, fullBasis: 0.9672, netBasis: -0.0775, irr: 1.4055, impliedRate: 2.3282, basisSpread: 0.9952, contract: 'TL2612.CFE' },
+  { date: '2026-06-16', basis: 0.8037, code: '220008.IB', name: '22附息国债08', tenor: 25.85, price: 120.9383, ytm: 2.247, fullBasis: 0.8037, netBasis: 0.0483, irr: 1.41, impliedRate: 2.2703, basisSpread: 0.8503, contract: 'TL2612.CFE' },
+  { date: '2026-06-17', basis: 0.8118, code: '220008.IB', name: '22附息国债08', tenor: 25.85, price: 121.1788, ytm: 2.236, fullBasis: 0.8118, netBasis: 0.0496, irr: 1.3864, impliedRate: 2.2596, basisSpread: 0.8332, contract: 'TL2612.CFE' },
+  { date: '2026-07-15', basis: 0.656, code: '220008.IB', name: '22附息国债08', tenor: 25.77, price: 121.0442, ytm: 2.24, fullBasis: 0.656, netBasis: -0.0068, irr: 1.4464, impliedRate: 2.2586, basisSpread: 0.7349, contract: 'TL2612.CFE' },
+  { date: '2026-07-16', basis: 0.6886, code: '220008.IB', name: '22附息国债08', tenor: 25.77, price: 120.8232, ytm: 2.25, fullBasis: 0.6886, netBasis: 0.0327, irr: 1.3759, impliedRate: 2.2703, basisSpread: 0.6933, contract: 'TL2612.CFE' },
+  { date: '2026-08-13', basis: 0.5203, code: '220008.IB', name: '22附息国债08', tenor: 25.69, price: 123.7293, ytm: 2.117, fullBasis: 0.5203, netBasis: -0.0175, irr: 1.4423, impliedRate: 2.1297, basisSpread: 0.6076, contract: 'TL2612.CFE' },
+  { date: '2026-08-14', basis: 0.5592, code: '220008.IB', name: '22附息国债08', tenor: 25.69, price: 123.8739, ytm: 2.1105, fullBasis: 0.5592, netBasis: 0.024, irr: 1.3375, impliedRate: 2.125, basisSpread: 0.5596, contract: 'TL2612.CFE' },
+  { date: '2026-09-08', basis: 0.4574, code: '220008.IB', name: '22附息国债08', tenor: 25.62, price: 123.4446, ytm: 2.1275, fullBasis: 0.4574, netBasis: 0.0288, irr: 1.3081, impliedRate: 2.1397, basisSpread: 0.4346, contract: 'TL2612.CFE' },
+  { date: '2026-09-09', basis: 0.3678, code: '220008.IB', name: '22附息国债08', tenor: 25.62, price: 123.3867, ytm: 2.13, fullBasis: 0.3678, netBasis: -0.0525, irr: 1.5672, impliedRate: 2.1383, basisSpread: 0.5151, contract: 'TL2612.CFE' },
+  { date: '2026-09-11', basis: 0.4195, code: '220008.IB', name: '22附息国债08', tenor: 25.61, price: 123.0475, ytm: 2.145, fullBasis: 0.4195, netBasis: 0.0162, irr: 1.3871, impliedRate: 2.1559, basisSpread: 0.4453, contract: 'TL2612.CFE' },
+  { date: '2026-09-15', basis: 0.437, code: '220008.IB', name: '22附息国债08', tenor: 25.6, price: 123.1072, ytm: 2.142, fullBasis: 0.437, netBasis: 0.0514, irr: 1.2728, impliedRate: 2.154, basisSpread: 0.3915, contract: 'TL2612.CFE' },
+  { date: '2026-09-16', basis: 0.5146, code: '220008.IB', name: '22附息国债08', tenor: 25.6, price: 123.2059, ytm: 2.1375, fullBasis: 0.5146, netBasis: 0.1374, irr: 1.0014, impliedRate: 2.1531, basisSpread: 0.3049, contract: 'TL2612.CFE' },
+  { date: '2026-09-17', basis: 0.4705, code: '220008.IB', name: '22附息国债08', tenor: 25.59, price: 123.2041, ytm: 2.1375, fullBasis: 0.4705, netBasis: 0.1019, irr: 1.1289, impliedRate: 2.1512, basisSpread: 0.3399, contract: 'TL2612.CFE' },
+  { date: '2026-09-18', basis: 0.4453, code: '220008.IB', name: '22附息国债08', tenor: 25.59, price: 123.5381, ytm: 2.1225, fullBasis: 0.4453, netBasis: 0.0785, irr: 1.1928, impliedRate: 2.1349, basisSpread: 0.356, contract: 'TL2612.CFE' },
+  { date: '2026-09-22', basis: 0.4294, code: '220008.IB', name: '22附息国债08', tenor: 25.58, price: 124.0927, ytm: 2.0975, fullBasis: 0.4294, netBasis: 0.0652, irr: 1.173, impliedRate: 2.1093, basisSpread: 0.3357, contract: 'TL2612.CFE' },
 ]
 
 // === §D.3 T 合约基差 ===
 export const T_BASIS = [
-  { date: '2026-06-12', basis: 0.128, code: '260012.IB', name: '26附息国债12', tenor: 7.00, price: 99.9079, ytm: 1.574, fullBasis: 0.128, netBasis: 0.0784, irr: 1.3014, impliedRate: 1.5954, basisSpread: 0.6413, contract: 'T2612.CFE' },
-  { date: '2026-06-13', basis: 0.0835, code: '260012.IB', name: '26附息国债12', tenor: 6.99, price: 99.8817, ytm: 1.578, fullBasis: 0.0835, netBasis: 0.0401, irr: 1.388, impliedRate: 1.5924, basisSpread: 0.6687, contract: 'T2612.CFE' },
-  { date: '2026-06-16', basis: 0.1338, code: '260012.IB', name: '26附息国债12', tenor: 6.98, price: 99.8358, ytm: 1.585, fullBasis: 0.1338, netBasis: 0.1014, irr: 1.2826, impliedRate: 1.6082, basisSpread: 0.6141, contract: 'T2612.CFE' },
-  { date: '2026-06-17', basis: 0.1044, code: '260012.IB', name: '26附息国债12', tenor: 6.98, price: 99.8522, ytm: 1.5825, fullBasis: 0.1044, netBasis: 0.0957, irr: 1.3424, impliedRate: 1.6007, basisSpread: 0.6393, contract: 'T2612.CFE' },
-  { date: '2026-07-15', basis: 0.1563, code: '260012.IB', name: '26附息国债12', tenor: 6.91, price: 100.3128, ytm: 1.515, fullBasis: 0.1563, netBasis: 0.1142, irr: 1.2675, impliedRate: 1.5298, basisSpread: 0.5685, contract: 'T2612.CFE' },
-  { date: '2026-07-16', basis: 0.1228, code: '260012.IB', name: '26附息国债12', tenor: 6.90, price: 100.2923, ytm: 1.517, fullBasis: 0.1228, netBasis: 0.0873, irr: 1.3234, impliedRate: 1.5318, basisSpread: 0.6017, contract: 'T2612.CFE' },
-  { date: '2026-08-13', basis: 0.0945, code: '260012.IB', name: '26附息国债12', tenor: 6.83, price: 100.2012, ytm: 1.529, fullBasis: 0.0945, netBasis: 0.0612, irr: 1.3927, impliedRate: 1.5438, basisSpread: 0.6321, contract: 'T2612.CFE' },
-  { date: '2026-08-14', basis: 0.1071, code: '260012.IB', name: '26附息国债12', tenor: 6.82, price: 100.2184, ytm: 1.527, fullBasis: 0.1071, netBasis: 0.0748, irr: 1.3713, impliedRate: 1.5418, basisSpread: 0.6106, contract: 'T2612.CFE' },
-  { date: '2026-09-08', basis: 0.0587, code: '260012.IB', name: '26附息国债12', tenor: 6.76, price: 100.3829, ytm: 1.502, fullBasis: 0.0587, netBasis: 0.0208, irr: 1.4508, impliedRate: 1.5128, basisSpread: 0.5418, contract: 'T2612.CFE' },
-  { date: '2026-09-09', basis: 0.0612, code: '260012.IB', name: '26附息国债12', tenor: 6.76, price: 100.3958, ytm: 1.500, fullBasis: 0.0612, netBasis: 0.0234, irr: 1.4466, impliedRate: 1.5108, basisSpread: 0.5376, contract: 'T2612.CFE' },
-  { date: '2026-09-10', basis: 0.0723, code: '260012.IB', name: '26附息国债12', tenor: 6.76, price: 100.4085, ytm: 1.498, fullBasis: 0.0723, netBasis: 0.0351, irr: 1.4278, impliedRate: 1.5088, basisSpread: 0.5189, contract: 'T2612.CFE' },
-  { date: '2026-09-11', basis: 0.0645, code: '260012.IB', name: '26附息国债12', tenor: 6.75, price: 100.4012, ytm: 1.499, fullBasis: 0.0645, netBasis: 0.0272, irr: 1.4408, impliedRate: 1.5098, basisSpread: 0.5318, contract: 'T2612.CFE' },
-  { date: '2026-09-15', basis: 0.0521, code: '260012.IB', name: '26附息国债12', tenor: 6.74, price: 100.4212, ytm: 1.495, fullBasis: 0.0521, netBasis: 0.0153, irr: 1.4618, impliedRate: 1.5058, basisSpread: 0.5528, contract: 'T2612.CFE' },
-  { date: '2026-09-16', basis: 0.0589, code: '260012.IB', name: '26附息国债12', tenor: 6.73, price: 100.4189, ytm: 1.4955, fullBasis: 0.0589, netBasis: 0.0212, irr: 1.4506, impliedRate: 1.5063, basisSpread: 0.5416, contract: 'T2612.CFE' },
-  { date: '2026-09-17', basis: 0.0456, code: '260012.IB', name: '26附息国债12', tenor: 6.73, price: 100.4322, ytm: 1.493, fullBasis: 0.0456, netBasis: 0.0080, irr: 1.4725, impliedRate: 1.5038, basisSpread: 0.5634, contract: 'T2612.CFE' },
-  { date: '2026-09-18', basis: 0.0512, code: '260012.IB', name: '26附息国债12', tenor: 6.73, price: 100.4395, ytm: 1.4915, fullBasis: 0.0512, netBasis: 0.0136, irr: 1.4632, impliedRate: 1.5023, basisSpread: 0.5541, contract: 'T2612.CFE' },
-  { date: '2026-09-22', basis: 0.0399, code: '260012.IB', name: '26附息国债12', tenor: 6.73, price: 100.4427, ytm: 1.490, fullBasis: 0.0399, netBasis: 0.0022, irr: 1.3744, impliedRate: 1.4940, basisSpread: 0.3190, contract: 'T2612.CFE' },
+  { date: '2026-06-19', basis: 0.128, code: '260012.IB', name: '26附息国债12', tenor: 7, price: 99.9079, ytm: 1.574, fullBasis: 0.128, netBasis: 0.0784, irr: 1.3014, impliedRate: 1.5954, basisSpread: 0.6413, contract: 'T2612.CFE' },
+  { date: '2026-06-22', basis: 0.0835, code: '260012.IB', name: '26附息国债12', tenor: 6.99, price: 99.8817, ytm: 1.578, fullBasis: 0.0835, netBasis: 0.0401, irr: 1.388, impliedRate: 1.5924, basisSpread: 0.6687, contract: 'T2612.CFE' },
+  { date: '2026-06-23', basis: 0.1338, code: '260012.IB', name: '26附息国债12', tenor: 6.98, price: 99.8358, ytm: 1.585, fullBasis: 0.1338, netBasis: 0.1014, irr: 1.2826, impliedRate: 1.6082, basisSpread: 0.6141, contract: 'T2612.CFE' },
+  { date: '2026-06-24', basis: 0.1044, code: '260012.IB', name: '26附息国债12', tenor: 6.98, price: 99.8522, ytm: 1.5825, fullBasis: 0.1044, netBasis: 0.0957, irr: 1.3424, impliedRate: 1.6007, basisSpread: 0.6393, contract: 'T2612.CFE' },
+  { date: '2026-06-25', basis: 0.1104, code: '260012.IB', name: '26附息国债12', tenor: 6.98, price: 99.9269, ytm: 1.5711, fullBasis: 0.1104, netBasis: 0.0864, irr: 1.3274, impliedRate: 1.5894, basisSpread: 0.629, contract: 'T2612.CFE' },
+  { date: '2026-06-26', basis: 0.0889, code: '260012.IB', name: '26附息国债12', tenor: 6.98, price: 99.9833, ytm: 1.5625, fullBasis: 0.0889, netBasis: 0.0454, irr: 1.3708, impliedRate: 1.5767, basisSpread: 0.6462, contract: 'T2612.CFE' },
+  { date: '2026-06-29', basis: 0.0726, code: '260012.IB', name: '26附息国债12', tenor: 6.97, price: 100.0815, ytm: 1.5475, fullBasis: 0.0726, netBasis: 0.0241, irr: 1.4011, impliedRate: 1.5581, basisSpread: 0.6496, contract: 'T2612.CFE' },
+  { date: '2026-06-30', basis: 0.0587, code: '260012.IB', name: '26附息国债12', tenor: 6.96, price: 99.9668, ytm: 1.565, fullBasis: 0.0587, netBasis: 0.0123, irr: 1.432, impliedRate: 1.5745, basisSpread: 0.6593, contract: 'T2612.CFE' },
+  { date: '2026-07-01', basis: 0.1458, code: '260012.IB', name: '26附息国债12', tenor: 6.96, price: 99.8524, ytm: 1.5825, fullBasis: 0.1458, netBasis: 0.0966, irr: 1.2422, impliedRate: 1.6074, basisSpread: 0.5679, contract: 'T2612.CFE' },
+  { date: '2026-07-02', basis: 0.0797, code: '260012.IB', name: '26附息国债12', tenor: 6.96, price: 99.8687, ytm: 1.58, fullBasis: 0.0797, netBasis: 0.0192, irr: 1.3856, impliedRate: 1.5939, basisSpread: 0.6298, contract: 'T2612.CFE' },
+  { date: '2026-07-03', basis: 0.1098, code: '260012.IB', name: '26附息国债12', tenor: 6.96, price: 99.8851, ytm: 1.5775, fullBasis: 0.1098, netBasis: 0.0338, irr: 1.3175, impliedRate: 1.5962, basisSpread: 0.5954, contract: 'T2612.CFE' },
+  { date: '2026-07-06', basis: 0.0815, code: '260012.IB', name: '26附息国债12', tenor: 6.95, price: 99.9438, ytm: 1.5685, fullBasis: 0.0815, netBasis: 0.0053, irr: 1.3759, impliedRate: 1.582, basisSpread: 0.6109, contract: 'T2612.CFE' },
+  { date: '2026-07-07', basis: 0.09, code: '260012.IB', name: '26附息国债12', tenor: 6.95, price: 99.934, ytm: 1.57, fullBasis: 0.09, netBasis: 0.0096, irr: 1.3555, impliedRate: 1.585, basisSpread: 0.5981, contract: 'T2612.CFE' },
+  { date: '2026-07-08', basis: 0.0637, code: '260012.IB', name: '26附息国债12', tenor: 6.94, price: 99.9764, ytm: 1.5635, fullBasis: 0.0637, netBasis: -0.0135, irr: 1.4135, impliedRate: 1.5737, basisSpread: 0.6201, contract: 'T2612.CFE' },
+  { date: '2026-07-09', basis: 0.0762, code: '260012.IB', name: '26附息国债12', tenor: 6.94, price: 99.9797, ytm: 1.563, fullBasis: 0.0762, netBasis: -0.0027, irr: 1.3839, impliedRate: 1.5752, basisSpread: 0.6034, contract: 'T2612.CFE' },
+  { date: '2026-07-10', basis: 0.0722, code: '260012.IB', name: '26附息国债12', tenor: 6.94, price: 99.9666, ytm: 1.565, fullBasis: 0.0722, netBasis: -0.0042, irr: 1.3921, impliedRate: 1.5767, basisSpread: 0.603, contract: 'T2612.CFE' },
+  { date: '2026-07-13', basis: 0.0579, code: '260012.IB', name: '26附息国债12', tenor: 6.93, price: 99.934, ytm: 1.57, fullBasis: 0.0579, netBasis: -0.0088, irr: 1.4227, impliedRate: 1.5797, basisSpread: 0.6045, contract: 'T2612.CFE' },
+  { date: '2026-07-14', basis: 0.1016, code: '260012.IB', name: '26附息国债12', tenor: 6.93, price: 99.9731, ytm: 1.564, fullBasis: 0.1016, netBasis: 0.0365, irr: 1.3178, impliedRate: 1.5805, basisSpread: 0.5565, contract: 'T2612.CFE' },
+  { date: '2026-07-15', basis: 0.0767, code: '260012.IB', name: '26附息国债12', tenor: 6.92, price: 99.9665, ytm: 1.565, fullBasis: 0.0767, netBasis: 0.0214, irr: 1.3756, impliedRate: 1.5775, basisSpread: 0.5772, contract: 'T2612.CFE' },
+  { date: '2026-07-16', basis: 0.1076, code: '260012.IB', name: '26附息国债12', tenor: 6.92, price: 99.947, ytm: 1.568, fullBasis: 0.1076, netBasis: 0.0557, irr: 1.3005, impliedRate: 1.5857, basisSpread: 0.542, contract: 'T2612.CFE' },
+  { date: '2026-07-17', basis: 0.0943, code: '260012.IB', name: '26附息国债12', tenor: 6.92, price: 99.9795, ytm: 1.563, fullBasis: 0.0943, netBasis: 0.0438, irr: 1.3305, impliedRate: 1.5782, basisSpread: 0.5511, contract: 'T2612.CFE' },
+  { date: '2026-07-20', basis: 0.0992, code: '260012.IB', name: '26附息国债12', tenor: 6.91, price: 99.934, ytm: 1.57, fullBasis: 0.0992, netBasis: 0.0479, irr: 1.3143, impliedRate: 1.5865, basisSpread: 0.5334, contract: 'T2612.CFE' },
+  { date: '2026-07-21', basis: 0.0755, code: '260012.IB', name: '26附息国债12', tenor: 6.91, price: 99.947, ytm: 1.568, fullBasis: 0.0755, netBasis: 0.0129, irr: 1.371, impliedRate: 1.5805, basisSpread: 0.5527, contract: 'T2612.CFE' },
+  { date: '2026-07-22', basis: 0.0852, code: '260012.IB', name: '26附息国债12', tenor: 6.9, price: 100.0574, ytm: 1.551, fullBasis: 0.0852, netBasis: 0.0214, irr: 1.3441, impliedRate: 1.564, basisSpread: 0.5388, contract: 'T2612.CFE' },
+  { date: '2026-07-23', basis: 0.0954, code: '260012.IB', name: '26附息国债12', tenor: 6.9, price: 99.9989, ytm: 1.56, fullBasis: 0.0954, netBasis: 0.0296, irr: 1.3177, impliedRate: 1.5752, basisSpread: 0.5243, contract: 'T2612.CFE' },
+  { date: '2026-07-24', basis: 0.0885, code: '260012.IB', name: '26附息国债12', tenor: 6.9, price: 100.0378, ytm: 1.554, fullBasis: 0.0885, netBasis: 0.0274, irr: 1.333, impliedRate: 1.5678, basisSpread: 0.527, contract: 'T2612.CFE' },
+  { date: '2026-07-27', basis: 0.0632, code: '260012.IB', name: '26附息国债12', tenor: 6.89, price: 99.9988, ytm: 1.56, fullBasis: 0.0632, netBasis: 0.0154, irr: 1.3938, impliedRate: 1.57, basisSpread: 0.5394, contract: 'T2612.CFE' },
+  { date: '2026-07-28', basis: 0.0812, code: '260012.IB', name: '26附息国债12', tenor: 6.89, price: 99.9664, ytm: 1.565, fullBasis: 0.0812, netBasis: 0.0466, irr: 1.3462, impliedRate: 1.5782, basisSpread: 0.5171, contract: 'T2612.CFE' },
+  { date: '2026-07-29', basis: 0.0814, code: '260012.IB', name: '26附息国债12', tenor: 6.88, price: 99.9987, ytm: 1.56, fullBasis: 0.0814, netBasis: 0.0604, irr: 1.3436, impliedRate: 1.573, basisSpread: 0.5126, contract: 'T2612.CFE' },
+  { date: '2026-07-30', basis: 0.091, code: '260012.IB', name: '26附息国债12', tenor: 6.88, price: 100.0861, ytm: 1.5465, fullBasis: 0.091, netBasis: 0.0516, irr: 1.3157, impliedRate: 1.5603, basisSpread: 0.4988, contract: 'T2612.CFE' },
+  { date: '2026-07-31', basis: 0.0712, code: '260012.IB', name: '26附息国债12', tenor: 6.88, price: 100.1671, ytm: 1.534, fullBasis: 0.0712, netBasis: 0.0307, irr: 1.3652, impliedRate: 1.5439, basisSpread: 0.5143, contract: 'T2612.CFE' },
+  { date: '2026-08-03', basis: 0.0733, code: '260012.IB', name: '26附息国债12', tenor: 6.87, price: 100.128, ytm: 1.54, fullBasis: 0.0733, netBasis: 0.0238, irr: 1.3556, impliedRate: 1.5506, basisSpread: 0.4994, contract: 'T2612.CFE' },
+  { date: '2026-08-04', basis: 0.0833, code: '260012.IB', name: '26附息国债12', tenor: 6.87, price: 100.225, ytm: 1.525, fullBasis: 0.0833, netBasis: 0.0205, irr: 1.3255, impliedRate: 1.5364, basisSpread: 0.4851, contract: 'T2612.CFE' },
+  { date: '2026-08-05', basis: 0.0692, code: '260012.IB', name: '26附息国债12', tenor: 6.87, price: 100.1926, ytm: 1.53, fullBasis: 0.0692, netBasis: 0.0039, irr: 1.3629, impliedRate: 1.5394, basisSpread: 0.4949, contract: 'T2612.CFE' },
+  { date: '2026-08-06', basis: 0.0993, code: '260012.IB', name: '26附息国债12', tenor: 6.86, price: 100.186, ytm: 1.531, fullBasis: 0.0993, netBasis: 0.0373, irr: 1.2781, impliedRate: 1.5454, basisSpread: 0.4606, contract: 'T2612.CFE' },
+  { date: '2026-08-07', basis: 0.0622, code: '260012.IB', name: '26附息国债12', tenor: 6.86, price: 100.2085, ytm: 1.5275, fullBasis: 0.0622, netBasis: 0.0031, irr: 1.3792, impliedRate: 1.5357, basisSpread: 0.4934, contract: 'T2612.CFE' },
+  { date: '2026-08-10', basis: 0.0727, code: '260012.IB', name: '26附息国债12', tenor: 6.85, price: 100.2373, ytm: 1.523, fullBasis: 0.0727, netBasis: 0.0177, irr: 1.3445, impliedRate: 1.5327, basisSpread: 0.4701, contract: 'T2612.CFE' },
+  { date: '2026-08-11', basis: 0.0595, code: '260012.IB', name: '26附息国债12', tenor: 6.85, price: 100.192, ytm: 1.53, fullBasis: 0.0595, netBasis: 0.0037, irr: 1.3816, impliedRate: 1.5379, basisSpread: 0.479, contract: 'T2612.CFE' },
+  { date: '2026-08-12', basis: 0.0943, code: '260012.IB', name: '26附息国债12', tenor: 6.85, price: 100.2177, ytm: 1.526, fullBasis: 0.0943, netBasis: 0.0403, irr: 1.2785, impliedRate: 1.5394, basisSpread: 0.4399, contract: 'T2612.CFE' },
+  { date: '2026-08-13', basis: 0.091, code: '260012.IB', name: '26附息国债12', tenor: 6.84, price: 100.2693, ytm: 1.518, fullBasis: 0.091, netBasis: 0.0362, irr: 1.2854, impliedRate: 1.5305, basisSpread: 0.439, contract: 'T2612.CFE' },
+  { date: '2026-08-14', basis: 0.0622, code: '260012.IB', name: '26附息国债12', tenor: 6.84, price: 100.3047, ytm: 1.5125, fullBasis: 0.0622, netBasis: 0.0062, irr: 1.3675, impliedRate: 1.5201, basisSpread: 0.4634, contract: 'T2612.CFE' },
+  { date: '2026-08-17', basis: 0.0669, code: '260012.IB', name: '26附息国债12', tenor: 6.83, price: 100.3139, ytm: 1.511, fullBasis: 0.0669, netBasis: 0.0112, irr: 1.3487, impliedRate: 1.5193, basisSpread: 0.446, contract: 'T2612.CFE' },
+  { date: '2026-08-18', basis: 0.0378, code: '260012.IB', name: '26附息国债12', tenor: 6.83, price: 100.3719, ytm: 1.502, fullBasis: 0.0378, netBasis: -0.0196, irr: 1.4346, impliedRate: 1.5052, basisSpread: 0.4707, contract: 'T2612.CFE' },
+  { date: '2026-08-19', basis: -0.0209, code: '260012.IB', name: '26附息国债12', tenor: 6.83, price: 100.304, ytm: 1.5125, fullBasis: -0.0209, netBasis: -0.0759, irr: 1.6151, impliedRate: 1.5067, basisSpread: 0.5252, contract: 'T2612.CFE' },
+  { date: '2026-08-20', basis: 0.0684, code: '260012.IB', name: '26附息国债12', tenor: 6.82, price: 100.32, ytm: 1.51, fullBasis: 0.0684, netBasis: 0.0156, irr: 1.3385, impliedRate: 1.5186, basisSpread: 0.4316, contract: 'T2612.CFE' },
+  { date: '2026-08-21', basis: 0.0407, code: '260012.IB', name: '26附息国债12', tenor: 6.82, price: 100.3198, ytm: 1.51, fullBasis: 0.0407, netBasis: 0.0026, irr: 1.4232, impliedRate: 1.5141, basisSpread: 0.455, contract: 'T2612.CFE' },
+  { date: '2026-08-24', basis: 0.0324, code: '260012.IB', name: '26附息国债12', tenor: 6.81, price: 100.4031, ytm: 1.497, fullBasis: 0.0324, netBasis: -0.0035, irr: 1.4451, impliedRate: 1.4992, basisSpread: 0.4505, contract: 'T2612.CFE' },
+  { date: '2026-08-25', basis: 0.0348, code: '260012.IB', name: '26附息国债12', tenor: 6.81, price: 100.3643, ytm: 1.503, fullBasis: 0.0348, netBasis: 0.005, irr: 1.4368, impliedRate: 1.5059, basisSpread: 0.4438, contract: 'T2612.CFE' },
+  { date: '2026-08-26', basis: 0.0546, code: '260012.IB', name: '26附息国债12', tenor: 6.81, price: 100.3062, ytm: 1.512, fullBasis: 0.0546, netBasis: 0.0172, irr: 1.372, impliedRate: 1.5186, basisSpread: 0.4198, contract: 'T2612.CFE' },
+  { date: '2026-08-27', basis: 0.1056, code: '260012.IB', name: '26附息国债12', tenor: 6.81, price: 100.229, ytm: 1.524, fullBasis: 0.1056, netBasis: 0.0582, irr: 1.2029, impliedRate: 1.5394, basisSpread: 0.3645, contract: 'T2612.CFE' },
+  { date: '2026-08-28', basis: 0.1183, code: '260012.IB', name: '26附息国债12', tenor: 6.8, price: 100.2417, ytm: 1.522, fullBasis: 0.1183, netBasis: 0.0686, irr: 1.1572, impliedRate: 1.5394, basisSpread: 0.3475, contract: 'T2612.CFE' },
+  { date: '2026-08-31', basis: 0.1107, code: '260012.IB', name: '26附息国债12', tenor: 6.79, price: 100.2478, ytm: 1.521, fullBasis: 0.1107, netBasis: 0.0718, irr: 1.172, impliedRate: 1.5372, basisSpread: 0.3423, contract: 'T2612.CFE' },
+  { date: '2026-09-01', basis: 0.085, code: '260012.IB', name: '26附息国债12', tenor: 6.79, price: 100.2862, ytm: 1.515, fullBasis: 0.085, netBasis: 0.0368, irr: 1.2568, impliedRate: 1.5268, basisSpread: 0.3638, contract: 'T2612.CFE' },
+  { date: '2026-09-02', basis: 0.093, code: '260012.IB', name: '26附息国债12', tenor: 6.79, price: 100.2668, ytm: 1.518, fullBasis: 0.093, netBasis: 0.0424, irr: 1.2259, impliedRate: 1.5312, basisSpread: 0.3514, contract: 'T2612.CFE' },
+  { date: '2026-09-03', basis: 0.0549, code: '260012.IB', name: '26附息国债12', tenor: 6.79, price: 100.334, ytm: 1.5075, fullBasis: 0.0549, netBasis: 0.004, irr: 1.3562, impliedRate: 1.5141, basisSpread: 0.3853, contract: 'T2612.CFE' },
+  { date: '2026-09-04', basis: 0.0639, code: '260012.IB', name: '26附息国债12', tenor: 6.78, price: 100.3018, ytm: 1.5125, fullBasis: 0.0639, netBasis: 0.014, irr: 1.3226, impliedRate: 1.5208, basisSpread: 0.372, contract: 'T2612.CFE' },
+  { date: '2026-09-07', basis: 0.0768, code: '260012.IB', name: '26附息国债12', tenor: 6.78, price: 100.3238, ytm: 1.509, fullBasis: 0.0768, netBasis: 0.0298, irr: 1.2682, impliedRate: 1.5193, basisSpread: 0.3463, contract: 'T2612.CFE' },
+  { date: '2026-09-08', basis: 0.0941, code: '260012.IB', name: '26附息国债12', tenor: 6.77, price: 100.3045, ytm: 1.512, fullBasis: 0.0941, netBasis: 0.0486, irr: 1.2014, impliedRate: 1.5253, basisSpread: 0.3247, contract: 'T2612.CFE' },
+  { date: '2026-09-09', basis: 0.0618, code: '260012.IB', name: '26附息国债12', tenor: 6.77, price: 100.3043, ytm: 1.512, fullBasis: 0.0618, netBasis: 0.0202, irr: 1.3183, impliedRate: 1.5201, basisSpread: 0.3527, contract: 'T2612.CFE' },
+  { date: '2026-09-10', basis: 0.0801, code: '260012.IB', name: '26附息国债12', tenor: 6.77, price: 100.3042, ytm: 1.512, fullBasis: 0.0801, netBasis: 0.0435, irr: 1.247, impliedRate: 1.523, basisSpread: 0.3302, contract: 'T2612.CFE' },
+  { date: '2026-09-11', basis: 0.0957, code: '260012.IB', name: '26附息国债12', tenor: 6.76, price: 100.2466, ytm: 1.521, fullBasis: 0.0957, netBasis: 0.0624, irr: 1.1846, impliedRate: 1.535, basisSpread: 0.3103, contract: 'T2612.CFE' },
+  { date: '2026-09-14', basis: 0.0871, code: '260012.IB', name: '26附息国债12', tenor: 6.76, price: 100.2654, ytm: 1.518, fullBasis: 0.0871, netBasis: 0.0528, irr: 1.2066, impliedRate: 1.5305, basisSpread: 0.3061, contract: 'T2612.CFE' },
+  { date: '2026-09-15', basis: 0.0597, code: '260012.IB', name: '26附息国债12', tenor: 6.75, price: 100.3067, ytm: 1.5115, fullBasis: 0.0597, netBasis: 0.0283, irr: 1.3114, impliedRate: 1.5193, basisSpread: 0.3292, contract: 'T2612.CFE' },
+  { date: '2026-09-16', basis: 0.0635, code: '260012.IB', name: '26附息国债12', tenor: 6.75, price: 100.3289, ytm: 1.508, fullBasis: 0.0635, netBasis: 0.0358, irr: 1.2928, impliedRate: 1.5163, basisSpread: 0.3211, contract: 'T2612.CFE' },
+  { date: '2026-09-17', basis: 0.0698, code: '260012.IB', name: '26附息国债12', tenor: 6.75, price: 100.3352, ytm: 1.507, fullBasis: 0.0698, netBasis: 0.0459, irr: 1.2641, impliedRate: 1.5163, basisSpread: 0.3105, contract: 'T2612.CFE' },
+  { date: '2026-09-18', basis: 0.0594, code: '260012.IB', name: '26附息国债12', tenor: 6.75, price: 100.3797, ytm: 1.5, fullBasis: 0.0594, netBasis: 0.0331, irr: 1.3033, impliedRate: 1.5074, basisSpread: 0.3167, contract: 'T2612.CFE' },
+  { date: '2026-09-21', basis: 0.0607, code: '260012.IB', name: '26附息国债12', tenor: 6.74, price: 100.3856, ytm: 1.499, fullBasis: 0.0607, netBasis: 0.025, irr: 1.2888, impliedRate: 1.5067, basisSpread: 0.3026, contract: 'T2612.CFE' },
+  { date: '2026-09-22', basis: 0.0399, code: '260012.IB', name: '26附息国债12', tenor: 6.73, price: 100.4427, ytm: 1.49, fullBasis: 0.0399, netBasis: 0.0022, irr: 1.3744, impliedRate: 1.494, basisSpread: 0.319, contract: 'T2612.CFE' },
 ]
 
 // === §D.4 3*T - TL 价差 ===
 // 3 * T (10年期期货结算价) - TL (30年期期货结算价)
 export const TRIPLE_T_TL = [
-  { date: '2026-06-15', t10: 107.85, t5: 104.95, t30: 115.05, val: 208.50 },
-  { date: '2026-06-16', t10: 107.92, t5: 104.99, t30: 115.18, val: 208.58 },
-  { date: '2026-06-17', t10: 107.88, t5: 104.95, t30: 115.13, val: 208.51 },
-  { date: '2026-06-18', t10: 107.93, t5: 105.01, t30: 115.20, val: 208.59 },
-  { date: '2026-06-22', t10: 108.05, t5: 105.10, t30: 115.35, val: 208.80 },
-  { date: '2026-06-23', t10: 108.10, t5: 105.14, t30: 115.40, val: 208.90 },
-  { date: '2026-06-24', t10: 108.18, t5: 105.21, t30: 115.48, val: 209.06 },
-  { date: '2026-06-25', t10: 108.25, t5: 105.28, t30: 115.55, val: 209.20 },
-  { date: '2026-06-26', t10: 108.20, t5: 105.24, t30: 115.50, val: 209.10 },
-  { date: '2026-06-29', t10: 108.30, t5: 105.31, t30: 115.60, val: 209.30 },
-  { date: '2026-06-30', t10: 108.40, t5: 105.40, t30: 115.70, val: 209.50 },
-  { date: '2026-07-01', t10: 108.35, t5: 105.36, t30: 115.65, val: 209.40 },
-  { date: '2026-07-02', t10: 108.30, t5: 105.32, t30: 115.60, val: 209.30 },
-  { date: '2026-07-03', t10: 108.22, t5: 105.25, t30: 115.50, val: 209.16 },
-  { date: '2026-07-04', t10: 108.18, t5: 105.22, t30: 115.45, val: 209.09 },
-  { date: '2026-07-07', t10: 108.25, t5: 105.28, t30: 115.55, val: 209.20 },
-  { date: '2026-07-08', t10: 108.35, t5: 105.36, t30: 115.65, val: 209.40 },
-  { date: '2026-07-09', t10: 108.40, t5: 105.40, t30: 115.70, val: 209.50 },
-  { date: '2026-07-10', t10: 108.45, t5: 105.45, t30: 115.75, val: 209.60 },
-  { date: '2026-07-11', t10: 108.50, t5: 105.50, t30: 115.80, val: 209.70 },
-  { date: '2026-07-14', t10: 108.60, t5: 105.58, t30: 115.92, val: 209.88 },
-  { date: '2026-07-15', t10: 108.65, t5: 105.63, t30: 115.98, val: 209.97 },
-  { date: '2026-07-16', t10: 108.72, t5: 105.70, t30: 116.05, val: 210.11 },
-  { date: '2026-07-17', t10: 108.78, t5: 105.76, t30: 116.12, val: 210.22 },
-  { date: '2026-07-18', t10: 108.85, t5: 105.82, t30: 116.18, val: 210.37 },
-  { date: '2026-07-21', t10: 108.80, t5: 105.78, t30: 116.12, val: 210.28 },
-  { date: '2026-07-22', t10: 108.88, t5: 105.85, t30: 116.20, val: 210.44 },
-  { date: '2026-07-23', t10: 108.95, t5: 105.91, t30: 116.28, val: 210.57 },
-  { date: '2026-07-24', t10: 108.90, t5: 105.86, t30: 116.22, val: 210.48 },
-  { date: '2026-07-25', t10: 109.00, t5: 105.96, t30: 116.35, val: 210.65 },
-  { date: '2026-07-28', t10: 109.05, t5: 106.00, t30: 116.40, val: 210.75 },
-  { date: '2026-07-29', t10: 109.00, t5: 105.96, t30: 116.35, val: 210.65 },
-  { date: '2026-07-30', t10: 109.08, t5: 106.03, t30: 116.45, val: 210.79 },
-  { date: '2026-07-31', t10: 109.12, t5: 106.07, t30: 116.50, val: 210.86 },
-  { date: '2026-08-01', t10: 109.18, t5: 106.12, t30: 116.55, val: 210.99 },
-  { date: '2026-08-04', t10: 109.22, t5: 106.16, t30: 116.60, val: 211.06 },
-  { date: '2026-08-05', t10: 109.28, t5: 106.21, t30: 116.68, val: 211.16 },
-  { date: '2026-08-06', t10: 109.34, t5: 106.26, t30: 116.74, val: 211.28 },
-  { date: '2026-08-07', t10: 109.40, t5: 106.32, t30: 116.80, val: 211.40 },
-  { date: '2026-08-08', t10: 109.45, t5: 106.36, t30: 116.85, val: 211.50 },
-  { date: '2026-08-11', t10: 109.40, t5: 106.32, t30: 116.80, val: 211.40 },
-  { date: '2026-08-12', t10: 109.35, t5: 106.28, t30: 116.74, val: 211.31 },
-  { date: '2026-08-13', t10: 109.30, t5: 106.23, t30: 116.68, val: 211.22 },
-  { date: '2026-08-14', t10: 109.28, t5: 106.21, t30: 116.65, val: 211.19 },
-  { date: '2026-08-15', t10: 109.25, t5: 106.19, t30: 116.62, val: 211.13 },
-  { date: '2026-08-18', t10: 109.20, t5: 106.14, t30: 116.58, val: 211.02 },
-  { date: '2026-08-19', t10: 109.18, t5: 106.12, t30: 116.55, val: 210.99 },
-  { date: '2026-08-20', t10: 109.22, t5: 106.16, t30: 116.60, val: 211.06 },
-  { date: '2026-08-21', t10: 109.15, t5: 106.10, t30: 116.50, val: 210.95 },
-  { date: '2026-08-22', t10: 109.10, t5: 106.06, t30: 116.42, val: 210.88 },
-  { date: '2026-08-25', t10: 109.05, t5: 106.01, t30: 116.35, val: 210.80 },
-  { date: '2026-08-26', t10: 109.02, t5: 105.99, t30: 116.32, val: 210.74 },
-  { date: '2026-08-27', t10: 108.98, t5: 105.96, t30: 116.28, val: 210.66 },
-  { date: '2026-08-28', t10: 108.95, t5: 105.94, t30: 116.25, val: 210.60 },
-  { date: '2026-08-29', t10: 108.92, t5: 105.92, t30: 116.22, val: 210.54 },
-  { date: '2026-09-01', t10: 108.95, t5: 105.95, t30: 116.26, val: 210.59 },
-  { date: '2026-09-02', t10: 108.92, t5: 105.93, t30: 116.22, val: 210.54 },
-  { date: '2026-09-03', t10: 108.95, t5: 105.96, t30: 116.26, val: 210.59 },
-  { date: '2026-09-04', t10: 108.98, t5: 105.99, t30: 116.30, val: 210.64 },
-  { date: '2026-09-05', t10: 109.02, t5: 106.02, t30: 116.35, val: 210.71 },
-  { date: '2026-09-08', t10: 109.08, t5: 106.07, t30: 116.42, val: 210.82 },
-  { date: '2026-09-09', t10: 109.14, t5: 106.13, t30: 116.50, val: 210.92 },
-  { date: '2026-09-10', t10: 109.18, t5: 106.16, t30: 116.55, val: 210.99 },
-  { date: '2026-09-11', t10: 109.22, t5: 106.20, t30: 116.60, val: 211.06 },
-  { date: '2026-09-12', t10: 109.26, t5: 106.24, t30: 116.66, val: 211.12 },
-  { date: '2026-09-15', t10: 109.32, t5: 106.29, t30: 116.72, val: 211.24 },
-  { date: '2026-09-16', t10: 109.36, t5: 106.33, t30: 116.78, val: 211.30 },
-  { date: '2026-09-17', t10: 109.40, t5: 106.36, t30: 116.82, val: 211.38 },
-  { date: '2026-09-18', t10: 109.45, t5: 106.41, t30: 116.88, val: 211.47 },
-  { date: '2026-09-19', t10: 109.50, t5: 106.46, t30: 116.95, val: 211.55 },
-  { date: '2026-09-22', t10: 109.61, t5: 106.585, t30: 117.05, val: 211.78 },
+  { date: '2026-06-15', t10: 108.815, t5: 106.11, t30: 113.4, val: 46188 },
+  { date: '2026-06-16', t10: 108.965, t5: 106.235, t30: 113.64, val: 46189 },
+  { date: '2026-06-17', t10: 109.015, t5: 106.26, t30: 113.87, val: 46190 },
+  { date: '2026-06-18', t10: 109.045, t5: 106.305, t30: 113.82, val: 46191 },
+  { date: '2026-06-22', t10: 109.07, t5: 106.325, t30: 114, val: 46195 },
+  { date: '2026-06-23', t10: 108.955, t5: 106.25, t30: 113.64, val: 46196 },
+  { date: '2026-06-24', t10: 109.015, t5: 106.315, t30: 113.57, val: 46197 },
+  { date: '2026-06-25', t10: 109.095, t5: 106.35, t30: 113.95, val: 46198 },
+  { date: '2026-06-26', t10: 109.18, t5: 106.41, t30: 114.11, val: 46199 },
+  { date: '2026-06-29', t10: 109.32, t5: 106.515, t30: 114.27, val: 46202 },
+  { date: '2026-06-30', t10: 109.215, t5: 106.445, t30: 113.75, val: 46203 },
+  { date: '2026-07-01', t10: 108.995, t5: 106.285, t30: 113.37, val: 46204 },
+  { date: '2026-07-02', t10: 109.08, t5: 106.345, t30: 113.5, val: 46205 },
+  { date: '2026-07-03', t10: 109.045, t5: 106.34, t30: 113.33, val: 46206 },
+  { date: '2026-07-06', t10: 109.165, t5: 106.42, t30: 113.62, val: 46209 },
+  { date: '2026-07-07', t10: 109.155, t5: 106.425, t30: 113.61, val: 46210 },
+  { date: '2026-07-08', t10: 109.245, t5: 106.475, t30: 113.91, val: 46211 },
+  { date: '2026-07-09', t10: 109.23, t5: 106.45, t30: 113.93, val: 46212 },
+  { date: '2026-07-10', t10: 109.22, t5: 106.445, t30: 114, val: 46213 },
+  { date: '2026-07-13', t10: 109.185, t5: 106.44, t30: 113.76, val: 46216 },
+  { date: '2026-07-14', t10: 109.19, t5: 106.455, t30: 113.79, val: 46217 },
+  { date: '2026-07-15', t10: 109.19, t5: 106.455, t30: 113.86, val: 46218 },
+  { date: '2026-07-16', t10: 109.135, t5: 106.405, t30: 113.61, val: 46219 },
+  { date: '2026-07-17', t10: 109.195, t5: 106.44, t30: 113.88, val: 46220 },
+  { date: '2026-07-20', t10: 109.13, t5: 106.395, t30: 113.72, val: 46223 },
+  { date: '2026-07-21', t10: 109.175, t5: 106.44, t30: 113.89, val: 46224 },
+  { date: '2026-07-22', t10: 109.3, t5: 106.515, t30: 114.49, val: 46225 },
+  { date: '2026-07-23', t10: 109.215, t5: 106.44, t30: 114.69, val: 46226 },
+  { date: '2026-07-24', t10: 109.26, t5: 106.44, t30: 114.72, val: 46227 },
+  { date: '2026-07-27', t10: 109.225, t5: 106.41, t30: 114.97, val: 46230 },
+  { date: '2026-07-28', t10: 109.175, t5: 106.37, t30: 114.9, val: 46231 },
+  { date: '2026-07-29', t10: 109.205, t5: 106.4, t30: 114.71, val: 46232 },
+  { date: '2026-07-30', t10: 109.28, t5: 106.46, t30: 115.07, val: 46233 },
+  { date: '2026-07-31', t10: 109.385, t5: 106.525, t30: 115.36, val: 46234 },
+  { date: '2026-08-03', t10: 109.325, t5: 106.46, t30: 115.42, val: 46237 },
+  { date: '2026-08-04', t10: 109.415, t5: 106.525, t30: 115.62, val: 46238 },
+  { date: '2026-08-05', t10: 109.395, t5: 106.5, t30: 115.44, val: 46239 },
+  { date: '2026-08-06', t10: 109.38, t5: 106.5, t30: 115.39, val: 46240 },
+  { date: '2026-08-07', t10: 109.44, t5: 106.545, t30: 115.77, val: 46241 },
+  { date: '2026-08-10', t10: 109.47, t5: 106.555, t30: 116.09, val: 46244 },
+  { date: '2026-08-11', t10: 109.425, t5: 106.51, t30: 115.92, val: 46245 },
+  { date: '2026-08-12', t10: 109.42, t5: 106.52, t30: 115.9, val: 46246 },
+  { date: '2026-08-13', t10: 109.475, t5: 106.56, t30: 116.28, val: 46247 },
+  { date: '2026-08-14', t10: 109.54, t5: 106.61, t30: 116.37, val: 46248 },
+  { date: '2026-08-17', t10: 109.525, t5: 106.605, t30: 116.15, val: 46251 },
+  { date: '2026-08-18', t10: 109.605, t5: 106.66, t30: 116.49, val: 46252 },
+  { date: '2026-08-19', t10: 109.58, t5: 106.635, t30: 116.22, val: 46253 },
+  { date: '2026-08-20', t10: 109.48, t5: 106.585, t30: 115.9, val: 46254 },
+  { date: '2026-08-21', t10: 109.455, t5: 106.56, t30: 115.89, val: 46255 },
+  { date: '2026-08-24', t10: 109.55, t5: 106.605, t30: 116.21, val: 46258 },
+  { date: '2026-08-25', t10: 109.545, t5: 106.575, t30: 116.63, val: 46259 },
+  { date: '2026-08-26', t10: 109.445, t5: 106.51, t30: 116.47, val: 46260 },
+  { date: '2026-08-27', t10: 109.305, t5: 106.415, t30: 115.92, val: 46261 },
+  { date: '2026-08-28', t10: 109.305, t5: 106.415, t30: 115.8, val: 46262 },
+  { date: '2026-08-31', t10: 109.32, t5: 106.41, t30: 115.88, val: 46265 },
+  { date: '2026-09-01', t10: 109.39, t5: 106.475, t30: 116.18, val: 46266 },
+  { date: '2026-09-02', t10: 109.36, t5: 106.445, t30: 115.9, val: 46267 },
+  { date: '2026-09-03', t10: 109.475, t5: 106.495, t30: 116.35, val: 46268 },
+  { date: '2026-09-04', t10: 109.43, t5: 106.435, t30: 116.37, val: 46269 },
+  { date: '2026-09-07', t10: 109.44, t5: 106.465, t30: 116.46, val: 46272 },
+  { date: '2026-09-08', t10: 109.4, t5: 106.425, t30: 116.41, val: 46273 },
+  { date: '2026-09-09', t10: 109.435, t5: 106.455, t30: 116.44, val: 46274 },
+  { date: '2026-09-10', t10: 109.415, t5: 106.45, t30: 116.23, val: 46275 },
+  { date: '2026-09-11', t10: 109.335, t5: 106.39, t30: 116.07, val: 46276 },
+  { date: '2026-09-14', t10: 109.365, t5: 106.42, t30: 115.91, val: 46279 },
+  { date: '2026-09-15', t10: 109.44, t5: 106.48, t30: 116.11, val: 46280 },
+  { date: '2026-09-16', t10: 109.46, t5: 106.49, t30: 116.13, val: 46281 },
+  { date: '2026-09-17', t10: 109.46, t5: 106.495, t30: 116.17, val: 46282 },
+  { date: '2026-09-18', t10: 109.52, t5: 106.535, t30: 116.51, val: 46283 },
+  { date: '2026-09-21', t10: 109.525, t5: 106.52, t30: 116.69, val: 46286 },
+  { date: '2026-09-22', t10: 109.61, t5: 106.585, t30: 117.05, val: 46287 },
 ]
 
 export const TRIPLE_T_TL_LATEST = {
@@ -246,7 +289,7 @@ export const TRIPLE_T_TL_LATEST = {
   t10: 109.61,
   t5: 106.585,
   t30: 117.05,
-  val: 211.78,
+  val: 46287,
 }
 
 export const SPREAD_NOTES = [
@@ -262,4 +305,4 @@ export const SPREAD_NOTES = [
     title: '3*T - TL 价差',
     desc: '3 倍 10 年期国债期货减去 30 年期国债期货。用于刻画收益率曲线陡峭度变化,价差上行通常意味着曲线变陡(长端相对走弱)。',
   },
-]
+]

+ 206 - 93
web-app/src/views/multiasset/fund/data.js

@@ -1,5 +1,5 @@
 // 基金产品筛选打分模型 · 数据加载层
-// 数据源:4.3-多资产分析.xlsx · 3.1 - 3.5 sheets
+// 数据源:4.3-多资产分析.xlsx · 3.2 - 3.5 sheets
 //   §F.1 最新二级债基打分结果排名(按基金公司)
 //   §F.2 权益仓位 5%-15% 排名(一级债基为主)
 //   §F.3 权益仓位 15%-25% 排名(二级债基居多)
@@ -26,8 +26,8 @@ export const palette = {
   tealBg: '#E0F7F4',
 }
 
-// 截止日期(数据截至 2026/6/30,模型 2026Q2)
-export const AS_OF = '2026-06-30'
+// 截止日期(数据截至 2026/9/22,模型 2026Q2)
+export const AS_OF = '2026-09-22'
 export const PERIOD = '2026Q2'
 
 // 评分维度权重(满分 10)
@@ -64,112 +64,225 @@ export const SCORE_RULES = [
 
 // ===== §F.1 最新二级债基打分结果(按基金公司) =====
 export const COMPANY_SCORES = [
-  { name: '景顺长城基金管理有限公司', scale: 2757.32, scaleChange: 335.37, growthRate: 0.1385, marketShare: 0.1186, score: 9.60, recommendedCap: 0.20 },
-  { name: '易方达基金管理有限公司',     scale: 2108.95, scaleChange: 333.85, growthRate: 0.1881, marketShare: 0.0907, score: 8.50, recommendedCap: 0.15 },
-  { name: '华商基金管理有限公司',       scale: 912.24,  scaleChange: 299.20, growthRate: 0.4881, marketShare: 0.0393, score: 8.20, recommendedCap: 0.15 },
-  { name: '富国基金管理有限公司',       scale: 1510.51, scaleChange: 332.87, growthRate: 0.2827, marketShare: 0.0650, score: 8.05, recommendedCap: 0.15 },
-  { name: '鹏华基金管理有限公司',       scale: 951.01,  scaleChange: 306.40, growthRate: 0.4753, marketShare: 0.0409, score: 7.80, recommendedCap: 0.10 },
-  { name: '汇添富基金管理股份有限公司', scale: 1418.30, scaleChange: 497.25, growthRate: 0.5399, marketShare: 0.0610, score: 7.70, recommendedCap: 0.10 },
-  { name: '南方基金管理股份有限公司',   scale: 998.58,  scaleChange: 236.87, growthRate: 0.3110, marketShare: 0.0430, score: 7.50, recommendedCap: 0.07 },
-  { name: '招商基金管理有限公司',       scale: 895.73,  scaleChange: -150.81,growthRate: -0.1441,marketShare: 0.0385, score: 7.30, recommendedCap: 0.07 },
-  { name: '兴业基金管理有限公司',       scale: 437.09,  scaleChange: 113.37, growthRate: 0.3502, marketShare: 0.0188, score: 7.00, recommendedCap: 0.07 },
-  { name: '永赢基金管理有限公司',       scale: 616.28,  scaleChange: 118.12, growthRate: 0.2371, marketShare: 0.0265, score: 6.75, recommendedCap: 0.05 },
-  { name: '华夏基金管理有限公司',       scale: 851.65,  scaleChange: 94.02,  growthRate: 0.1241, marketShare: 0.0366, score: 6.65, recommendedCap: 0.05 },
-  { name: '中欧基金管理有限公司',       scale: 731.77,  scaleChange: -164.63,growthRate: -0.1837,marketShare: 0.0315, score: 6.65, recommendedCap: 0.05 },
-  { name: '博时基金管理有限公司',       scale: 613.43,  scaleChange: 135.36, growthRate: 0.2831, marketShare: 0.0264, score: 6.60, recommendedCap: 0.05 },
-  { name: '交银施罗德基金管理有限公司', scale: 331.35,  scaleChange: 103.60, growthRate: 0.4549, marketShare: 0.0143, score: 6.45, recommendedCap: 0.05 },
-  { name: '嘉实基金管理有限公司',       scale: 536.76,  scaleChange: 134.99, growthRate: 0.3360, marketShare: 0.0231, score: 6.20, recommendedCap: 0.02 },
-  { name: '大成基金管理有限公司',       scale: 232.04,  scaleChange: 34.81,  growthRate: 0.1765, marketShare: 0.0100, score: 6.05, recommendedCap: 0.02 },
-  { name: '工银瑞信基金管理有限公司',   scale: 453.47,  scaleChange: 2.50,   growthRate: 0.0055, marketShare: 0.0195, score: 5.95, recommendedCap: 0.02 },
-  { name: '兴证全球基金管理有限公司',   scale: 251.30,  scaleChange: -2.41,  growthRate: -0.0095,marketShare: 0.0108, score: 5.75, recommendedCap: 0.02 },
-  { name: '天弘基金管理有限公司',       scale: 423.49,  scaleChange: -21.79, growthRate: -0.0489,marketShare: 0.0182, score: 5.65, recommendedCap: 0.02 },
-  { name: '银华基金管理股份有限公司',   scale: 346.52,  scaleChange: -27.44, growthRate: -0.0734,marketShare: 0.0149, score: 5.65, recommendedCap: 0.02 },
-  { name: '中银基金管理有限公司',       scale: 231.17,  scaleChange: -83.64, growthRate: -0.2657,marketShare: 0.0099, score: 5.50, recommendedCap: 0.02 },
-  { name: '广发基金管理有限公司',       scale: 505.60,  scaleChange: -63.09, growthRate: -0.1109,marketShare: 0.0218, score: 5.40, recommendedCap: 0.02 },
-  { name: '华安基金管理有限公司',       scale: 177.74,  scaleChange: -74.55, growthRate: -0.2955,marketShare: 0.0076, score: 5.25, recommendedCap: 0.02 },
-  { name: '平安基金管理有限公司',       scale: 266.90,  scaleChange: 49.40,  growthRate: 0.2271, marketShare: 0.0115, score: 4.85, recommendedCap: 0.02 },
-  { name: '安信基金管理有限责任公司',   scale: 233.09,  scaleChange: -25.27, growthRate: -0.0978,marketShare: 0.0100, score: 4.85, recommendedCap: 0.02 },
+  { name: '景顺长城基金管理有限公司', scale: 2757.32, scaleChange: 335.37, growthRate: 0.1385, marketShare: 0.1186, score: 9.6, recommendedCap: 0.2 },
+  { name: '易方达基金管理有限公司', scale: 2108.95, scaleChange: 333.85, growthRate: 0.1881, marketShare: 0.0907, score: 8.5, recommendedCap: 0.15 },
+  { name: '华商基金管理有限公司', scale: 912.24, scaleChange: 299.2, growthRate: 0.4881, marketShare: 0.0393, score: 8.2, recommendedCap: 0.15 },
+  { name: '富国基金管理有限公司', scale: 1510.51, scaleChange: 332.87, growthRate: 0.2827, marketShare: 0.065, score: 8.05, recommendedCap: 0.15 },
+  { name: '鹏华基金管理有限公司', scale: 951.01, scaleChange: 306.4, growthRate: 0.4753, marketShare: 0.0409, score: 7.8, recommendedCap: 0.1 },
+  { name: '汇添富基金管理股份有限公司', scale: 1418.3, scaleChange: 497.25, growthRate: 0.5399, marketShare: 0.061, score: 7.7, recommendedCap: 0.1 },
+  { name: '南方基金管理股份有限公司', scale: 998.58, scaleChange: 236.87, growthRate: 0.311, marketShare: 0.043, score: 7.5, recommendedCap: 0.07 },
+  { name: '招商基金管理有限公司', scale: 895.73, scaleChange: -150.81, growthRate: -0.1441, marketShare: 0.0385, score: 7.3, recommendedCap: 0.07 },
+  { name: '兴业基金管理有限公司', scale: 437.09, scaleChange: 113.37, growthRate: 0.3502, marketShare: 0.0188, score: 7, recommendedCap: 0.07 },
+  { name: '永赢基金管理有限公司', scale: 616.28, scaleChange: 118.12, growthRate: 0.2371, marketShare: 0.0265, score: 6.75, recommendedCap: 0.05 },
+  { name: '华夏基金管理有限公司', scale: 851.65, scaleChange: 94.02, growthRate: 0.1241, marketShare: 0.0366, score: 6.65, recommendedCap: 0.05 },
+  { name: '中欧基金管理有限公司', scale: 731.77, scaleChange: -164.63, growthRate: -0.1837, marketShare: 0.0315, score: 6.65, recommendedCap: 0.05 },
+  { name: '博时基金管理有限公司', scale: 613.43, scaleChange: 135.36, growthRate: 0.2831, marketShare: 0.0264, score: 6.6, recommendedCap: 0.05 },
+  { name: '交银施罗德基金管理有限公司', scale: 331.35, scaleChange: 103.6, growthRate: 0.4549, marketShare: 0.0143, score: 6.45, recommendedCap: 0.05 },
+  { name: '嘉实基金管理有限公司', scale: 536.76, scaleChange: 134.99, growthRate: 0.336, marketShare: 0.0231, score: 6.2, recommendedCap: 0.02 },
+  { name: '大成基金管理有限公司', scale: 232.04, scaleChange: 34.81, growthRate: 0.1765, marketShare: 0.01, score: 6.05, recommendedCap: 0.02 },
+  { name: '工银瑞信基金管理有限公司', scale: 453.47, scaleChange: 2.5, growthRate: 0.0055, marketShare: 0.0195, score: 5.95, recommendedCap: 0.02 },
+  { name: '兴证全球基金管理有限公司', scale: 251.3, scaleChange: -2.41, growthRate: -0.0095, marketShare: 0.0108, score: 5.75, recommendedCap: 0.02 },
+  { name: '天弘基金管理有限公司', scale: 423.49, scaleChange: -21.79, growthRate: -0.0489, marketShare: 0.0182, score: 5.65, recommendedCap: 0.02 },
+  { name: '银华基金管理股份有限公司', scale: 346.52, scaleChange: -27.44, growthRate: -0.0734, marketShare: 0.0149, score: 5.65, recommendedCap: 0.02 },
+  { name: '中银基金管理有限公司', scale: 231.17, scaleChange: -83.64, growthRate: -0.2657, marketShare: 0.0099, score: 5.5, recommendedCap: 0.02 },
+  { name: '广发基金管理有限公司', scale: 505.6, scaleChange: -63.09, growthRate: -0.1109, marketShare: 0.0218, score: 5.4, recommendedCap: 0.02 },
+  { name: '华安基金管理有限公司', scale: 177.74, scaleChange: -74.55, growthRate: -0.2955, marketShare: 0.0076, score: 5.25, recommendedCap: 0.02 },
+  { name: '平安基金管理有限公司', scale: 266.9, scaleChange: 49.4, growthRate: 0.2271, marketShare: 0.0115, score: 4.85, recommendedCap: 0.02 },
+  { name: '安信基金管理有限责任公司', scale: 233.09, scaleChange: -25.27, growthRate: -0.0978, marketShare: 0.01, score: 4.85, recommendedCap: 0.02 },
 ]
 
 // ===== §F.2 权益仓位 5%-15% 排名(一级债基为主) =====
 export const FUND_LOW = [
   { code: '006174.OF', name: '长信稳裕三个月定开债券发起式', quantScore: 97.55, percentile: 0.98, rank: 1, prevPercentile: 0.86, prevRank: 8, rankChange: 7 },
-  { code: '004821.OF', name: '国寿安保安吉纯债半年定开债券发起式', quantScore: 86.00, percentile: 0.96, rank: 2, prevPercentile: 0.98, prevRank: 1, rankChange: -1 },
-  { code: '009290.OF', name: '富国添享一年持有期债券A', quantScore: 85.90, percentile: 0.94, rank: 3, prevPercentile: 0.96, prevRank: 2, rankChange: -1 },
-  { code: '008019.OF', name: '鹏华丰鑫债券', quantScore: 84.20, percentile: 0.92, rank: 4, prevPercentile: 0.90, prevRank: 4, rankChange: 0 },
-  { code: '000166.OF', name: '中海稳健收益债券', quantScore: 82.85, percentile: 0.90, rank: 5, prevPercentile: 0.85, prevRank: 7, rankChange: 2 },
-  { code: '003102.OF', name: '长盛盛裕纯债A', quantScore: 81.50, percentile: 0.88, rank: 6, prevPercentile: 0.92, prevRank: 3, rankChange: -3 },
-  { code: '007194.OF', name: '长城久稳纯债债券A', quantScore: 80.20, percentile: 0.86, rank: 7, prevPercentile: 0.83, prevRank: 9, rankChange: 2 },
-  { code: '007735.OF', name: '金鹰添鑫定开债券发起式', quantScore: 78.65, percentile: 0.84, rank: 8, prevPercentile: 0.80, prevRank: 11, rankChange: 3 },
-  { code: '005579.OF', name: '光大保德信晟利债券A', quantScore: 77.40, percentile: 0.82, rank: 9, prevPercentile: 0.88, prevRank: 5, rankChange: -4 },
-  { code: '004000.OF', name: '泰康安泰回报债券A', quantScore: 76.10, percentile: 0.80, rank: 10, prevPercentile: 0.78, prevRank: 12, rankChange: 2 },
-  { code: '003868.OF', name: '招商招福宝货币B', quantScore: 75.00, percentile: 0.78, rank: 11, prevPercentile: 0.81, prevRank: 10, rankChange: -1 },
-  { code: '001948.OF', name: '建信稳定鑫利债券A', quantScore: 74.20, percentile: 0.76, rank: 12, prevPercentile: 0.74, prevRank: 14, rankChange: 2 },
-  { code: '002405.OF', name: '光大保德信中高等级债券A', quantScore: 72.85, percentile: 0.74, rank: 13, prevPercentile: 0.77, prevRank: 13, rankChange: 0 },
-  { code: '000295.OF', name: '鹏华丰实定期开放债券A', quantScore: 71.50, percentile: 0.72, rank: 14, prevPercentile: 0.70, prevRank: 16, rankChange: 2 },
-  { code: '001027.OF', name: '前海开源中证军工', quantScore: 70.85, percentile: 0.70, rank: 15, prevPercentile: 0.72, prevRank: 15, rankChange: 0 },
-  { code: '002883.OF', name: '华润元大现金通货币A', quantScore: 69.40, percentile: 0.68, rank: 16, prevPercentile: 0.65, prevRank: 18, rankChange: 2 },
-  { code: '000402.OF', name: '工银瑞信纯债债券A', quantScore: 68.10, percentile: 0.66, rank: 17, prevPercentile: 0.69, prevRank: 17, rankChange: 0 },
-  { code: '003926.OF', name: '中融盈泽中短债A', quantScore: 67.30, percentile: 0.64, rank: 18, prevPercentile: 0.61, prevRank: 19, rankChange: 1 },
-  { code: '002957.OF', name: '财通资管鑫管家货币A', quantScore: 66.50, percentile: 0.62, rank: 19, prevPercentile: 0.67, prevRank: 17, rankChange: -2 },
-  { code: '004137.OF', name: '博时合惠货币B', quantScore: 65.20, percentile: 0.60, rank: 20, prevPercentile: 0.58, prevRank: 21, rankChange: 1 },
+  { code: '004821.OF', name: '国寿安保安吉纯债半年定开债券发起式', quantScore: 86, percentile: 0.96, rank: 2, prevPercentile: 0.98, prevRank: 1, rankChange: -1 },
+  { code: '009290.OF', name: '富国添享一年持有期债券A', quantScore: 85.9, percentile: 0.94, rank: 3, prevPercentile: 0.96, prevRank: 2, rankChange: -1 },
+  { code: '002826.OF', name: '中银永利半年定期开放债券', quantScore: 84.05, percentile: 0.93, rank: 4, prevPercentile: 0.94, prevRank: 3, rankChange: -1 },
+  { code: '007551.OF', name: '鑫元泽利A', quantScore: 83.60000000000001, percentile: 0.91, rank: 5, prevPercentile: 0.93, prevRank: 4, rankChange: -1 },
+  { code: '675100.OF', name: '西部利得得尊纯债A', quantScore: 82.75, percentile: 0.89, rank: 6, prevPercentile: 0.91, prevRank: 5, rankChange: -1 },
+  { code: '161015.SZ', name: '富国天盈LOF', quantScore: 81.35, percentile: 0.88, rank: 7, prevPercentile: 0.84, prevRank: 9, rankChange: 2 },
+  { code: '000668.OF', name: '国寿安保尊享债券A', quantScore: 81.10000000000001, percentile: 0.86, rank: 8, prevPercentile: 0.88, prevRank: 7, rankChange: -1 },
+  { code: '007712.OF', name: '中银康享3个月定期开放债券', quantScore: 78.64999999999999, percentile: 0.84, rank: 9, prevPercentile: 0.81, prevRank: 11, rankChange: 2 },
+  { code: '009021.OF', name: '鹏华丰诚债券A', quantScore: 78.34999999999998, percentile: 0.83, rank: 10, prevPercentile: 0.89, prevRank: 6, rankChange: -4 },
+  { code: '008232.OF', name: '中银恒优12个月持有期债券A', quantScore: 77.2, percentile: 0.81, rank: 11, prevPercentile: 0.5, prevRank: 29, rankChange: 18 },
+  { code: '620009.OF', name: '金元顺安丰祥债券A', quantScore: 77.04999999999998, percentile: 0.79, rank: 12, prevPercentile: 0.83, prevRank: 10, rankChange: -2 },
+  { code: '100018.OF', name: '富国天利增长债券A', quantScore: 76.44999999999999, percentile: 0.77, rank: 13, prevPercentile: 0.77, prevRank: 13, rankChange: 0 },
+  { code: '675111.OF', name: '西部利得汇享债券A', quantScore: 74.50000000000001, percentile: 0.76, rank: 14, prevPercentile: 0.76, prevRank: 14, rankChange: 0 },
+  { code: '519669.OF', name: '银河领先债券A', quantScore: 73.7, percentile: 0.74, rank: 15, prevPercentile: 0.71, prevRank: 17, rankChange: 2 },
+  { code: '007562.OF', name: '景顺长城景泰纯利债券A', quantScore: 73.55, percentile: 0.72, rank: 16, prevPercentile: 0.69, prevRank: 18, rankChange: 2 },
+  { code: '000546.OF', name: '兴业定开债券A', quantScore: 73.125, percentile: 0.71, rank: 17, prevPercentile: 0.79, prevRank: 12, rankChange: -5 },
+  { code: '240003.OF', name: '华宝宝康债券A', quantScore: 72.2, percentile: 0.69, rank: 18, prevPercentile: 0.74, prevRank: 15, rankChange: -3 },
+  { code: '001235.OF', name: '中银国有企业债A', quantScore: 68.60000000000001, percentile: 0.67, rank: 19, prevPercentile: 0.64, prevRank: 21, rankChange: 2 },
+  { code: '070025.OF', name: '嘉实信用债券A', quantScore: 68, percentile: 0.66, rank: 20, prevPercentile: 0.72, prevRank: 16, rankChange: -4 },
+  { code: '590009.OF', name: '中邮稳定收益债券A', quantScore: 67.75, percentile: 0.64, rank: 21, prevPercentile: 0.67, prevRank: 19, rankChange: -2 },
+  { code: '007008.OF', name: '中邮纯债优选一年定期开放债券A', quantScore: 67.10000000000001, percentile: 0.62, rank: 22, prevPercentile: 0.66, prevRank: 20, rankChange: -2 },
+  { code: '485107.OF', name: '工银添利债券A', quantScore: 63.5, percentile: 0.61, rank: 23, prevPercentile: 0.61, prevRank: 23, rankChange: 0 },
+  { code: '002524.OF', name: '兴业福益债券A', quantScore: 62.17499999999999, percentile: 0.59, rank: 24, prevPercentile: 0.57, prevRank: 24.5, rankChange: 0.5 },
+  { code: '164808.SZ', name: '工银四季LOF', quantScore: 62, percentile: 0.57, rank: 25, prevPercentile: 0.57, prevRank: 24.5, rankChange: -0.5 },
+  { code: '000181.OF', name: '景顺长城四季金利债券A', quantScore: 61.75000000000001, percentile: 0.55, rank: 26, prevPercentile: 0.3, prevRank: 41, rankChange: 15 },
+  { code: '164902.SZ', name: '交银添利LOF', quantScore: 54.97500000000001, percentile: 0.54, rank: 27, prevPercentile: 0.55, prevRank: 26, rankChange: -1 },
+  { code: '000130.OF', name: '大成景兴信用债债券A', quantScore: 54.50000000000001, percentile: 0.52, rank: 28, prevPercentile: 0.47, prevRank: 31, rankChange: 3 },
+  { code: '161019.SZ', name: '富国天锋LOF', quantScore: 54.05, percentile: 0.5, rank: 29, prevPercentile: 0.62, prevRank: 22, rankChange: -7 },
+  { code: '206018.OF', name: '鹏华产业债债券A', quantScore: 53.775000000000006, percentile: 0.49, rank: 30, prevPercentile: 0.52, prevRank: 28, rankChange: -2 },
+  { code: '163005.SZ', name: '长信利众LOF', quantScore: 51.75000000000001, percentile: 0.47, rank: 31, prevPercentile: 0.54, prevRank: 27, rankChange: -4 },
+  { code: '007879.OF', name: '嘉实致安3个月定期债券', quantScore: 51.075, percentile: 0.45, rank: 32, prevPercentile: 0.49, prevRank: 30, rankChange: -2 },
+  { code: '519078.OF', name: '汇添富增强收益债券A', quantScore: 49.125, percentile: 0.44, rank: 33, prevPercentile: 0.37, prevRank: 37, rankChange: 4 },
+  { code: '020002.OF', name: '国泰金龙债券A', quantScore: 48.224999999999994, percentile: 0.42, rank: 34, prevPercentile: 0.38, prevRank: 36, rankChange: 2 },
+  { code: '380009.OF', name: '中银添利债券发起A', quantScore: 46.575, percentile: 0.4, rank: 35, prevPercentile: 0.44, prevRank: 33, rankChange: -2 },
+  { code: '003612.OF', name: '南方卓元债券A', quantScore: 46.35, percentile: 0.38, rank: 36, prevPercentile: 0.42, prevRank: 34, rankChange: -2 },
+  { code: '002600.OF', name: '易方达裕景添利6个月定期开放债券', quantScore: 45.949999999999996, percentile: 0.37, rank: 37, prevPercentile: 0.4, prevRank: 35, rankChange: -2 },
+  { code: '160513.SZ', name: '稳健债LOF', quantScore: 45.225, percentile: 0.35, rank: 38, prevPercentile: 0.45, prevRank: 32, rankChange: -6 },
+  { code: '519680.OF', name: '交银增利债券A/B', quantScore: 41.475, percentile: 0.33, rank: 39, prevPercentile: 0.33, prevRank: 39, rankChange: 0 },
+  { code: '160622.SZ', name: '鹏华丰利LOF', quantScore: 40.27499999999999, percentile: 0.32, rank: 40, prevPercentile: 0.35, prevRank: 38, rankChange: -2 },
+  { code: '163819.SZ', name: '中银信用增利LOF', quantScore: 39.074999999999996, percentile: 0.3, rank: 41, prevPercentile: 0.32, prevRank: 40, rankChange: -1 },
+  { code: '161216.SZ', name: '国投双债LOF', quantScore: 38.449999999999996, percentile: 0.28, rank: 42, prevPercentile: 0.28, prevRank: 42, rankChange: 0 },
+  { code: '001001.OF', name: '华夏债券A/B', quantScore: 35.925, percentile: 0.27, rank: 43, prevPercentile: 0.27, prevRank: 43, rankChange: 0 },
+  { code: '371020.OF', name: '摩根纯债债券A', quantScore: 34.35000000000001, percentile: 0.25, rank: 44, prevPercentile: 0.25, prevRank: 44, rankChange: 0 },
+  { code: '166008.SZ', name: '中欧强债LOF', quantScore: 34.12499999999999, percentile: 0.23, rank: 45, prevPercentile: 0.11, prevRank: 52, rankChange: 7 },
+  { code: '270029.OF', name: '广发聚财信用债券A', quantScore: 31.05, percentile: 0.22, rank: 46, prevPercentile: 0.22, prevRank: 46, rankChange: 0 },
+  { code: '007666.OF', name: '华夏鼎泓债券A', quantScore: 30.824999999999996, percentile: 0.2, rank: 47, prevPercentile: 0.23, prevRank: 45, rankChange: -2 },
+  { code: '001011.OF', name: '华夏希望债券A', quantScore: 24.3, percentile: 0.18, rank: 48, prevPercentile: 0.2, prevRank: 47, rankChange: -1 },
+  { code: '163806.OF', name: '中银增利债券A', quantScore: 23.625, percentile: 0.16, rank: 49, prevPercentile: 0.16, prevRank: 49, rankChange: 0 },
+  { code: '530008.OF', name: '建信稳定增利债券C', quantScore: 21.999999999999996, percentile: 0.15, rank: 50, prevPercentile: 0.13, prevRank: 51, rankChange: 1 },
+  { code: '320004.OF', name: '诺安优化收益债券C', quantScore: 20.349999999999994, percentile: 0.13, rank: 51, prevPercentile: 0.18, prevRank: 48, rankChange: -3 },
+  { code: '003218.OF', name: '前海开源祥和债券A', quantScore: 20.25, percentile: 0.11, rank: 52, prevPercentile: 0.15, prevRank: 50, rankChange: -2 },
+  { code: '163003.SZ', name: '长信利鑫LOF', quantScore: 16.900000000000006, percentile: 0.1, rank: 53, prevPercentile: 0.05, prevRank: 56, rankChange: 3 },
+  { code: '009730.OF', name: '中信保诚安鑫回报债券A', quantScore: 15.900000000000002, percentile: 0.08, rank: 54, prevPercentile: 0.1, prevRank: 53, rankChange: -1 },
+  { code: '550004.OF', name: '中信保诚三得益债券A', quantScore: 15.899999999999997, percentile: 0.06, rank: 55, prevPercentile: 0.08, prevRank: 54, rankChange: -1 },
+  { code: '000997.OF', name: '南方双元债券A', quantScore: 15.150000000000002, percentile: 0.05, rank: 56, prevPercentile: 0.06, prevRank: 55, rankChange: -1 },
+  { code: '005890.OF', name: '先锋博盈纯债A', quantScore: 6.875000000000002, percentile: 0.03, rank: 57, prevPercentile: 0.03, prevRank: 57, rankChange: 0 },
+  { code: '005892.OF', name: '先锋汇盈纯债A', quantScore: 6.575, percentile: 0.01, rank: 58, prevPercentile: 0.01, prevRank: 58, rankChange: 0 },
 ]
 
 // ===== §F.3 权益仓位 15%-25% 排名(二级债基居多) =====
 export const FUND_MID1 = [
-  { code: '630007.OF', name: '华商稳健双利债券A', type: '混合债券型二级基金', quantScore: 87.80, percentile: 0.94, rank: 4, prevPercentile: 0.88, prevRank: 8, rankChange: 4 },
-  { code: '217023.OF', name: '招商信用增强债券A', type: '混合债券型二级基金', quantScore: 87.58, percentile: 0.92, rank: 5, prevPercentile: 0.94, prevRank: 4, rankChange: -1 },
-  { code: '485111.OF', name: '工银双利债券A',     type: '混合债券型二级基金', quantScore: 80.20, percentile: 0.88, rank: 8, prevPercentile: 0.77, prevRank: 16, rankChange: 8 },
-  { code: '002719.OF', name: '融通增益债券A',     type: '混合债券型二级基金', quantScore: 78.45, percentile: 0.84, rank: 10, prevPercentile: 0.86, prevRank: 10, rankChange: 0 },
-  { code: '002073.OF', name: '长城稳固收益债券A', type: '混合债券型二级基金', quantScore: 76.80, percentile: 0.82, rank: 11, prevPercentile: 0.79, prevRank: 14, rankChange: 3 },
-  { code: '675011.OF', name: '西部利得稳健双利债券A', type: '混合债券型二级基金', quantScore: 75.30, percentile: 0.80, rank: 12, prevPercentile: 0.81, prevRank: 12, rankChange: 0 },
-  { code: '003213.OF', name: '鹏华丰饶定期开放债券', type: '混合债券型二级基金', quantScore: 74.50, percentile: 0.78, rank: 13, prevPercentile: 0.74, prevRank: 18, rankChange: 5 },
-  { code: '001033.OF', name: '华夏安康信用优选债券A', type: '混合债券型二级基金', quantScore: 73.20, percentile: 0.76, rank: 14, prevPercentile: 0.78, prevRank: 15, rankChange: 1 },
-  { code: '003819.OF', name: '景顺长城景颐丰利债券A', type: '混合债券型二级基金', quantScore: 72.40, percentile: 0.74, rank: 15, prevPercentile: 0.71, prevRank: 19, rankChange: 4 },
-  { code: '005750.OF', name: '平安双债添益债券A', type: '混合债券型二级基金', quantScore: 71.10, percentile: 0.72, rank: 16, prevPercentile: 0.75, prevRank: 17, rankChange: 1 },
-  { code: '001615.OF', name: '中欧时代先锋A',     type: '混合债券型二级基金', quantScore: 69.85, percentile: 0.70, rank: 17, prevPercentile: 0.68, prevRank: 21, rankChange: 4 },
-  { code: '005576.OF', name: '华泰柏瑞新金融地产股票A', type: '混合债券型二级基金', quantScore: 68.20, percentile: 0.68, rank: 18, prevPercentile: 0.72, prevRank: 18, rankChange: 0 },
-  { code: '001102.OF', name: '前海开源中证军工指数A', type: '混合债券型二级基金', quantScore: 67.10, percentile: 0.66, rank: 19, prevPercentile: 0.63, prevRank: 22, rankChange: 3 },
-  { code: '675031.OF', name: '西部利得得尊债券A', type: '混合债券型二级基金', quantScore: 65.80, percentile: 0.64, rank: 20, prevPercentile: 0.66, prevRank: 20, rankChange: 0 },
-  { code: '005232.OF', name: '鹏华丰盈债券',     type: '混合债券型二级基金', quantScore: 64.50, percentile: 0.62, rank: 21, prevPercentile: 0.59, prevRank: 24, rankChange: 3 },
-  { code: '002600.OF', name: '易方达裕祥回报债券A', type: '混合债券型二级基金', quantScore: 63.20, percentile: 0.60, rank: 22, prevPercentile: 0.62, prevRank: 23, rankChange: 1 },
-  { code: '000088.OF', name: '嘉实中证金边国债ETF', type: '混合债券型二级基金', quantScore: 61.85, percentile: 0.58, rank: 23, prevPercentile: 0.55, prevRank: 26, rankChange: 3 },
-  { code: '000416.OF', name: '汇添富年年利定期开放债券A', type: '混合债券型二级基金', quantScore: 60.30, percentile: 0.56, rank: 24, prevPercentile: 0.58, prevRank: 25, rankChange: 1 },
-  { code: '003831.OF', name: '华夏鼎隆债券A',     type: '混合债券型二级基金', quantScore: 59.10, percentile: 0.54, rank: 25, prevPercentile: 0.51, prevRank: 28, rankChange: 3 },
-  { code: '004112.OF', name: '创金合信鼎泰双债债券A', type: '混合债券型二级基金', quantScore: 57.85, percentile: 0.52, rank: 26, prevPercentile: 0.54, prevRank: 27, rankChange: 1 },
+  { code: '630007.OF', name: '华商稳健双利债券A', type: '混合债券型二级基金', quantScore: 87.8, percentile: 0.94, rank: 4, prevPercentile: 0.88, prevRank: 8, rankChange: 4 },
+  { code: '217023.OF', name: '招商信用增强债券A', type: '混合债券型二级基金', quantScore: 87.57499999999997, percentile: 0.92, rank: 5, prevPercentile: 0.94, prevRank: 4, rankChange: -1 },
+  { code: '485111.OF', name: '工银双利债券A', type: '混合债券型二级基金', quantScore: 80.19999999999999, percentile: 0.88, rank: 8, prevPercentile: 0.77, prevRank: 16, rankChange: 8 },
+  { code: '519947.OF', name: '长信利保债券A', type: '混合债券型二级基金', quantScore: 78.64999999999999, percentile: 0.87, rank: 9, prevPercentile: 0.97, prevRank: 2, rankChange: -7 },
+  { code: '010430.OF', name: '招商安阳债券A', type: '混合债券型二级基金', quantScore: 77.49999999999999, percentile: 0.84, rank: 11, prevPercentile: 0.91, prevRank: 6, rankChange: -5 },
+  { code: '162210.OF', name: '宏利集利债券A', type: '混合债券型二级基金', quantScore: 76.85, percentile: 0.83, rank: 12, prevPercentile: 0.78, prevRank: 15, rankChange: 3 },
+  { code: '006466.OF', name: '浦银安盛双债增强债券A', type: '混合债券型二级基金', quantScore: 76.22500000000001, percentile: 0.81, rank: 13, prevPercentile: 0.84, prevRank: 11, rankChange: -2 },
+  { code: '002796.OF', name: '景顺长城景盈双利债券A', type: '混合债券型二级基金', quantScore: 74.65, percentile: 0.78, rank: 15, prevPercentile: 0.64, prevRank: 25, rankChange: 10 },
+  { code: '217024.OF', name: '招商安盈债券A', type: '混合债券型二级基金', quantScore: 74.42500000000001, percentile: 0.77, rank: 16, prevPercentile: 0.87, prevRank: 9, rankChange: -7 },
+  { code: '519753.OF', name: '交银安心收益债券A', type: '混合债券型二级基金', quantScore: 73.97500000000001, percentile: 0.76, rank: 17, prevPercentile: 0.74, prevRank: 18, rankChange: 1 },
+  { code: '002065.OF', name: '景顺长城景盛双息收益债券A', type: '混合债券型二级基金', quantScore: 67.85000000000001, percentile: 0.73, rank: 19, prevPercentile: 0.71, prevRank: 20, rankChange: 1 },
+  { code: '010014.OF', name: '华夏鼎清债券A', type: '混合债券型二级基金', quantScore: 65.875, percentile: 0.71, rank: 20, prevPercentile: 0.45, prevRank: 39, rankChange: 19 },
+  { code: '004427.OF', name: '交银增利增强债券A', type: '混合债券型二级基金', quantScore: 65.75, percentile: 0.7, rank: 21, prevPercentile: 0.53, prevRank: 33, rankChange: 12 },
+  { code: '121012.OF', name: '国投瑞银优化增强债券A/B', type: '混合债券型二级基金', quantScore: 64.75, percentile: 0.69, rank: 22, prevPercentile: 0.59, prevRank: 29, rankChange: 7 },
+  { code: '420002.OF', name: '天弘永利债券A', type: '混合债券型二级基金', quantScore: 63.375, percentile: 0.67, rank: 23, prevPercentile: 0.73, prevRank: 19, rankChange: -4 },
+  { code: '000875.OF', name: '建信稳定得利债券A', type: '混合债券型二级基金', quantScore: 62.9, percentile: 0.66, rank: 24, prevPercentile: 0.6, prevRank: 28, rankChange: 4 },
+  { code: '008475.OF', name: '招商民安增益债券A', type: '混合债券型二级基金', quantScore: 62.875, percentile: 0.64, rank: 25, prevPercentile: 0.66, prevRank: 24, rankChange: -1 },
+  { code: '003637.OF', name: '安信永鑫增强债券A', type: '混合债券型二级基金', quantScore: 61.550000000000004, percentile: 0.63, rank: 26, prevPercentile: 0.67, prevRank: 23, rankChange: -3 },
+  { code: '002701.OF', name: '东方红汇阳债券A', type: '混合债券型二级基金', quantScore: 60.04999999999999, percentile: 0.61, rank: 27, prevPercentile: 0.7, prevRank: 21, rankChange: -6 },
+  { code: '110007.OF', name: '易方达稳健收益债券A', type: '混合债券型二级基金', quantScore: 59.724999999999994, percentile: 0.6, rank: 28, prevPercentile: 0.69, prevRank: 22, rankChange: -6 },
+  { code: '002651.OF', name: '东方红汇利债券A', type: '混合债券型二级基金', quantScore: 58.85, percentile: 0.59, rank: 29, prevPercentile: 0.63, prevRank: 26, rankChange: -3 },
+  { code: '002925.OF', name: '广发集源债券A', type: '混合债券型二级基金', quantScore: 57.77500000000001, percentile: 0.56, rank: 31, prevPercentile: 0.56, prevRank: 31, rankChange: 0 },
+  { code: '008791.OF', name: '招商安华债券A', type: '混合债券型二级基金', quantScore: 56.724999999999994, percentile: 0.5, rank: 35, prevPercentile: 0.8, prevRank: 14, rankChange: -21 },
+  { code: '000107.OF', name: '富国稳健增强债券A/B', type: '混合债券型二级基金', quantScore: 55.7, percentile: 0.49, rank: 36, prevPercentile: 0.57, prevRank: 30, rankChange: -6 },
+  { code: '519030.OF', name: '海富通稳固收益债券C', type: '混合债券型二级基金', quantScore: 53.275000000000006, percentile: 0.47, rank: 37, prevPercentile: 0.5, prevRank: 35, rankChange: -2 },
+  { code: '000045.OF', name: '工银产业债券A', type: '混合债券型二级基金', quantScore: 48.35, percentile: 0.46, rank: 38, prevPercentile: 0.43, prevRank: 40, rankChange: 2 },
+  { code: '000171.OF', name: '易方达裕丰回报债券A', type: '混合债券型二级基金', quantScore: 47.175000000000004, percentile: 0.45, rank: 39, prevPercentile: 0.32, prevRank: 48, rankChange: 9 },
+  { code: '002351.OF', name: '易方达裕祥回报债券A', type: '混合债券型二级基金', quantScore: 46.675, percentile: 0.43, rank: 40, prevPercentile: 0.49, prevRank: 36, rankChange: -4 },
+  { code: '000142.OF', name: '融通增强收益债券A', type: '混合债券型二级基金', quantScore: 46.300000000000004, percentile: 0.42, rank: 41, prevPercentile: 0.33, prevRank: 47, rankChange: 6 },
+  { code: '006059.OF', name: '鹏扬泓利债券A', type: '混合债券型二级基金', quantScore: 45.49999999999999, percentile: 0.4, rank: 42, prevPercentile: 0.46, prevRank: 38, rankChange: -4 },
+  { code: '002969.OF', name: '易方达丰和债券A', type: '混合债券型二级基金', quantScore: 45.375, percentile: 0.39, rank: 43, prevPercentile: 0.23, prevRank: 54, rankChange: 11 },
+  { code: '470018.OF', name: '汇添富双利债券A', type: '混合债券型二级基金', quantScore: 40.25, percentile: 0.38, rank: 44, prevPercentile: 0.36, prevRank: 45, rankChange: 1 },
+  { code: '002961.OF', name: '中欧双利债券A', type: '混合债券型二级基金', quantScore: 37.25000000000001, percentile: 0.35, rank: 46, prevPercentile: 0.3, prevRank: 49, rankChange: 3 },
+  { code: '020019.OF', name: '国泰双利债券A', type: '混合债券型二级基金', quantScore: 37.1, percentile: 0.33, rank: 47, prevPercentile: 0.39, prevRank: 43, rankChange: -4 },
+  { code: '004585.OF', name: '鹏扬汇利债券A', type: '混合债券型二级基金', quantScore: 35.325, percentile: 0.32, rank: 48, prevPercentile: 0.42, prevRank: 41, rankChange: -7 },
+  { code: '000189.OF', name: '易方达丰华债券A', type: '混合债券型二级基金', quantScore: 34.675, percentile: 0.3, rank: 49, prevPercentile: 0.26, prevRank: 52, rankChange: 3 },
+  { code: '290003.OF', name: '泰信双息双利债券C', type: '混合债券型二级基金', quantScore: 33.65, percentile: 0.29, rank: 50, prevPercentile: 0.15, prevRank: 60, rankChange: 10 },
+  { code: '000406.OF', name: '汇添富双利增强债券A', type: '混合债券型二级基金', quantScore: 32.175, percentile: 0.28, rank: 51, prevPercentile: 0.08, prevRank: 65, rankChange: 14 },
+  { code: '002501.OF', name: '银华远景债券A', type: '混合债券型二级基金', quantScore: 30.374999999999996, percentile: 0.26, rank: 52, prevPercentile: 0.22, prevRank: 55, rankChange: 3 },
+  { code: '007128.OF', name: '天弘增强回报A', type: '混合债券型二级基金', quantScore: 30.074999999999996, percentile: 0.25, rank: 53, prevPercentile: 0.38, prevRank: 44, rankChange: -9 },
+  { code: '070020.OF', name: '嘉实稳固收益债券C', type: '混合债券型二级基金', quantScore: 28.425, percentile: 0.22, rank: 54.5, prevPercentile: 0.25, prevRank: 53, rankChange: -1.5 },
+  { code: '004807.OF', name: '中银证券安弘债券A', type: '混合债券型二级基金', quantScore: 28.425, percentile: 0.22, rank: 54.5, prevPercentile: 0.12, prevRank: 62, rankChange: 7.5 },
+  { code: '675081.OF', name: '西部利得祥盈债券A', type: '混合债券型二级基金', quantScore: 28.249999999999996, percentile: 0.21, rank: 56, prevPercentile: 0.16, prevRank: 59, rankChange: 3 },
+  { code: '006207.OF', name: '泰康裕泰债券A', type: '混合债券型二级基金', quantScore: 27.349999999999998, percentile: 0.19, rank: 57, prevPercentile: 0.29, prevRank: 50, rankChange: -7 },
+  { code: '009763.OF', name: '惠升和悦债券A', type: '混合债券型二级基金', quantScore: 26.425000000000004, percentile: 0.18, rank: 58, prevPercentile: 0.19, prevRank: 57, rankChange: -1 },
+  { code: '952020.OF', name: '国泰海通君得盈债券A', type: '混合债券型二级基金', quantScore: 26.3, percentile: 0.16, rank: 59, prevPercentile: 0.05, prevRank: 67, rankChange: 8 },
+  { code: '165509.SZ', name: '中信保诚增强LOF', type: '混合债券型二级基金', quantScore: 25.424999999999997, percentile: 0.15, rank: 60, prevPercentile: 0.11, prevRank: 63, rankChange: 3 },
+  { code: '002932.OF', name: '圆信永丰强化收益A', type: '混合债券型二级基金', quantScore: 23.775, percentile: 0.14, rank: 61, prevPercentile: 0.28, prevRank: 51, rankChange: -10 },
+  { code: '002988.OF', name: '平安鼎信债券A', type: '混合债券型二级基金', quantScore: 23.174999999999997, percentile: 0.12, rank: 62, prevPercentile: 0.21, prevRank: 56, rankChange: -6 },
+  { code: '002738.OF', name: '泓德裕康债券A', type: '混合债券型二级基金', quantScore: 20.325000000000003, percentile: 0.11, rank: 63, prevPercentile: 0.09, prevRank: 64, rankChange: 1 },
+  { code: '008726.OF', name: '平安添裕债券A', type: '混合债券型二级基金', quantScore: 18.974999999999998, percentile: 0.09, rank: 64, prevPercentile: 0.02, prevRank: 69, rankChange: 5 },
+  { code: '010473.OF', name: '华富安华债券A', type: '混合债券型二级基金', quantScore: 18.675000000000004, percentile: 0.08, rank: 65, prevPercentile: 0.07, prevRank: 66, rankChange: 1 },
+  { code: '070015.OF', name: '嘉实多元债券A', type: '混合债券型二级基金', quantScore: 18.375000000000004, percentile: 0.07, rank: 66, prevPercentile: 0.14, prevRank: 61, rankChange: -5 },
+  { code: '166105.SZ', name: '信澳鑫安LOF', type: '混合债券型二级基金', quantScore: 17.925, percentile: 0.05, rank: 67, prevPercentile: 0.35, prevRank: 46, rankChange: -21 },
+  { code: '710301.OF', name: '富安达增强收益债券A', type: '混合债券型二级基金', quantScore: 16.700000000000003, percentile: 0.04, rank: 68, prevPercentile: 0.01, prevRank: 70, rankChange: 2 },
+  { code: '010068.OF', name: '工银双盈债券A', type: '混合债券型二级基金', quantScore: 16.425, percentile: 0.02, rank: 69, prevPercentile: 0.18, prevRank: 58, rankChange: -11 },
+  { code: '010165.OF', name: '太平丰和一年定开债券发起式', type: '混合债券型二级基金', quantScore: 15.375, percentile: 0.01, rank: 70, prevPercentile: 0.04, prevRank: 68, rankChange: -2 },
 ]
 
 // ===== §F.4 权益仓位 25%-40% 排名(二级债基为主) =====
 export const FUND_MID2 = [
-  { code: '010011.OF', name: '景顺长城景颐招利6个月持有期债券A', type: '混合债券型二级基金', quantScore: 88.95, percentile: 0.95, rank: 2, prevPercentile: 0.97, prevRank: 1, rankChange: -1 },
-  { code: '000385.OF', name: '景顺长城景颐双利债券A',         type: '混合债券型二级基金', quantScore: 87.65, percentile: 0.93, rank: 3, prevPercentile: 0.93, prevRank: 3, rankChange: 0 },
-  { code: '008999.OF', name: '景顺长城景颐嘉利6个月持有期债券A', type: '混合债券型二级基金', quantScore: 87.05, percentile: 0.90, rank: 4, prevPercentile: 0.90, prevRank: 4, rankChange: 0 },
-  { code: '011037.OF', name: '富国天润回报混合A',             type: '混合债券型二级基金', quantScore: 84.20, percentile: 0.88, rank: 5, prevPercentile: 0.85, prevRank: 7, rankChange: 2 },
-  { code: '002068.OF', name: '鹏华丰盛债券A',                 type: '混合债券型二级基金', quantScore: 82.50, percentile: 0.86, rank: 6, prevPercentile: 0.88, prevRank: 5, rankChange: -1 },
-  { code: '000171.OF', name: '易方达裕丰回报债券A',           type: '混合债券型二级基金', quantScore: 80.80, percentile: 0.84, rank: 7, prevPercentile: 0.81, prevRank: 10, rankChange: 3 },
-  { code: '005576.OF', name: '华泰柏瑞新金融地产股票A',       type: '混合债券型二级基金', quantScore: 79.30, percentile: 0.82, rank: 8, prevPercentile: 0.79, prevRank: 12, rankChange: 4 },
-  { code: '006228.OF', name: '南方多元定开债券A',             type: '混合债券型二级基金', quantScore: 78.10, percentile: 0.80, rank: 9, prevPercentile: 0.83, prevRank: 8, rankChange: -1 },
-  { code: '002097.OF', name: '博时裕嘉纯债债券',               type: '混合债券型二级基金', quantScore: 76.40, percentile: 0.78, rank: 10, prevPercentile: 0.74, prevRank: 14, rankChange: 4 },
-  { code: '001615.OF', name: '中欧时代先锋A',                 type: '混合债券型二级基金', quantScore: 74.85, percentile: 0.76, rank: 11, prevPercentile: 0.77, prevRank: 13, rankChange: 2 },
-  { code: '003382.OF', name: '民生加银鑫享债券A',             type: '混合债券型二级基金', quantScore: 73.10, percentile: 0.74, rank: 12, prevPercentile: 0.71, prevRank: 16, rankChange: 4 },
-  { code: '002010.OF', name: '工银瑞信新得润混合A',           type: '混合债券型二级基金', quantScore: 71.50, percentile: 0.72, rank: 13, prevPercentile: 0.75, prevRank: 12, rankChange: -1 },
-  { code: '005027.OF', name: '中加颐睿纯债债券A',             type: '混合债券型二级基金', quantScore: 69.85, percentile: 0.70, rank: 14, prevPercentile: 0.66, prevRank: 19, rankChange: 5 },
-  { code: '003429.OF', name: '长盛盛和纯债债券A',             type: '混合债券型二级基金', quantScore: 68.20, percentile: 0.68, rank: 15, prevPercentile: 0.70, prevRank: 18, rankChange: 3 },
-  { code: '001102.OF', name: '前海开源中证军工指数A',         type: '混合债券型二级基金', quantScore: 66.40, percentile: 0.66, rank: 16, prevPercentile: 0.63, prevRank: 21, rankChange: 5 },
+  { code: '010011.OF', name: '景顺长城景颐招利6个月持有期债券A', type: '混合债券型二级基金', quantScore: 88.85, percentile: 0.95, rank: 2, prevPercentile: 0.97, prevRank: 1, rankChange: -1 },
+  { code: '000385.OF', name: '景顺长城景颐双利债券A', type: '混合债券型二级基金', quantScore: 87.65, percentile: 0.93, rank: 3, prevPercentile: 0.93, prevRank: 3, rankChange: 0 },
+  { code: '008999.OF', name: '景顺长城景颐嘉利6个月持有期债券A', type: '混合债券型二级基金', quantScore: 87.05000000000001, percentile: 0.9, rank: 4, prevPercentile: 0.9, prevRank: 4, rankChange: 0 },
+  { code: '001257.OF', name: '兴业收益增强债券A', type: '混合债券型二级基金', quantScore: 78.85000000000001, percentile: 0.86, rank: 6, prevPercentile: 0.84, prevRank: 7, rankChange: 1 },
+  { code: '217008.OF', name: '招商安本增利债券C', type: '混合债券型二级基金', quantScore: 73.7, percentile: 0.84, rank: 7, prevPercentile: 0.81, prevRank: 8, rankChange: 1 },
+  { code: '008556.OF', name: '易方达裕富债券A', type: '混合债券型二级基金', quantScore: 66.4, percentile: 0.79, rank: 9, prevPercentile: 0.7, prevRank: 13, rankChange: 4 },
+  { code: '163827.OF', name: '中银产业债债券A', type: '混合债券型二级基金', quantScore: 63.1, percentile: 0.75, rank: 11, prevPercentile: 0.72, prevRank: 12, rankChange: 1 },
+  { code: '000143.OF', name: '鹏华双债加利债券A', type: '混合债券型二级基金', quantScore: 62.14999999999999, percentile: 0.7, rank: 13, prevPercentile: 0.61, prevRank: 17, rankChange: 4 },
+  { code: '006839.OF', name: '安信聚利增强债券A', type: '混合债券型二级基金', quantScore: 59.45, percentile: 0.65, rank: 15, prevPercentile: 0.29, prevRank: 31, rankChange: 16 },
+  { code: '005078.OF', name: '富国宝利增强债券A', type: '混合债券型二级基金', quantScore: 59, percentile: 0.63, rank: 16, prevPercentile: 0.63, prevRank: 16, rankChange: 0 },
+  { code: '519162.OF', name: '新华增怡债券A', type: '混合债券型二级基金', quantScore: 56.224999999999994, percentile: 0.61, rank: 17, prevPercentile: 0.56, prevRank: 19, rankChange: 2 },
+  { code: '160718.OF', name: '嘉实多利收益债券A', type: '混合债券型二级基金', quantScore: 56.2, percentile: 0.59, rank: 18, prevPercentile: 0.31, prevRank: 30, rankChange: 12 },
+  { code: '004902.OF', name: '富国丰利增强债券A', type: '混合债券型二级基金', quantScore: 54.50000000000001, percentile: 0.56, rank: 19, prevPercentile: 0.59, prevRank: 18, rankChange: -1 },
+  { code: '630009.OF', name: '华商稳定增利债券A', type: '混合债券型二级基金', quantScore: 50.9, percentile: 0.52, rank: 21, prevPercentile: 0.27, prevRank: 32, rankChange: 11 },
+  { code: '253060.OF', name: '国联安信心增长债券A', type: '混合债券型二级基金', quantScore: 50.5, percentile: 0.5, rank: 22, prevPercentile: 0.47, prevRank: 23, rankChange: 1 },
+  { code: '003504.OF', name: '景顺长城景颐丰利债券A', type: '混合债券型二级基金', quantScore: 50.499999999999986, percentile: 0.47, rank: 23, prevPercentile: 0.22, prevRank: 34, rankChange: 11 },
+  { code: '002459.OF', name: '华夏鼎利债券A', type: '混合债券型二级基金', quantScore: 50.14999999999999, percentile: 0.45, rank: 24, prevPercentile: 0.36, prevRank: 28, rankChange: 4 },
+  { code: '202101.OF', name: '南方宝元债券A', type: '混合债券型二级基金', quantScore: 48.85, percentile: 0.43, rank: 25, prevPercentile: 0.4, prevRank: 26, rankChange: 1 },
+  { code: '180015.OF', name: '银华增强收益债券A', type: '混合债券型二级基金', quantScore: 45.550000000000004, percentile: 0.4, rank: 26, prevPercentile: 0.45, prevRank: 24, rankChange: -2 },
+  { code: '010435.OF', name: '富国双债增强债券A', type: '混合债券型二级基金', quantScore: 45.099999999999994, percentile: 0.38, rank: 27, prevPercentile: 0.68, prevRank: 14, rankChange: -13 },
+  { code: '110027.OF', name: '易方达安心回报债券A', type: '混合债券型二级基金', quantScore: 44.95, percentile: 0.36, rank: 28, prevPercentile: 0.25, prevRank: 33, rankChange: 5 },
+  { code: '003133.OF', name: '易方达裕鑫债券A', type: '混合债券型二级基金', quantScore: 41.825, percentile: 0.31, rank: 30, prevPercentile: 0.38, prevRank: 27, rankChange: -3 },
+  { code: '010449.OF', name: '广发恒悦债券A', type: '混合债券型二级基金', quantScore: 41.525, percentile: 0.29, rank: 31, prevPercentile: 0.5, prevRank: 22, rankChange: -9 },
+  { code: '002361.OF', name: '国富恒瑞债券A', type: '混合债券型二级基金', quantScore: 41.375, percentile: 0.27, rank: 32, prevPercentile: 0.77, prevRank: 10, rankChange: -22 },
+  { code: '000118.OF', name: '广发聚鑫债券A', type: '混合债券型二级基金', quantScore: 38.525, percentile: 0.25, rank: 33, prevPercentile: 0.34, prevRank: 29, rankChange: -4 },
+  { code: '420008.OF', name: '天弘增益回报债券发起式A', type: '混合债券型二级基金', quantScore: 33.25000000000001, percentile: 0.22, rank: 34, prevPercentile: 0.43, prevRank: 25, rankChange: -9 },
+  { code: '000377.OF', name: '摩根双债增利债券A', type: '混合债券型二级基金', quantScore: 29.200000000000003, percentile: 0.2, rank: 35, prevPercentile: 0.13, prevRank: 38, rankChange: 3 },
+  { code: '000338.OF', name: '鹏华双债保利债券B', type: '混合债券型二级基金', quantScore: 28.900000000000002, percentile: 0.18, rank: 36, prevPercentile: 0.2, prevRank: 35, rankChange: -1 },
+  { code: '050023.OF', name: '博时天颐债券A', type: '混合债券型二级基金', quantScore: 26, percentile: 0.15, rank: 37, prevPercentile: 0.15, prevRank: 37, rankChange: 0 },
+  { code: '002636.OF', name: '广发集裕债券A', type: '混合债券型二级基金', quantScore: 25.55, percentile: 0.13, rank: 38, prevPercentile: 0.18, prevRank: 36, rankChange: -2 },
+  { code: '166010.OF', name: '中欧鼎利债券A', type: '混合债券型二级基金', quantScore: 21.85, percentile: 0.11, rank: 39, prevPercentile: 0.04, prevRank: 42, rankChange: 3 },
+  { code: '162105.SZ', name: '金鹰持久增利LOF', type: '混合债券型二级基金', quantScore: 17.375, percentile: 0.06, rank: 41, prevPercentile: 0.09, prevRank: 40, rankChange: -1 },
+  { code: '004025.OF', name: '融通收益增强债券A', type: '混合债券型二级基金', quantScore: 13.775000000000004, percentile: 0.04, rank: 42, prevPercentile: 0.02, prevRank: 43, rankChange: 1 },
+  { code: '519733.OF', name: '交银强化回报债券A/B', type: '混合债券型二级基金', quantScore: 13.625000000000002, percentile: 0.02, rank: 43, prevPercentile: 0.11, prevRank: 39, rankChange: -4 },
 ]
 
 // ===== §F.5 权益仓位 40% 以上排名(二级债基为主) =====
 export const FUND_HIGH = [
-  { code: '002474.OF', name: '中邮睿信增强债券A', type: '混合债券型二级基金', quantScore: 87.52, percentile: 0.96, rank: 1, prevPercentile: 0.93, prevRank: 2, rankChange: 1 },
-  { code: '000184.OF', name: '工银添福债券A',     type: '混合债券型二级基金', quantScore: 83.93, percentile: 0.93, rank: 2, prevPercentile: 0.96, prevRank: 1, rankChange: -1 },
-  { code: '008398.OF', name: '汇添富鑫福债',     type: '混合债券型二级基金', quantScore: 79.30, percentile: 0.90, rank: 3, prevPercentile: 0.90, prevRank: 3, rankChange: 0 },
-  { code: '000089.OF', name: '民生加银增强收益债券A', type: '混合债券型二级基金', quantScore: 77.85, percentile: 0.88, rank: 4, prevPercentile: 0.84, prevRank: 6, rankChange: 2 },
-  { code: '002138.OF', name: '泓德裕泰债券A',     type: '混合债券型二级基金', quantScore: 76.20, percentile: 0.86, rank: 5, prevPercentile: 0.88, prevRank: 4, rankChange: -1 },
-  { code: '002828.OF', name: '南方多元定期开放债券A', type: '混合债券型二级基金', quantScore: 74.10, percentile: 0.83, rank: 6, prevPercentile: 0.79, prevRank: 9, rankChange: 3 },
-  { code: '001102.OF', name: '前海开源中证军工指数A', type: '混合债券型二级基金', quantScore: 72.50, percentile: 0.81, rank: 7, prevPercentile: 0.83, prevRank: 7, rankChange: 0 },
-  { code: '000067.OF', name: '民生加银转债优选A', type: '混合债券型二级基金', quantScore: 70.85, percentile: 0.78, rank: 8, prevPercentile: 0.75, prevRank: 11, rankChange: 3 },
-  { code: '003107.OF', name: '光大保德信安诚债券A', type: '混合债券型二级基金', quantScore: 68.40, percentile: 0.75, rank: 9, prevPercentile: 0.80, prevRank: 8, rankChange: -1 },
-  { code: '002714.OF', name: '博时裕荣纯债债券', type: '混合债券型二级基金', quantScore: 66.10, percentile: 0.72, rank: 10, prevPercentile: 0.69, prevRank: 12, rankChange: 2 },
+  { code: '002474.OF', name: '中邮睿信增强债券A', type: '混合债券型二级基金', quantScore: 87.52499999999999, percentile: 0.96, rank: 1, prevPercentile: 0.93, prevRank: 2, rankChange: 1 },
+  { code: '000184.OF', name: '工银添福债券A', type: '混合债券型二级基金', quantScore: 83.925, percentile: 0.93, rank: 2, prevPercentile: 0.96, prevRank: 1, rankChange: -1 },
+  { code: '008398.OF', name: '汇添富鑫福债', type: '混合债券型一级基金', quantScore: 79.3, percentile: 0.9, rank: 3, prevPercentile: 0.9, prevRank: 3, rankChange: 0 },
+  { code: '005908.OF', name: '华泰保兴尊利债券A', type: '混合债券型二级基金', quantScore: 79, percentile: 0.86, rank: 4, prevPercentile: 0.86, prevRank: 4, rankChange: 0 },
+  { code: '720003.OF', name: '财通收益增强债券A', type: '混合债券型二级基金', quantScore: 72.475, percentile: 0.83, rank: 5, prevPercentile: 0.66, prevRank: 10, rankChange: 5 },
+  { code: '003628.OF', name: '兴银收益增强A', type: '混合债券型二级基金', quantScore: 69.02499999999999, percentile: 0.8, rank: 6, prevPercentile: 0.83, prevRank: 5, rankChange: -1 },
+  { code: '002405.OF', name: '光大保德信中高等级债券A', type: '混合债券型一级基金', quantScore: 66.975, percentile: 0.76, rank: 7, prevPercentile: 0.73, prevRank: 8, rankChange: 1 },
+  { code: '004952.OF', name: '兴全恒益债券A', type: '混合债券型二级基金', quantScore: 65.2, percentile: 0.73, rank: 8, prevPercentile: 0.8, prevRank: 6, rankChange: -2 },
+  { code: '610008.OF', name: '信澳信用债债券A', type: '混合债券型二级基金', quantScore: 62.475, percentile: 0.7, rank: 9, prevPercentile: 0.7, prevRank: 9, rankChange: 0 },
+  { code: '202105.OF', name: '南方广利回报债券A/B', type: '混合债券型二级基金', quantScore: 56.175, percentile: 0.66, rank: 10, prevPercentile: 0.3, prevRank: 21, rankChange: 11 },
+  { code: '005121.OF', name: '富国兴利增强债券A', type: '混合债券型二级基金', quantScore: 52.574999999999996, percentile: 0.63, rank: 11, prevPercentile: 0.53, prevRank: 14, rankChange: 3 },
+  { code: '240012.OF', name: '华宝增强收益债券A', type: '混合债券型二级基金', quantScore: 51.974999999999994, percentile: 0.6, rank: 12, prevPercentile: 0.43, prevRank: 17, rankChange: 5 },
+  { code: '000014.OF', name: '华夏聚利债券A', type: '混合债券型一级基金', quantScore: 51.824999999999996, percentile: 0.56, rank: 13, prevPercentile: 0.63, prevRank: 11, rankChange: -2 },
+  { code: '001751.OF', name: '华商信用增强债券A', type: '混合债券型二级基金', quantScore: 51.324999999999996, percentile: 0.53, rank: 14, prevPercentile: 0.6, prevRank: 12, rankChange: -2 },
+  { code: '001862.OF', name: '东方红收益增强债券A', type: '混合债券型二级基金', quantScore: 50.42500000000001, percentile: 0.5, rank: 15, prevPercentile: 0.56, prevRank: 13, rankChange: -2 },
+  { code: '100035.OF', name: '富国优化增强债券A/B', type: '混合债券型二级基金', quantScore: 49.575, percentile: 0.46, rank: 16, prevPercentile: 0.4, prevRank: 18, rankChange: 2 },
+  { code: '040012.OF', name: '华安强化收益债券A', type: '混合债券型二级基金', quantScore: 49.525, percentile: 0.43, rank: 17, prevPercentile: 0.76, prevRank: 7, rankChange: -10 },
+  { code: '010118.OF', name: '天弘多元收益债券A', type: '混合债券型二级基金', quantScore: 40.525, percentile: 0.4, rank: 18, prevPercentile: 0.5, prevRank: 15, rankChange: -3 },
+  { code: '008345.OF', name: '南华瑞泽债券A', type: '混合债券型二级基金', quantScore: 40.15, percentile: 0.36, rank: 19, prevPercentile: 0.36, prevRank: 19, rankChange: 0 },
+  { code: '360013.OF', name: '光大保德信信用添益债券A', type: '混合债券型二级基金', quantScore: 39.475, percentile: 0.33, rank: 20, prevPercentile: 0.23, prevRank: 23, rankChange: 3 },
+  { code: '003458.OF', name: '嘉实稳宏债券A', type: '混合债券型二级基金', quantScore: 39.074999999999996, percentile: 0.3, rank: 21, prevPercentile: 0.26, prevRank: 22, rankChange: 1 },
+  { code: '002521.OF', name: '永赢双利债券A', type: '混合债券型二级基金', quantScore: 37.525, percentile: 0.26, rank: 22, prevPercentile: 0.46, prevRank: 16, rankChange: -6 },
+  { code: '530017.OF', name: '建信双息红利债券A', type: '混合债券型二级基金', quantScore: 34.675, percentile: 0.23, rank: 23, prevPercentile: 0.2, prevRank: 24, rankChange: 1 },
+  { code: '164206.SZ', name: '天弘添利LOF', type: '混合债券型一级基金', quantScore: 30.524999999999995, percentile: 0.2, rank: 24, prevPercentile: 0.33, prevRank: 20, rankChange: -4 },
+  { code: '050011.OF', name: '博时信用债券A/B', type: '混合债券型二级基金', quantScore: 28.450000000000003, percentile: 0.16, rank: 25, prevPercentile: 0.16, prevRank: 25, rankChange: 0 },
+  { code: '217018.OF', name: '招商安瑞进取债券A', type: '混合债券型二级基金', quantScore: 26.425000000000004, percentile: 0.13, rank: 26, prevPercentile: 0.13, prevRank: 26, rankChange: 0 },
+  { code: '690002.OF', name: '民生加银增强收益债券A', type: '混合债券型二级基金', quantScore: 25.374999999999996, percentile: 0.1, rank: 27, prevPercentile: 0.1, prevRank: 27, rankChange: 0 },
+  { code: '001031.OF', name: '华夏安康债券A', type: '混合债券型二级基金', quantScore: 20.025, percentile: 0.06, rank: 28, prevPercentile: 0.06, prevRank: 28, rankChange: 0 },
+  { code: '210014.OF', name: '金鹰元丰债券A', type: '混合债券型二级基金', quantScore: 16.075, percentile: 0.03, rank: 29, prevPercentile: 0.03, prevRank: 29, rankChange: 0 },
 ]
 
 // 综合排名(区间)
@@ -195,4 +308,4 @@ export function scoreBand(score) {
   if (score >= 5.5) return { cls: 'neutral',  fg: '#6B7A96', bg: '#EEF2F7', label: '中性' }
   if (score >= 4.5) return { cls: 'mid-bear', fg: '#E8912D', bg: '#FFF4E5', label: '偏空' }
   return                  { cls: 'bear',     fg: '#E13B3B', bg: '#FDEAEA', label: '低配' }
-}
+}

+ 0 - 5
web-app/src/views/stock/h-share/data.js

@@ -46,13 +46,8 @@ export const scoreSummary = {
   asOf: '2026-09-30',
   prevAsOf: '2026-08-31',
   rating: '中性',
-  // 资产小组 / 投资经理 / 综合评分
   groupScore: 4.67,
   groupDelta: 0.13,
-  managerScore: 4.57,
-  compositeScore: 4.62,
-  compositeDelta: 0.35,
-  // 本月主要变化(解读)
   highlights: [
     '习特会,地缘政治压力显著改善',
     '美联储 9 月加息,流动性边际收紧',

+ 2 - 9
web-app/src/views/stock/h-share/index.vue

@@ -129,7 +129,7 @@
       <div class="section-hd">
         <span class="dot"></span>
         <h2>一级类别综合得分 · 类别贡献度 · 本月解读</h2>
-        <span class="meta">按因子权重加权平均 · 含资产小组 / 投资经理 / 综合三方评分</span>
+        <span class="meta">按因子权重加权平均 · 含资产小组 / 综合评分</span>
       </div>
 
       <div class="card-grid cols-2-1-1">
@@ -177,16 +177,9 @@
                   <span class="r-delta up">+{{ summary.groupDelta.toFixed(2) }}</span>
                 </span>
               </div>
-              <div class="rating-row">
-                <span class="r-k">投资经理评分</span>
-                <span class="r-v">{{ formatScore(summary.managerScore) }}</span>
-              </div>
               <div class="rating-row">
                 <span class="r-k">综合评分</span>
-                <span class="r-v">
-                  {{ formatScore(summary.compositeScore) }}
-                  <span class="r-delta up">+{{ summary.compositeDelta.toFixed(2) }}</span>
-                </span>
+                <span class="r-v">{{ formatScore(summary.current) }}</span>
               </div>
               <div class="highlight">
                 <div class="hl-title">本月主要变化</div>

+ 20 - 20
web-app/src/views/stock/us/data.js

@@ -48,7 +48,6 @@ export const scoreSummary = {
   rating: '中性偏多',
   groupScore: 6.50,
   groupDelta: 0.67,
-  managerScore: 6.85,
   highlights: [
     '美国经济数据与企业盈利韧性偏强,宏观与盈利类因子打分提升',
     '估值与动量指标同步改善,动态看美股性价比在提升',
@@ -70,7 +69,7 @@ export const categories = [
     factors: [
       {
         name: '地缘政治',
-        weight: 8,
+        weight: 8.33,
         definition: '中美、美欧、俄乌等地缘争端',
         rule: '恶化:0-3,中性:4-6,好转:7-10',
         current: 5,
@@ -78,7 +77,7 @@ export const categories = [
       },
       {
         name: '经济周期',
-        weight: 8,
+        weight: 8.33,
         definition: '衰退、滞胀、复苏、过热等周期阶段预期',
         rule: '恶化:0-3,中性:4-6,好转:7-10',
         current: 5,
@@ -86,7 +85,7 @@ export const categories = [
       },
       {
         name: '货币政策',
-        weight: 8,
+        weight: 8.33,
         definition: '美联储即期货币政策立场与节奏',
         rule: '紧缩:0-3,中性:4-6,宽松:7-10',
         current: 6,
@@ -94,7 +93,7 @@ export const categories = [
       },
       {
         name: '美国经济指数',
-        weight: 11,
+        weight: 8.33,
         definition: 'PMI、产能利用率、消费者信心、失业率、通胀预期差',
         rule: '综合打分指标,越大越好(取值0.4-0.5为中性)',
         current: 7,
@@ -110,7 +109,7 @@ export const categories = [
     factors: [
       {
         name: 'PE 历史分位数·标普 500',
-        weight: 9,
+        weight: 8.33,
         definition: '标普 500 指数市盈率历史分位数',
         rule: '估值越高,打分越低',
         current: 8,
@@ -118,7 +117,7 @@ export const categories = [
       },
       {
         name: 'PE 历史分位数·纳斯达克',
-        weight: 9,
+        weight: 8.33,
         definition: '纳斯达克指数市盈率历史分位数',
         rule: '估值越高,打分越低',
         current: 8,
@@ -126,7 +125,7 @@ export const categories = [
       },
       {
         name: '企业盈利·纳斯达克',
-        weight: 12,
+        weight: 8.33,
         definition: '预测 EPS 平均值:纳斯达克',
         rule: '预测 EPS 上修,分数越高',
         current: 8,
@@ -134,7 +133,7 @@ export const categories = [
       },
       {
         name: 'TED 利差',
-        weight: 10,
+        weight: 8.33,
         definition: '3M 美元 LIBOR 与美债收益率之差',
         rule: '取值越小越宽裕,越大越紧张',
         current: 7,
@@ -150,7 +149,7 @@ export const categories = [
     factors: [
       {
         name: '情绪·换手率·标普 500',
-        weight: 7.5,
+        weight: 8.33,
         definition: '标普 500 成分股换手率水平',
         rule: '5% 以内换手温和,10% 以上活跃,15% 以上高换手',
         current: 6,
@@ -158,7 +157,7 @@ export const categories = [
       },
       {
         name: '情绪·换手率·纳斯达克',
-        weight: 7.5,
+        weight: 8.33,
         definition: '纳斯达克成分股换手率水平',
         rule: '5% 以内换手温和,10% 以上活跃,15% 以上高换手',
         current: 5,
@@ -166,7 +165,7 @@ export const categories = [
       },
       {
         name: '波动率·VIX·标普 500',
-        weight: 7.5,
+        weight: 8.33,
         definition: '标普 500 隐含波动率 VIX',
         rule: '15 为中枢,VIX 越高打分越低,35 以上为恐慌',
         current: 7,
@@ -174,7 +173,7 @@ export const categories = [
       },
       {
         name: '波动率·VIX·纳斯达克',
-        weight: 7.5,
+        weight: 8.33,
         definition: '纳斯达克相关波动率指标',
         rule: '15 为中枢,VIX 越高打分越低,35 以上为恐慌',
         current: 6,
@@ -187,26 +186,27 @@ export const categories = [
 export const allFactors = categories.flatMap((c) => c.factors)
 
 export const categoryWeightedCurrent = categories.map((c) => {
-  const totalWeight = c.factors.reduce((s, f) => s + f.weight, 0)
-  const weighted = c.factors.reduce((s, f) => s + f.weight * f.current, 0)
+  const n = c.factors.length
+  const avg = n > 0 ? c.factors.reduce((s, f) => s + f.current, 0) / n : 0
+  const totalFactors = categories.reduce((s, x) => s + x.factors.length, 0)
   return {
     key: c.key,
     name: c.name,
     color: c.color,
     bgColor: c.bgColor,
-    weight: totalWeight,
-    score: totalWeight > 0 ? weighted / totalWeight : 0,
+    weight: totalFactors > 0 ? +((n / totalFactors) * 100).toFixed(2) : 0,
+    score: avg,
   }
 })
 
 export const categoryWeightedPrev = categories.map((c) => {
-  const totalWeight = c.factors.reduce((s, f) => s + f.weight, 0)
-  const weighted = c.factors.reduce((s, f) => s + f.weight * f.previous, 0)
+  const n = c.factors.length
+  const avg = n > 0 ? c.factors.reduce((s, f) => s + f.previous, 0) / n : 0
   return {
     key: c.key,
     name: c.name,
     color: c.color,
-    score: totalWeight > 0 ? weighted / totalWeight : 0,
+    score: avg,
   }
 })
 

+ 9 - 9
web-app/src/views/stock/us/index.vue

@@ -33,22 +33,22 @@
       <div class="kpi-card">
         <div class="label">政治与宏观</div>
         <div class="value">{{ formatScore(catScore('macro')) }}</div>
-        <div class="chg">权重 35% · 4 项因子</div>
+        <div class="chg">权重 33.33% · 4 项简单平均</div>
       </div>
       <div class="kpi-card">
         <div class="label">估值与盈利</div>
         <div class="value">{{ formatScore(catScore('profit')) }}</div>
-        <div class="chg">权重 40% · 4 项因子</div>
+        <div class="chg">权重 33.33% · 4 项简单平均</div>
       </div>
       <div class="kpi-card">
         <div class="label">市场情绪与动量</div>
         <div class="value">{{ formatScore(catScore('momentum')) }}</div>
-        <div class="chg">权重 30% · 4 项因子</div>
+        <div class="chg">权重 33.33% · 4 项简单平均</div>
       </div>
       <div class="kpi-card">
-        <div class="label">投资经理综合打分</div>
-        <div class="value">{{ formatScore(summary.managerScore) }}</div>
-        <div class="chg">投资小组 {{ formatScore(summary.groupScore) }} · 中性偏多</div>
+        <div class="label">投资小组评分</div>
+        <div class="value">{{ formatScore(summary.groupScore) }}</div>
+        <div class="chg">较上期 +{{ summary.groupDelta.toFixed(2) }} · 中性偏多</div>
       </div>
     </section>
 
@@ -129,7 +129,7 @@
       <div class="section-hd">
         <span class="dot"></span>
         <h2>一级类别综合得分 · 类别贡献度 · 本月解读</h2>
-        <span class="meta">按因子权重加权平均 · 含投资小组 / 投资经理 / 综合三方评分</span>
+        <span class="meta">12 项因子简单平均 · 含投资小组 / 综合评分</span>
       </div>
 
       <div class="card-grid cols-2-1-1">
@@ -178,8 +178,8 @@
                 </span>
               </div>
               <div class="rating-row">
-                <span class="r-k">投资经理综合打分</span>
-                <span class="r-v">{{ formatScore(summary.managerScore) }}</span>
+                <span class="r-k">综合评分(12 项简单平均)</span>
+                <span class="r-v">{{ formatScore(summary.current) }}</span>
               </div>
               <div class="highlight">
                 <div class="hl-title">本月主要变化</div>