Kaynağa Gözat

fix(bond,financing): 修正净融资口径与10年国债图表显示

- 供求面: mock 数据替换为 Wind 真实数据(2023-01~2026-08), 净融资改为发行量-总偿还量口径, 新增净融资额序列接入图表与 KPI

- 融资需求: 10年国债收益率右轴 max 4->5, 修复高超4%段被裁剪断线; 移除票据融资当月值序列; 修复图例色块与柱子颜色不匹配
jiangwh 1 gün önce
ebeveyn
işleme
f8dd2039b6

+ 6 - 2
web-app/src/views/bond/supply-demand/charts.js

@@ -29,12 +29,16 @@ const downGrad = (color) => ({
 
 // 发行量 vs 到期量 + 净融资(单纵轴)
 // yMax 用于在多个图之间统一纵坐标尺度
-export function issueMatureNetOption(issue, mature, { yMax = null } = {}) {
+// net:净融资额序列(= 发行量 − 总偿还量);缺省时回落为 发行量 − 到期量
+export function issueMatureNetOption(issue, mature, { yMax = null, net = null } = {}) {
   const cats = sliceDate(issue)
   const matMap = new Map(mature.map(([d, v]) => [String(d).slice(2, 7), v]))
   const issVals = issue.map((x) => x[1])
   const matVals = cats.map((d) => matMap.get(d) ?? 0)
-  const netVals = issVals.map((v, i) => v - matVals[i])
+  const netMap = net && net.length ? new Map(net.map(([d, v]) => [String(d).slice(2, 7), v])) : null
+  const netVals = netMap
+    ? cats.map((d) => netMap.get(d) ?? null)
+    : issVals.map((v, i) => v - matVals[i])
   const useMax = yMax == null ? Math.max(0, ...issVals, ...matVals) : yMax
   return {
     tooltip: { ...tipOpt, trigger: 'axis', axisPointer: { type: 'shadow' } },

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

@@ -70,98 +70,139 @@ async function loadLatestByCode(code, list) {
 }
 
 // ===== Mock 兜底数据 =====
+// 口径:净融资额 = 总发行量 − 总偿还量(总偿还量 = 到期偿还量 + 回售/赎回/提前兑付等)
+// mature 列为到期偿还量;net 列为净融资额
 
-// 利率债月度发行量、到期量(亿元)
+// 利率债(国债 + 地方政府债 + 政策性银行债)
 function mockRateBond() {
   const issue = [
-    ['2023-01-31',  5800], ['2023-02-28',  6200], ['2023-03-31',  9800], ['2023-04-30',  7500],
-    ['2023-05-31',  8200], ['2023-06-30', 12500], ['2023-07-31',  6800], ['2023-08-31',  9800],
-    ['2023-09-30', 11200], ['2023-10-31',  8600], ['2023-11-30', 10200], ['2023-12-31',  9200],
-    ['2024-01-31',  6500], ['2024-02-29',  4500], ['2024-03-31', 11800], ['2024-04-30',  8200],
-    ['2024-05-31',  9000], ['2024-06-30', 13800], ['2024-07-31',  7200], ['2024-08-31', 11200],
-    ['2024-09-30', 12500], ['2024-10-31',  9200], ['2024-11-30', 11500], ['2024-12-31', 10200],
-    ['2025-01-31',  7800], ['2025-02-28',  5200], ['2025-03-31', 13200], ['2025-04-30',  9500],
-    ['2025-05-31', 10800], ['2025-06-30', 15600], ['2025-07-31',  8500], ['2025-08-31', 12800],
-    ['2025-09-30', 14200], ['2025-10-31', 10200], ['2025-11-30', 12500], ['2025-12-31', 11200],
-    ['2026-01-31',  8500], ['2026-02-28',  5500], ['2026-03-31', 14600], ['2026-04-30', 10500],
-    ['2026-05-31', 11500], ['2026-06-30', 16800], ['2026-07-31',  9200], ['2026-08-31', 13200],
+    ['2023-01-31',  17484.83], ['2023-02-28',  18990.98], ['2023-03-31',  24861.12], ['2023-04-30',  19695.79],
+    ['2023-05-31',  21546.44], ['2023-06-30',  21671.68], ['2023-07-31',  20116.96], ['2023-08-31',  27373.59],
+    ['2023-09-30',  23528.67], ['2023-10-31',  30464.65], ['2023-11-30',  23633.39], ['2023-12-31',  13686.27],
+    ['2024-01-31',   16204.5], ['2024-02-29',  15721.41], ['2024-03-31',   20870.5], ['2024-04-30',   20430.1],
+    ['2024-05-31',  25128.25], ['2024-06-30',  24080.75], ['2024-07-31',   22613.1], ['2024-08-31',  33778.93],
+    ['2024-09-30',  31008.53], ['2024-10-31',  22478.33], ['2024-11-30',   27711.4], ['2024-12-31',   19272.6],
+    ['2025-01-31',  21431.16], ['2025-02-28',   28719.3], ['2025-03-31',  28524.33], ['2025-04-30',  27698.41],
+    ['2025-05-31',  28806.13], ['2025-06-30',  33571.22], ['2025-07-31',  32071.43], ['2025-08-31',  29778.98],
+    ['2025-09-30',  29140.47], ['2025-10-31',  22264.85], ['2025-11-30',  24434.61], ['2025-12-31',  23388.67],
+    ['2026-01-31',   27731.7], ['2026-02-28',  25972.29], ['2026-03-31',  31442.82], ['2026-04-30',  27219.67],
+    ['2026-05-31',  26407.59], ['2026-06-30',  28677.47], ['2026-07-31',  26977.86], ['2026-08-31',  31930.33],
   ]
   const mature = [
-    ['2023-01-31',  2800], ['2023-02-28',  1900], ['2023-03-31',  3500], ['2023-04-30',  4200],
-    ['2023-05-31',  5800], ['2023-06-30',  8500], ['2023-07-31',  5200], ['2023-08-31',  6800],
-    ['2023-09-30',  6200], ['2023-10-31',  3500], ['2023-11-30',  2800], ['2023-12-31',  2200],
-    ['2024-01-31',  3200], ['2024-02-29',  2100], ['2024-03-31',  4200], ['2024-04-30',  4800],
-    ['2024-05-31',  6500], ['2024-06-30',  9200], ['2024-07-31',  5800], ['2024-08-31',  7500],
-    ['2024-09-30',  6800], ['2024-10-31',  4200], ['2024-11-30',  3200], ['2024-12-31',  2500],
-    ['2025-01-31',  3500], ['2025-02-28',  2300], ['2025-03-31',  4500], ['2025-04-30',  5200],
-    ['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', 19213],
+    ['2023-01-31',   12094.9], ['2023-02-28',   9765.39], ['2023-03-31',  13266.76], ['2023-04-30',  14726.62],
+    ['2023-05-31',  12860.41], ['2023-06-30',  12464.83], ['2023-07-31',  15235.47], ['2023-08-31',  15078.52],
+    ['2023-09-30',  13055.94], ['2023-10-31',  12846.28], ['2023-11-30',  10148.77], ['2023-12-31',    4018.6],
+    ['2024-01-31',  12123.42], ['2024-02-29',  12459.74], ['2024-03-31',  15552.05], ['2024-04-30',  17206.02],
+    ['2024-05-31',   8912.04], ['2024-06-30',  15604.26], ['2024-07-31',  14587.91], ['2024-08-31',  13649.79],
+    ['2024-09-30',  15144.64], ['2024-10-31',  10146.19], ['2024-11-30',   7022.78], ['2024-12-31',   7492.49],
+    ['2025-01-31',  11090.77], ['2025-02-28',   9085.79], ['2025-03-31',  12800.05], ['2025-04-30',  19786.26],
+    ['2025-05-31',  10833.32], ['2025-06-30',  16404.81], ['2025-07-31',  16700.26], ['2025-08-31',  12543.28],
+    ['2025-09-30',  16494.45], ['2025-10-31',  16005.83], ['2025-11-30',    9456.4], ['2025-12-31',  18099.23],
+    ['2026-01-31',  14378.99], ['2026-02-28',  13087.54], ['2026-03-31',  20908.94], ['2026-04-30',  21515.05],
+    ['2026-05-31',  12905.48], ['2026-06-30',   19255.5], ['2026-07-31',  13061.41], ['2026-08-31',  19213.74],
   ]
-  return { issue, mature }
+  const net = [
+    ['2023-01-31',   5374.83], ['2023-02-28',   9225.54], ['2023-03-31',   11574.3], ['2023-04-30',   4956.55],
+    ['2023-05-31',   8675.04], ['2023-06-30',   9189.67], ['2023-07-31',   4881.49], ['2023-08-31',  12241.05],
+    ['2023-09-30',  10464.16], ['2023-10-31',  17018.33], ['2023-11-30',  13184.63], ['2023-12-31',   9667.34],
+    ['2024-01-31',   4065.93], ['2024-02-29',   3261.62], ['2024-03-31',   5298.08], ['2024-04-30',   3211.47],
+    ['2024-05-31',  16203.54], ['2024-06-30',   8458.48], ['2024-07-31',   8000.49], ['2024-08-31',  20113.77],
+    ['2024-09-30',  15861.58], ['2024-10-31',  12313.62], ['2024-11-30',  20667.46], ['2024-12-31',  11428.78],
+    ['2025-01-31',  10334.71], ['2025-02-28',  19628.81], ['2025-03-31',  15687.87], ['2025-04-30',   7903.99],
+    ['2025-05-31',  17950.66], ['2025-06-30',  17067.31], ['2025-07-31',  15334.38], ['2025-08-31',  17213.99],
+    ['2025-09-30',  12630.96], ['2025-10-31',   6229.84], ['2025-11-30',     14951], ['2025-12-31',   4787.82],
+    ['2026-01-31',  13311.51], ['2026-02-28',  12857.06], ['2026-03-31',  10486.89], ['2026-04-30',   5664.47],
+    ['2026-05-31',  13459.31], ['2026-06-30',   9342.06], ['2026-07-31',  13898.24], ['2026-08-31',  12062.89],
+  ]
+  return { issue, mature, net }
 }
 
-// 信用债月度发行量(中票+短融+超短融+PPN)、到期量
+// 信用债(中票 + 短融 + 超短融 + PPN)
 function mockCreditBond() {
   const issue = [
-    ['2023-01-31',  4200], ['2023-02-28',  3800], ['2023-03-31',  6800], ['2023-04-30',  6200],
-    ['2023-05-31',  5800], ['2023-06-30',  6500], ['2023-07-31',  5200], ['2023-08-31',  7200],
-    ['2023-09-30',  6800], ['2023-10-31',  5500], ['2023-11-30',  6200], ['2023-12-31',  4800],
-    ['2024-01-31',  5500], ['2024-02-29',  3200], ['2024-03-31',  7800], ['2024-04-30',  6500],
-    ['2024-05-31',  6200], ['2024-06-30',  6800], ['2024-07-31',  5800], ['2024-08-31',  7500],
-    ['2024-09-30',  7200], ['2024-10-31',  5800], ['2024-11-30',  6500], ['2024-12-31',  5200],
-    ['2025-01-31',  6200], ['2025-02-28',  3500], ['2025-03-31',  8500], ['2025-04-30',  7200],
-    ['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',  7971],
+    ['2023-01-31',   5916.67], ['2023-02-28',   6707.11], ['2023-03-31',  10481.14], ['2023-04-30',   9201.62],
+    ['2023-05-31',   4783.76], ['2023-06-30',    7880.7], ['2023-07-31',   6713.39], ['2023-08-31',    9363.5],
+    ['2023-09-30',   6017.65], ['2023-10-31',   6881.74], ['2023-11-30',    6481.8], ['2023-12-31',   5141.35],
+    ['2024-01-31',   9571.89], ['2024-02-29',   5069.31], ['2024-03-31',   11475.6], ['2024-04-30',     10005],
+    ['2024-05-31',   5223.98], ['2024-06-30',   8451.01], ['2024-07-31',   8978.28], ['2024-08-31',   9112.31],
+    ['2024-09-30',    7541.8], ['2024-10-31',   6191.66], ['2024-11-30',   8267.15], ['2024-12-31',   7101.35],
+    ['2025-01-31',   8777.68], ['2025-02-28',   6000.91], ['2025-03-31',   8371.62], ['2025-04-30',    9388.3],
+    ['2025-05-31',    5190.5], ['2025-06-30',   8669.35], ['2025-07-31',   8851.29], ['2025-08-31',   7469.18],
+    ['2025-09-30',   7616.54], ['2025-10-31',   7664.73], ['2025-11-30',   9124.15], ['2025-12-31',   7487.12],
+    ['2026-01-31',    8569.2], ['2026-02-28',    3809.8], ['2026-03-31',   9607.34], ['2026-04-30',   9885.73],
+    ['2026-05-31',   3982.36], ['2026-06-30',   7333.23], ['2026-07-31',   8350.98], ['2026-08-31',   7971.17],
   ]
   const mature = [
-    ['2023-01-31',  3500], ['2023-02-28',  2200], ['2023-03-31',  4800], ['2023-04-30',  5200],
-    ['2023-05-31',  5500], ['2023-06-30',  4200], ['2023-07-31',  3800], ['2023-08-31',  4500],
-    ['2023-09-30',  5200], ['2023-10-31',  4800], ['2023-11-30',  5500], ['2023-12-31',  6200],
-    ['2024-01-31',  4200], ['2024-02-29',  2800], ['2024-03-31',  5200], ['2024-04-30',  5800],
-    ['2024-05-31',  6200], ['2024-06-30',  4800], ['2024-07-31',  4200], ['2024-08-31',  5200],
-    ['2024-09-30',  5800], ['2024-10-31',  5500], ['2024-11-30',  6200], ['2024-12-31',  7000],
-    ['2025-01-31',  4800], ['2025-02-28',  3200], ['2025-03-31',  5800], ['2025-04-30',  6500],
-    ['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',  6148],
+    ['2023-01-31',   4290.21], ['2023-02-28',   3800.92], ['2023-03-31',   8533.04], ['2023-04-30',   7584.68],
+    ['2023-05-31',    5531.7], ['2023-06-30',   6297.22], ['2023-07-31',    5767.9], ['2023-08-31',   6498.05],
+    ['2023-09-30',   6011.62], ['2023-10-31',   4777.01], ['2023-11-30',    4913.2], ['2023-12-31',   6835.43],
+    ['2024-01-31',   5878.59], ['2024-02-29',   3444.61], ['2024-03-31',   7714.83], ['2024-04-30',   6934.11],
+    ['2024-05-31',   4424.88], ['2024-06-30',   5801.28], ['2024-07-31',   6032.57], ['2024-08-31',   6961.17],
+    ['2024-09-30',   6961.07], ['2024-10-31',   4743.52], ['2024-11-30',   5117.88], ['2024-12-31',   5477.98],
+    ['2025-01-31',   4858.03], ['2025-02-28',   3552.57], ['2025-03-31',   6756.97], ['2025-04-30',   6480.32],
+    ['2025-05-31',   4237.38], ['2025-06-30',   5643.95], ['2025-07-31',      5280], ['2025-08-31',   5669.34],
+    ['2025-09-30',   5434.41], ['2025-10-31',   4589.27], ['2025-11-30',   5132.66], ['2025-12-31',   5514.44],
+    ['2026-01-31',   4748.09], ['2026-02-28',   2751.29], ['2026-03-31',   6176.84], ['2026-04-30',   6208.68],
+    ['2026-05-31',   3660.17], ['2026-06-30',   5147.59], ['2026-07-31',    5328.8], ['2026-08-31',   6147.55],
+  ]
+  const net = [
+    ['2023-01-31',   1142.68], ['2023-02-28',   2521.99], ['2023-03-31',    922.65], ['2023-04-30',    150.26],
+    ['2023-05-31',  -1549.27], ['2023-06-30',    514.99], ['2023-07-31',    124.21], ['2023-08-31',   1457.86],
+    ['2023-09-30',  -1162.23], ['2023-10-31',   1112.42], ['2023-11-30',     304.9], ['2023-12-31',  -2900.69],
+    ['2024-01-31',   2820.44], ['2024-02-29',   1238.33], ['2024-03-31',   2740.41], ['2024-04-30',   1918.11],
+    ['2024-05-31',    368.99], ['2024-06-30',   1705.24], ['2024-07-31',   2194.28], ['2024-08-31',   1073.75],
+    ['2024-09-30',   -382.75], ['2024-10-31',    699.46], ['2024-11-30',   1942.31], ['2024-12-31',    185.64],
+    ['2025-01-31',   3191.55], ['2025-02-28',    1700.9], ['2025-03-31',   -272.43], ['2025-04-30',   1193.14],
+    ['2025-05-31',    181.55], ['2025-06-30',    1821.7], ['2025-07-31',   2321.43], ['2025-08-31',     143.7],
+    ['2025-09-30',    853.61], ['2025-10-31',   1618.86], ['2025-11-30',   2629.23], ['2025-12-31',    773.53],
+    ['2026-01-31',   3250.08], ['2026-02-28',    587.43], ['2026-03-31',   2270.26], ['2026-04-30',   2636.27],
+    ['2026-05-31',    -35.37], ['2026-06-30',   1516.86], ['2026-07-31',   2134.92], ['2026-08-31',    624.53],
   ]
-  return { issue, mature }
+  return { issue, mature, net }
 }
 
-// 金融债月度发行量、到期量
+// 金融债
 function mockFinBond() {
   const issue = [
-    ['2023-01-31',  2800], ['2023-02-28',  2500], ['2023-03-31',  4200], ['2023-04-30',  3800],
-    ['2023-05-31',  3500], ['2023-06-30',  4500], ['2023-07-31',  3200], ['2023-08-31',  4200],
-    ['2023-09-30',  4500], ['2023-10-31',  3800], ['2023-11-30',  4200], ['2023-12-31',  3500],
-    ['2024-01-31',  3800], ['2024-02-29',  2200], ['2024-03-31',  5200], ['2024-04-30',  4500],
-    ['2024-05-31',  4200], ['2024-06-30',  4800], ['2024-07-31',  3800], ['2024-08-31',  4500],
-    ['2024-09-30',  4800], ['2024-10-31',  4200], ['2024-11-30',  4500], ['2024-12-31',  3800],
-    ['2025-01-31',  4200], ['2025-02-28',  2500], ['2025-03-31',  5800], ['2025-04-30',  5000],
-    ['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',  5317],
+    ['2023-01-31',       355], ['2023-02-28',       690], ['2023-03-31',      3884], ['2023-04-30',    3191.7],
+    ['2023-05-31',      2599], ['2023-06-30',      2003], ['2023-07-31',      3236], ['2023-08-31',      2712],
+    ['2023-09-30',      3221], ['2023-10-31',      3097], ['2023-11-30',    3815.9], ['2023-12-31',    1872.7],
+    ['2024-01-31',       979], ['2024-02-29',      2351], ['2024-03-31',      2689], ['2024-04-30',    4112.5],
+    ['2024-05-31',      3740], ['2024-06-30',    2960.2], ['2024-07-31',      3771], ['2024-08-31',      5103],
+    ['2024-09-30',    2603.5], ['2024-10-31',    2444.1], ['2024-11-30',    3834.4], ['2024-12-31',    2620.6],
+    ['2025-01-31',       688], ['2025-02-28',      2687], ['2025-03-31',    2823.6], ['2025-04-30',      4135],
+    ['2025-05-31',    5694.7], ['2025-06-30',      4133], ['2025-07-31',      5246], ['2025-08-31',      3057],
+    ['2025-09-30',      3961], ['2025-10-31',      1428], ['2025-11-30',    5857.7], ['2025-12-31',    3964.4],
+    ['2026-01-31',       788], ['2026-02-28',       282], ['2026-03-31',     619.7], ['2026-04-30',    4529.2],
+    ['2026-05-31',      4929], ['2026-06-30',   5395.28], ['2026-07-31',    5714.4], ['2026-08-31',      5317],
   ]
   const mature = [
-    ['2023-01-31',  1800], ['2023-02-28',  1200], ['2023-03-31',  2500], ['2023-04-30',  2800],
-    ['2023-05-31',  3000], ['2023-06-30',  2200], ['2023-07-31',  2000], ['2023-08-31',  2400],
-    ['2023-09-30',  2800], ['2023-10-31',  2600], ['2023-11-30',  3000], ['2023-12-31',  3500],
-    ['2024-01-31',  2200], ['2024-02-29',  1500], ['2024-03-31',  2800], ['2024-04-30',  3200],
-    ['2024-05-31',  3500], ['2024-06-30',  2600], ['2024-07-31',  2200], ['2024-08-31',  2800],
-    ['2024-09-30',  3200], ['2024-10-31',  3000], ['2024-11-30',  3500], ['2024-12-31',  4000],
-    ['2025-01-31',  2600], ['2025-02-28',  1800], ['2025-03-31',  3200], ['2025-04-30',  3600],
-    ['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',  1837],
+    ['2023-01-31',       315], ['2023-02-28',       544], ['2023-03-31',      1897], ['2023-04-30',    1933.8],
+    ['2023-05-31',      1268], ['2023-06-30',       445], ['2023-07-31',       474], ['2023-08-31',    1739.5],
+    ['2023-09-30',       807], ['2023-10-31',       694], ['2023-11-30',      1325], ['2023-12-31',     843.8],
+    ['2024-01-31',       551], ['2024-02-29',       841], ['2024-03-31',      2240], ['2024-04-30',    1880.7],
+    ['2024-05-31',     492.5], ['2024-06-30',      1166], ['2024-07-31',     667.2], ['2024-08-31',    1001.5],
+    ['2024-09-30',    782.55], ['2024-10-31',       327], ['2024-11-30',      1644], ['2024-12-31',    1360.5],
+    ['2025-01-31',     656.5], ['2025-02-28',      1507], ['2025-03-31',      2362], ['2025-04-30',      1344],
+    ['2025-05-31',   1383.27], ['2025-06-30',      1628], ['2025-07-31',       619], ['2025-08-31',      1477],
+    ['2025-09-30',    1136.3], ['2025-10-31',    1491.6], ['2025-11-30',    2274.4], ['2025-12-31',    2526.2],
+    ['2026-01-31',       348], ['2026-02-28',       623], ['2026-03-31',      1974], ['2026-04-30',      2364],
+    ['2026-05-31',      2193], ['2026-06-30',      1916], ['2026-07-31',      2643], ['2026-08-31',      1837],
+  ]
+  const net = [
+    ['2023-01-31',    -111.5], ['2023-02-28',       136], ['2023-03-31',      1722], ['2023-04-30',     829.4],
+    ['2023-05-31',    1121.3], ['2023-06-30',      1193], ['2023-07-31',      2692], ['2023-08-31',     885.5],
+    ['2023-09-30',       720], ['2023-10-31',      1382], ['2023-11-30',    2187.9], ['2023-12-31',     888.9],
+    ['2024-01-31',        13], ['2024-02-29',      1510], ['2024-03-31',     -1354], ['2024-04-30',     881.8],
+    ['2024-05-31',    3127.5], ['2024-06-30',     941.2], ['2024-07-31',    1888.8], ['2024-08-31',      2302],
+    ['2024-09-30',   -349.05], ['2024-10-31',    2108.1], ['2024-11-30',    1113.4], ['2024-12-31',     376.1],
+    ['2025-01-31',     -52.5], ['2025-02-28',       880], ['2025-03-31',    -555.7], ['2025-04-30',      1764],
+    ['2025-05-31',   2438.93], ['2025-06-30',      1875], ['2025-07-31',      4067], ['2025-08-31',     267.5],
+    ['2025-09-30',    -432.3], ['2025-10-31',    -462.1], ['2025-11-30',    1836.3], ['2025-12-31',     550.6],
+    ['2026-01-31',        20], ['2026-02-28',    -457.1], ['2026-03-31',   -2195.3], ['2026-04-30',    1329.2],
+    ['2026-05-31',      2041], ['2026-06-30',   1627.78], ['2026-07-31',    2927.4], ['2026-08-31',      2082],
   ]
-  return { issue, mature }
+  return { issue, mature, net }
 }
 
 // ===== 投资者结构(托管表)— 来自需求文档 =====
@@ -226,10 +267,13 @@ export const investorHolding202607 = {
 const mock = {
   rateIssue: { name: '利率债发行量',     unit: '亿元', source: 'Wind', code: 'B-RATE-ISS', series: mockRateBond().issue },
   rateMature:{ name: '利率债到期量',     unit: '亿元', source: 'Wind', code: 'B-RATE-MAT', series: mockRateBond().mature },
+  rateNet:   { name: '利率债净融资额',   unit: '亿元', source: 'Wind', code: 'B-RATE-NET', series: mockRateBond().net },
   creditIssue:{ name: '信用债发行量',    unit: '亿元', source: 'Wind', code: 'B-CRED-ISS', series: mockCreditBond().issue },
   creditMature:{ name: '信用债到期量',   unit: '亿元', source: 'Wind', code: 'B-CRED-MAT', series: mockCreditBond().mature },
+  creditNet: { name: '信用债净融资额',   unit: '亿元', source: 'Wind', code: 'B-CRED-NET', series: mockCreditBond().net },
   finIssue:  { name: '金融债发行量',     unit: '亿元', source: 'Wind', code: 'B-FIN-ISS',  series: mockFinBond().issue },
   finMature: { name: '金融债到期量',     unit: '亿元', source: 'Wind', code: 'B-FIN-MAT',  series: mockFinBond().mature },
+  finNet:    { name: '金融债净融资额',   unit: '亿元', source: 'Wind', code: 'B-FIN-NET',  series: mockFinBond().net },
 }
 
 function mockSeries(key) { return mock[key]?.series || [] }
@@ -284,18 +328,21 @@ async function loadLatestWithFallback(key) {
 
 export const loadRateIssue   = () => loadWithFallback('rateIssue')
 export const loadRateMature  = () => loadWithFallback('rateMature')
+export const loadRateNet     = () => loadWithFallback('rateNet')
 export const loadCreditIssue = () => loadWithFallback('creditIssue')
 export const loadCreditMature= () => loadWithFallback('creditMature')
+export const loadCreditNet   = () => loadWithFallback('creditNet')
 export const loadFinIssue    = () => loadWithFallback('finIssue')
 export const loadFinMature   = () => loadWithFallback('finMature')
+export const loadFinNet      = () => loadWithFallback('finNet')
 
 export async function loadAllSeries() {
-  const [rateIssue, rateMature, creditIssue, creditMature, finIssue, finMature] = await Promise.all([
-    loadRateIssue(), loadRateMature(),
-    loadCreditIssue(), loadCreditMature(),
-    loadFinIssue(), loadFinMature(),
+  const [rateIssue, rateMature, rateNet, creditIssue, creditMature, creditNet, finIssue, finMature, finNet] = await Promise.all([
+    loadRateIssue(), loadRateMature(), loadRateNet(),
+    loadCreditIssue(), loadCreditMature(), loadCreditNet(),
+    loadFinIssue(), loadFinMature(), loadFinNet(),
   ])
-  return { rateIssue, rateMature, creditIssue, creditMature, finIssue, finMature }
+  return { rateIssue, rateMature, rateNet, creditIssue, creditMature, creditNet, finIssue, finMature, finNet }
 }
 export async function loadLatestAll() {
   const [rateIssue, rateMature, creditIssue, creditMature, finIssue, finMature] = await Promise.all([

+ 16 - 19
web-app/src/views/bond/supply-demand/index.vue

@@ -64,7 +64,7 @@
               <div class="kv"><span class="k">净融资</span><span class="v strong">{{ formatYi(rateNetLatest) }} 亿元</span></div>
             </div>
             <div class="note">
-              利率债包括国债、地方政府债、政策性银行债。净融资 = 发行量 − 到期量,反映一级市场对二级市场的供给压力。{{ rateComment }}。
+              利率债包括国债、地方政府债、政策性银行债。净融资 = 发行量 − 总偿还量(含到期、回售、赎回等),反映一级市场对二级市场的供给压力。{{ rateComment }}。
             </div>
           </div>
         </div>
@@ -329,10 +329,13 @@ const holdingTab = vRef('202608')
 
 const rateIssueSeries   = vRef([])
 const rateMatureSeries  = vRef([])
+const rateNetSeries     = vRef([])
 const creditIssueSeries = vRef([])
 const creditMatureSeries= vRef([])
+const creditNetSeries   = vRef([])
 const finIssueSeries    = vRef([])
 const finMatureSeries   = vRef([])
+const finNetSeries      = vRef([])
 
 function formatNum(v) {
   if (typeof v !== 'number') return v ?? '—'
@@ -371,10 +374,13 @@ async function reload() {
     const all = await loadAllSeries()
     rateIssueSeries.value    = all.rateIssue.series
     rateMatureSeries.value   = all.rateMature.series
+    rateNetSeries.value      = all.rateNet.series
     creditIssueSeries.value  = all.creditIssue.series
     creditMatureSeries.value = all.creditMature.series
+    creditNetSeries.value    = all.creditNet.series
     finIssueSeries.value     = all.finIssue.series
     finMatureSeries.value    = all.finMature.series
+    finNetSeries.value       = all.finNet.series
     updatedAt.value = new Date().toISOString().slice(0, 19).replace('T', ' ')
   } finally {
     loading.value = false
@@ -389,25 +395,16 @@ const creditMatureLatest= computed(() => latestOf(creditMatureSeries.value))
 const finIssueLatest    = computed(() => latestOf(finIssueSeries.value))
 const finMatureLatest   = computed(() => latestOf(finMatureSeries.value))
 
-const rateNetLatest   = computed(() => {
-  if (!rateIssueLatest.value || !rateMatureLatest.value) return null
-  return { value: rateIssueLatest.value.value - rateMatureLatest.value.value, date: rateIssueLatest.value.date }
-})
-const creditNetLatest = computed(() => {
-  if (!creditIssueLatest.value || !creditMatureLatest.value) return null
-  return { value: creditIssueLatest.value.value - creditMatureLatest.value.value, date: creditIssueLatest.value.date }
-})
-const finNetLatest    = computed(() => {
-  if (!finIssueLatest.value || !finMatureLatest.value) return null
-  return { value: finIssueLatest.value.value - finMatureLatest.value.value, date: finIssueLatest.value.date }
-})
+const rateNetLatest   = computed(() => latestOf(rateNetSeries.value))
+const creditNetLatest = computed(() => latestOf(creditNetSeries.value))
+const finNetLatest    = computed(() => latestOf(finNetSeries.value))
 
 const kpis = computed(() => ([
-  { label: '利率债发行',  icon: '📤', value: rateIssueLatest.value?.value,   unit: '亿元', date: formatDate(rateIssueLatest.value?.date),   tag: '净融资 ' + (rateNetLatest.value?.value ?? '—'),     sign: true },
+  { label: '利率债发行',  icon: '📤', value: rateIssueLatest.value?.value,   unit: '亿元', date: formatDate(rateIssueLatest.value?.date),   tag: '净融资 ' + fmtYi(rateNetLatest.value?.value),     sign: true },
   { label: '利率债到期',  icon: '📥', value: rateMatureLatest.value?.value,  unit: '亿元', date: formatDate(rateMatureLatest.value?.date),  tag: '到期高峰',                                         sign: true },
-  { label: '信用债发行',  icon: '📤', value: creditIssueLatest.value?.value, unit: '亿元', date: formatDate(creditIssueLatest.value?.date), tag: '净融资 ' + (creditNetLatest.value?.value ?? '—'), sign: true },
+  { label: '信用债发行',  icon: '📤', value: creditIssueLatest.value?.value, unit: '亿元', date: formatDate(creditIssueLatest.value?.date), tag: '净融资 ' + fmtYi(creditNetLatest.value?.value), sign: true },
   { label: '信用债到期',  icon: '📥', value: creditMatureLatest.value?.value, unit: '亿元', date: formatDate(creditMatureLatest.value?.date), tag: '到期高峰',                                       sign: true },
-  { label: '金融债发行',  icon: '📤', value: finIssueLatest.value?.value,    unit: '亿元', date: formatDate(finIssueLatest.value?.date),    tag: '净融资 ' + (finNetLatest.value?.value ?? '—'),   sign: true },
+  { label: '金融债发行',  icon: '📤', value: finIssueLatest.value?.value,    unit: '亿元', date: formatDate(finIssueLatest.value?.date),    tag: '净融资 ' + fmtYi(finNetLatest.value?.value),   sign: true },
   { label: '金融债到期',  icon: '📥', value: finMatureLatest.value?.value,   unit: '亿元', date: formatDate(finMatureLatest.value?.date),   tag: '到期高峰',                                        sign: true },
   { label: '合计发行',    icon: '📊', value: sumLatest([rateIssueLatest, creditIssueLatest, finIssueLatest]),  unit: '亿元', date: formatDate(rateIssueLatest.value?.date),  tag: '三类合计',                                        sign: true },
   { label: '合计净融资',  icon: '💰', value: sumLatest([rateNetLatest, creditNetLatest, finNetLatest]),       unit: '亿元', date: formatDate(rateIssueLatest.value?.date),  tag: '净供给',                                          sign: true },
@@ -451,9 +448,9 @@ function ceilNice(v) {
   return nice * base
 }
 
-const rateOpt   = computed(() => issueMatureNetOption(rateIssueSeries.value,   rateMatureSeries.value,   unifiedAxis.value))
-const creditOpt = computed(() => issueMatureNetOption(creditIssueSeries.value, creditMatureSeries.value, unifiedAxis.value))
-const finOpt    = computed(() => issueMatureNetOption(finIssueSeries.value,    finMatureSeries.value,    unifiedAxis.value))
+const rateOpt   = computed(() => issueMatureNetOption(rateIssueSeries.value,   rateMatureSeries.value,   { ...unifiedAxis.value, net: rateNetSeries.value }))
+const creditOpt = computed(() => issueMatureNetOption(creditIssueSeries.value, creditMatureSeries.value, { ...unifiedAxis.value, net: creditNetSeries.value }))
+const finOpt    = computed(() => issueMatureNetOption(finIssueSeries.value,    finMatureSeries.value,    { ...unifiedAxis.value, net: finNetSeries.value }))
 
 const rateComment = computed(() => {
   if (rateNetLatest.value == null) return '持续观察'

+ 6 - 19
web-app/src/views/fundamental/financing/charts.js

@@ -130,7 +130,10 @@ export function billVsBond10Option(d) {
   return {
     tooltip: { ...tipOpt, trigger: 'axis' },
     legend: {
-      data: ['近1年票据融资额', '票据融资当月值', '10年国债到期收益率'],
+      data: [
+        { name: '近1年票据融资额', itemStyle: { color: '#7A4FCB' } },
+        '10年国债到期收益率',
+      ],
       top: 6, type: 'scroll', textStyle: { color: C.mut, fontSize: 11 }, itemWidth: 14, itemHeight: 8,
     },
     grid: { top: 32, left: 56, right: 56, bottom: 28 },
@@ -142,7 +145,7 @@ export function billVsBond10Option(d) {
       },
       {
         type: 'value', name: '%', position: 'right',
-        min: 0, max: 4,
+        min: 0, max: 5,
         ...axisStyle({ nameTextStyle: { color: C.mut, fontSize: 10 }, nameGap: 14 }),
       },
     ],
@@ -160,22 +163,6 @@ export function billVsBond10Option(d) {
         },
         yAxisIndex: 0,
       },
-      {
-        name: '票据融资当月值', type: 'bar',
-        data: d.bill || [],
-        barWidth: 8,
-        itemStyle: {
-          color: (p) => (p.value >= 0 ? {
-            type: 'linear', x: 0, y: 0, x2: 0, y2: 1,
-            colorStops: [{ offset: 0, color: '#A8B6D8' }, { offset: 1, color: '#6B7A96' }],
-          } : {
-            type: 'linear', x: 0, y: 0, x2: 0, y2: 1,
-            colorStops: [{ offset: 0, color: '#F8B4B4' }, { offset: 1, color: '#E13B3B' }],
-          }),
-          borderRadius: [3, 3, 0, 0],
-        },
-        yAxisIndex: 0,
-      },
       {
         name: '10年国债到期收益率', type: 'line', smooth: true,
         showSymbol: false, symbol: 'circle', symbolSize: 5,
@@ -207,7 +194,7 @@ export function m1VsBond10Option(d) {
       },
       {
         type: 'value', name: '%', position: 'right',
-        min: 0, max: 4,
+        min: 0, max: 5,
         ...axisStyle({ nameTextStyle: { color: C.mut, fontSize: 10 }, nameGap: 14 }),
       },
     ],