Просмотр исходного кода

fix(bond): 修正利率利差/量化定价/资金面 mock 与底稿一致性

- R1 rate-spread/sheets.json: 国开/AAA/AA+/AA/AA(2) 锚点对齐 Excel 2026-09-29
- R2 rate-spread/data.js: getTermByBucket(gk) 不再回退 gz,缺失返回 [] 由图表显示'暂无数据'
- R3 rate-spread/data.js: 以 mulberry32+FNV 哈希的 stableNoise 替换 Math.random(),
  末位日 noise=0,保证 KPI 最新值与刷新无关
- R4 quant-pricing/data.js: 补齐情绪历史 2020-01-02~2022-01-14 共 495 条交易日,
  SENTIENT_META.range 更新为 2020-01-02 : 2026-09-18(总量 1663 条)
- R5 funding/data.js: 删除国债净买入伪造的 2026-09=400,序列止于底稿 2026-08=500
ligb 6 дней назад
Родитель
Сommit
4232a0bf76

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

@@ -467,7 +467,7 @@ function mockBondBuy() {
     ['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],
+    ['2026-07-31',  600], ['2026-08-31',  500],
   ]
 }
 

+ 499 - 3
web-app/src/views/bond/quant-pricing/data.js

@@ -3033,14 +3033,14 @@ function build3DHistory() {
 const MOCK_3D_HISTORY = build3DHistory()
 
 // ===== §B-QP.4 债市情绪指标 =====
-// 情绪指数 vs 10Y 国债(Wind:S0059749),日频 2022-01-17 ~ 2026-09-18(1168 个真实配对点)
+// 情绪指数 vs 10Y 国债(Wind:S0059749),日频 2020-01-02 ~ 2026-09-18(1663 个真实配对点)
 // 来源:底稿「3.4-债市量化分析-债市情绪指标」A/B/C 列(情绪指数 + 10Y 配对 = 第 3 列)
 const SENTIENT_META = {
   name: '中债国债到期收益率:10年',
   code: 'S0059749',
   frequency: '日',
   unit: '%',
-  range: '2022-01-17 : 2026-09-18',
+  range: '2020-01-02 : 2026-09-18',
   source: 'Wind · 中债估值中心',
   updatedAt: '2026-09-18',
 }
@@ -4214,11 +4214,507 @@ const SENTIENT_HISTORY_RAW = [
   [44580, '2022-01-19', 0.381, 2.7314],
   [44579, '2022-01-18', 0.350, 2.7415],
   [44578, '2022-01-17', 0.334, 2.7860],
+  // 历史段:2020-01-02 ~ 2022-01-14(495 条交易日)
+  [43832, '2020-01-02', 0.245, 3.1349],
+  [43833, '2020-01-03', 0.243, 3.1339],
+  [43836, '2020-01-06', 0.225, 3.1090],
+  [43837, '2020-01-07', 0.225, 3.1130],
+  [43838, '2020-01-08', 0.231, 3.1298],
+  [43839, '2020-01-09', 0.227, 3.1262],
+  [43840, '2020-01-10', 0.219, 3.1126],
+  [43843, '2020-01-13', 0.22, 3.1276],
+  [43844, '2020-01-14', 0.211, 3.1125],
+  [43845, '2020-01-15', 0.196, 3.0850],
+  [43846, '2020-01-16', 0.192, 3.0820],
+  [43847, '2020-01-17', 0.204, 3.1102],
+  [43850, '2020-01-20', 0.183, 3.0783],
+  [43851, '2020-01-21', 0.175, 3.0674],
+  [43852, '2020-01-22', 0.179, 3.0789],
+  [43853, '2020-01-23', 0.182, 3.0893],
+  [43864, '2020-02-03', 0.094, 2.9142],
+  [43865, '2020-02-04', 0.084, 2.8922],
+  [43866, '2020-02-05', 0.071, 2.8650],
+  [43867, '2020-02-06', 0.087, 2.8992],
+  [43868, '2020-02-07', 0.069, 2.8609],
+  [43871, '2020-02-10', 0.066, 2.8549],
+  [43872, '2020-02-11', 0.078, 2.8801],
+  [43873, '2020-02-12', 0.074, 2.8727],
+  [43874, '2020-02-13', 0.066, 2.8559],
+  [43875, '2020-02-14', 0.075, 2.8749],
+  [43878, '2020-02-17', 0.054, 2.8292],
+  [43879, '2020-02-18', 0.053, 2.8276],
+  [43880, '2020-02-19', 0.062, 2.8474],
+  [43881, '2020-02-20', 0.058, 2.8374],
+  [43882, '2020-02-21', 0.061, 2.8450],
+  [43885, '2020-02-24', 0.045, 2.7868],
+  [43886, '2020-02-25', 0.037, 2.7605],
+  [43887, '2020-02-26', 0.054, 2.7874],
+  [43888, '2020-02-27', 0.049, 2.7697],
+  [43889, '2020-02-28', 0.038, 2.7378],
+  [43892, '2020-03-02', 0.026, 2.6879],
+  [43893, '2020-03-03', 0.021, 2.6672],
+  [43894, '2020-03-04', 0.038, 2.6947],
+  [43895, '2020-03-05', 0.018, 2.6442],
+  [43896, '2020-03-06', 0.025, 2.6508],
+  [43899, '2020-03-09', 0.026, 2.6276],
+  [43900, '2020-03-10', 0.025, 2.6233],
+  [43901, '2020-03-11', 0.032, 2.6357],
+  [43902, '2020-03-12', 0.022, 2.6130],
+  [43903, '2020-03-13', 0.019, 2.6055],
+  [43906, '2020-03-16', 0.033, 2.6295],
+  [43907, '2020-03-17', 0.034, 2.6297],
+  [43908, '2020-03-18', 0.041, 2.6427],
+  [43909, '2020-03-19', 0.045, 2.6493],
+  [43910, '2020-03-20', 0.055, 2.6671],
+  [43913, '2020-03-23', 0.052, 2.6569],
+  [43914, '2020-03-24', 0.054, 2.6484],
+  [43915, '2020-03-25', 0.062, 2.6520],
+  [43916, '2020-03-26', 0.055, 2.6264],
+  [43917, '2020-03-27', 0.076, 2.6589],
+  [43920, '2020-03-30', 0.064, 2.5966],
+  [43921, '2020-03-31', 0.067, 2.5913],
+  [43922, '2020-04-01', 0.082, 2.6103],
+  [43923, '2020-04-02', 0.072, 2.5780],
+  [43924, '2020-04-03', 0.089, 2.6005],
+  [43928, '2020-04-07', 0.085, 2.5440],
+  [43929, '2020-04-08', 0.097, 2.5619],
+  [43930, '2020-04-09', 0.108, 2.5785],
+  [43931, '2020-04-10', 0.109, 2.5744],
+  [43934, '2020-04-13', 0.117, 2.5696],
+  [43935, '2020-04-14', 0.103, 2.5340],
+  [43936, '2020-04-15', 0.118, 2.5589],
+  [43937, '2020-04-16', 0.122, 2.5598],
+  [43938, '2020-04-17', 0.131, 2.5728],
+  [43941, '2020-04-20', 0.135, 2.5607],
+  [43942, '2020-04-21', 0.129, 2.5416],
+  [43943, '2020-04-22', 0.123, 2.5226],
+  [43944, '2020-04-23', 0.145, 2.5605],
+  [43945, '2020-04-24', 0.141, 2.5473],
+  [43948, '2020-04-27', 0.154, 2.5540],
+  [43949, '2020-04-28', 0.144, 2.5247],
+  [43950, '2020-04-29', 0.164, 2.5611],
+  [43951, '2020-04-30', 0.147, 2.5178],
+  [43957, '2020-05-06', 0.17, 2.6112],
+  [43958, '2020-05-07', 0.172, 2.6217],
+  [43959, '2020-05-08', 0.167, 2.6184],
+  [43962, '2020-05-11', 0.177, 2.6606],
+  [43963, '2020-05-12', 0.167, 2.6469],
+  [43964, '2020-05-13', 0.172, 2.6655],
+  [43965, '2020-05-14', 0.172, 2.6730],
+  [43966, '2020-05-15', 0.194, 2.7253],
+  [43969, '2020-05-18', 0.185, 2.6991],
+  [43970, '2020-05-19', 0.2, 2.7272],
+  [43971, '2020-05-20', 0.187, 2.6959],
+  [43972, '2020-05-21', 0.201, 2.7217],
+  [43973, '2020-05-22', 0.194, 2.7051],
+  [43976, '2020-05-25', 0.214, 2.7378],
+  [43977, '2020-05-26', 0.203, 2.7111],
+  [43978, '2020-05-27', 0.209, 2.7267],
+  [43979, '2020-05-28', 0.212, 2.7383],
+  [43980, '2020-05-29', 0.211, 2.7393],
+  [43983, '2020-06-01', 0.206, 2.7416],
+  [43984, '2020-06-02', 0.199, 2.7316],
+  [43985, '2020-06-03', 0.206, 2.7504],
+  [43986, '2020-06-04', 0.218, 2.7797],
+  [43987, '2020-06-05', 0.21, 2.7671],
+  [43990, '2020-06-08', 0.217, 2.7947],
+  [43991, '2020-06-09', 0.213, 2.7901],
+  [43992, '2020-06-10', 0.22, 2.8093],
+  [43993, '2020-06-11', 0.213, 2.7972],
+  [43994, '2020-06-12', 0.22, 2.8169],
+  [43997, '2020-06-15', 0.209, 2.8019],
+  [43998, '2020-06-16', 0.214, 2.8146],
+  [43999, '2020-06-17', 0.211, 2.8117],
+  [44000, '2020-06-18', 0.215, 2.8219],
+  [44001, '2020-06-19', 0.216, 2.8277],
+  [44004, '2020-06-22', 0.228, 2.8608],
+  [44005, '2020-06-23', 0.217, 2.8410],
+  [44006, '2020-06-24', 0.224, 2.8569],
+  [44011, '2020-06-29', 0.224, 2.9093],
+  [44012, '2020-06-30', 0.23, 2.9316],
+  [44013, '2020-07-01', 0.221, 2.9220],
+  [44014, '2020-07-02', 0.232, 2.9559],
+  [44015, '2020-07-03', 0.226, 2.9538],
+  [44018, '2020-07-06', 0.229, 2.9906],
+  [44019, '2020-07-07', 0.24, 3.0222],
+  [44020, '2020-07-08', 0.243, 3.0394],
+  [44021, '2020-07-09', 0.223, 3.0089],
+  [44022, '2020-07-10', 0.242, 3.0429],
+  [44025, '2020-07-13', 0.247, 3.0357],
+  [44026, '2020-07-14', 0.231, 2.9966],
+  [44027, '2020-07-15', 0.23, 2.9905],
+  [44028, '2020-07-16', 0.247, 3.0189],
+  [44029, '2020-07-17', 0.249, 3.0178],
+  [44032, '2020-07-20', 0.232, 2.9673],
+  [44033, '2020-07-21', 0.25, 2.9988],
+  [44034, '2020-07-22', 0.23, 2.9514],
+  [44035, '2020-07-23', 0.248, 2.9844],
+  [44036, '2020-07-24', 0.233, 2.9468],
+  [44039, '2020-07-27', 0.234, 2.9327],
+  [44040, '2020-07-28', 0.253, 2.9680],
+  [44041, '2020-07-29', 0.254, 2.9631],
+  [44042, '2020-07-30', 0.254, 2.9686],
+  [44043, '2020-07-31', 0.23, 2.9225],
+  [44046, '2020-08-03', 0.229, 2.9310],
+  [44047, '2020-08-04', 0.228, 2.9328],
+  [44048, '2020-08-05', 0.237, 2.9560],
+  [44049, '2020-08-06', 0.228, 2.9399],
+  [44050, '2020-08-07', 0.229, 2.9466],
+  [44053, '2020-08-10', 0.217, 2.9323],
+  [44054, '2020-08-11', 0.233, 2.9703],
+  [44055, '2020-08-12', 0.215, 2.9361],
+  [44056, '2020-08-13', 0.229, 2.9695],
+  [44057, '2020-08-14', 0.221, 2.9566],
+  [44060, '2020-08-17', 0.218, 2.9630],
+  [44061, '2020-08-18', 0.205, 2.9387],
+  [44062, '2020-08-19', 0.222, 2.9875],
+  [44063, '2020-08-20', 0.213, 2.9811],
+  [44064, '2020-08-21', 0.197, 2.9598],
+  [44067, '2020-08-24', 0.206, 3.0171],
+  [44068, '2020-08-25', 0.201, 3.0198],
+  [44069, '2020-08-26', 0.204, 3.0384],
+  [44070, '2020-08-27', 0.201, 3.0438],
+  [44071, '2020-08-28', 0.207, 3.0702],
+  [44074, '2020-08-31', 0.18, 3.0519],
+  [44075, '2020-09-01', 0.187, 3.0789],
+  [44076, '2020-09-02', 0.2, 3.1062],
+  [44077, '2020-09-03', 0.194, 3.0947],
+  [44078, '2020-09-04', 0.18, 3.0682],
+  [44081, '2020-09-07', 0.201, 3.1154],
+  [44082, '2020-09-08', 0.202, 3.1182],
+  [44083, '2020-09-09', 0.182, 3.0781],
+  [44084, '2020-09-10', 0.184, 3.0831],
+  [44085, '2020-09-11', 0.196, 3.1098],
+  [44088, '2020-09-14', 0.184, 3.0881],
+  [44089, '2020-09-15', 0.198, 3.1176],
+  [44090, '2020-09-16', 0.196, 3.1160],
+  [44091, '2020-09-17', 0.207, 3.1401],
+  [44092, '2020-09-18', 0.199, 3.1234],
+  [44095, '2020-09-21', 0.191, 3.1103],
+  [44096, '2020-09-22', 0.203, 3.1367],
+  [44097, '2020-09-23', 0.2, 3.1320],
+  [44098, '2020-09-24', 0.192, 3.1168],
+  [44099, '2020-09-25', 0.192, 3.1172],
+  [44102, '2020-09-28', 0.194, 3.1252],
+  [44103, '2020-09-29', 0.199, 3.1372],
+  [44104, '2020-09-30', 0.193, 3.1255],
+  [44113, '2020-10-09', 0.207, 3.1567],
+  [44116, '2020-10-12', 0.2, 3.1407],
+  [44117, '2020-10-13', 0.2, 3.1418],
+  [44118, '2020-10-14', 0.205, 3.1527],
+  [44119, '2020-10-15', 0.209, 3.1610],
+  [44120, '2020-10-16', 0.22, 3.1837],
+  [44123, '2020-10-19', 0.214, 3.1714],
+  [44124, '2020-10-20', 0.208, 3.1586],
+  [44125, '2020-10-21', 0.204, 3.1503],
+  [44126, '2020-10-22', 0.214, 3.1727],
+  [44127, '2020-10-23', 0.202, 3.1470],
+  [44130, '2020-10-26', 0.203, 3.1492],
+  [44131, '2020-10-27', 0.226, 3.1966],
+  [44132, '2020-10-28', 0.22, 3.1850],
+  [44133, '2020-10-29', 0.218, 3.1803],
+  [44134, '2020-10-30', 0.206, 3.1555],
+  [44137, '2020-11-02', 0.203, 3.1862],
+  [44138, '2020-11-03', 0.205, 3.2010],
+  [44139, '2020-11-04', 0.201, 3.2048],
+  [44140, '2020-11-05', 0.209, 3.2343],
+  [44141, '2020-11-06', 0.209, 3.2449],
+  [44144, '2020-11-09', 0.187, 3.2359],
+  [44145, '2020-11-10', 0.2, 3.2753],
+  [44146, '2020-11-11', 0.186, 3.2572],
+  [44147, '2020-11-12', 0.199, 3.2959],
+  [44148, '2020-11-13', 0.199, 3.3080],
+  [44151, '2020-11-16', 0.193, 3.3305],
+  [44152, '2020-11-17', 0.18, 3.3168],
+  [44153, '2020-11-18', 0.176, 3.3203],
+  [44154, '2020-11-19', 0.188, 3.3573],
+  [44155, '2020-11-20', 0.18, 3.3343],
+  [44158, '2020-11-23', 0.19, 3.3365],
+  [44159, '2020-11-24', 0.196, 3.3428],
+  [44160, '2020-11-25', 0.196, 3.3358],
+  [44161, '2020-11-26', 0.188, 3.3126],
+  [44162, '2020-11-27', 0.187, 3.3048],
+  [44165, '2020-11-30', 0.196, 3.3052],
+  [44166, '2020-12-01', 0.188, 3.2815],
+  [44167, '2020-12-02', 0.202, 3.3046],
+  [44168, '2020-12-03', 0.201, 3.2958],
+  [44169, '2020-12-04', 0.191, 3.2698],
+  [44172, '2020-12-07', 0.199, 3.2666],
+  [44173, '2020-12-08', 0.217, 3.2984],
+  [44174, '2020-12-09', 0.202, 3.2605],
+  [44175, '2020-12-10', 0.215, 3.2823],
+  [44176, '2020-12-11', 0.219, 3.2843],
+  [44179, '2020-12-14', 0.218, 3.2638],
+  [44180, '2020-12-15', 0.211, 3.2422],
+  [44181, '2020-12-16', 0.215, 3.2461],
+  [44182, '2020-12-17', 0.219, 3.2480],
+  [44183, '2020-12-18', 0.228, 3.2598],
+  [44186, '2020-12-21', 0.234, 3.2540],
+  [44187, '2020-12-22', 0.213, 3.2054],
+  [44188, '2020-12-23', 0.222, 3.2176],
+  [44189, '2020-12-24', 0.219, 3.2055],
+  [44190, '2020-12-25', 0.222, 3.2037],
+  [44193, '2020-12-28', 0.232, 3.2076],
+  [44194, '2020-12-29', 0.23, 3.1970],
+  [44195, '2020-12-30', 0.239, 3.2095],
+  [44196, '2020-12-31', 0.226, 3.1767],
+  [44200, '2021-01-04', 0.231, 3.1712],
+  [44201, '2021-01-05', 0.242, 3.1901],
+  [44202, '2021-01-06', 0.246, 3.1958],
+  [44203, '2021-01-07', 0.228, 3.1541],
+  [44204, '2021-01-08', 0.24, 3.1749],
+  [44207, '2021-01-11', 0.228, 3.1391],
+  [44208, '2021-01-12', 0.25, 3.1812],
+  [44209, '2021-01-13', 0.235, 3.1467],
+  [44210, '2021-01-14', 0.23, 3.1359],
+  [44211, '2021-01-15', 0.238, 3.1537],
+  [44214, '2021-01-18', 0.239, 3.1588],
+  [44215, '2021-01-19', 0.24, 3.1633],
+  [44216, '2021-01-20', 0.231, 3.1454],
+  [44217, '2021-01-21', 0.247, 3.1806],
+  [44218, '2021-01-22', 0.249, 3.1860],
+  [44221, '2021-01-25', 0.247, 3.1843],
+  [44222, '2021-01-26', 0.254, 3.2004],
+  [44223, '2021-01-27', 0.249, 3.1909],
+  [44224, '2021-01-28', 0.239, 3.1722],
+  [44225, '2021-01-29', 0.25, 3.1963],
+  [44228, '2021-02-01', 0.228, 3.1714],
+  [44229, '2021-02-02', 0.248, 3.2191],
+  [44230, '2021-02-03', 0.229, 3.1885],
+  [44231, '2021-02-04', 0.231, 3.1989],
+  [44232, '2021-02-05', 0.23, 3.2044],
+  [44235, '2021-02-08', 0.233, 3.2311],
+  [44236, '2021-02-09', 0.233, 3.2393],
+  [44237, '2021-02-10', 0.219, 3.2170],
+  [44245, '2021-02-18', 0.217, 3.2715],
+  [44246, '2021-02-19', 0.2, 3.2416],
+  [44249, '2021-02-22', 0.2, 3.2573],
+  [44250, '2021-02-23', 0.21, 3.2768],
+  [44251, '2021-02-24', 0.206, 3.2674],
+  [44252, '2021-02-25', 0.185, 3.2247],
+  [44253, '2021-02-26', 0.185, 3.2236],
+  [44256, '2021-03-01', 0.188, 3.2328],
+  [44257, '2021-03-02', 0.208, 3.2756],
+  [44258, '2021-03-03', 0.206, 3.2722],
+  [44259, '2021-03-04', 0.195, 3.2502],
+  [44260, '2021-03-05', 0.204, 3.2709],
+  [44263, '2021-03-08', 0.213, 3.2748],
+  [44264, '2021-03-09', 0.197, 3.2370],
+  [44265, '2021-03-10', 0.207, 3.2540],
+  [44266, '2021-03-11', 0.209, 3.2544],
+  [44267, '2021-03-12', 0.218, 3.2682],
+  [44270, '2021-03-15', 0.21, 3.2382],
+  [44271, '2021-03-16', 0.221, 3.2547],
+  [44272, '2021-03-17', 0.202, 3.2116],
+  [44273, '2021-03-18', 0.223, 3.2496],
+  [44274, '2021-03-19', 0.203, 3.2050],
+  [44277, '2021-03-22', 0.22, 3.2265],
+  [44278, '2021-03-23', 0.206, 3.1926],
+  [44279, '2021-03-24', 0.219, 3.2142],
+  [44280, '2021-03-25', 0.221, 3.2145],
+  [44281, '2021-03-26', 0.217, 3.2007],
+  [44284, '2021-03-29', 0.214, 3.1809],
+  [44285, '2021-03-30', 0.215, 3.1794],
+  [44286, '2021-03-31', 0.233, 3.2109],
+  [44287, '2021-04-01', 0.22, 3.1802],
+  [44288, '2021-04-02', 0.235, 3.2072],
+  [44292, '2021-04-06', 0.22, 3.1580],
+  [44293, '2021-04-07', 0.243, 3.2015],
+  [44294, '2021-04-08', 0.224, 3.1565],
+  [44295, '2021-04-09', 0.238, 3.1832],
+  [44298, '2021-04-12', 0.24, 3.1732],
+  [44299, '2021-04-13', 0.247, 3.1839],
+  [44300, '2021-04-14', 0.247, 3.1781],
+  [44301, '2021-04-15', 0.235, 3.1491],
+  [44302, '2021-04-16', 0.236, 3.1520],
+  [44305, '2021-04-19', 0.244, 3.1689],
+  [44306, '2021-04-20', 0.255, 3.1925],
+  [44307, '2021-04-21', 0.257, 3.1964],
+  [44308, '2021-04-22', 0.241, 3.1628],
+  [44309, '2021-04-23', 0.244, 3.1707],
+  [44312, '2021-04-26', 0.249, 3.1820],
+  [44313, '2021-04-27', 0.264, 3.2125],
+  [44314, '2021-04-28', 0.248, 3.1792],
+  [44315, '2021-04-29', 0.26, 3.2047],
+  [44316, '2021-04-30', 0.268, 3.2208],
+  [44322, '2021-05-06', 0.27, 3.2034],
+  [44323, '2021-05-07', 0.269, 3.1974],
+  [44326, '2021-05-10', 0.268, 3.1858],
+  [44327, '2021-05-11', 0.276, 3.1961],
+  [44328, '2021-05-12', 0.276, 3.1890],
+  [44329, '2021-05-13', 0.273, 3.1759],
+  [44330, '2021-05-14', 0.262, 3.1460],
+  [44333, '2021-05-17', 0.269, 3.1409],
+  [44334, '2021-05-18', 0.276, 3.1504],
+  [44335, '2021-05-19', 0.28, 3.1523],
+  [44336, '2021-05-20', 0.268, 3.1211],
+  [44337, '2021-05-21', 0.281, 3.1407],
+  [44340, '2021-05-24', 0.274, 3.1066],
+  [44341, '2021-05-25', 0.291, 3.1371],
+  [44342, '2021-05-26', 0.275, 3.0955],
+  [44343, '2021-05-27', 0.275, 3.0905],
+  [44344, '2021-05-28', 0.279, 3.0928],
+  [44347, '2021-05-31', 0.285, 3.0847],
+  [44348, '2021-06-01', 0.295, 3.1068],
+  [44349, '2021-06-02', 0.283, 3.0829],
+  [44350, '2021-06-03', 0.279, 3.0768],
+  [44351, '2021-06-04', 0.298, 3.1168],
+  [44354, '2021-06-07', 0.3, 3.1248],
+  [44355, '2021-06-08', 0.28, 3.0839],
+  [44356, '2021-06-09', 0.286, 3.0924],
+  [44357, '2021-06-10', 0.3, 3.1189],
+  [44358, '2021-06-11', 0.293, 3.1017],
+  [44362, '2021-06-15', 0.307, 3.1203],
+  [44363, '2021-06-16', 0.304, 3.1114],
+  [44364, '2021-06-17', 0.289, 3.0764],
+  [44365, '2021-06-18', 0.296, 3.0900],
+  [44368, '2021-06-21', 0.305, 3.0999],
+  [44369, '2021-06-22', 0.306, 3.0994],
+  [44370, '2021-06-23', 0.305, 3.0940],
+  [44371, '2021-06-24', 0.297, 3.0757],
+  [44372, '2021-06-25', 0.293, 3.0638],
+  [44375, '2021-06-28', 0.31, 3.0903],
+  [44376, '2021-06-29', 0.298, 3.0633],
+  [44377, '2021-06-30', 0.306, 3.0774],
+  [44378, '2021-07-01', 0.316, 3.0911],
+  [44379, '2021-07-02', 0.297, 3.0445],
+  [44382, '2021-07-05', 0.32, 3.0740],
+  [44383, '2021-07-06', 0.312, 3.0508],
+  [44384, '2021-07-07', 0.315, 3.0505],
+  [44385, '2021-07-08', 0.307, 3.0267],
+  [44386, '2021-07-09', 0.312, 3.0300],
+  [44389, '2021-07-12', 0.325, 3.0364],
+  [44390, '2021-07-13', 0.316, 3.0123],
+  [44391, '2021-07-14', 0.327, 3.0218],
+  [44392, '2021-07-15', 0.323, 3.0005],
+  [44393, '2021-07-16', 0.318, 2.9754],
+  [44396, '2021-07-19', 0.321, 2.9429],
+  [44397, '2021-07-20', 0.326, 2.9386],
+  [44398, '2021-07-21', 0.325, 2.9246],
+  [44399, '2021-07-22', 0.328, 2.9171],
+  [44400, '2021-07-23', 0.327, 2.9007],
+  [44403, '2021-07-26', 0.351, 2.9110],
+  [44404, '2021-07-27', 0.339, 2.8736],
+  [44405, '2021-07-28', 0.354, 2.8897],
+  [44406, '2021-07-29', 0.334, 2.8350],
+  [44407, '2021-07-30', 0.354, 2.8644],
+  [44410, '2021-08-02', 0.332, 2.8097],
+  [44411, '2021-08-03', 0.334, 2.8101],
+  [44412, '2021-08-04', 0.345, 2.8298],
+  [44413, '2021-08-05', 0.349, 2.8358],
+  [44414, '2021-08-06', 0.346, 2.8403],
+  [44417, '2021-08-09', 0.342, 2.8623],
+  [44418, '2021-08-10', 0.346, 2.8810],
+  [44419, '2021-08-11', 0.345, 2.8914],
+  [44420, '2021-08-12', 0.324, 2.8565],
+  [44421, '2021-08-13', 0.343, 2.8973],
+  [44424, '2021-08-16', 0.331, 2.8747],
+  [44425, '2021-08-17', 0.33, 2.8719],
+  [44426, '2021-08-18', 0.317, 2.8449],
+  [44427, '2021-08-19', 0.316, 2.8435],
+  [44428, '2021-08-20', 0.33, 2.8738],
+  [44431, '2021-08-23', 0.329, 2.8722],
+  [44432, '2021-08-24', 0.325, 2.8650],
+  [44433, '2021-08-25', 0.331, 2.8788],
+  [44434, '2021-08-26', 0.318, 2.8520],
+  [44435, '2021-08-27', 0.311, 2.8382],
+  [44438, '2021-08-30', 0.32, 2.8604],
+  [44439, '2021-08-31', 0.312, 2.8443],
+  [44440, '2021-09-01', 0.322, 2.8665],
+  [44441, '2021-09-02', 0.313, 2.8484],
+  [44442, '2021-09-03', 0.322, 2.8676],
+  [44445, '2021-09-06', 0.319, 2.8652],
+  [44446, '2021-09-07', 0.321, 2.8702],
+  [44447, '2021-09-08', 0.312, 2.8530],
+  [44448, '2021-09-09', 0.326, 2.8836],
+  [44449, '2021-09-10', 0.318, 2.8666],
+  [44452, '2021-09-13', 0.312, 2.8569],
+  [44453, '2021-09-14', 0.306, 2.8469],
+  [44454, '2021-09-15', 0.319, 2.8742],
+  [44455, '2021-09-16', 0.316, 2.8695],
+  [44456, '2021-09-17', 0.321, 2.8809],
+  [44459, '2021-09-20', 0.31, 2.8646],
+  [44463, '2021-09-24', 0.3, 2.8530],
+  [44466, '2021-09-27', 0.306, 2.8720],
+  [44467, '2021-09-28', 0.322, 2.9081],
+  [44468, '2021-09-29', 0.317, 2.8998],
+  [44469, '2021-09-30', 0.309, 2.8898],
+  [44477, '2021-10-08', 0.294, 2.9217],
+  [44480, '2021-10-11', 0.312, 2.9826],
+  [44481, '2021-10-12', 0.302, 2.9622],
+  [44482, '2021-10-13', 0.301, 2.9609],
+  [44483, '2021-10-14', 0.314, 2.9908],
+  [44484, '2021-10-15', 0.298, 2.9580],
+  [44487, '2021-10-18', 0.296, 2.9598],
+  [44488, '2021-10-19', 0.289, 2.9463],
+  [44489, '2021-10-20', 0.291, 2.9529],
+  [44490, '2021-10-21', 0.305, 2.9831],
+  [44491, '2021-10-22', 0.31, 2.9953],
+  [44494, '2021-10-25', 0.302, 2.9823],
+  [44495, '2021-10-26', 0.303, 2.9861],
+  [44496, '2021-10-27', 0.303, 2.9881],
+  [44497, '2021-10-28', 0.307, 2.9974],
+  [44498, '2021-10-29', 0.288, 2.9602],
+  [44501, '2021-11-01', 0.298, 2.9665],
+  [44502, '2021-11-02', 0.31, 2.9853],
+  [44503, '2021-11-03', 0.295, 2.9491],
+  [44504, '2021-11-04', 0.302, 2.9576],
+  [44505, '2021-11-05', 0.31, 2.9690],
+  [44508, '2021-11-08', 0.313, 2.9605],
+  [44509, '2021-11-09', 0.307, 2.9436],
+  [44510, '2021-11-10', 0.305, 2.9335],
+  [44511, '2021-11-11', 0.31, 2.9375],
+  [44512, '2021-11-12', 0.311, 2.9358],
+  [44515, '2021-11-15', 0.317, 2.9319],
+  [44516, '2021-11-16', 0.323, 2.9373],
+  [44517, '2021-11-17', 0.318, 2.9186],
+  [44518, '2021-11-18', 0.31, 2.8947],
+  [44519, '2021-11-19', 0.319, 2.9068],
+  [44522, '2021-11-22', 0.315, 2.8744],
+  [44523, '2021-11-23', 0.321, 2.8789],
+  [44524, '2021-11-24', 0.331, 2.8924],
+  [44525, '2021-11-25', 0.321, 2.8649],
+  [44526, '2021-11-26', 0.314, 2.8421],
+  [44529, '2021-11-29', 0.318, 2.8284],
+  [44530, '2021-11-30', 0.34, 2.8649],
+  [44531, '2021-12-01', 0.327, 2.8381],
+  [44532, '2021-12-02', 0.343, 2.8703],
+  [44533, '2021-12-03', 0.345, 2.8724],
+  [44536, '2021-12-06', 0.334, 2.8460],
+  [44537, '2021-12-07', 0.341, 2.8590],
+  [44538, '2021-12-08', 0.328, 2.8308],
+  [44539, '2021-12-09', 0.343, 2.8603],
+  [44540, '2021-12-10', 0.34, 2.8485],
+  [44543, '2021-12-13', 0.338, 2.8263],
+  [44544, '2021-12-14', 0.357, 2.8592],
+  [44545, '2021-12-15', 0.34, 2.8188],
+  [44546, '2021-12-16', 0.347, 2.8273],
+  [44547, '2021-12-17', 0.338, 2.8022],
+  [44550, '2021-12-20', 0.341, 2.7903],
+  [44551, '2021-12-21', 0.357, 2.8177],
+  [44552, '2021-12-22', 0.346, 2.7884],
+  [44553, '2021-12-23', 0.354, 2.8001],
+  [44554, '2021-12-24', 0.366, 2.8199],
+  [44557, '2021-12-27', 0.352, 2.7715],
+  [44558, '2021-12-28', 0.356, 2.7753],
+  [44559, '2021-12-29', 0.36, 2.7759],
+  [44560, '2021-12-30', 0.37, 2.7916],
+  [44561, '2021-12-31', 0.37, 2.7861],
+  [44564, '2022-01-03', 0.354, 2.7623],
+  [44565, '2022-01-04', 0.354, 2.7651],
+  [44566, '2022-01-05', 0.365, 2.7933],
+  [44567, '2022-01-06', 0.363, 2.7908],
+  [44568, '2022-01-07', 0.357, 2.7835],
+  [44571, '2022-01-10', 0.351, 2.7806],
+  [44572, '2022-01-11', 0.35, 2.7787],
+  [44573, '2022-01-12', 0.35, 2.7794],
+  [44574, '2022-01-13', 0.362, 2.8062],
+  [44575, '2022-01-14', 0.357, 2.7953],
 ]
 
 
 function buildSentientHistory() {
-  // 真实 1168 个配对日数据,按日期升序直传(无 sine / 随机回放)
+  // 真实 1663 个配对日数据,按日期升序直传(无 sine / 随机回放)
   // 底稿原始顺序为降序(最新在前),反转后得到升序(最早在前)
   return SENTIENT_HISTORY_RAW.slice().reverse().map(r => ({ date: r[1], idx: r[0], value: r[2], y10: r[3] }))
 }

+ 41 - 15
web-app/src/views/bond/rate-spread/data.js

@@ -158,9 +158,28 @@ function buildDates(baseSerial, n) {
 
 const MOCK_DATES = buildDates(46294, DAYS)
 
-// 工具:在给定基础值上叠加周期扰动 + 随机噪声
-function jitter(base, amp = 0.05) {
-  return +(base + (Math.random() - 0.5) * 2 * amp).toFixed(4)
+// ===== 确定性伪随机(mulberry32)=====
+// 模块级 seed,保证 KPI / 图表数据跨刷新一致
+function mulberry32(seed) {
+  let a = seed >>> 0
+  return function () {
+    a = (a + 0x6D2B79F5) >>> 0
+    let t = a
+    t = Math.imul(t ^ (t >>> 15), t | 1)
+    t ^= t + Math.imul(t ^ (t >>> 7), t | 61)
+    return ((t ^ (t >>> 14)) >>> 0) / 4294967296
+  }
+}
+// 基于 (品种键, 期限, i) 的稳定噪声,无 Math.random()
+function stableNoise(kind, bucket, i, amp) {
+  let h = 2166136261 >>> 0
+  const s = `${kind}|${bucket}|${i}`
+  for (let k = 0; k < s.length; k++) {
+    h ^= s.charCodeAt(k)
+    h = Math.imul(h, 16777619)
+  }
+  const r = mulberry32(h)() // [0,1)
+  return (r - 0.5) * 2 * amp
 }
 
 // === 收益率曲线 mock ===
@@ -186,7 +205,7 @@ function mockRateYields() {
     return out
   }
 
-  function makeSeries(spread) {
+  function makeSeries(spread, kindKey) {
     const arr = []
     for (let i = 0; i < MOCK_DATES.length; i++) {
       const level = levelAt(i)
@@ -194,7 +213,9 @@ function mockRateYields() {
       buckets.forEach((b) => {
         const base = level[b] + (spread?.[b] ?? 0)
         const amp = b === '30Y' ? 0.04 : b === '10Y' ? 0.03 : 0.025
-        obj[b] = jitter(base, amp)
+        // 锚点日(i=最后)强制等于 base → KPI 数值与刷新无关
+        const noise = i === MOCK_DATES.length - 1 ? 0 : stableNoise(kindKey, b, i, amp)
+        obj[b] = +(base + noise).toFixed(4)
       })
       arr.push(obj)
     }
@@ -202,7 +223,7 @@ function mockRateYields() {
   }
 
   // 相对国债的期限利差(bp → %,)
-  const gz = makeSeries({ '6M': 0, '1Y': 0, '3Y': 0, '5Y': 0, '7Y': 0, '10Y': 0, '30Y': 0 })
+  const gz = makeSeries({ '6M': 0, '1Y': 0, '3Y': 0, '5Y': 0, '7Y': 0, '10Y': 0, '30Y': 0 }, 'gz')
   const gk = makeSeries({
     '6M':  sheet.anchors.gk['6M']  - sheet.anchors.gz['6M'],
     '1Y':  sheet.anchors.gk['1Y']  - sheet.anchors.gz['1Y'],
@@ -211,7 +232,7 @@ function mockRateYields() {
     '7Y':  sheet.anchors.gk['7Y']  - sheet.anchors.gz['7Y'],
     '10Y': sheet.anchors.gk['10Y'] - sheet.anchors.gz['10Y'],
     '30Y': sheet.anchors.gk['30Y'] - sheet.anchors.gz['30Y'],
-  })
+  }, 'gk')
   const aaa = makeSeries({
     '6M':  sheet.anchors.aaa['6M']  - sheet.anchors.gz['6M'],
     '1Y':  sheet.anchors.aaa['1Y']  - sheet.anchors.gz['1Y'],
@@ -220,7 +241,7 @@ function mockRateYields() {
     '7Y':  sheet.anchors.aaa['7Y']  - sheet.anchors.gz['7Y'],
     '10Y': sheet.anchors.aaa['10Y'] - sheet.anchors.gz['10Y'],
     '30Y': sheet.anchors.aaa['30Y'] - sheet.anchors.gz['30Y'],
-  })
+  }, 'aaa')
   const aaP = makeSeries({
     '6M':  sheet.anchors.aaP['6M']  - sheet.anchors.gz['6M'],
     '1Y':  sheet.anchors.aaP['1Y']  - sheet.anchors.gz['1Y'],
@@ -229,7 +250,7 @@ function mockRateYields() {
     '7Y':  sheet.anchors.aaP['7Y']  - sheet.anchors.gz['7Y'],
     '10Y': sheet.anchors.aaP['10Y'] - sheet.anchors.gz['10Y'],
     '30Y': sheet.anchors.aaP['30Y'] - sheet.anchors.gz['30Y'],
-  })
+  }, 'aaP')
   const aa = makeSeries({
     '6M':  sheet.anchors.aa['6M']  - sheet.anchors.gz['6M'],
     '1Y':  sheet.anchors.aa['1Y']  - sheet.anchors.gz['1Y'],
@@ -238,7 +259,7 @@ function mockRateYields() {
     '7Y':  sheet.anchors.aa['7Y']  - sheet.anchors.gz['7Y'],
     '10Y': sheet.anchors.aa['10Y'] - sheet.anchors.gz['10Y'],
     '30Y': sheet.anchors.aa['30Y'] - sheet.anchors.gz['30Y'],
-  })
+  }, 'aa')
   const aa2 = makeSeries({
     '6M':  sheet.anchors.aa2['6M']  - sheet.anchors.gz['6M'],
     '1Y':  sheet.anchors.aa2['1Y']  - sheet.anchors.gz['1Y'],
@@ -247,7 +268,7 @@ function mockRateYields() {
     '7Y':  sheet.anchors.aa2['7Y']  - sheet.anchors.gz['7Y'],
     '10Y': sheet.anchors.aa2['10Y'] - sheet.anchors.gz['10Y'],
     '30Y': sheet.anchors.aa2['30Y'] - sheet.anchors.gz['30Y'],
-  })
+  }, 'aa2')
 
   function packRows(rows) {
     return rows.map((r, i) => {
@@ -292,7 +313,9 @@ function mockCreditSpreads() {
       const sh = shiftAt(i)
       const obj = { date: MOCK_DATES[i] }
       buckets.forEach((b) => {
-        const v = base[rating][b] + sh + (Math.random() - 0.5) * 0.02
+        const isLast = i === MOCK_DATES.length - 1
+        const noise = isLast ? 0 : stableNoise('spread', `${rating}|${b}`, i, 0.02)
+        const v = base[rating][b] + sh + noise
         obj[b] = +Math.max(0.03, v).toFixed(4)
       })
       arr.push(obj)
@@ -332,7 +355,9 @@ function mockTermSpreads() {
       const sh = shiftAt(i)
       const obj = { date: MOCK_DATES[i] }
       buckets.forEach((b) => {
-        const v = anchors[k][b] + sh + (Math.random() - 0.5) * 0.03
+        const isLast = i === MOCK_DATES.length - 1
+        const noise = isLast ? 0 : stableNoise('term', `${k}|${b}`, i, 0.03)
+        const v = anchors[k][b] + sh + noise
         obj[b] = +v.toFixed(4)
       })
       arr.push(obj)
@@ -402,8 +427,9 @@ export function getSpreadByBucket(bucket) {
 
 export function getTermByBucket(kind, bucket) {
   // kind: 'gz' | 'gk' | 'aaa' | 'aaP' | 'aa' | 'aa2'
-  return rowsToSeriesByBucket(mock[kind === 'gz' ? 'termGZ3' : kind === 'aa' ? 'termAA3' : (kind === 'gk' ? 'gz' : kind)].rows, bucket)
-  // Note: term mock uses keys gz/gk/aaa/aaP/aa/aa2
+  // 直接从 MOCK_TERMS.series 取对应序列;无数据返回 [](图表显示"暂无数据")
+  const rows = MOCK_TERMS.series?.[kind] || []
+  return rowsToSeriesByBucket(rows, bucket)
 }
 
 export function getAllTermSpreads() {

+ 5 - 5
web-app/src/views/bond/rate-spread/sheets.json

@@ -8,11 +8,11 @@
       "desc": "国债 / 国开 / AAA/AA+/AA/AA(2) 到期收益率 × 6M/1Y/3Y/5Y/7Y/10Y/30Y",
       "anchors": {
         "gz":  { "6M": 1.20,  "1Y": 1.22,  "3Y": 1.28,  "5Y": 1.39,  "7Y": 1.50,  "10Y": 1.667, "30Y": 2.07 },
-        "gk":  { "6M": 1.26,  "1Y": 1.30,  "3Y": 1.38,  "5Y": 1.51,  "7Y": 1.66,  "10Y": 1.867, "30Y": 2.42 },
-        "aaa": { "6M": 1.33,  "1Y": 1.37,  "3Y": 1.4676,"5Y": 1.63,  "7Y": 1.78,  "10Y": 2.007, "30Y": 2.55 },
-        "aaP": { "6M": 1.36,  "1Y": 1.40,  "3Y": 1.51,  "5Y": 1.69,  "7Y": 1.86,  "10Y": 2.097, "30Y": 2.65 },
-        "aa":  { "6M": 1.395, "1Y": 1.44,  "3Y": 1.58,  "5Y": 1.81,  "7Y": 1.99,  "10Y": 2.267, "30Y": 2.79 },
-        "aa2": { "6M": 1.445, "1Y": 1.49,  "3Y": 1.66,  "5Y": 1.94,  "7Y": 2.16,  "10Y": 2.517, "30Y": 3.02 }
+        "gk":  { "6M": 1.3125,"1Y": 1.3778,"3Y": 1.4352,"5Y": 1.502, "7Y": 1.6398,"10Y": 1.7408,"30Y": 2.1837 },
+        "aaa": { "6M": 1.4848,"1Y": 1.5,   "3Y": 1.6228,"5Y": 1.6855,"7Y": 1.7878,"10Y": 1.9511 },
+        "aaP": { "6M": 1.5048,"1Y": 1.53,  "3Y": 1.6628,"5Y": 1.7355,"7Y": 1.8778,"10Y": 2.1111 },
+        "aa":  { "6M": 1.5148,"1Y": 1.55,  "3Y": 1.7028,"5Y": 1.8155,"7Y": 2.0178,"10Y": 2.3711 },
+        "aa2": { "6M": 1.5531,"1Y": 1.5621,"3Y": 1.6965,"5Y": 1.8176,"7Y": 2.1601,"10Y": 2.5    }
       },
       "events": [
         { "offset":     0, "curve": { "6M": 0.00, "1Y": 0.00, "3Y": 0.00, "5Y": 0.00, "7Y": 0.00, "10Y": 0.00,  "30Y": 0.00 } },