Переглянути джерело

feat(bond/policy): 政策面数据按 Excel 底稿修正, 图表展示优化

- 政策利率 vs 10Y: 折线起点截到 y10 首期 (2016-01), 共享单 Y 轴
- 10Y 国债收益率: 兜底数据从 19 个季度点扩展到 129 个月度点 (Excel C 列)
- 超储率: 改用 Excel AA/AB 列 (M0010096), 起点 2006, 82 个季度点
- 贷款利率: 增加 Excel AE 加权平均 + AF 一般 + AG 按揭三线数据 (2017-12/2018-12/2008-09 起)
- 政府债余额: 改用 Excel AP/AQ 列 (M6179494), 2017-01 起 116 个月 + 同比派生
- 图表: loan/govDebt 支持可选第二参数 (YoY/加权平均) 注入
- 加载层: 新增 loadLoanAvg / loadGovDebtY, 同步 mock/kpiMeta/loadAllSeries

数据源说明: D:\工作空间\投研平台\数据\投研看板-新版思路的数据底稿-9月30日(1)\4.1.1-债市分析-其他部分.xlsx
ligb 4 днів тому
батько
коміт
00f0c5bdf7

+ 38 - 21
web-app/src/views/bond/policy/charts.js

@@ -22,27 +22,29 @@ const sliceDate = (s) => s.map((x) => String(x[0]).slice(2, 7))
 
 // ===== 政策利率 vs 10Y 国债(双 Y 轴折线) =====
 export function policyRateVsY10Option(policyRate, y10) {
-  const cats = sliceDate(policyRate)
+  // 以 10Y 国债首期月份为起始点, 隐藏此前的政策利率段 (此前无 10Y 收益率可比对)
+  const firstY10Month = y10.length ? String(y10[0][0]).slice(2, 7) : null
+  const pr = firstY10Month
+    ? policyRate.filter(([d]) => String(d).slice(2, 7) >= firstY10Month)
+    : policyRate
+  const cats = sliceDate(pr)
   const y10Map = new Map(y10.map(([d, v]) => [String(d).slice(2, 7), v]))
   // 找降息事件
   const events = []
-  for (let i = 1; i < policyRate.length; i++) {
-    if (policyRate[i][1] !== policyRate[i - 1][1]) events.push({ x: cats[i], v: policyRate[i][1] })
+  for (let i = 1; i < pr.length; i++) {
+    if (pr[i][1] !== pr[i - 1][1]) events.push({ x: cats[i], v: pr[i][1] })
   }
   return {
     tooltip: { ...tipOpt, trigger: 'axis' },
     legend: { data: ['政策利率', '10Y 国债收益率'], top: 4, textStyle: { color: C.mut, fontSize: 11 }, itemWidth: 14, itemHeight: 8 },
-    grid: { top: 32, left: 50, right: 50, bottom: 28 },
+    grid: { top: 32, left: 50, right: 18, bottom: 28 },
     xAxis: { type: 'category', data: cats, ...axisStyle({ axisLabel: { color: C.mut, fontSize: 10 } }) },
-    yAxis: [
-      { type: 'value', name: '%', ...axisStyle() },
-      { type: 'value', name: '%', position: 'right', ...axisStyle() },
-    ],
+    yAxis: { type: 'value', name: '%', ...axisStyle() },
     series: [
       {
         name: '政策利率',
         type: 'line', step: 'end', showSymbol: false,
-        data: policyRate.map((x) => x[1]),
+        data: pr.map((x) => x[1]),
         lineStyle: { color: C.brand, width: 2.2 },
         itemStyle: { color: C.brand },
         markPoint: events.length ? {
@@ -56,7 +58,7 @@ export function policyRateVsY10Option(policyRate, y10) {
       },
       {
         name: '10Y 国债收益率',
-        type: 'line', smooth: true, showSymbol: false, yAxisIndex: 1,
+        type: 'line', smooth: true, showSymbol: false,
         data: cats.map((d) => y10Map.get(d) ?? null),
         lineStyle: { color: C.up, width: 2.2 },
         itemStyle: { color: C.up },
@@ -121,15 +123,23 @@ export function deficitBarLineOption(deficitSeries, ratioSeries) {
 }
 
 // ===== 政府债余额 + 同比增速 =====
-export function govDebtOption(series) {
-  const cats = series.map((x) => String(x[0]).slice(2, 7))
+// series: [[date, value], ...]
+// yoySeries: 可选, 直接提供同比数据 ([date, yoy%], ...); 不传则在月度频度下按年同比派生
+export function govDebtOption(series, yoySeries) {
+  const cats = sliceDate(series)
   const values = series.map((x) => x[1])
-  const yoy = values.map((v, i) => {
-    if (i < 4) return null
-    const prev = values[i - 4]
-    if (!prev) return null
-    return +((v / prev - 1) * 100).toFixed(2)
-  })
+  let yoy
+  if (yoySeries && yoySeries.length) {
+    const yoyMap = new Map(yoySeries.map(([d, v]) => [String(d).slice(2, 7), v]))
+    yoy = cats.map((d) => yoyMap.get(d) ?? null)
+  } else {
+    yoy = values.map((v, i) => {
+      if (i < 12) return null
+      const prev = values[i - 12]
+      if (!prev) return null
+      return +((v / prev - 1) * 100).toFixed(2)
+    })
+  }
   return {
     tooltip: { ...tipOpt, trigger: 'axis', axisPointer: { type: 'shadow' } },
     legend: { data: ['政府债余额', '同比增速'], top: 4, textStyle: { color: C.mut, fontSize: 11 }, itemWidth: 14, itemHeight: 8 },
@@ -158,17 +168,24 @@ export function govDebtOption(series) {
   }
 }
 
-// ===== 双线(一般贷款 vs 按揭) =====
-export function loanRatesOption(gen, mort) {
+// ===== 三线(贷款加权平均 vs 一般贷款 vs 按揭) =====
+export function loanRatesOption(gen, mort, weighted) {
   const cats = sliceDate(gen)
   const mortMap = new Map(mort.map(([d, v]) => [String(d).slice(2, 7), v]))
+  const weightedMap = weighted ? new Map(weighted.map(([d, v]) => [String(d).slice(2, 7), v])) : new Map()
   return {
     tooltip: { ...tipOpt, trigger: 'axis' },
-    legend: { data: ['一般贷款', '个人住房按揭'], top: 4, textStyle: { color: C.mut, fontSize: 11 }, itemWidth: 14, itemHeight: 8 },
+    legend: { data: ['贷款加权平均', '一般贷款', '个人住房按揭'], top: 4, textStyle: { color: C.mut, fontSize: 11 }, itemWidth: 14, itemHeight: 8 },
     grid: { top: 32, left: 50, right: 18, bottom: 28 },
     xAxis: { type: 'category', data: cats, ...axisStyle({ axisLabel: { color: C.mut, fontSize: 10 } }) },
     yAxis: { type: 'value', name: '%', ...axisStyle() },
     series: [
+      {
+        name: '贷款加权平均', type: 'line', smooth: true, showSymbol: false,
+        data: cats.map((d) => weightedMap.get(d) ?? null),
+        lineStyle: { color: C.purple, width: 2.4 },
+        itemStyle: { color: C.purple },
+      },
       {
         name: '一般贷款', type: 'line', smooth: true, showSymbol: false,
         data: gen.map((x) => x[1]),

+ 208 - 54
web-app/src/views/bond/policy/data.js

@@ -5,8 +5,9 @@
 //   M0041371  逆回购利率:7天                (%, 日)
 //   M0061518  人民币存款准备金率:大型存款类金融机构 (%, 月)
 //   M0085858  金融机构:超额准备金率         (%, 月)
-//   M0096879  一般贷款利率:加权利率         (%, 月)
-//   M0096881  个人住房按揭贷款利率:加权     (%, 月)
+//   M0058002  贷款加权平均利率              (%, 季)
+//   M0096879  一般贷款利率:加权利率         (%, 季)
+//   M0096881  个人住房按揭贷款利率:加权     (%, 季)
 //   M5405501  财政赤字(预期目标)            (亿元, 年)
 //   M5405502  财政赤字率(预期目标)          (%, 年)
 //   M6179494  社会融资规模存量:政府债券     (万亿元, 月)
@@ -162,14 +163,42 @@ export const rrrAdjustments = [
 
 // ===== 时间序列 mock(用于图表展示) =====
 
-// 10年国债收益率(月度,近5年)
+// 中债国债到期收益率:10年 (%, 月末日观测, 数据源:4.1.1-债市分析-其他部分.xlsx 政策面 C 列, 共 129 个月)
 function mockY10Series() {
   const arr = [
-    ['2021-12-31', 2.78], ['2022-03-31', 2.81], ['2022-06-30', 2.83], ['2022-09-30', 2.71],
-    ['2022-12-31', 2.84], ['2023-03-31', 2.85], ['2023-06-30', 2.70], ['2023-09-30', 2.68],
-    ['2023-12-31', 2.56], ['2024-03-31', 2.31], ['2024-06-30', 2.21], ['2024-09-30', 2.04],
-    ['2024-12-31', 1.68], ['2025-03-31', 1.81], ['2025-06-30', 1.65], ['2025-09-30', 1.86],
-    ['2025-12-31', 1.85], ['2026-03-31', 1.78], ['2026-06-30', 1.73], ['2026-08-31', 1.68],
+    ['2016-01-31', 2.8368], ['2016-02-29', 2.8527], ['2016-03-31', 2.8422], ['2016-04-28', 2.8913],
+    ['2016-05-31', 2.9952], ['2016-06-30', 2.8038], ['2016-07-31', 2.7830], ['2016-08-31', 2.7452],
+    ['2016-09-29', 2.7258], ['2016-10-31', 2.7375], ['2016-11-30', 2.9893], ['2016-12-30', 3.0115],
+    ['2017-01-25', 3.3465], ['2017-02-28', 3.3252], ['2017-03-31', 3.2730], ['2017-04-27', 3.4668],
+    ['2017-05-31', 3.6152], ['2017-06-29', 3.5683], ['2017-07-31', 3.6373], ['2017-08-31', 3.6353],
+    ['2017-09-29', 3.6136], ['2017-10-31', 3.8630], ['2017-11-30', 3.8852], ['2017-12-30', 3.8807],
+    ['2018-01-31', 3.9066], ['2018-02-28', 3.8201], ['2018-03-29', 3.7407], ['2018-04-27', 3.6217],
+    ['2018-05-31', 3.6202], ['2018-06-28', 3.4756], ['2018-07-31', 3.4638], ['2018-08-30', 3.5751],
+    ['2018-09-29', 3.6103], ['2018-10-31', 3.4936], ['2018-11-29', 3.3550], ['2018-12-30', 3.2265],
+    ['2019-01-31', 3.1032], ['2019-02-28', 3.1870], ['2019-03-31', 3.1332], ['2019-04-29', 3.3869],
+    ['2019-05-30', 3.2751], ['2019-06-30', 3.2254], ['2019-07-31', 3.1487], ['2019-08-29', 3.0573],
+    ['2019-09-29', 3.1411], ['2019-10-31', 3.2757], ['2019-11-28', 3.1650], ['2019-12-30', 3.1365],
+    ['2020-01-22', 2.9932], ['2020-02-27', 2.7376], ['2020-03-31', 2.5550], ['2020-04-29', 2.5380],
+    ['2020-05-31', 2.7253], ['2020-06-30', 2.8456], ['2020-07-30', 2.9664], ['2020-08-31', 3.0478],
+    ['2020-09-29', 3.1482], ['2020-10-29', 3.1810], ['2020-11-30', 3.2725], ['2020-12-30', 3.1429],
+    ['2021-01-31', 3.1712], ['2021-02-28', 3.2475], ['2021-03-31', 3.1960], ['2021-04-29', 3.1640],
+    ['2021-05-31', 3.0400], ['2021-06-30', 3.0878], ['2021-07-29', 2.8363], ['2021-08-31', 2.8226],
+    ['2021-09-29', 2.8776], ['2021-10-31', 2.9435], ['2021-11-30', 2.8401], ['2021-12-30', 2.7754],
+    ['2022-01-29', 2.6997], ['2022-02-28', 2.8025], ['2022-03-31', 2.7743], ['2022-04-28', 2.8386],
+    ['2022-05-31', 2.7551], ['2022-06-30', 2.8255], ['2022-07-31', 2.7292], ['2022-08-31', 2.6125],
+    ['2022-09-29', 2.7601], ['2022-10-31', 2.6629], ['2022-11-30', 2.8600], ['2022-12-30', 2.8353],
+    ['2023-01-31', 2.9101], ['2023-02-28', 2.8977], ['2023-03-30', 2.8528], ['2023-04-27', 2.7788],
+    ['2023-05-31', 2.6825], ['2023-06-29', 2.6351], ['2023-07-31', 2.6607], ['2023-08-31', 2.5850],
+    ['2023-09-27', 2.6751], ['2023-10-31', 2.6853], ['2023-11-30', 2.6625], ['2023-12-30', 2.5553],
+    ['2024-01-31', 2.4354], ['2024-02-29', 2.3675], ['2024-03-31', 2.3082], ['2024-04-29', 2.3028],
+    ['2024-05-30', 2.2926], ['2024-06-30', 2.2486], ['2024-07-31', 2.1297], ['2024-08-29', 2.1704],
+    ['2024-09-29', 2.1518], ['2024-10-31', 2.1406], ['2024-11-28', 2.0206], ['2024-12-30', 1.6752],
+    ['2025-01-26', 1.6299], ['2025-02-27', 1.7152], ['2025-03-31', 1.8104], ['2025-04-29', 1.6243],
+    ['2025-05-29', 1.6712], ['2025-06-30', 1.6433], ['2025-07-31', 1.7059], ['2025-08-31', 1.8257],
+    ['2025-09-29', 1.8605], ['2025-10-30', 1.7954], ['2025-11-30', 1.8366], ['2025-12-30', 1.8473],
+    ['2026-01-29', 1.8112], ['2026-02-27', 1.7753], ['2026-03-31', 1.8244], ['2026-04-29', 1.7473],
+    ['2026-05-31', 1.7009], ['2026-06-30', 1.7448], ['2026-07-30', 1.7141], ['2026-08-31', 1.6834],
+    ['2026-09-28', 1.6670],
   ]
   return arr
 }
@@ -220,42 +249,98 @@ function mockRrrMonthly() {
   return months
 }
 
-// 超储率(季度,保留季节性波动形态,目标 2025-12=1.5、2026-06=1.3)
+// 中国:超额存款准备金率(超储率):金融机构 (%, 季, M0010096)
+// 数据源:4.1.1-债市分析-其他部分.xlsx 政策面 sheet AA 列日期 / AB 列数值, 起 2006-03, 共 82 个季度点
 function mockExcessReserveRatio() {
   return [
-    ['2018-12-31', 2.40], ['2019-03-31', 2.10], ['2019-06-30', 2.25], ['2019-09-30', 1.95],
-    ['2019-12-31', 1.85], ['2020-03-31', 1.65], ['2020-06-30', 1.75], ['2020-09-30', 1.55],
-    ['2020-12-31', 1.55], ['2021-03-31', 1.45], ['2021-06-30', 1.55], ['2021-09-30', 1.40],
-    ['2021-12-31', 1.50], ['2022-03-31', 1.35], ['2022-06-30', 1.45], ['2022-09-30', 1.25],
-    ['2022-12-31', 1.40], ['2023-03-31', 1.25], ['2023-06-30', 1.40], ['2023-09-30', 1.15],
-    ['2023-12-31', 1.30], ['2024-03-31', 1.20], ['2024-06-30', 1.30], ['2024-09-30', 1.10],
-    ['2024-12-31', 1.30], ['2025-03-31', 1.40], ['2025-06-30', 1.30], ['2025-09-30', 1.25],
-    ['2025-12-31', 1.50], ['2026-03-31', 1.40], ['2026-06-30', 1.30],
+    ['2006-03-30', 3.00], ['2006-06-29', 3.10], ['2006-09-29', 2.52], ['2006-12-30', 4.80],
+    ['2007-03-30', 2.87], ['2007-06-29', 3.00], ['2007-09-29', 2.80], ['2007-12-30', 3.50],
+    ['2008-03-30', 2.00], ['2008-06-29', 1.95], ['2008-09-29', 2.07], ['2008-12-30', 5.11],
+    ['2009-03-30', 2.28], ['2009-06-29', 1.55], ['2009-09-29', 2.06], ['2009-12-30', 3.13],
+    ['2010-03-30', 1.96], ['2010-06-29', 1.82], ['2010-09-29', 1.70], ['2010-12-30', 2.00],
+    ['2011-03-30', 1.50], ['2011-06-29', 0.80], ['2011-09-29', 1.40], ['2011-12-30', 2.30],
+    ['2012-03-30', 2.20], ['2012-06-29', 2.10], ['2012-09-29', 2.10], ['2012-12-30', 3.30],
+    ['2013-03-30', 2.00], ['2013-06-29', 2.10], ['2013-09-29', 2.10], ['2013-12-30', 2.30],
+    ['2014-03-30', 1.80], ['2014-06-29', 1.70], ['2014-09-29', 2.30], ['2014-12-30', 2.70],
+    ['2015-03-30', 2.30], ['2015-06-29', 2.50], ['2015-09-29', 1.90], ['2015-12-30', 2.10],
+    ['2016-03-30', 2.00], ['2016-06-29', 2.10], ['2016-09-29', 1.70], ['2016-12-30', 2.40],
+    ['2017-03-30', 1.30], ['2017-06-29', 1.40], ['2017-09-29', 1.30], ['2017-12-30', 2.10],
+    ['2018-03-30', 1.30], ['2018-06-29', 1.70], ['2018-09-29', 1.50], ['2018-12-30', 2.40],
+    ['2019-03-30', 1.30], ['2019-06-29', 2.00], ['2019-09-29', 1.80], ['2019-12-30', 2.40],
+    ['2020-03-30', 2.10], ['2020-06-29', 1.60], ['2020-09-29', 1.60], ['2020-12-30', 2.20],
+    ['2021-03-30', 1.50], ['2021-06-29', 1.20], ['2021-09-29', 1.40], ['2021-12-30', 2.00],
+    ['2022-03-30', 1.70], ['2022-06-29', 1.50], ['2022-09-29', 1.50], ['2022-12-30', 2.00],
+    ['2023-03-30', 1.70], ['2023-06-29', 1.60], ['2023-09-29', 1.40], ['2023-12-30', 2.10],
+    ['2024-03-30', 1.50], ['2024-06-29', 1.50], ['2024-09-29', 1.80], ['2024-12-30', 1.10],
+    ['2025-03-30', 1.00], ['2025-06-29', 1.40], ['2025-09-29', 1.40], ['2025-12-30', 1.50],
+    ['2026-03-30', 1.40], ['2026-06-29', 1.30],
   ]
 }
 
-// 一般贷款利率 vs 个人住房按揭(2026-06 目标:3.51 / 3.05)
+// 贷款加权平均利率 + 一般贷款 + 个人住房按揭 (%, 季)
+// 数据源:4.1.1-债市分析-其他部分.xlsx 政策面 sheet AE(加权平均 M0058002) / AF(一般贷款 M0058003) / AG(按揭 M0058005) 列, 自 2007-12 起
 function mockLoanRates() {
   return {
+    weighted: [
+      ['2008-09-29', 7.39], ['2008-12-30', 5.56], ['2009-03-30', 4.76], ['2009-06-29', 4.98],
+      ['2009-09-29', 5.05], ['2009-12-30', 5.25], ['2010-03-30', 5.51], ['2010-06-29', 5.57],
+      ['2010-09-29', 5.59], ['2010-12-30', 6.19], ['2011-03-30', 6.91], ['2011-06-29', 7.29],
+      ['2011-09-29', 8.06], ['2011-12-30', 8.01], ['2012-03-30', 7.61], ['2012-06-29', 7.06],
+      ['2012-09-29', 6.97], ['2012-12-30', 6.78], ['2013-03-30', 6.65], ['2013-06-29', 6.91],
+      ['2013-09-29', 7.05], ['2013-12-30', 7.20], ['2014-03-30', 7.18], ['2014-06-29', 6.96],
+      ['2014-09-29', 6.97], ['2014-12-30', 6.77], ['2015-03-30', 6.56], ['2015-06-29', 6.04],
+      ['2015-09-29', 5.70], ['2015-12-30', 5.27], ['2016-03-30', 5.24], ['2016-06-29', 5.20],
+      ['2016-09-29', 5.15], ['2016-12-30', 5.22], ['2017-03-30', 5.45], ['2017-06-29', 5.60],
+      ['2017-09-29', 5.71], ['2017-12-30', 5.71], ['2018-03-30', 5.91], ['2018-06-29', 5.94],
+      ['2018-09-29', 5.92], ['2018-12-30', 5.64], ['2019-03-30', 5.69], ['2019-06-29', 5.66],
+      ['2019-09-29', 5.62], ['2019-12-30', 5.44], ['2020-03-30', 5.08], ['2020-06-29', 5.06],
+      ['2020-09-29', 5.12], ['2020-12-30', 5.03], ['2021-03-30', 5.10], ['2021-06-29', 4.93],
+      ['2021-09-29', 5.00], ['2021-12-30', 4.76], ['2022-03-30', 4.65], ['2022-06-29', 4.41],
+      ['2022-09-29', 4.34], ['2022-12-30', 4.14], ['2023-03-30', 4.34], ['2023-06-29', 4.19],
+      ['2023-09-29', 4.14], ['2023-12-30', 3.83], ['2024-03-30', 3.99], ['2024-06-29', 3.68],
+      ['2024-09-29', 3.67], ['2024-12-30', 3.28], ['2025-03-30', 3.44], ['2025-06-29', 3.29],
+      ['2025-09-29', 3.24], ['2025-12-30', 3.15], ['2026-03-30', 3.23], ['2026-06-29', 3.05],
+    ],
     generalLoan: [
-      ['2018-12-31', 5.91], ['2019-03-31', 5.69], ['2019-06-30', 5.66], ['2019-09-30', 5.74],
-      ['2019-12-31', 5.74], ['2020-03-31', 5.48], ['2020-06-30', 5.26], ['2020-09-30', 5.12],
-      ['2020-12-31', 4.97], ['2021-03-31', 4.83], ['2021-06-30', 4.78], ['2021-09-30', 4.72],
-      ['2021-12-31', 4.65], ['2022-03-31', 4.57], ['2022-06-30', 4.41], ['2022-09-30', 4.34],
-      ['2022-12-31', 4.20], ['2023-03-31', 4.11], ['2023-06-30', 4.02], ['2023-09-30', 3.92],
-      ['2023-12-31', 3.83], ['2024-03-31', 3.73], ['2024-06-30', 3.61], ['2024-09-30', 3.51],
-      ['2024-12-31', 3.42], ['2025-03-31', 3.40], ['2025-06-30', 3.45], ['2025-09-30', 3.48],
-      ['2025-12-31', 3.55], ['2026-03-31', 3.54], ['2026-06-30', 3.51],
+      ['2007-12-30', 7.89], ['2008-09-29', 8.19], ['2008-12-30', 6.23], ['2009-03-30', 5.70],
+      ['2009-06-29', 5.70], ['2009-09-29', 5.74], ['2009-12-30', 5.88], ['2010-03-30', 6.04],
+      ['2010-06-29', 5.99], ['2010-09-29', 6.09], ['2010-12-30', 6.34], ['2011-03-30', 7.10],
+      ['2011-06-29', 7.36], ['2011-09-29', 7.80], ['2011-12-30', 7.80], ['2012-03-30', 7.97],
+      ['2012-06-29', 7.55], ['2012-09-29', 7.18], ['2012-12-30', 7.07], ['2013-03-30', 7.22],
+      ['2013-06-29', 7.10], ['2013-09-29', 7.16], ['2013-12-30', 7.14], ['2014-03-30', 7.37],
+      ['2014-06-29', 7.26], ['2014-09-29', 7.33], ['2014-12-30', 6.92], ['2015-03-30', 6.78],
+      ['2015-06-29', 6.46], ['2015-09-29', 6.01], ['2015-12-30', 5.64], ['2016-03-30', 5.67],
+      ['2016-06-29', 5.58], ['2016-09-29', 5.65], ['2016-12-30', 5.44], ['2017-03-30', 5.63],
+      ['2017-06-29', 5.71], ['2017-09-29', 5.86], ['2017-12-30', 5.80], ['2018-03-30', 6.01],
+      ['2018-06-29', 6.08], ['2018-09-29', 6.19], ['2018-12-30', 5.91], ['2019-03-30', 6.04],
+      ['2019-06-29', 5.94], ['2019-09-29', 5.96], ['2019-12-30', 5.74], ['2020-03-30', 5.48],
+      ['2020-06-29', 5.26], ['2020-09-29', 5.31], ['2020-12-30', 5.30], ['2021-03-30', 5.30],
+      ['2021-06-29', 5.20], ['2021-09-29', 5.30], ['2021-12-30', 5.19], ['2022-03-30', 4.98],
+      ['2022-06-29', 4.76], ['2022-09-29', 4.65], ['2022-12-30', 4.57], ['2023-03-30', 4.53],
+      ['2023-06-29', 4.48], ['2023-09-29', 4.51], ['2023-12-30', 4.35], ['2024-03-30', 4.27],
+      ['2024-06-29', 4.13], ['2024-09-29', 4.15], ['2024-12-30', 3.82], ['2025-03-30', 3.75],
+      ['2025-06-29', 3.69], ['2025-09-29', 3.67], ['2025-12-30', 3.55], ['2026-03-30', 3.54],
+      ['2026-06-29', 3.51],
     ],
     mortgage: [
-      ['2018-12-31', 5.75], ['2019-03-31', 5.69], ['2019-06-30', 5.53], ['2019-09-30', 5.55],
-      ['2019-12-31', 5.54], ['2020-03-31', 5.48], ['2020-06-30', 5.32], ['2020-09-30', 5.16],
-      ['2020-12-31', 5.10], ['2021-03-31', 5.05], ['2021-06-30', 5.00], ['2021-09-30', 4.95],
-      ['2021-12-31', 4.91], ['2022-03-31', 4.84], ['2022-06-30', 4.72], ['2022-09-30', 4.59],
-      ['2022-12-31', 4.46], ['2023-03-31', 4.32], ['2023-06-30', 4.11], ['2023-09-30', 3.92],
-      ['2023-12-31', 3.78], ['2024-03-31', 3.62], ['2024-06-30', 3.45], ['2024-09-30', 3.31],
-      ['2024-12-31', 3.18], ['2025-03-31', 3.10], ['2025-06-30', 3.08], ['2025-09-30', 3.07],
-      ['2025-12-31', 3.06], ['2026-03-31', 3.05], ['2026-06-30', 3.05],
+      ['2008-12-30', 4.94], ['2009-03-30', 4.45], ['2009-06-29', 4.34], ['2009-09-29', 4.38],
+      ['2009-12-30', 4.42], ['2010-03-30', 4.63], ['2010-06-29', 4.95], ['2010-09-29', 5.03],
+      ['2010-12-30', 5.34], ['2011-03-30', 6.17], ['2011-06-29', 6.83], ['2011-09-29', 7.36],
+      ['2011-12-30', 7.62], ['2012-03-30', 7.43], ['2012-06-29', 6.68], ['2012-09-29', 6.20],
+      ['2012-12-30', 6.22], ['2013-03-30', 6.27], ['2013-06-29', 6.29], ['2013-09-29', 6.39],
+      ['2013-12-30', 6.53], ['2014-03-30', 6.70], ['2014-06-29', 6.93], ['2014-09-29', 6.96],
+      ['2014-12-30', 6.25], ['2015-03-30', 6.01], ['2015-06-29', 5.53], ['2015-09-29', 5.02],
+      ['2015-12-30', 4.70], ['2016-03-30', 4.63], ['2016-06-29', 4.55], ['2016-09-29', 4.52],
+      ['2016-12-30', 4.52], ['2017-03-30', 4.55], ['2017-06-29', 4.69], ['2017-09-29', 5.01],
+      ['2017-12-30', 5.26], ['2018-03-30', 5.42], ['2018-06-29', 5.60], ['2018-09-29', 5.72],
+      ['2018-12-30', 5.75], ['2019-03-30', 5.68], ['2019-06-29', 5.53], ['2019-09-29', 5.55],
+      ['2019-12-30', 5.62], ['2020-03-30', 5.60], ['2020-06-29', 5.42], ['2020-09-29', 5.36],
+      ['2020-12-30', 5.34], ['2021-03-30', 5.37], ['2021-06-29', 5.42], ['2021-09-29', 5.54],
+      ['2021-12-30', 5.63], ['2022-03-30', 5.49], ['2022-06-29', 4.62], ['2022-09-29', 4.34],
+      ['2022-12-30', 4.26], ['2023-03-30', 4.14], ['2023-06-29', 4.11], ['2023-09-29', 4.02],
+      ['2023-12-30', 3.97], ['2024-03-30', 3.69], ['2024-06-29', 3.45], ['2024-09-29', 3.31],
+      ['2024-12-30', 3.09], ['2025-03-30', 3.13], ['2025-06-29', 3.06], ['2025-09-29', 3.06],
+      ['2025-12-30', 3.06], ['2026-03-30', 3.06], ['2026-06-29', 3.05],
     ],
   }
 }
@@ -275,15 +360,78 @@ function mockFiscal() {
       ['2022-12-31', 2.8], ['2023-12-31', 3.0], ['2024-12-31', 3.0], ['2025-12-31', 4.0],
       ['2026-12-31', 4.0],
     ],
-    govDebt: [
-      ['2019-12-31', 38.10], ['2020-06-30', 41.50], ['2020-12-31', 46.55], ['2021-06-30', 50.78],
-      ['2021-12-31', 53.10], ['2022-06-30', 56.78], ['2022-12-31', 60.93], ['2023-06-30', 64.85],
-      ['2023-12-31', 70.12], ['2024-06-30', 75.50], ['2024-12-31', 80.78], ['2025-06-30', 86.30],
-      ['2025-12-31', 92.10], ['2026-03-31', 100.50], ['2026-06-30', 102.30], ['2026-08-31', 103.69],
-    ],
   }
 }
 
+// 社会融资规模存量:政府债券 (万亿元, 月, M6179494)
+// 数据源:4.1.1-债市分析-其他部分.xlsx 政策面 sheet AO 列(日期) / AP 列(余额), 2017-01 起 116 个月
+function mockGovDebt() {
+  return [
+    ['2017-01-30', 22.64], ['2017-02-27', 22.62], ['2017-03-30', 22.94], ['2017-04-29', 23.54],
+    ['2017-05-30', 24.19], ['2017-06-29', 24.85], ['2017-07-30', 25.79], ['2017-08-30', 26.23],
+    ['2017-09-29', 26.78], ['2017-10-30', 27.28], ['2017-11-29', 27.88], ['2017-12-30', 28.15],
+    ['2018-01-30', 28.15], ['2018-02-27', 28.17], ['2018-03-30', 28.35], ['2018-04-29', 28.88],
+    ['2018-05-30', 29.16], ['2018-06-29', 29.81], ['2018-07-30', 30.61], ['2018-08-30', 31.47],
+    ['2018-09-29', 32.38], ['2018-10-30', 32.69], ['2018-11-29', 32.66], ['2018-12-30', 33.01],
+    ['2019-01-30', 33.18], ['2019-02-27', 33.61], ['2019-03-30', 33.95], ['2019-04-29', 34.40],
+    ['2019-05-30', 34.78], ['2019-06-29', 35.47], ['2019-07-30', 36.11], ['2019-08-30', 36.62],
+    ['2019-09-29', 36.99], ['2019-10-30', 37.18], ['2019-11-29', 37.35], ['2019-12-30', 37.73],
+    ['2020-01-30', 38.49], ['2020-02-28', 38.67], ['2020-03-30', 39.31], ['2020-04-29', 39.64],
+    ['2020-05-30', 40.78], ['2020-06-29', 41.52], ['2020-07-30', 42.07], ['2020-08-30', 43.45],
+    ['2020-09-29', 44.46], ['2020-10-30', 44.95], ['2020-11-29', 45.35], ['2020-12-30', 46.06],
+    ['2021-01-30', 46.29], ['2021-02-27', 46.39], ['2021-03-30', 46.71], ['2021-04-29', 47.08],
+    ['2021-05-30', 47.75], ['2021-06-29', 48.50], ['2021-07-30', 48.68], ['2021-08-30', 49.66],
+    ['2021-09-29', 50.46], ['2021-10-30', 51.08], ['2021-11-29', 51.90], ['2021-12-30', 53.06],
+    ['2022-01-30', 53.67], ['2022-02-27', 53.94], ['2022-03-30', 54.65], ['2022-04-29', 55.04],
+    ['2022-05-30', 56.10], ['2022-06-29', 57.72], ['2022-07-30', 58.12], ['2022-08-30', 58.42],
+    ['2022-09-29', 58.98], ['2022-10-30', 59.25], ['2022-11-29', 59.91], ['2022-12-30', 60.19],
+    ['2023-01-30', 60.60], ['2023-02-27', 61.41], ['2023-03-30', 62.02], ['2023-04-29', 62.47],
+    ['2023-05-30', 63.03], ['2023-06-29', 63.57], ['2023-07-30', 63.98], ['2023-08-30', 65.15],
+    ['2023-09-29', 66.14], ['2023-10-30', 67.71], ['2023-11-29', 68.86], ['2023-12-30', 69.79],
+    ['2024-01-30', 70.09], ['2024-02-28', 70.69], ['2024-03-30', 71.15], ['2024-04-29', 71.06],
+    ['2024-05-30', 72.28], ['2024-06-29', 73.13], ['2024-07-30', 73.82], ['2024-08-30', 75.44],
+    ['2024-09-29', 76.97], ['2024-10-30', 78.02], ['2024-11-29', 79.33], ['2024-12-30', 81.09],
+    ['2025-01-30', 81.78], ['2025-02-27', 83.47], ['2025-03-30', 84.96], ['2025-04-29', 85.93],
+    ['2025-05-30', 87.39], ['2025-06-29', 88.74], ['2025-07-30', 89.99], ['2025-08-30', 91.36],
+    ['2025-09-29', 92.55], ['2025-10-30', 93.03], ['2025-11-29', 94.24], ['2025-12-30', 94.92],
+    ['2026-01-30', 95.90], ['2026-02-27', 97.30], ['2026-03-30', 98.47], ['2026-04-29', 99.37],
+    ['2026-05-30', 100.60], ['2026-06-29', 101.36], ['2026-07-30', 102.68], ['2026-08-30', 103.69],
+  ]
+}
+
+// 社会融资规模存量:政府债券 同比 (%, 月)
+// 数据源:4.1.1-债市分析-其他部分.xlsx 政策面 sheet AO/AQ 列, 2018-01 起 104 个月
+function mockGovDebtYoY() {
+  return [
+    ['2018-01-30', 24.36], ['2018-02-27', 24.54], ['2018-03-30', 23.58], ['2018-04-29', 22.71],
+    ['2018-05-30', 20.54], ['2018-06-29', 19.97], ['2018-07-30', 18.67], ['2018-08-30', 19.97],
+    ['2018-09-29', 20.91], ['2018-10-30', 19.82], ['2018-11-29', 17.16], ['2018-12-30', 17.24],
+    ['2019-01-30', 17.84], ['2019-02-27', 19.31], ['2019-03-30', 19.75], ['2019-04-29', 19.08],
+    ['2019-05-30', 19.29], ['2019-06-29', 18.99], ['2019-07-30', 17.98], ['2019-08-30', 16.35],
+    ['2019-09-29', 14.24], ['2019-10-30', 13.75], ['2019-11-29', 14.36], ['2019-12-30', 14.30],
+    ['2020-01-30', 16.01], ['2020-02-28', 15.05], ['2020-03-30', 15.78], ['2020-04-29', 15.25],
+    ['2020-05-30', 17.25], ['2020-06-29', 17.06], ['2020-07-30', 16.50], ['2020-08-30', 18.66],
+    ['2020-09-29', 20.18], ['2020-10-30', 20.89], ['2020-11-29', 21.41], ['2020-12-30', 22.09],
+    ['2021-01-30', 20.27], ['2021-02-27', 19.96], ['2021-03-30', 18.82], ['2021-04-29', 18.77],
+    ['2021-05-30', 17.09], ['2021-06-29', 16.81], ['2021-07-30', 15.71], ['2021-08-30', 14.29],
+    ['2021-09-29', 13.50], ['2021-10-30', 13.64], ['2021-11-29', 14.44], ['2021-12-30', 15.20],
+    ['2022-01-30', 15.94], ['2022-02-27', 16.28], ['2022-03-30', 17.00], ['2022-04-29', 16.91],
+    ['2022-05-30', 17.49], ['2022-06-29', 19.01], ['2022-07-30', 19.39], ['2022-08-30', 17.64],
+    ['2022-09-29', 16.88], ['2022-10-30', 15.99], ['2022-11-29', 15.43], ['2022-12-30', 13.44],
+    ['2023-01-30', 12.91], ['2023-02-27', 13.85], ['2023-03-30', 13.49], ['2023-04-29', 13.50],
+    ['2023-05-30', 12.35], ['2023-06-29', 10.14], ['2023-07-30', 10.08], ['2023-08-30', 11.52],
+    ['2023-09-29', 12.14], ['2023-10-30', 14.28], ['2023-11-29', 14.94], ['2023-12-30', 15.95],
+    ['2024-01-30', 15.66], ['2024-02-28', 15.11], ['2024-03-30', 14.72], ['2024-04-29', 13.75],
+    ['2024-05-30', 14.68], ['2024-06-29', 15.04], ['2024-07-30', 15.38], ['2024-08-30', 15.79],
+    ['2024-09-29', 16.37], ['2024-10-30', 15.23], ['2024-11-29', 15.20], ['2024-12-30', 16.19],
+    ['2025-01-30', 16.68], ['2025-02-27', 18.08], ['2025-03-30', 19.41], ['2025-04-29', 20.93],
+    ['2025-05-30', 20.90], ['2025-06-29', 21.35], ['2025-07-30', 21.90], ['2025-08-30', 21.10],
+    ['2025-09-29', 20.24], ['2025-10-30', 19.24], ['2025-11-29', 18.79], ['2025-12-30', 17.06],
+    ['2026-01-30', 17.27], ['2026-02-27', 16.57], ['2026-03-30', 15.90], ['2026-04-29', 15.64],
+    ['2026-05-30', 15.12], ['2026-06-29', 14.22], ['2026-07-30', 14.10], ['2026-08-30', 13.50],
+  ]
+}
+
 const mock = {
   policyRate: { name: '政策利率(1Y贷款基准/7D逆回购)', unit: '%', source: '中国人民银行', code: 'M0041371', series: mockPolicyRateMonthly() },
   y10:        { name: '中债国债到期收益率:10年', unit: '%', source: '中债登', code: 'G0000892', series: mockY10Series() },
@@ -291,9 +439,11 @@ const mock = {
   excess:     { name: '金融机构:超额准备金率', unit: '%', source: '中国人民银行', code: 'M0085858', series: mockExcessReserveRatio() },
   loanGen:    { name: '一般贷款:加权利率', unit: '%', source: '中国人民银行', code: 'M0096879', series: mockLoanRates().generalLoan },
   loanMort:   { name: '个人住房按揭:加权利率', unit: '%', source: '中国人民银行', code: 'M0096881', series: mockLoanRates().mortgage },
+  loanAvg:    { name: '贷款加权平均利率', unit: '%', source: '中国人民银行', code: 'M0058002', series: mockLoanRates().weighted },
   deficit:    { name: '财政赤字(预期目标)', unit: '亿元', source: '中国政府网', code: 'M5405501', series: mockFiscal().deficit },
   deficitR:   { name: '财政赤字率(预期目标)', unit: '%', source: '中国政府网', code: 'M5405502', series: mockFiscal().deficitRatio },
-  govDebt:    { name: '社会融资规模存量:政府债券', unit: '万亿元', source: '中国人民银行', code: 'M6179494', series: mockFiscal().govDebt },
+  govDebt:    { name: '社会融资规模存量:政府债券', unit: '万亿元', source: '中国人民银行', code: 'M6179494', series: mockGovDebt() },
+  govDebtY:   { name: '社融政府债券:同比', unit: '%', source: '中国人民银行', code: 'M6179494_yoy', series: mockGovDebtYoY() },
 }
 
 function mockSeries(key) { return mock[key]?.series || [] }
@@ -306,6 +456,7 @@ export const kpiMeta = {
   excess:     { source: mock.excess.source,     code: mock.excess.code },
   loanGen:    { source: mock.loanGen.source,    code: mock.loanGen.code },
   loanMort:   { source: mock.loanMort.source,   code: mock.loanMort.code },
+  loanAvg:    { source: mock.loanAvg.source,    code: mock.loanAvg.code },
   deficitR:   { source: mock.deficitR.source,   code: mock.deficitR.code },
   govDebt:    { source: mock.govDebt.source,    code: mock.govDebt.code },
 }
@@ -313,7 +464,7 @@ function mockMeta(key) {
   const m = mock[key]
   const freqMap = {
     policyRate: '日', y10: '日', rrr: '月', excess: '季',
-    loanGen: '季', loanMort: '季',
+    loanGen: '季', loanMort: '季', loanAvg: '季',
     deficit: '年', deficitR: '年', govDebt: '月',
   }
   return {
@@ -371,39 +522,42 @@ export const loadRrr        = () => loadWithFallback('rrr')
 export const loadExcess     = () => loadWithFallback('excess')
 export const loadLoanGen    = () => loadWithFallback('loanGen')
 export const loadLoanMort   = () => loadWithFallback('loanMort')
+export const loadLoanAvg    = () => loadWithFallback('loanAvg')
 export const loadDeficit    = () => loadWithFallback('deficit')
 export const loadDeficitR   = () => loadWithFallback('deficitR')
 export const loadGovDebt    = () => loadWithFallback('govDebt')
+// 社融政府债券同比为派生指标, 无独立 API 代码, 直接走 mock
+export const loadGovDebtY   = async () => ({ meta: null, series: mockGovDebtYoY() })
 
 export async function loadAllSeries() {
   const [
-    policyRate, y10, rrr, excess, loanGen, loanMort,
-    deficit, deficitR, govDebt,
+    policyRate, y10, rrr, excess, loanGen, loanMort, loanAvg,
+    deficit, deficitR, govDebt, govDebtY,
   ] = await Promise.all([
     loadPolicyRate(), loadY10(), loadRrr(), loadExcess(),
-    loadLoanGen(), loadLoanMort(),
-    loadDeficit(), loadDeficitR(), loadGovDebt(),
+    loadLoanGen(), loadLoanMort(), loadLoanAvg(),
+    loadDeficit(), loadDeficitR(), loadGovDebt(), loadGovDebtY(),
   ])
   return {
-    policyRate, y10, rrr, excess, loanGen, loanMort,
-    deficit, deficitR, govDebt,
+    policyRate, y10, rrr, excess, loanGen, loanMort, loanAvg,
+    deficit, deficitR, govDebt, govDebtY,
   }
 }
 
 export async function loadLatestAll() {
   const [
-    policyRate, y10, rrr, excess, loanGen, loanMort,
-    deficit, deficitR, govDebt,
+    policyRate, y10, rrr, excess, loanGen, loanMort, loanAvg,
+    deficit, deficitR, govDebt, govDebtY,
   ] = await Promise.all([
     loadLatestWithFallback('policyRate'), loadLatestWithFallback('y10'),
     loadLatestWithFallback('rrr'), loadLatestWithFallback('excess'),
-    loadLatestWithFallback('loanGen'), loadLatestWithFallback('loanMort'),
+    loadLatestWithFallback('loanGen'), loadLatestWithFallback('loanMort'), loadLatestWithFallback('loanAvg'),
     loadLatestWithFallback('deficit'), loadLatestWithFallback('deficitR'),
-    loadLatestWithFallback('govDebt'),
+    loadLatestWithFallback('govDebt'), loadGovDebtY(),
   ])
   return {
-    policyRate, y10, rrr, excess, loanGen, loanMort,
-    deficit, deficitR, govDebt,
+    policyRate, y10, rrr, excess, loanGen, loanMort, loanAvg,
+    deficit, deficitR, govDebt, govDebtY,
   }
 }
 

+ 7 - 3
web-app/src/views/bond/policy/index.vue

@@ -220,7 +220,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>
           <div class="card-body">
@@ -294,9 +294,11 @@ const rrrSeries        = vRef([])
 const excessSeries     = vRef([])
 const loanGenSeries    = vRef([])
 const loanMortSeries   = vRef([])
+const loanAvgSeries    = vRef([])
 const deficitSeries    = vRef([])
 const deficitRSeries   = vRef([])
 const govDebtSeries    = vRef([])
+const govDebtYSeries   = vRef([])
 
 function formatNum(v) {
   if (typeof v !== 'number') return v ?? '—'
@@ -340,9 +342,11 @@ async function reload() {
     excessSeries.value     = all.excess.series
     loanGenSeries.value    = all.loanGen.series
     loanMortSeries.value   = all.loanMort.series
+    loanAvgSeries.value    = all.loanAvg.series
     deficitSeries.value    = all.deficit.series
     deficitRSeries.value   = all.deficitR.series
     govDebtSeries.value    = all.govDebt.series
+    govDebtYSeries.value   = all.govDebtY.series
     updatedAt.value = new Date().toISOString().slice(0, 19).replace('T', ' ')
   } finally {
     loading.value = false
@@ -413,10 +417,10 @@ const excessOpt = computed(() => monthlyLineOption(excessSeries.value, {
   smooth: true,
 }))
 
-const loanOpt = computed(() => loanRatesOption(loanGenSeries.value, loanMortSeries.value))
+const loanOpt = computed(() => loanRatesOption(loanGenSeries.value, loanMortSeries.value, loanAvgSeries.value))
 
 const deficitOpt = computed(() => deficitBarLineOption(deficitSeries.value, deficitRSeries.value))
-const govDebtOpt = computed(() => govDebtOption(govDebtSeries.value))
+const govDebtOpt = computed(() => govDebtOption(govDebtSeries.value, govDebtYSeries.value))
 </script>
 
 <style scoped>