<!
DOCT YPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>A股短线情绪量化系统 V2 · 情绪温度计算器</title>
<style>
:root {
--kimi-font-sans: -apple-system, "PingFang SC", "Microsoft YaHei", "Segoe UI", sans-serif;
--kimi-color-text-primary: #1a1a1a;
--kimi-color-text-secondary: #555555;
--kimi-color-text-tertiary: #8a8a8a;
--kimi-color-text-quaternary: #b0b0b0;
--kimi-color-border: rgba(0,0,0,.12);
--kimi-chart-1: #2f6bff;
--kimi-chart-2: #e5484d;
--kimi-chart-3: #30a46c;
--kimi-color-danger: #e5484d;
--kimi-color-warning: #f5a524;
--kimi-color-positive: #30a46c;
}
* { box-sizing: border-box; }
body { font-family: var(--kimi-font-sans); color: var(--kimi-color-text-primary); background: #fafafa; margin: 0; padding: 16px; }
.wrap { max-width: 640px; margin: 0 auto; }
.wq-num { font-variant-numeric: tabular-nums; font-feature-settings: "tnum" 1; }
.wq-card { border: 1px solid var(--kimi-color-border); border-radius: 12px; padding: 16px; margin-bottom: 16px; background: #fff; }
.wq-title { font-size: 17px; font-weight: 600; margin: 0 0 4px; }
.wq-sub { font-size: 12px; color: var(--kimi-color-text-tertiary); margin: 0 0 12px; line-height: 1.5; }
.wq-metrics { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
.wq-metric { border: 1px solid var(--kimi-color-border); border-radius: 10px; padding: 10px 12px; }
.wq-metric .k { font-size: 12px; color: var(--kimi-color-text-tertiary); }
.wq-metric .v { font-size: 22px; font-weight: 600; margin-top: 2px; }
.wq-metric .d { font-size: 12px; margin-top: 2px; }
.up { color: var(--kimi-color-danger); }
.dn { color: var(--kimi-color-positive); }
.wq-ladder-row { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.wq-ladder-row .lv { width: 44px; font-size: 13px; font-weight: 600; text-align: right; }
.wq-ladder-row .bar { height: 22px; border-radius: 6px; background: rgba(0,0,0,.06); flex: 1; }
.wq-ladder-row .fill { height: 100%; border-radius: 6px; display: flex; align-items: center; padding-left: 8px; font-size: 11px; color: #fff; white-space: nowrap; overflow: hidden; }
.wq-ladder-row .gap { height: 4px; border-radius: 4px; border: 1px dashed var(--kimi-color-text-quaternary); flex: 1; }
.wq-ladder-row .nm { font-size: 12px; color: var(--kimi-color-text-secondary); white-space: nowrap; }
.wq-seg-row { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.wq-seg-row .lv { width: 62px; font-size: 12px; text-align: right; }
.wq-seg-row .bar { height: 18px; border-radius: 6px; background: rgba(0,0,0,.06); flex: 1; }
.wq-seg-row .fill { height: 100%; border-radius: 6px; }
.wq-seg-row .pc { width: 52px; font-size: 13px; font-weight: 600; }
.wq-tag { font-size: 11px; padding: 1px 6px; border-radius: 4px; margin-left: 4px; }
.wq-slider-row { display: grid; grid-template-columns: 110px 1fr 48px; align-items: center; gap: 10px; margin-bottom: 10px; }
.wq-slider-row label { font-size: 13px; }
.wq-slider-row output { font-size: 14px; font-weight: 600; text-align: right; }
.wq-slider-row input[type=range] { width: 100%; accent-color: #1a1a1a; }
.wq-chip { display: inline-block; font-size: 12px; padding: 3px 10px; border-radius: 999px; font-weight: 600; margin: 0 6px 6px 0; }
@media (max-width: 480px) { .wq-metrics { grid-template-columns: repeat(2, 1fr); } }
</style>
</head>
<body>
<div class="wrap">
<div class="wq-card" style="background:#1a1a1a; color:#fff; border:none;">
<div class="wq-title">A股短线情绪量化系统 V2</div>
<div class="wq-sub" style="color:rgba(255,255,255,.6);">每日收盘后:把
同花顺/东财/连板网的六项数据拖入计算器 → 读出情绪温度 → 按阶段表执行仓位。数据截至 2026-10-08。</div>
</div>
<div class="wq-card">
<p class="wq-title">收盘核心指标</p>
<p class="wq-sub">红=较上一交易日恶化,绿=改善(财联社口径,不含ST/退市)</p>
<div class="wq-metrics">
<div class="wq-metric"><div class="k">涨停家数</div><div class="v wq-num">43</div><div class="d up">↓ 52→43</div></div>
<div class="wq-metric"><div class="k">封板率</div><div class="v wq-num">57%</div><div class="d up">↓ 81.2%,炸板32家</div></div>
<div class="wq-metric"><div class="k">首板晋级率</div><div class="v wq-num">7.5%</div><div class="d up">↓ 21.4%,低位冰点</div></div>
<div class="wq-metric"><div class="k">连板晋级率</div><div class="v wq-num">58.3%</div><div class="d dn">↑ 高位抱团强化</div></div>
<div class="wq-metric"><div class="k">连板家数</div><div class="v wq-num">10</div><div class="d up">↓ 12→10</div></div>
<div class="wq-metric"><div class="k">最高板</div><div class="v wq-num">8板</div><div class="d dn">↑
新华传媒一字</div></div>
</div>
</div>
<div class="wq-card">
<p class="wq-title">连板天梯 · 10月8日真实结构</p>
<p class="wq-sub">8板与4板之间断层3级 = 高标孤立结构;新华传媒一字封单65.7亿(并购重组+地产)</p>
<div id="wq-ladder"></div>
<p class="wq-sub" style="margin-top:8px;">断板伤痛榜:
襄阳轴承(4进5) -5.04% ·
均瑶健康(2进3) -6.22% ·
亚邦股份(2进3) -6.67% ·
深物业A(3进4) -0.98%</p>
</div>
<div class="wq-card">
<p class="wq-title">分段晋级率(双轨制)</p>
<p class="wq-sub">一进二崩、高位抱团 = 背离结构;三进四/四进五为历史高危区</p>
<div id="wq-seg"></div>
</div>
<div class="wq-card">
<p class="wq-title">情绪温度计算器(拖动滑块)</p>
<p class="wq-sub">晋级率分连板/首板双口径;封板率权重25%。数据来源:同花顺问财「涨停聚焦」页 + 财联社收盘快讯</p>
<div class="wq-slider-row"><label>涨停家数</label><input type="range" id="s-zt" min="0" max="120" value="43"><output class="wq-num" id="o-zt">43</output></div>
<div class="wq-slider-row"><label>连板家数</label><input type="range" id="s-lb" min="0" max="30" value="10"><output class="wq-num" id="o-lb">10</output></div>
<div class="wq-slider-row"><label>最高板数</label><input type="range" id="s-gd" min="1" max="12" value="8"><output class="wq-num" id="o-gd">8</output></div>
<div class="wq-slider-row"><label>封板率 %</label><input type="range" id="s-fb" min="40" max="100" value="57"><output class="wq-num" id="o-fb">57</output></div>
<div class="wq-slider-row"><label>连板晋级率 %</label><input type="range" id="s-ljj" min="0" max="100" value="58"><output class="wq-num" id="o-ljj">58</output></div>
<div class="wq-slider-row"><label>首板晋级率 %</label><input type="range" id="s-sjj" min="0" max="60" value="7"><output class="wq-num" id="o-sjj">7</output></div>
<div class="wq-slider-row"><label>跌停家数</label><input type="range" id="s-dt" min="0" max="40" value="13"><output class="wq-num" id="o-dt">13</output></div>
<div id="wq-warn" style="margin: 4px 0 8px;"></div>
<div style="display:flex; gap:16px; align-items:center; flex-wrap: wrap;">
<svg viewBox="0 0 200 118" width="180" height="106">
<path d="M 20 100 A 80 80 0 0 1 180 100" fill="none" stroke="rgba(0,0,0,.1)" stroke-width="12" stroke-linecap="round"/>
<path id="wq-arc" d="M 20 100 A 80 80 0 0 1 180 100" fill="none" stroke="var(--kimi-chart-1)" stroke-width="12" stroke-linecap="round" stroke-dasharray="251.4" stroke-dashoffset="251.4"/>
<text id="wq-temp" x="100" y="88" text-anchor="middle" font-size="34" font-weight="600" class="wq-num">57</text>
<text x="100" y="108" text-anchor="middle" font-size="11" fill="var(--kimi-color-text-tertiary)">情绪温度 V2</text>
</svg>
<div style="flex:1; min-width:220px;">
<div style="margin-bottom:8px;"><span class="wq-chip" id="wq-stage" style="background: rgba(47,107,255,.12); color: var(--kimi-chart-1);">分化期</span></div>
<div style="font-size:13px; margin-bottom:4px;">建议仓位:<b class="wq-num" id="wq-pos">20–30%</b></div>
<div style="font-size:12px; color: var(--kimi-color-text-tertiary); line-height:1.5;" id="wq-tip"></div>
</div>
</div>
</div>
<div class="wq-card">
<p class="wq-title">阶段速查表</p>
<div class="wq-sub" style="font-size:13px; line-height:2; margin:0;">
<b><40</b> 冰点/退潮 → 0%空仓 ·
<b>40–55</b> 回暖试探 → 10–20% ·
<b>55–70</b> 分化发酵 → 20–30% ·
<b>70–85</b> 主升/高潮 → 40–70% ·
<b>>85</b> 亢奋 → 减仓锁盈
</div>
</div>
</div>
<script>
(function(){
var stages = [
{ max: 40, name: "冰点 / 退潮", pos: "0%(空仓)", tip: "跌停遍地、连板稀缺,不抄底不接力,等待最强个股出现。", color: "var(--kimi-color-danger)", bg: "rgba(229,72,77,.12)" },
{ max: 55, name: "回暖试探期", pos: "10–20%", tip: "轻仓试错新题材首板/二板,聚焦逆势抗跌标的,快进快出。", color: "#e5484d", bg: "rgba(229,72,77,.12)" },
{ max: 70, name: "分化发酵期", pos: "20–30%", tip: "总分尚可但结构分化:高位锁龙、低位主线首板小仓试错、3–5板中位接力坚决回避。", color: "var(--kimi-chart-1)", bg: "rgba(47,107,255,.12)" },
{ max: 85, name: "主升 / 高潮期", pos: "40–70%", tip: "坚定锁仓主线龙头,缩量加速分批止盈;只锁龙头,不锁跟风。", color: "var(--kimi-chart-3)", bg: "rgba(48,164,108,.12)" },
{ max: 101, name: "亢奋一致期", pos: "减仓锁盈", tip: "涨停>80家、封单占流通市值3%+,一致即见顶,卖在一致。", color: "var(--kimi-color-warning)", bg: "rgba(245,165,36,.15)" }
];
var ladder = [
{ lv: "8板", n: 1, names: "新华传媒(一字·封单65.7亿)", c: "var(--kimi-chart-2)" },
{ lv: "7板", gap: true },
{ lv: "6板", gap: true },
{ lv: "5板", gap: true },
{ lv: "4板", n: 2, names: "
九阳股份 ·
时代万恒", c: "var(--kimi-chart-1)" },
{ lv: "3板", n: 4, names: "
园林股份 ·
紫竹高科 ·
传艺科技 ·
上海洗霸", c: "var(--kimi-chart-1)" },
{ lv: "2板", n: 3, names: "
陆家嘴 ·
兴业股份 ·
龙蟠科技", c: "var(--kimi-chart-1)" },
{ lv: "首板", n: 32, names: "
东北制药 ·
联环药业 ·
中远海能 ·
雄韬股份 …", c: "var(--kimi-color-text-quaternary)" }
];
var ladderEl = getElementById("wq-ladder");
ladder.forEach(function(r){
var row = createElement("div"); row.className = "wq-ladder-row";
if (r.gap) {
row.innerHTML = ‘<div class="lv">‘ + r.lv + ‘</div><div class="gap"></div><div class="nm">断层</div>‘;
} else {
var w = Math.max(r.n / 32 * 100, 6);
row.innerHTML = ‘<div class="lv">‘ + r.lv + ‘</div>‘ +
‘<div class="bar"><div class="fill" style="width:‘ + w + ‘%;background:‘ + r.c + ‘;">‘ + r.n + ‘ 家</div></div>‘ +
‘<div class="nm">‘ + r.names + ‘</div>‘;
}
ladderEl.appendChild(row);
});
var segs = [
{ lv: "一进二", n: 3, d: 40, tag: "低位冰点", danger: true },
{ lv: "二进三", n: 4, d: 6, tag: "", danger: false },
{ lv: "三进四", n: 2, d: 4, tag: "高危区", danger: true },
{ lv: "四进五", n: 0, d: 1, tag: "高危区", danger: true },
{ lv: "七进八", n: 1, d: 1, tag: "高标抱团", danger: false }
];
var segEl = getElementById("wq-seg");
segs.forEach(function(r){
var pc = r.d > 0 ? Math.round(r.n / r.d * 1000) / 10 : 0;
var row = createElement("div"); row.className = "wq-seg-row";
row.innerHTML = ‘<div class="lv">‘ + r.lv + ‘</div>‘ +
‘<div class="bar"><div class="fill" style="width:‘ + Math.max(pc, 2) + ‘%;background:‘ + (r.danger ? "var(--kimi-chart-2)" : "var(--kimi-chart-1)") + ‘;"></div></div>‘ +
‘<div class="pc wq-num">‘ + pc + ‘%</div>‘ +
(r.tag ? ‘<span class="wq-tag" style="background: rgba(229,72,77,.15); color: var(--kimi-chart-2);">‘ + r.tag + ‘</span>‘ : ‘‘);
segEl.appendChild(row);
});
function clamp(x){ return Math.max(0, Math.min(100, x)); }
function score(v){
var s1 = clamp(v.zt / 80 * 100) * 0.15;
var s2 = clamp(v.lb / 12 * 100) * 0.10;
var s3 = (v.gd >= 7 ? 100 : v.gd >= 5 ? 85 : v.gd >= 4 ? 70 : v.gd >= 3 ? 50 : v.gd >= 2 ? 30 : 10) * 0.15;
var s4 = clamp((v.fb - 50) / 40 * 100) * 0.25;
var jr = 0.5 * v.ljj + 0.5 * v.sjj;
var s5 = clamp((jr - 10) / 30 * 100) * 0.20;
var s6 = clamp((20 - v.dt) / 18 * 100) * 0.15;
return s1 + s2 + s3 + s4 + s5 + s6;
}
var ids = ["zt","lb","gd","fb","ljj","sjj","dt"];
function update(){
var v = {};
ids.forEach(function(k){
v[k] = parseInt(getElementById("s-"+k).value, 10);
getElementById("o-"+k).textContent = v[k];
});
var t = Math.round(score(v));
getElementById("wq-temp").textContent = t;
getElementById("wq-arc").setAttribute("stroke-dashoffset", (251.4 * (1 - t/100)).toFixed(1));
var st = stages.find(function(s){ return t < s.max; });
var chip = getElementById("wq-stage");
chip.textContent = st.name;
chip.style.background = st.bg;
chip.style.color = st.color;
getElementById("wq-pos").textContent = st.pos;
getElementById("wq-tip").textContent = st.tip;
var warns = [];
if (v.sjj < 10) warns.push("低位冰点:首板晋级率<10%");
if (v.fb < 60) warns.push("炸板高危:封板率<60%");
if (v.gd >= 6 && v.ljj > 50) warns.push("梯队断层:高标孤立+高位抱团");
if (v.dt > 10) warns.push("亏钱效应扩散:跌停>10家");
getElementById("wq-warn").innerHTML = warns.map(function(w){
return ‘<span class="wq-chip" style="background: rgba(245,165,36,.15); color: var(--kimi-color-warning);">⚠ ‘ + w + ‘</span>‘;
}).join("");
}
ids.forEach(function(k){ getElementById("s-"+k).addEventListener("input", update); });
update();
})();
</script>
</body>
</html>