|
|
@@ -20,7 +20,8 @@
|
|
|
{{ formatNum(k.value) }}<span class="unit"> {{ k.unit }}</span>
|
|
|
</div>
|
|
|
<div :class="['chg', chgCls(k.value, k.sign)]">
|
|
|
- <span class="arrow">{{ arrow(k.value) }}</span> {{ k.date }} · {{ k.tag }}
|
|
|
+ {{ k.date }}
|
|
|
+ <!-- <span>{{ arrow(k.value) }}</span> {{ k.date }} · {{ k.tag }} -->
|
|
|
</div>
|
|
|
</div>
|
|
|
</section>
|
|
|
@@ -41,12 +42,12 @@
|
|
|
<span class="ic">1.1</span>
|
|
|
<span class="title-text">现价 GDP · 同比 / 累计走势</span>
|
|
|
</div>
|
|
|
- <div class="acts">
|
|
|
+ <!-- <div class="acts">
|
|
|
<div class="pill-group">
|
|
|
<a :class="{ on: nomPill === 'yoy' }" @click="nomPill = 'yoy'">同比</a>
|
|
|
<a :class="{ on: nomPill === 'trend' }" @click="nomPill = 'trend'">趋势线</a>
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ </div> -->
|
|
|
</div>
|
|
|
<div class="card-body">
|
|
|
<Chart :option="gdpNominalOpt" height="300px" />
|
|
|
@@ -68,9 +69,9 @@
|
|
|
<div class="kv"><span class="k">最近观测</span><span class="v">{{ gdpNominalMeta?.data_end || '—' }}</span></div>
|
|
|
<div class="kv"><span class="k">最新读数</span><span class="v strong">{{ formatPct(gdpNominalLatest) }}</span></div>
|
|
|
</div>
|
|
|
- <div class="note">
|
|
|
- 现价 GDP 同比反映名义增长(含价格因素)。近 4 季度呈温和回升态势,{{ gdpNominalComment }}。
|
|
|
- </div>
|
|
|
+<div class="note">
|
|
|
+ 现价 GDP 同比反映名义增长(含价格因素)。{{ gdpNominalTrend }},{{ gdpNominalComment }}。
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -124,7 +125,7 @@
|
|
|
<div class="section-hd">
|
|
|
<span class="dot"></span>
|
|
|
<h2>§1.3 GDP 周度预测 (MM6)</h2>
|
|
|
- <span class="meta">周频 · 自研模型 · MM6 · R² ≈ 0.91</span>
|
|
|
+ <span class="meta">周频 · 自研模型 · MM6 </span>
|
|
|
<span class="meta-spacer"></span>
|
|
|
<span class="meta">最近预测 {{ formatPct(mm6ForecastLatest) }} · {{ formatDate(mm6ForecastMeta?.data_end) }}</span>
|
|
|
</div>
|
|
|
@@ -151,7 +152,7 @@
|
|
|
<div class="name">🔮 MM6 下期预测</div>
|
|
|
<div style="font-size:11px;color:var(--mut);margin-top:3px">基于 22 个高频指标</div>
|
|
|
</div>
|
|
|
- <span class="badge" v-if="mm6R2">R²={{ mm6R2 }}</span>
|
|
|
+ <!-- <span class="badge" v-if="mm6R2">R²={{ mm6R2 }}</span> -->
|
|
|
</div>
|
|
|
<div class="pred">
|
|
|
<span class="v" style="color:var(--ink)">{{ mm6ForecastLatest?.value?.toFixed?.(2) || '—' }}<span style="font-size:13px;color:var(--mut)">%</span></span>
|
|
|
@@ -159,7 +160,7 @@
|
|
|
</div>
|
|
|
<div class="range">
|
|
|
<span>{{ mm6RangeLow?.toFixed?.(2) }}%</span>
|
|
|
- <span>{{ formatDate(mm6ForecastLatest?.date) }} 预测 ± {{ mm6Range?.toFixed?.(2) }}pct</span>
|
|
|
+ <!-- <span>{{ formatDate(mm6ForecastLatest?.date) }} 预测 ± {{ mm6Range?.toFixed?.(2) }}pct</span> -->
|
|
|
<span>{{ mm6RangeHigh?.toFixed?.(2) }}%</span>
|
|
|
</div>
|
|
|
<div class="hrange"><div class="pin" :style="{ left: mm6PinLeft + '%' }"></div></div>
|
|
|
@@ -177,7 +178,7 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <div class="card-grid cols-1" style="margin-top:14px">
|
|
|
+ <!-- <div class="card-grid cols-1" style="margin-top:14px">
|
|
|
<div class="card">
|
|
|
<div class="card-head">
|
|
|
<div class="title">
|
|
|
@@ -192,7 +193,7 @@
|
|
|
<Chart :option="mm6ForecastOpt" height="320px" />
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ </div> -->
|
|
|
</section>
|
|
|
|
|
|
<!-- §1.4 GDP 平减指数 -->
|
|
|
@@ -360,9 +361,9 @@ onMounted(reload)
|
|
|
const kpis = computed(() => ([
|
|
|
{ label: '现价 GDP 同比', icon: '📈', value: gdpNominalLatest.value?.value, unit: '%', date: formatDate(gdpNominalLatest.value?.date), tag: '名义增速', sign: true, forecast: false },
|
|
|
{ label: '不变价 GDP 同比', icon: '📊', value: gdpRealLatest.value?.value, unit: '%', date: formatDate(gdpRealLatest.value?.date), tag: '实际增速', sign: true, forecast: false },
|
|
|
- { label: 'GDP 平减指数', icon: '🧮', value: gdpDeflatorLatest.value?.value, unit: '%', date: formatDate(gdpDeflatorLatest.value?.date), tag: gdpDeflatorLatest.value?.value >= 0 ? '价格因素为正' : '价格因素为负', sign: false, forecast: false },
|
|
|
- { label: 'MM6 周频预测', icon: '🔮', value: mm6ForecastLatest.value?.value, unit: '%', date: formatDate(mm6ForecastLatest.value?.date), tag: '下期预测', sign: true, forecast: true },
|
|
|
+ { label: 'GDP 平减指数', icon: '🧮', value: gdpDeflatorLatest.value?.value, unit: '%', date: formatDate(gdpDeflatorLatest.value?.date), tag: gdpDeflatorLatest.value?.value >= 0 ? '价格因素为正' : '价格因素为负', sign: true, forecast: false },
|
|
|
{ label: 'MM6 实际增速', icon: '🎯', value: mm6ActualLatest.value?.value, unit: '%', date: formatDate(mm6ActualLatest.value?.date), tag: '季度内最新', sign: true, forecast: false },
|
|
|
+ { label: 'MM6 周频预测', icon: '🔮', value: mm6ForecastLatest.value?.value, unit: '%', date: formatDate(mm6ForecastLatest.value?.date), tag: '下期预测', sign: true, forecast: true },
|
|
|
]))
|
|
|
|
|
|
// ===== Charts =====
|
|
|
@@ -411,6 +412,7 @@ const mm6Range = computed(() => {
|
|
|
const lv = l.get(d)
|
|
|
return lv != null ? uv - lv : null
|
|
|
}).filter((x) => x != null)
|
|
|
+
|
|
|
if (!widths.length) return 0.3
|
|
|
return widths[widths.length - 1] / 2
|
|
|
})
|
|
|
@@ -450,6 +452,26 @@ const gdpNominalComment = computed(() => {
|
|
|
if (v >= 0) return '名义增长偏弱'
|
|
|
return '名义增长承压'
|
|
|
})
|
|
|
+
|
|
|
+// 近 4 季度趋势判断:基于 gdpNominalSeries 末 4 个数据点的斜率
|
|
|
+const gdpNominalTrend = computed(() => {
|
|
|
+ const arr = gdpNominalSeries.value
|
|
|
+ if (!arr || arr.length < 2) return '增长动能持续观察'
|
|
|
+ const win = arr.slice(-4).map(x => x[1]).filter(v => typeof v === 'number')
|
|
|
+ if (win.length < 2) return '增长动能持续观察'
|
|
|
+ const first = win[0]
|
|
|
+ const last = win[win.length - 1]
|
|
|
+ const diff = last - first
|
|
|
+ // 绝对阈值 0.3pct,比例阈值 5%
|
|
|
+ const rel = Math.abs(diff) / (Math.abs(first) || 1)
|
|
|
+ if (rel < 0.05 && Math.abs(diff) < 0.3) return '近 4 季度走势平稳'
|
|
|
+ if (diff >= 0) {
|
|
|
+ if (rel >= 0.15 || diff >= 1.0) return '近 4 季度明显回升'
|
|
|
+ return '近 4 季度呈温和回升态势'
|
|
|
+ }
|
|
|
+ if (rel >= 0.15 || diff <= -1.0) return '近 4 季度明显回落'
|
|
|
+ return '近 4 季度呈温和回落态势'
|
|
|
+})
|
|
|
</script>
|
|
|
|
|
|
<style scoped>
|