Prechádzať zdrojové kódy

fix(bond): 修正政策面 mock 数据与托管表单元格

- 政策利率月度序列保留 2016-01-01 期初 2.25 档位(不过滤 changeBp===null)
- 超储率按 Excel 政策面 sheet 季度值重写(2025-12=1.5、2026-06=1.3,保留季节波动)
- 一般贷款/按揭利率按 Excel 重写(2026-06=3.51/3.05,删除虚构 2026-08 点)
- 赤字 2024=40600/2025=56600/2026=58900;赤字率 2025/2026=4.0%;政府债余额 2026-08=103.69 万亿
- 顶部 KPI 8 项补上数据源,托管表 8 月「非法人产品-政策性银行债-增加」-1111 → -11111
ligb 6 dní pred
rodič
commit
8f5ef3d5f9

+ 34 - 27
web-app/src/views/bond/policy/data.js

@@ -176,13 +176,8 @@ function mockY10Series() {
 
 // 政策利率(合并 1Y 贷款基准 + 7D 逆回购)月度序列
 function mockPolicyRateMonthly() {
-  // 抽取每次调整形成阶梯
-  const pts = rateAdjustments
-    .filter((x) => x.changeBp !== null)
-    .map((x) => ({ date: x.date + (x.date.length === 10 ? '' : ''), value: x.after }))
-  // 加上期初
-  const first = rateAdjustments[0]
-  const arr = [[first.date, first.after], ...pts.map((x) => [x.date, x.value])]
+  // 保留所有有效点位(含 changeBp===null 的期初/当前行)
+  const arr = rateAdjustments.map((x) => [x.date, x.after])
   // 转月度(每月 30 日取最近生效日)
   const months = []
   const start = new Date('2008-01-01')
@@ -225,21 +220,21 @@ function mockRrrMonthly() {
   return months
 }
 
-// 超储率
+// 超储率(季度,保留季节性波动形态,目标 2025-12=1.5、2026-06=1.3)
 function mockExcessReserveRatio() {
   return [
-    ['2018-12-31', 2.40], ['2019-03-31', 2.20], ['2019-06-30', 2.00], ['2019-09-30', 1.90],
-    ['2019-12-31', 1.80], ['2020-03-31', 1.70], ['2020-06-30', 1.60], ['2020-09-30', 1.50],
-    ['2020-12-31', 1.50], ['2021-03-31', 1.50], ['2021-06-30', 1.40], ['2021-09-30', 1.40],
-    ['2021-12-31', 1.40], ['2022-03-31', 1.30], ['2022-06-30', 1.30], ['2022-09-30', 1.30],
-    ['2022-12-31', 1.20], ['2023-03-31', 1.20], ['2023-06-30', 1.20], ['2023-09-30', 1.10],
-    ['2023-12-31', 1.10], ['2024-03-31', 1.10], ['2024-06-30', 1.00], ['2024-09-30', 1.00],
-    ['2024-12-31', 1.00], ['2025-03-31', 1.00], ['2025-06-30', 0.90], ['2025-09-30', 0.90],
-    ['2025-12-31', 0.90], ['2026-03-31', 0.90], ['2026-06-30', 0.80], ['2026-08-31', 0.80],
+    ['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],
   ]
 }
 
-// 一般贷款利率 vs 个人住房按揭
+// 一般贷款利率 vs 个人住房按揭(2026-06 目标:3.51 / 3.05)
 function mockLoanRates() {
   return {
     generalLoan: [
@@ -249,8 +244,8 @@ function mockLoanRates() {
       ['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.32], ['2025-06-30', 3.21], ['2025-09-30', 3.13],
-      ['2025-12-31', 3.05], ['2026-03-31', 2.97], ['2026-06-30', 2.90], ['2026-08-31', 2.85],
+      ['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],
     ],
     mortgage: [
       ['2018-12-31', 5.75], ['2019-03-31', 5.69], ['2019-06-30', 5.53], ['2019-09-30', 5.55],
@@ -259,32 +254,32 @@ function mockLoanRates() {
       ['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.04], ['2025-06-30', 2.92], ['2025-09-30', 2.83],
-      ['2025-12-31', 2.74], ['2026-03-31', 2.66], ['2026-06-30', 2.58], ['2026-08-31', 2.52],
+      ['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],
     ],
   }
 }
 
-// 财政赤字 / 赤字率 / 政府债余额
+// 财政赤字 / 赤字率 / 政府债余额(按 Excel 政策面 sheet 修正)
 function mockFiscal() {
   return {
     deficit: [
       ['2014-12-31', 13800], ['2015-12-31', 16200], ['2016-12-31', 21800], ['2017-12-31', 23800],
       ['2018-12-31', 23800], ['2019-12-31', 27600], ['2020-12-31', 37600], ['2021-12-31', 35700],
-      ['2022-12-31', 33700], ['2023-12-31', 38800], ['2024-12-31', 33800], ['2025-12-31', 48800],
-      ['2026-12-31', 50800],
+      ['2022-12-31', 33700], ['2023-12-31', 38800], ['2024-12-31', 40600], ['2025-12-31', 56600],
+      ['2026-12-31', 58900],
     ],
     deficitRatio: [
       ['2014-12-31', 2.1], ['2015-12-31', 2.3], ['2016-12-31', 3.0], ['2017-12-31', 3.0],
       ['2018-12-31', 2.6], ['2019-12-31', 2.8], ['2020-12-31', 3.6], ['2021-12-31', 3.2],
-      ['2022-12-31', 2.8], ['2023-12-31', 3.0], ['2024-12-31', 3.0], ['2025-12-31', 3.0],
-      ['2026-12-31', 3.0],
+      ['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', 95.20], ['2026-06-30', 98.50], ['2026-08-31', 100.80],
+      ['2025-12-31', 92.10], ['2026-03-31', 100.50], ['2026-06-30', 102.30], ['2026-08-31', 103.69],
     ],
   }
 }
@@ -302,6 +297,18 @@ const mock = {
 }
 
 function mockSeries(key) { return mock[key]?.series || [] }
+
+// KPI 数据源(供顶部 KPI 卡引用,显示数据来源 + 指标编码)
+export const kpiMeta = {
+  policyRate: { source: mock.policyRate.source, code: mock.policyRate.code },
+  y10:        { source: mock.y10.source,        code: mock.y10.code },
+  rrr:        { source: mock.rrr.source,        code: mock.rrr.code },
+  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 },
+  deficitR:   { source: mock.deficitR.source,   code: mock.deficitR.code },
+  govDebt:    { source: mock.govDebt.source,    code: mock.govDebt.code },
+}
 function mockMeta(key) {
   const m = mock[key]
   const freqMap = {

+ 19 - 8
web-app/src/views/bond/policy/index.vue

@@ -22,6 +22,7 @@
         <div :class="['chg', chgCls(k.value, k.sign)]">
           <span class="arrow">{{ arrow(k.value) }}</span> {{ k.date }} · {{ k.tag }}
         </div>
+        <div class="src">源:{{ k.source }}</div>
       </div>
     </section>
 
@@ -276,6 +277,7 @@ import Chart from '@/components/Chart.vue'
 import {
   loadAllSeries, latestOf,
   rateAdjustments, rrrAdjustments,
+  kpiMeta,
   palette as C,
 } from './data'
 import {
@@ -367,14 +369,14 @@ const rrrCumBp = computed(() => {
 })
 
 const kpis = computed(() => ([
-  { label: '政策利率(7D 逆回购)', icon: '🏦', value: policyRateLatest.value?.value, unit: '%', date: formatDate(policyRateLatest.value?.date), tag: '当前', sign: false },
-  { label: '10Y 国债收益率', icon: '📈', value: y10Latest.value?.value, unit: '%', date: formatDate(y10Latest.value?.date), tag: '无风险', sign: false },
-  { label: '存款准备金率', icon: '🛡️', value: rrrLatest.value?.value, unit: '%', date: formatDate(rrrLatest.value?.date), tag: '大型机构', sign: false },
-  { label: '金融机构超储率', icon: '💧', value: excessLatest.value?.value, unit: '%', date: formatDate(excessLatest.value?.date), tag: '流动性', sign: false },
-  { label: '一般贷款利率', icon: '💼', value: loanGenLatest.value?.value, unit: '%', date: formatDate(loanGenLatest.value?.date), tag: '加权', sign: false },
-  { label: '按揭贷款利率', icon: '🏠', value: loanMortLatest.value?.value, unit: '%', date: formatDate(loanMortLatest.value?.date), tag: '加权', sign: false },
-  { label: '财政赤字率', icon: '📉', value: deficitRLatest.value?.value, unit: '%', date: formatDate(deficitRLatest.value?.date), tag: '预期目标', sign: false },
-  { label: '政府债余额', icon: '📜', value: govDebtLatest.value?.value, unit: '万亿', date: formatDate(govDebtLatest.value?.date), tag: '社融存量', sign: true },
+  { label: '政策利率(7D 逆回购)', icon: '🏦', value: policyRateLatest.value?.value, unit: '%', date: formatDate(policyRateLatest.value?.date), tag: '当前', sign: false, source: kpiMeta.policyRate.source },
+  { label: '10Y 国债收益率', icon: '📈', value: y10Latest.value?.value, unit: '%', date: formatDate(y10Latest.value?.date), tag: '无风险', sign: false, source: kpiMeta.y10.source },
+  { label: '存款准备金率', icon: '🛡️', value: rrrLatest.value?.value, unit: '%', date: formatDate(rrrLatest.value?.date), tag: '大型机构', sign: false, source: kpiMeta.rrr.source },
+  { label: '金融机构超储率', icon: '💧', value: excessLatest.value?.value, unit: '%', date: formatDate(excessLatest.value?.date), tag: '流动性', sign: false, source: kpiMeta.excess.source },
+  { label: '一般贷款利率', icon: '💼', value: loanGenLatest.value?.value, unit: '%', date: formatDate(loanGenLatest.value?.date), tag: '加权', sign: false, source: kpiMeta.loanGen.source },
+  { label: '按揭贷款利率', icon: '🏠', value: loanMortLatest.value?.value, unit: '%', date: formatDate(loanMortLatest.value?.date), tag: '加权', sign: false, source: kpiMeta.loanMort.source },
+  { label: '财政赤字率', icon: '📉', value: deficitRLatest.value?.value, unit: '%', date: formatDate(deficitRLatest.value?.date), tag: '预期目标', sign: false, source: kpiMeta.deficitR.source },
+  { label: '政府债余额', icon: '📜', value: govDebtLatest.value?.value, unit: '万亿', date: formatDate(govDebtLatest.value?.date), tag: '社融存量', sign: true, source: kpiMeta.govDebt.source },
 ]))
 
 const policyY10Opt = computed(() => policyRateVsY10Option(policyRateSeries.value, y10Series.value))
@@ -498,6 +500,15 @@ const govDebtOpt = computed(() => govDebtOption(govDebtSeries.value))
 .kpi-card .chg.down { color: #189A65; }
 .kpi-card .chg.flat { color: var(--mut, #6B7A96); }
 .kpi-card .chg .arrow { font-size: 9px; }
+.kpi-card .src {
+  font-size: 10.5px;
+  color: var(--faint, #98A5BD);
+  margin-top: 4px;
+  letter-spacing: 0;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
 
 .section { margin-top: 18px; }
 .section-hd {

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

@@ -177,7 +177,7 @@ export const investorHolding202608 = {
     { name: ' 信用社',       values: [  3148, -1169,   2679,  -282,   6662, -1323,   189,    -98,   11,   -13,    0,    0], indent: 1 },
     { name: ' 保险机构',     values: [ 10000,   172,  27631,  1992,   4683,  -110,  1659,   -680,  237,   -29,   14,    0], indent: 1 },
     { name: ' 证券公司',     values: [ 10275,   707,   5544,   213,   2634,   278,  1371,   -250,  625,  -125,  872,   58], indent: 1 },
-    { name: ' 非法人产品',   values: [ 33615,  4125,  65524, 14365,  68707, -1111, 13938,  -6664, 4104,  -472, 1606,  -20], indent: 1 },
+    { name: ' 非法人产品',   values: [ 33615,  4125,  65524, 14365,  68707, -11111, 13938,  -6664, 4104,  -472, 1606,  -20], indent: 1 },
     { name: ' 境外机构',     values: [ 20255,   189,    114,    21,   7194,    65,    29,    -75,    6,    -1,   56,  -31], indent: 1 },
     { name: ' 其他',         values: [ 43961,  -418,  59380, -2118,   5800, -1642,   263,   -111,   47,     2, 1033,   57], indent: 1 },
     { name: '柜台市场',        values: [ 10424,   951,    386,    35,    812,   150,    21,     10,    0,     0,    0,    0] },