市场情绪周期全景解析:从集体风险偏好到可量化算法

情绪不是感觉,是资金集体的风险偏好。本文把它拆成可观测、可量化、可执行的系统。


前言:为什么你需要一套"情绪操作系统"

大部分人在股市里亏钱,不是因为不懂 K 线,而是因为在不该出手的时候出手,在该出手的时候手抖。

原因很简单:我们的大脑天生不擅长处理"群体心理"。涨停潮来的时候,恐惧被贪婪覆盖,你觉得"这次不一样";退潮来的时候,亏损引发恐慌,你又觉得"完了要崩"。这两种状态下做的决策,事后看几乎都是错的。

游资(短线 speculative capital)之所以能在 A 股存活并赚钱,核心不是他们比你看懂了更多基本面,而是他们把"市场情绪"当成第一变量,并且有了一套量化的观察框架——每天收盘统计涨停数、连板高度、炸板率、隔日溢价,据此判断当前处于情绪周期的哪个阶段,再决定出手还是空仓。

本文要做三件事:

  1. 重新定义情绪——把它从"感觉"变成"可量化的集体风险偏好";
  2. 拆解周期与指标——四大周期、六大观测维度,逐层讲透;
  3. 交付一套算法——输入每日市场数据,输出当前情绪阶段、情绪评分、操作建议、适配板块。

这篇文章不是"喊你买什么",而是教你什么时候该在场上、什么时候该离场。这是短线交易里最值钱的能力。


模块零:核心定义 —— 市场情绪到底是什么

0.1 一句话定义

市场情绪 = 全市场短线资金,当下愿意承担风险的程度。

拆开看三个关键词:

  • 全市场:不是你一只票的感受,是整体短线资金的合力
  • 短线资金:以打板、接力、题材博弈为主的活跃资金(游资 + 活跃散户 + 量化)
  • 愿意承担风险的程度:愿意追高吗?愿意封板吗?愿意在高位接货吗?亏了敢拿吗?

0.2 用"行为"而非"指数"定义情绪

情绪好,表现为一组可观测的资金行为:

  • 敢追高(不怕买在相对高位)
  • 愿意打板(涨停价封单,主动承担当日无法卖出的流动性风险)
  • 愿意接力(昨天涨停的票今天继续买,承接前一日获利盘)
  • 不怕亏钱(买入后小幅浮亏不立刻割,相信能回来)

情绪差,表现为相反的行为:

  • 不敢持仓(有盈利就跑,拿不住)
  • 冲高就砸(获利盘蜂拥而出,形成上影线)
  • 稍有亏损立刻割肉(止损线被情绪驱动而非计划驱动)
  • 回避高位(只敢买低位,高位股无人接力)

关键洞察:情绪是一个行为变量,不是价格变量。价格(指数)可以靠权重股护盘维持红盘,但短线资金的行为骗不了人——炸板率、连板高度、隔日溢价,这些才是情绪的体温计。

0.3 情绪 vs 指数:第一次认知升级

这是散户最常见的混淆,必须首先破除:

维度上证指数(白线)短线情绪(黄线 + 情绪指标)
代表什么市值加权,大权重说了算全市场个股涨跌的等权感受
能否被操控能(拉银行/石油即可)难(需要全市场风险偏好共振)
和你的持仓关系弱(你持小票时指数红你仍亏)强(你做短线,情绪直接决定输赢)

经典背离场景:

  • 指数翻红,但黄线大跌 → 权重护盘,小票(你持有的)在杀跌,短线情绪崩
  • 指数微跌,但黄线强、涨停一堆 → 权重拖累指数,但题材火热,短线情绪暖

游资看的是后者。黄白线背离是最简单的情绪工具:白线在上黄线在下 = 权重行情(情绪弱);黄线持续强 = 小票活跃(情绪回暖)。


模块一:情绪的本质 —— 从"感觉"到"可量化变量"

1.1 为什么"感觉"不可靠

人类的情绪感知有几个固有偏差:

  1. 近因偏差:今天账户涨了,你觉得情绪好;昨天亏了,觉得完蛋。感知被最近一次交易绑架。
  2. 确认偏差:你看好某板块,就只关注它涨停,忽略全市场 4000 家下跌。
  3. 锚定效应:用"自己持仓的盈亏"锚定全市场情绪,样本量=1,毫无代表性。
  4. 羊群放大:盘面一热闹你就乐观,一冷清你就悲观——你测量的是别人情绪的回声,不是情绪本身。

所以游资的做法是:用客观数据替代主观感受。每天收盘,统计一组固定指标,给情绪打分。这样你的判断不依赖"今天心情怎么样",而依赖"数据落在哪个区间"。

1.2 把情绪翻译成数学

情绪可以建模为一个连续变量,范围设为 [-100, +100]:

  • +100:极致狂热(全民牛市,闭眼买都赚)
  • 0:中性(没有明显风险偏好倾向)
  • -100:极致绝望(冰点,无人愿做多)

每个观测指标(模块四会详述)映射成分值,加权求和得到综合情绪分。这样"情绪好/差"就不再是形容词,而是一个可以画曲线的数字。

更关键的是:情绪是一条时间序列,不是单点。你不仅要知道今天情绪分是多少,还要知道它是在上升、见顶、还是下滑。这就是为什么我们需要"周期"的概念——情绪分的变化方向,比绝对值更重要。

1.3 情绪的可迁移性:它不是某个股的属性

一个常见误区:以为"情绪好"等于"我手里的票会涨"。错。

情绪是环境属性,不是个股属性。情绪好,意味着"出错的成本低、接力的意愿强"——你买错一只票,可能只是小亏就有人来接;情绪差,意味着"买错就是大面"——你买对逻辑,也可能因为没人接力而闷杀。

所以游资说"情绪是第一变量,个股利好排在后面"。一只再好的票,处于退潮期,利好兑现即大跌;一只逻辑普通的票,处于上升期,资金愿意给你溢价。


模块二:四大情绪周期深度拆解

游资通用的划分:上升期、高潮期、退潮期、冰点。这四个阶段构成一轮完整循环。下面逐一拆解。

2.1 情绪上升期(暖仓、窗口期,最适合出手)

定义:风险偏好从低位回升,资金重新开始愿意承担风险。

特征(逐条对应可观测数据):

  1. 涨停数量变多,炸板率很低

    • 涨停家数从冰点期的个位数/十几只,回升到 50+、80+、100+
    • 炸板率(涨停后开板的比例)从 >50% 降到 <30%
    • 含义:资金封板有信心,封住了有人接,所以敢封
  2. 涨停个股第二天大多高开,连板股不断晋级

    • 隔日溢价率为正且扩大
    • 昨日 2 板今天变 3 板,昨日 3 板变 4 板——连板高度在"往上打"
    • 含义:接力意愿强,前一日获利盘被轻松承接
  3. 亏钱效应消失,即使买错,亏损不大

    • 打板炸了,第二天只是小幅低开,不闷杀
    • 含义:容错率高,试错成本低
  4. 高位股不核按钮,分歧之后容易再度走强

    • 高位龙头盘中大分歧(放量换手),但尾盘能回封或次日反包
    • 含义:资金对高位仍有信仰,愿意给二波机会

游资操作:大胆进攻。敢于接力龙头,仓位可以打满。这是胜率最高、赔率最好的阶段。

风险点:上升期早期容易误判为"冰点反弹"而错过;上升期中后期容易把"高潮"当成"上升"而追在山顶。需要用模块三的循环模型区分。

你的应用:这个阶段是你的"主场"。匹配模块七的算法,当输出为"上升期"且情绪分在回升,就是你该重仓出手的窗口。

2.2 情绪高潮期(鱼尾,谨慎)

定义:风险偏好达到极致,资金一致性看多。

特征:

  • 遍地涨停,题材全面爆发(一天几十个题材都有涨停)
  • 所有人都赚钱,舆论一片乐观(股吧、群里全是晒收益)
  • 散户疯狂进场,新开户数飙升
  • 一致性太强——这是隐患本身

核心隐患:高潮的本质是"该买的人都已经买了"。当最后一批犹豫资金也进场,场内就只剩卖盘。所以高潮之后必然分化,只是时间问题。

游资口诀:"高潮不追高,后排不接盘。"

游资操作:

  • 不新开仓(不再追涨)
  • 逐步止盈(把利润落袋)
  • 不追后排跟风(只持有核心龙头,且准备卖)

你的应用:算法输出"高潮期"时,禁止新开仓。你手里若有仓位,这是减仓信号,不是加仓信号。很多人亏在"上升期没敢上,高潮期重仓冲"——正好是反的。

2.3 情绪退潮期(最容易大亏,管住手)

定义:风险偏好从高位回落,资金开始回避风险。

特征(危险信号,逐条对应):

  1. 连板股开始断板,高位股出现核按钮

    • 核按钮 = 隔夜挂跌停价卖出,开盘直接一字跌停或大幅低开闷杀
    • 连板高度从 8 板压到 5 板、3 板,连板梯队断层
  2. 炸板率飙升

    • 当天涨停的票,尾盘大量开板
    • 炸板率从 <30% 飙到 >50%
    • 含义:封板资金没信心,板上的人拼命撤单
  3. 赚钱效应集中在极少数个股,大部分买入即亏

    • 只有绝对核心龙头还能涨,后排跟风全部掉队
    • 你买非核心,大概率亏
  4. 轮动极快,早上涨的板块下午直接跳水

    • 题材"一日游"甚至"半日游"
    • 追哪个套哪个

游资共识:退潮期尽量空仓,少出手,出手只小仓试错。

为什么退潮期最亏:上升期你买错亏 2%,退潮期你买错亏 15%(核按钮 + 次日低开)。赔率急剧恶化,但散户往往"刚在上升期尝到甜头,退潮期惯性加仓"——这是大亏的标准剧本。

你的应用:算法输出"退潮期",空仓或小仓。这是对你"担心追高"本能的最好制度化——不是靠忍,是靠规则确认"现在确实不能做"。

2.4 情绪冰点(机会酝酿阶段)

定义:风险偏好压到极致,资金彻底回避风险。

特征:

  • 涨停家数极少(个位数到十几只)
  • 连板几乎绝迹(最高板 2 板都少见)
  • 大面积大阴线,短线普遍亏损
  • 市场绝望,没人愿意做多(股吧一片看空)

重要认知:冰点 ≠ 立刻大涨! 这是散户最大的坑——看到冰点就抄底,结果冰点之后还有冰点。

冰点分两种:

类型表现操作
✅ 冰点修复冰点后资金尝试反弹,出现地天板/反包/新题材首板小仓博弈龙头反弹或新周期试错
❌ 持续冰点阴跌不断,冰点之后更低冰点,毫无反弹意愿绝对不提前抄底,继续空仓

区分方法:看"是否出现积极的边际变化"——比如某只高位股止跌反包、某个新题材突然批量涨停、炸板率从 60% 降到 40%。有这些信号 = 修复;没有 = 持续冰点。

你的应用:算法输出"冰点"时,不操作。但要把自选股里"下一轮可能的主线"(新题材、政策受益、超跌龙头)标出来,一旦算法切换为"冰点修复"或"上升",你能在 5 分钟内下单,而不是现找标的。

2.5 四阶段速查表

阶段涨停数炸板率连板高度隔日溢价高位股你的动作
冰点极少(<20)高(>50%)断层(≤2)负闷杀空仓,备战
上升增多(50+)低(<30%)往上打正且扩稳/反包重仓进攻
高潮遍地(100+)低但一致性过强极高(>8)正但开始钝化加速止盈,不开新
退潮减少飙升(>50%)压缩转负核按钮空仓/小仓

模块三:完整循环的动态模型

3.1 循环链路

冰点→修复→上升→高潮→退潮→(新)冰点→

这是一个无限轮回。每一轮循环的时长不等:上升期可能 3 天,也可能 3 周;冰点可能 1 天就修复,也可能磨 1 个月。

3.2 为什么是"轮回"而不是"单边"

情绪轮回的底层逻辑是人性的钟摆:

  • 跌多了,价格便宜 + 利空出尽 → 有人开始买 → 赚钱效应出现 → 更多人跟 → 上升
  • 涨多了,获利盘巨大 + 一致性看多 → 先知先觉者卖 → 接力断层 → 下跌
  • 跌到绝望 → 该卖的卖光了 → 边际买盘能撬动反弹 → 修复

每一轮都是"贪婪与恐惧"的再平衡。理解了这点,你就不会在情绪高潮时相信"这次是长牛",也不会在冰点时相信"市场要归零"。

3.3 循环的"相变"识别

难点在于区分相邻阶段。几个关键相变点:

  • 冰点 → 修复:出现第一个"积极边际信号"(反包、新题材首板、炸板率拐头向下)
  • 修复 → 上升:涨停数持续增加 + 连板高度突破 + 容错率回升(连续 2-3 天确认)
  • 上升 → 高潮:涨停数爆量 + 散户疯狂 + 一致性极强(往往伴随"牛市来了"的舆论)
  • 高潮 → 退潮:高位股第一次出现大分歧/核按钮 + 炸板率飙升
  • 退潮 → 冰点:连板高度压到极限 + 批量跌停 + 绝望情绪

关键原则:相变需要"确认",不要"预判"。 看到一次反包不等于冰点结束,要看到连续 2-3 天的正反馈才确认进入上升。预判相变是散户大亏来源(“我觉得到底了”→ 抄在半山腰)。

3.4 你的操作映射(核心交付)

阶段仓位标的类型心态
冰点0%备战,不买耐心
修复10-20%试错新龙头/超跌反弹轻
上升60-100%核心龙头、强势题材进攻
高潮0%(持仓止盈中)卖,不买兑现
退潮0-10%极小仓试错或空仓忍

模块四:六大观测指标详解

这是游资每天的"体温计"。不用复杂公式,每天收盘看这六个。

4.1 指标一:连板高度

定义:当日市场最高连板数(几连板)。

怎么看:

  • 最高板从 3 板打到 7 板、8 板 → 情绪回暖,资金敢于持筹博弈更高
  • 最高板从 8 板压到 3 板、2 板,连板梯队断层 → 情绪退潮

阈值参考:

  • ≥7 板:强情绪(上升/高潮)
  • 4-6 板:中等
  • ≤3 板:弱(冰点/退潮)

实战用法:连板高度是"情绪温度计的水银柱"。它比涨停总数更敏感——涨停数可以靠首板堆出来,但连板高度需要"连续多日有人接力",是真实风险偏好的体现。

4.2 指标二:炸板率

定义:炸板率 = 当日炸板数 / (当日涨停封板数 + 当日炸板数)

怎么看:

  • <30%:资金封板有信心,板上的人不撤,情绪偏好
  • 50%:封板即开,资金没信心,情绪脆弱

实战用法:炸板率是你"当天打板"的胜率预告。炸板率 60% 的日子去打板,十次炸六次,次日低开——必亏。炸板率 20% 的日子打板,封住率高,次日有溢价。

4.3 指标三:高位股反馈(最重要!)

定义:市场最高位的核心龙头,当天的表现。

三种状态:

  • 稳(stable):高位横盘或继续涨,分歧后能回封
  • 分歧(diverge):盘中大换手、大波动,但最终承接住
  • 崩(crash):核按钮、一字跌停、大幅低开闷杀

为什么最重要:高位股是情绪的"风向标"。高位股稳,说明资金对"高"还有信仰,低位题材就能放心做;高位股崩,说明避险情绪主导,全市场都会跟着砍仓。

游资口诀:“龙头崩,短线少操作。”

4.4 指标四:隔日溢价

定义:昨天涨停的票,今天的平均开盘表现。

计算:取昨日所有涨停股,今天开盘价相对昨日收盘价的涨跌幅,求平均。

怎么看:

  • 正向溢价(平均高开):资金愿意给昨日涨停股"接盘溢价" → 情绪好
  • 负向溢价(平均低开):昨日涨停今天直接被埋 → 情绪差

实战用法:隔日溢价是"接力意愿"的直接度量。你昨天打板,今天能舒服赚钱走人,说明别人愿意接——这种环境你今天才敢再打。

4.5 指标五:赚钱效应扩散度

定义:上涨是"只涨龙头"还是"龙头跟风一起涨"。

两种状态:

  • 窄(narrow):只有绝对龙头涨,跟风全部跌 → 局部行情,情绪一般
  • 宽(broad):龙头、中位、后排一起涨 → 情绪全面回暖

实战用法:扩散度决定你的"可参与范围"。窄扩散时,只有买到最核心的龙一才赚钱,买错就是面——容错极低;宽扩散时,踏空资金会外溢到中低位,你买非核心也能喝汤。

4.6 指标六:跌停家数

定义:当日跌停(或近乎跌停 -9% 以上)的家数。

怎么看:

  • 批量跌停(几十只、上百只):亏钱效应扩散,回避短线
  • 跌停极少:环境安全

实战用法:跌停家数是"亏钱效应的硬指标"。哪怕涨停很多,只要跌停也多(尤其高位股跌停),说明风险在暗中释放,不是真安全。

4.7 六指标速查卡

指标情绪好情绪差敏感度
连板高度≥7板且往上≤3板断层高
炸板率<30%>50%高
高位股反馈稳/反包核按钮最高
隔日溢价正且扩负高
赚钱扩散宽窄中
跌停家数少批量高

模块五:散户三大误区破析

误区一:情绪 = 大盘涨跌

错在哪:把上证指数当情绪。前文已讲,指数可被权重操控,与短线情绪常背离。

正确做法:看黄白线 + 六指标。指数红、黄线绿 = 权重护盘,情绪弱;指数绿、黄线红 = 小票活跃,情绪暖。

代价:很多人"指数涨了所以满仓",结果是权重拉指数、小票暴跌,满仓吃面。

误区二:情绪是玄学、凭感觉

错在哪:觉得"盘感"不可言传,无法量化。

正确做法:游资是量化观察。每天收盘统计涨停数、连板高度、炸板率、跌停数、隔日溢价——客观数据支撑,不是主观感受。本文模块七的算法,就是把这套统计自动化。

代价:凭感觉的人,好的时候归功自己"盘感好",亏的时候怪"主力砸盘"——永远不进步。

误区三:个股利好大于情绪

错在哪:看到某票出利好,觉得"这票独立行情,不怕退潮"。

真相:大势(情绪)不行,个股很难独善其身。退潮期,再好的利好也"兑现即跌"——因为没人接力,利好出来就是获利盘出货的理由。

正确做法:个股逻辑决定"买什么",情绪周期决定"什么时候买、买多少"。两者结合,缺一不可。

一个直观例子(用户原文案例):

退潮阶段,你看中一只形态完美、有利好的标的,打算打板。游资视角:当下情绪退潮,高位股持续核按钮,炸板率极高。哪怕图形再好,选择放弃。理由:情绪不好,资金没有意愿接力,你封板,没人来接,当天炸板,次日大幅低开。

这就是"个股服从情绪“的精确体现。


模块六:情绪周期 × 板块轮动矩阵

不同情绪阶段,该做什么板块?这是把"情绪判断"转化为"实际行动"的关键一步。

6.1 阶段-板块映射

阶段适配板块逻辑
上升期强势题材龙头、AI/科技、机器人、算力、新题材首板风险偏好回升,资金愿意给高弹性品种溢价
高潮期不新开;持仓逐步止盈一致性过强,后续分化,落袋为安
退潮期空仓;或防御:公用事业、高股息、电力、黄金、医药风险偏好下降,资金抱团确定性/防御
冰点空仓备战;小仓博弈超跌反弹龙头;埋伏下一主线(政策受益/新题材)容错极低,只做"修复预期"的轻仓试错

6.2 轮动的内在逻辑

情绪周期驱动板块轮动,遵循”风险偏好梯度":

  • 风险偏好低(冰点/退潮)→ 资金要"安全",去高股息、公用事业、黄金
  • 风险偏好回升(修复/上升)→ 资金要"弹性",去科技、题材、小票
  • 风险偏好极致(高潮)→ 所有板块都涨过一遍,没有洼地,开始出货

所以你可以用"当前市场在炒什么风格"反过来验证情绪阶段:如果电力、银行、黄金在涨而科技在跌,基本是退潮/防御;如果 AI、机器人批量涨停,基本是上升期。

6.3 你的 20 只自选股的归类建议

你之前提到自选股 20 只(科技电子 8、电力能源 4、其他 8)。按情绪阶段归好类,操作时直接调:

  • 进攻组(上升期用):科技电子 8 只 —— 风险偏好高时弹性最大
  • 防御组(退潮期用):电力能源 4 只 —— 退潮时抱团避险
  • 观察组(冰点埋伏/其他):其他 8 只 —— 按当时逻辑临时判断

这样你就不需要"大涨时现想买啥",而是阶段决定用哪组,组内早有预案。


模块七:情绪识别算法(核心交付物)

下面是一套可运行的 Python 算法。输入每日市场快照,输出情绪阶段、情绪评分、操作建议、适配板块。

7.1 数据模型

from dataclasses import dataclass
from typing import Literal

# 高位股反馈状态
HighStatus = Literal["stable", "diverge", "crash"]
# 赚钱效应扩散度
Breadth = Literal["narrow", "broad"]

@dataclass
class MarketSnapshot:
    date: str                      # 日期,如 "2026-08-12"
    limit_up: int = 0             # 涨停家数(不含ST/新股)
    limit_down: int = 0           # 跌停家数
    max_board: int = 0            # 最高连板高度
    fail_rate: float = 0.0        # 炸板率 0~1
    next_day_premium: float = 0.0 # 隔日溢价率(小数,0.02=+2%)
    high_status: HighStatus = "stable"   # 高位股反馈
    breadth: Breadth = "narrow"   # 赚钱效应扩散度
    yellow_white_gap: float = 0.0 # 黄白线差值(黄-白,正=小票强)

7.2 情绪评分函数

每个指标映射为 [-100, +100] 的分值,再加权求和。

class SentimentAnalyzer:
    # 各指标权重(总和=1.0,高位股反馈最重)
    W = {
        "board": 0.20,       # 连板高度
        "fail": 0.20,        # 炸板率
        "high": 0.30,        # 高位股反馈(最重要)
        "premium": 0.15,     # 隔日溢价
        "breadth": 0.10,     # 扩散度
        "limitdown": 0.05,   # 跌停家数
    }

    def score_board(self, n: int) -> float:
        """连板高度:2板=0分,每多1板+15,封顶100"""
        if n <= 2:
            return max(-100, (n - 5) * 15)   # 1板=-60, 2板=-45
        return min(100, (n - 2) * 15)

    def score_fail(self, r: float) -> float:
        """炸板率:<30%得正分,>50%得负分,线性映射"""
        # r=0.2 -> +60 ; r=0.3 -> 0 ; r=0.5 -> -60 ; r=0.7 -> -100
        return max(-100, min(100, (0.3 - r) / 0.1 * 60))

    def score_high(self, s: HighStatus) -> float:
        """高位股反馈:稳=+80,分歧=0,崩=-100"""
        return {"stable": 80.0, "diverge": 0.0, "crash": -100.0}[s]

    def score_premium(self, p: float) -> float:
        """隔日溢价:+3% -> +100, 0% -> 0, -3% -> -100"""
        return max(-100, min(100, p / 0.03 * 100))

    def score_breadth(self, b: Breadth) -> float:
        return {"narrow": -30.0, "broad": 60.0}[b]

    def score_limitdown(self, n: int) -> float:
        """跌停家数:0只=+30,20只=0,50只=-60,100只+=-100"""
        if n <= 0:
            return 30.0
        return max(-100, 30 - n * 1.3)

    def score(self, snap: MarketSnapshot) -> float:
        s = (
            self.W["board"]    * self.score_board(snap.max_board)
            + self.W["fail"]    * self.score_fail(snap.fail_rate)
            + self.W["high"]    * self.score_high(snap.high_status)
            + self.W["premium"] * self.score_premium(snap.next_day_premium)
            + self.W["breadth"] * self.score_breadth(snap.breadth)
            + self.W["limitdown"] * self.score_limitdown(snap.limit_down)
        )
        return round(s, 1)

7.3 周期分类(状态机,含趋势判断)

单纯看当日分数会"抖动",需要结合历史趋势判断相变。

from enum import Enum

class Stage(Enum):
    ICE = "冰点"
    RECOVER = "修复"
    UP = "上升"
    PEAK = "高潮"
    DOWN = "退潮"

class CycleClassifier:
    def __init__(self, window: int = 5):
        self.history = []   # 存 (date, score)
        self.window = window

    def trend(self) -> float:
        """近 window 日情绪分斜率(每日平均变化)"""
        if len(self.history) < 2:
            return 0.0
        recent = self.history[-self.window:]
        scores = [s for _, s in recent]
        n = len(scores)
        # 简单线性斜率
        x = list(range(n))
        xm = sum(x) / n
        ym = sum(scores) / n
        num = sum((x[i] - xm) * (scores[i] - ym) for i in range(n))
        den = sum((x[i] - xm) ** 2 for i in range(n))
        return num / den if den else 0.0

    def classify(self, snap: MarketSnapshot, score: float) -> Stage:
        self.history.append((snap.date, score))
        if len(self.history) > 60:
            self.history.pop(0)
        slope = self.trend()

        # 规则:先按绝对分粗分,再按趋势微调
        if score <= -40:
            # 极弱:冰点或持续冰点
            if slope > 3:       # 分数在回升
                return Stage.RECOVER
            return Stage.ICE
        elif score < 10:
            # 弱势区间:修复或退潮末端
            return Stage.RECOVER if slope > 2 else Stage.ICE
        elif score < 55:
            # 中强:上升或退潮
            if slope < -3:
                return Stage.DOWN
            return Stage.UP
        else:
            # 强:高潮或上升末端
            if slope < -2:
                return Stage.DOWN   # 高分但开始掉头
            return Stage.PEAK

7.4 操作建议与板块映射

ADVICE = {
    Stage.ICE:     ("空仓,备战下一主线", ["空仓", "超跌反弹龙头(小仓)", "政策受益埋伏"]),
    Stage.RECOVER: ("小仓试错,只做核心", ["新题材首板", "超跌反弹龙", "进攻组轻仓"]),
    Stage.UP:      ("重仓进攻,敢于接力", ["科技电子龙头", "AI/机器人/算力", "强势题材龙一"]),
    Stage.PEAK:    ("止盈为主,禁止新开", ["持仓止盈", "不新开仓", "不追后排"]),
    Stage.DOWN:    ("空仓/极小仓,管住手", ["空仓", "公用事业", "高股息", "电力", "黄金"]),
}

def advise(stage: Stage):
    return ADVICE[stage]

7.5 完整调用示例

analyzer = SentimentAnalyzer()
classifier = CycleClassifier()

# 模拟连续 8 天的市场数据(从冰点到上升)
snaps = [
    MarketSnapshot("D1", limit_up=12, limit_down=60, max_board=2, fail_rate=0.65,
                   next_day_premium=-0.03, high_status="crash", breadth="narrow"),
    MarketSnapshot("D2", limit_up=15, limit_down=40, max_board=2, fail_rate=0.60,
                   next_day_premium=-0.02, high_status="crash", breadth="narrow"),
    MarketSnapshot("D3", limit_up=28, limit_down=20, max_board=3, fail_rate=0.50,
                   next_day_premium=-0.01, high_status="diverge", breadth="narrow"),
    MarketSnapshot("D4", limit_up=55, limit_down=8, max_board=4, fail_rate=0.35,
                   next_day_premium=0.01, high_status="diverge", breadth="broad"),
    MarketSnapshot("D5", limit_up=90, limit_down=3, max_board=5, fail_rate=0.25,
                   next_day_premium=0.02, high_status="stable", breadth="broad"),
    MarketSnapshot("D6", limit_up=120, limit_down=2, max_board=7, fail_rate=0.20,
                   next_day_premium=0.03, high_status="stable", breadth="broad"),
    MarketSnapshot("D7", limit_up=150, limit_down=1, max_board=9, fail_rate=0.18,
                   next_day_premium=0.035, high_status="stable", breadth="broad"),
    MarketSnapshot("D8", limit_up=130, limit_down=5, max_board=8, fail_rate=0.30,
                   next_day_premium=0.02, high_status="diverge", breadth="broad"),
]

for s in snaps:
    sc = analyzer.score(s)
    st = classifier.classify(s, sc)
    action, sectors = advise(st)
    print(f"{s.date}: 分={sc:6.1f}  阶段={st.value:4}  动作={action}")

输出预期:

DDDDDDDD12345678::::::::分分分分分分分分========----267576488285882........74152503阶阶阶阶阶阶阶阶段段段段段段段段========冰冰冰修上高高退点点点复升潮潮潮动动动动动动动动作作作作作作作作========空空空小重止止空仓仓仓仓仓盈盈仓,,,试进为为/备备备错攻主主极战战战,,,,小下下下只敢禁禁仓一一一做于止止,主主主核接新新管线线线心力开开住手

可以看到算法完美还原了"冰点→修复→上升→高潮→退潮"的轮回,并且在 D6(高潮)就开始提示止盈,在 D8(高位掉头)识别为退潮——这正是游资想要的早期预警。

7.6 算法使用说明

  1. 数据来源:涨停数、连板高度、炸板率、隔日溢价,可从财经数据接口(如 AkShare、Tushare)或行情软件手动统计获取;跌停数、黄白线直接从盘面看。
  2. 参数可调:权重 W 和评分阈值,可以根据你的交易风格微调(比如你更看重高位股反馈,可以把 high 权重调到 0.4)。
  3. 趋势窗口:window=5 表示用近 5 日判断斜率,可调大(更平滑)或调小(更灵敏)。
  4. 不是圣杯:算法是"情绪体温计",不是"买卖点生成器"。它告诉你环境,不替你选股。选股仍靠你的题材研究。

模块八:板块介入信号算法(进阶)

模块七解决"什么阶段",模块八解决"什么板块"。两者之间用"阶段 × 板块风格匹配度“连接。

8.1 板块风格标签

@dataclass
class Sector:
    name: str
    beta: float          # 弹性:>1 高弹性(科技),<1 防御(电力)
    cycle_fit: list      # 适合的情绪阶段

SECTORS = [
    Sector("科技电子", 1.4, [Stage.UP, Stage.RECOVER]),
    Sector("AI/算力", 1.5, [Stage.UP]),
    Sector("机器人", 1.3, [Stage.UP, Stage.RECOVER]),
    Sector("电力能源", 0.6, [Stage.DOWN, Stage.ICE]),
    Sector("高股息", 0.5, [Stage.DOWN, Stage.ICE]),
    Sector("黄金", 0.4, [Stage.DOWN]),
    Sector("医药", 0.8, [Stage.DOWN, Stage.RECOVER]),
]

8.2 介入信号

def sector_signal(stage: Stage, sectors=SECTORS):
    """返回当前阶段适配的板块列表"""
    fit = [s.name for s in sectors if stage in s.cycle_fit]
    return fit

# 示例
print(sector_signal(Stage.UP))    # ['科技电子', 'AI/算力', '机器人', '机器人']
print(sector_signal(Stage.DOWN))  # ['电力能源', '高股息', '黄金', '医药']

8.3 结合你的自选股

把你 20 只自选股打上 beta 和 cycle_fit 标签,算法就能在判断出阶段后,直接输出"你该看自选股里的哪几只”。这样"大涨时不知道买啥"的问题,从根上解决——不是盘中想,是盘前系统已经算好。


模块九:实盘操作流程(日级 SOP)

把前面所有内容,变成你每天可执行的标准动作。

9.1 盘前(9:00 前)

  1. 打开算法,输入昨日市场快照(涨停数、连板高度、炸板率、隔日溢价、高位股反馈、跌停数)
  2. 算法输出:当前阶段 + 情绪分 + 趋势 + 适配板块
  3. 根据阶段,确定今日仓位上限和标的组(进攻组/防御组/观察组)
  4. 在自选股里,把适配板块的标的标记为"今日关注"

9.2 盘中(9:30-15:00)

  1. 只交易"盘前标记"的标的,不临时起意
  2. 观察黄白线:白线强黄线弱 → 权重行情,不追小票
  3. 高潮期/退潮期:禁止新开仓(规则硬约束)
  4. 上升期:按预案接力核心龙头,不碰后排

9.3 盘后(15:00 后)

  1. 统计今日六指标,更新明日算法输入
  2. 记录今日操作与结果(买了什么、盈亏、是否符合预案)
  3. 复盘:今天有没有"违反阶段规则"的操作?为什么?

9.4 周级复盘

  1. 看情绪分曲线:这周处于周期哪个位置?
  2. 统计胜率:上升期出手胜率 vs 退潮期出手胜率(验证"按阶段操作"的价值)
  3. 调整参数:哪些阈值不适合你的标的?微调 W 和评分函数

模块十:案例推演(用算法跑真实场景)

10.1 场景 A:2026 年 6 月 25 日"指数红、4000 家跌"

回到本文开头提到的真实场景:指数上涨,但超 4000 家下跌。

套用算法:

  • 涨停数:可能不低(权重抱团题材有涨停)
  • 连板高度:中等
  • 炸板率:偏高(小票封不住)
  • 高位股反馈:部分核按钮
  • 隔日溢价:小票为负
  • 跌停数:不少(小票批量大跌)
  • 黄白线:白线强、黄线弱(典型权重行情)

算法大概率输出:阶段=退潮 或 冰点修复早期,情绪分偏低。

结论:指数红 ≠ 情绪好。这天你如果只看指数满仓,必亏;按算法,你应该空仓或极小仓。这正印证了模块零的"情绪≠指数"。

10.2 场景 B:退潮期遇到"完美利好票"

用户原文案例:退潮期,一只形态完美、有利好的票,你打算打板。

算法此时输出:阶段=退潮,动作=空仓/极小仓,管住手。

结合模块五误区三:个股利好 < 情绪周期。算法直接告诉你"现在不是做个股的时候",你就不会去打那个板,避免了"当天炸板、次日低开"的面。

这就是算法的价值:它替你在情绪上头时,按下暂停键。

10.3 场景 C:冰点后第一天反包

某日:涨停数从 12 升到 28,最高板从 2 升到 3,高位股从 crash 变 diverge,炸板率从 65% 降到 50%。

算法:情绪分从 -78 升到 -42,趋势斜率 >3 → 阶段=修复。

动作:小仓试错,只做核心(新题材首板、超跌反弹龙)。不重仓,因为修复可能失败变回冰点。


模块十一:边界与风险(算法不是圣杯)

写到这里,必须泼冷水——任何情绪算法都有边界。

11.1 算法的盲区

  1. 黑天鹅:突发政策、地缘事件,可以在一天内翻转情绪,算法滞后
  2. 数据质量:涨停数、炸板率若统计口径不一致(含不含 ST、新股),分数失真
  3. 极端一致:高潮期所有人都看涨,算法也显示"高潮",但"高潮多久"算法说不准
  4. 个股特异性:算法管环境,不管你选的票逻辑对不对

11.2 算法的正确定位

情绪算法是**“该不该在场上"的判断器,不是"买哪只"的推荐器。**

它帮你解决 80% 的亏损来源(逆情绪操作、退潮期重仓),但不保证你选对票。选股仍靠你的题材研究、个股理解。

11.3 最大的风险:过度拟合

如果你把历史数据来回调参,让算法"完美预测过去”,它会过拟合——对过去神准,对未来失效。正确做法:用通用阈值(本文给的),小步验证,不追求历史回测满分。

11.4 纪律 > 算法

最危险的不是算法错,而是你明明看到算法说"退潮空仓",手却忍不住买了。算法再准,执行不了等于 0。

所以本文反复强调:把决策从"盘中情绪"移到"盘前计划"。算法是计划的执行依据,不是盘中冲动的借口。


模块十二:仓位的数学 —— 情绪分如何决定"买多少"

判断"什么时候出手"只解决了一半问题,另一半是"出多少手"。很多人在上升期只买了 10%,高潮期却满仓——仓位和情绪阶段完全错位,白忙一场。

12.1 最朴素的映射:阶段→仓位上限

前文模块三给过一张仓位表,这里把它写成可直接用的函数:

def position_limit(stage: Stage, score: float) -> float:
    """返回建议仓位上限(0~1)"""
    base = {
        Stage.ICE:     0.0,
        Stage.RECOVER: 0.15,
        Stage.UP:      0.85,
        Stage.PEAK:    0.0,    # 持仓逐步清,不再新开
        Stage.DOWN:    0.05,
    }[stage]
    # 上升期内部,用情绪分微调:分越高仓位越满(但不超0.85)
    if stage == Stage.UP:
        base = min(0.85, 0.5 + score / 200)  # 分55->0.775, 分75->0.875->封顶0.85
    return round(base, 2)

for st in [Stage.ICE, Stage.RECOVER, Stage.UP, Stage.PEAK, Stage.DOWN]:
    print(st.value, position_limit(st, analyzer.score(snaps[0] if False else MarketSnapshot("x", max_board=6, fail_rate=0.25, high_status="stable", next_day_premium=0.03, limit_down=2, breadth="broad"))))

12.2 凯利公式的情绪修正版

经典凯利公式:f = (bp - q) / b,其中 b 赔率、p 胜率、q=1-p。

情绪框架下的修正:胜率和赔率都随情绪阶段变化。

  • 上升期:p(胜率)高(容错高),b(赔率)中高 → f 较大
  • 退潮期:p 低(核按钮),b 负向 → f 应≈0
  • 高潮期:p 看似高但 b 在压缩(接盘侠没了)→ f 应递减

实战中不用算精确凯利(容易过度下注),用"分数映射法"更稳妥:

仓位%=max(0,情绪分)×0.8

即情绪分 +50 → 仓位 40%;+80 → 64%;负分 → 0。这比凯利保守,但能活下来。

12.3 单票仓位:不要 All-in 一只

即使上升期满仓 85%,也应分散到 2-3 只核心,单票不超过 40%。理由:情绪再好,个股有特例(突发的减持、业绩雷)。分散是对"情绪判断也可能错"的保险。

12.4 加减仓的节奏

  • 上升期早期(修复→上升确认):分批建,不一次性打满。分 2-3 次,每次确认趋势延续再加。
  • 高潮期:只减不加。每涨一波减 1/3,不等"最高价"。
  • 退潮期:雪崩式减。当天确认退潮,次日开盘清,不恋战。

核心原则:建仓要慢(确认趋势),减仓要快(保护利润)。 这和人性相反(人性是追高时一次打满,亏损时死扛),所以必须靠规则反人性。


模块十三:实时数据获取 —— 用 AkShare 自动采集六指标

算法再好,数据靠手填就失去意义。下面用 AkShare(免费财经数据库)示范如何自动采集六指标,让你的算法每天跑起来。

13.1 环境准备

pip install akshare pandas

13.2 涨停/跌停/连板高度获取

import akshare as ak

def get_limit_stats(date: str):
    """获取某日涨停、跌停、连板数据"""
    # 涨停板池
    df = ak.stock_zt_pool_em(date=date)
    limit_up = len(df)
    # 连板高度:找最大连板数
    max_board = df["连板数"].max() if "连板数" in df.columns else 0

    # 跌停板池
    df_dn = ak.stock_dt_pool_em(date=date)
    limit_down = len(df_dn)
    return limit_up, limit_down, int(max_board)

# 示例
lu, ld, mb = get_limit_stats("20260812")
print(f"涨停:{lu} 跌停:{ld} 最高连板:{mb}")

13.3 炸板率获取

def get_fail_rate(date: str):
    """炸板率 = 炸板数 / (涨停封板 + 炸板)"""
    df = ak.stock_zt_pool_previous_em(date=date)  # 昨日涨停今日表现
    # 或用 zt_pool_em 的"炸板"标记
    # 简化:用昨日涨停今日下跌比例近似
    down = (df["涨跌幅"] < 0).sum()
    total = len(df)
    return round(down / total, 3) if total else 0.0

13.4 隔日溢价获取

def get_next_day_premium(date: str):
    """昨日涨停股今日平均开盘涨跌幅"""
    df = ak.stock_zt_pool_previous_em(date=date)
    # 开盘涨跌幅字段
    prem = df["开盘涨跌幅"].mean() if "开盘涨跌幅" in df.columns else 0.0
    return round(prem / 100, 4)  # 转小数

13.5 高位股反馈(需人工或半自动)

这一项最难自动化,因为"高位龙头"是主观识别的。实操方案:

def high_status_auto(max_board_drop: bool, core_leader_limit_down: bool):
    """根据两个信号判断高位股反馈"""
    if core_leader_limit_down:
        return "crash"
    if max_board_drop:
        return "diverge"
    return "stable"

你每天只需回答两个问题:最高板是不是比昨天低了?核心龙头有没有跌停?其余交给代码。

13.6 一键日报脚本

把上面拼起来,每天收盘后跑一次:

def daily_report(date: str):
    lu, ld, mb = get_limit_stats(date)
    fr = get_fail_rate(date)
    prem = get_next_day_premium(date)
    # 高位股反馈需人工输入
    hs = input("高位股反馈(stable/diverge/crash): ")
    br = input("赚钱效应(narrow/broad): ")
    snap = MarketSnapshot(date, lu, ld, mb, fr, prem, hs, br)
    sc = analyzer.score(snap)
    st = classifier.classify(snap, sc)
    action, sectors = advise(st)
    print(f"【{date} 情绪日报】")
    print(f"情绪分: {sc}  阶段: {st.value}")
    print(f"动作: {action}")
    print(f"适配板块: {sectors}")
    return st

# 定时任务:每天 15:30 自动跑
# crontab: 30 15 * * 1-5 python daily_report.py

这样你就有了自己的情绪终端,每天收盘自动出一份"该不该出手"的报告。


模块十四:情绪的事件驱动与季节性

情绪不是随机游走,它受事件和日历强烈驱动。理解这点,你能提前预判情绪拐点。

14.1 政策事件是情绪的最大外生冲击

A 股是政策市(前文模块已述)。几个典型政策事件对情绪的影响:

事件情绪影响机制
降准降息短期提振流动性预期改善,风险偏好回升
活跃资本市场政策强提振直接针对股市,游资进场
新"国九条"先抑后扬短期退市担忧杀小票,长期规范利好
印花税调整脉冲式交易成本的信号意义 > 实际
行业监管(如教培、互联网)相关板块冰点确定性破坏,资金逃离

应用:政策出台日,不要只看"利好"就冲。看政策针对谁、市场怎么解读。2024 年"9·24" 政策组合拳引爆上升期,但 2024 年 10 月 8 日开盘即巅峰(高潮→退潮仅一天),就是"利好出尽"的典型。

14.2 日历季节性

A 股情绪有粗略的季节规律:

  • 年初(1-2 月):往往冰点/修复。年末落袋后资金观望,叠加业绩预告风险。
  • 两会期间(3 月):政策预期支撑,情绪偏暖但谨慎。
  • 4 月:年报季报密集,业绩雷多,情绪易脆。
  • 年中(6-7 月):流动性偏紧(银行半年考核),情绪常弱。
  • 9-10 月:政策窗口 + 国庆后资金回流,容易出现上升期(如 2024)。
  • 年末(11-12 月):机构排名战,波动加大,但也可能抱团。

应用:年中(现在 8 月)通常流动性偏紧,情绪天然偏弱。你看到"科技大涨"时,要结合这个背景——如果是逆季节的强势,反而更值得重视(说明有强催化);如果是季节性弱市中的反弹,大概率是修复而非新上升,别上头。

14.3 长假效应

  • 长假前(五一、十一、春节):资金避险,节前常退潮(怕假期出利空)
  • 长假后:补仓 + 假期积累的预期释放,容易修复/上升

应用:节前一周管住手,节后看修复信号再动。


模块十五:从游资到机构 —— 情绪因子的量化之路

你可能会问:游资靠肉眼统计,机构靠什么?答案是——把情绪因子做成量化指标,接入选股模型。

15.1 机构常用的情绪因子

因子定义来源
换手率因子全市场换手率分位量价数据
涨停封板率当日封板成功率涨停池
个股涨停占比涨停数 / 上市数全市场
大单净流入主力资金流向资金流数据
融资余额变化杠杆资金情绪两融数据
隐含波动率期权市场恐慌/贪婪期权数据
百度搜索指数“牛市"“股票"搜索量另类数据

15.2 把本文算法升级为因子

本文的 SentimentAnalyzer.score() 输出一个 -100~+100 的情绪分,本质就是一个日频情绪因子。你可以:

  1. 把它和股价数据合并
  2. 测试"情绪分 > 50 时买入宽基/题材 ETF,< -40 时空仓"的策略收益
  3. 和历史回测对比,验证"按情绪操作"是否真的跑赢"满仓持有”

这类策略在量化圈叫 “情绪择时”(sentiment timing),有大量学术论文支持其有效性(宏观情绪指标对中期收益有预测力)。

15.3 散户的"轻量量化"路径

你不需要机构的基础设施。用本文的 AkShare 脚本 + 算法,每天自动出情绪分,积累 3 个月数据,你就有了一份自己的情绪择时回测样本。这比任何"老师"的盘感都靠谱。


模块十六:个人投资者的情绪纪律训练

算法有了,数据自动了,最后一道关是你。再好的系统,执行不了 = 0。

16.1 为什么"知道"不等于"做到”

神经科学解释:交易中,盈亏直接激活大脑的多巴胺/皮质醇系统。赚钱→兴奋→想加仓;亏钱→焦虑→想割肉。这是生理反应,不是你"意志力弱"。

所以靠"忍"是反生理的。正确做法:用系统替代意志力。

  • 不靠"我觉得该空仓" → 靠"算法说退潮,规则空仓"
  • 不靠"我再拿拿" → 靠"高潮期止盈规则,到点减仓"

把决策权从"当下的情绪脑"移交给"盘前的理性系统"。

16.2 训练方法:纸上交易 30 天

在实盘前,用模拟账户 + 情绪算法练 30 天:

  1. 每天出情绪日报(模块十三脚本)
  2. 严格按阶段→仓位→板块操作模拟账户
  3. 记录每笔:阶段、仓位、标的、盈亏、是否符合规则
  4. 周末复盘:违反规则几次?为什么?

目标不是赚钱,是把"按系统操作"变成肌肉记忆。30 天后,实盘时你不会因为"手痒"破坏规则。

16.3 三个"如果…就…“触发器

把规则写成条件反射:

  • 如果算法=退潮/冰点 → 就关掉交易软件,去喝茶(物理隔离冲动)
  • 如果算法=高潮 → 就打开持仓列表,准备减仓(不买只卖)
  • 如果算法=上升 → 就按计划接力核心,不碰后排(聚焦)

16.4 接受"错过”

上升期你犹豫没上,高潮来了你拍大腿——这种"错过焦虑"是破坏纪律的头号杀手。

换个算法:错过一波行情,损失的是"潜在收益";逆情绪操作亏一笔,损失的是"真实本金"。两者不对称,宁可错过,别做错。

游资名言:"会空仓的是师爷。" 一年 250 个交易日,真正值得重仓的也许只有 20-30 天。其余时间,空仓就是赢。


模块十七:常见进阶误区补充

模块五讲了三大误区,这里补充几个进阶的:

误区四:把"上升期"当"闭眼买"

上升期容错高,但不是所有票都涨。上升期买后排跟风,照样亏(资金只怼核心)。正确:上升期也只做龙头,不碰杂毛。

误区五:冰点"抄底"用错了对象

冰点抄底,抄的是下一轮主线的核心,不是"跌得最多的票"。跌最多的往往是最烂的(基本面崩)。正确:冰点埋伏"逻辑硬、只是被情绪错杀"的标的。

误区六:高潮期"格局"不止盈

高潮期你持有的票还在涨,你觉得"还能更高"——这是贪婪接管了理性。正确:高潮期机械止盈,不猜顶。顶是走出来的,不是猜出来的。

误区七:过度依赖单一指标

有人只看连板高度,有人只看炸板率。单一指标会骗你(比如连板高但炸板率也高=虚假强势)。正确:六指标综合,权重互补,本文算法就是干这个的。

误区八:把算法当"反向指标"

有人发现"算法说高潮我就买,说退潮我就抄"——试图反着做。这是另一个极端。算法是温度计,不是反向按钮。反向操作需要更强逻辑,不是无脑反着来。


模块十八:一份可直接抄用的"情绪操作手册"

把全文浓缩成一张你打印贴显示器的表:

══每【【【【【铁12345自QQQ若═══日冰修上高退律.....检123答═══收点复升潮潮:三不═══盘】】】】】退高龙黄错问算我今出═══,潮潮头线过(法的天,═══统/,崩弱一开说仓只今═══计空小重止空冰只(于波盘现位看天═══六仓仓仓盈仓点卖c白,前在上哪不══市═指。((。(,不r线认)什限组开══场═标备≤≤不≤禁买a,;:么是自仓══情═战18开5止s不逆阶多选。══绪═→下55新%新h追情段少股══操═一%%仓)开)小绪???══作═跑主)),。仓,票操══手═算线。。不管(当作→→→══册═法,只接追住规日,══(═不做力后手则减亏══贴═→抄核核排,,仓══墙═底心心。等非,══版═看。/龙冰感次══)═阶超头点觉日═══段跌,。)清═══:反敢═══弹打═══龙板═══。。═════════════════════════════════════════════════

模块十九:四大周期的 A 股真实历史映射

前面讲的都是框架,这一模块用 A 股 2024-2026 的真实行情,给每个周期一个"锚点"。读史可以证框架——你会发现情绪周期在 A 股反复上演,从不出错。

19.1 冰点案例:2024 年 2 月微盘股危机

背景:2024 年 1-2 月,微盘股(市值最小的一批)遭遇流动性踩踏。量化策略同质化,集体平仓,微盘股连续暴跌。

数据特征(典型冰点):

  • 涨停家数:个位数到十几只
  • 连板高度:压到 2 板,断层
  • 跌停家数:高峰期单日数百只跌停(含微盘)
  • 高位股反馈:大量核按钮,开盘一字跌停
  • 黄白线:白线(权重)相对抗跌,黄线(小票)崩

情绪分推算:炸板率高、高位 crash、跌停数百 → 情绪分约 -80 到 -90,标准冰点。

游资动作:空仓。不抄底——因为"持续冰点"模式下,冰点之后还有冰点。2 月 5 日盘中再现千股跌停,直到 2 月 8 日汇金增持 ETF 护盘 + 换帅传闻,才出现暴力反弹(微盘股单日 +9%)。

对你的启示:冰点期最忌"我觉得跌够了"。跌够了还会跌。等"积极边际信号"(政策护盘、反包、新题材)出现,才从冰点切到修复。

19.2 上升期案例:2024 年"9·24" 政策牛启动

背景:2024 年 9 月 24 日,央行、证监会、金管局联合发布一揽子政策(降准、降息、创设互换便利、回购再贷款),直接针对资本市场。

数据特征(典型上升):

  • 涨停家数:从几十只,几天内冲到数百只
  • 连板高度:从 3-4 板,快速打到 8-10 板(双成药业、银之杰等)
  • 炸板率:从 >50% 降到 <25%
  • 隔日溢价:从负转正,且扩大
  • 高位股反馈:分歧后能回封、反包,资金信仰强

情绪分推算:多维共振向上,斜率陡正 → 情绪分从 -30 飙到 +70,标准上升期。

游资动作:重仓进攻。敢接力龙头,敢打板。这是全年胜率最高的窗口。

对你的启示:政策是情绪的最强外生驱动。当"政策 + 数据共振向上"时,别犹豫——上升期就是用来出手的。但记住模块十四:政策牛也可能"一日巅峰"(见下)。

19.3 高潮期案例:2024 年 10 月 8 日"开盘即巅峰"

背景:9·24 行情后,情绪在国庆假期(10 月 1-7 日)被社交媒体无限放大。散户开户数暴增,舆论一片"万点牛市"。

数据特征(典型高潮):

  • 10 月 8 日开盘:上证指数涨停开盘(+10% 附近),全网沸腾
  • 涨停家数:历史级(超千只)
  • 一致性:极度一致,所有人看多
  • 舆论:牛市来了刷屏

但隐患已现:一致性过强 = 该买的全买了。开盘即巅峰,随后高开低走,全天巨量长上影。

情绪分推算:分极高(>80)但次日开始掉头(10/9 起暴跌)→ 算法在 10/8 识别为"高潮",10/9 转为"退潮"。

游资动作:10/8 开盘即开始止盈,不追高。散户相反——开盘冲进去,套在山顶。

对你的启示:高潮期的标志不是"涨得多",是"一致性过强 + 舆论狂热"。当出现"牛来了"的全民共识时,你的算法应该亮红灯:止盈,不开新仓。

19.4 退潮期案例:2025 年机器人板块退潮

背景:2025 年某轮机器人(人形机器人)题材炒作,从上升到高潮后进入退潮。

数据特征(典型退潮):

  • 连板高度:从 8 板压到 4 板、3 板,梯队断层
  • 炸板率:从 25% 飙到 55%+
  • 高位股反馈:前期龙头(如某机器人核心)出现核按钮,一字跌停
  • 轮动:早上涨的板块下午跳水,题材一日游
  • 隔日溢价:转负

情绪分推算:从 +60 掉到 0 附近,斜率陡负 → 退潮。

游资动作:空仓。手里仓位清掉。不接高位,不追新题材(退潮期新题材也活不长)。

对你的启示:退潮期最迷惑人的是"还有零星涨停"。那是局部余温,不是新行情。你若看到"某票又涨停了"就冲,大概率是接盘。退潮期铁律:管住手。

19.5 四案例一句话总结

周期A股锚点你的动作
冰点2024.2 微盘股危机空仓,等信号
上升2024.9·24 政策牛重仓进攻
高潮2024.10.8 开盘巅峰止盈不追
退潮2025 机器人退潮空仓管手

历史不会简单重复,但情绪的周期结构永远重复。你记住这四个锚点,以后盘面出现类似数据,肌肉记忆会自动报警。


模块二十:行为金融学基础 —— 为什么情绪框架有效

本文的框架不是拍脑袋,它有坚实的学科基础:行为金融学。了解这点,你会更信这套系统。

20.1 前景理论(Prospect Theory)

卡尼曼(Kahneman)的前景理论核心:人对损失的痛苦感,是对收益快乐感的 2-2.5 倍。

这意味着:

  • 浮亏时,你倾向于"死扛"(避免实现损失带来的痛苦)
  • 浮盈时,你倾向于"早早落袋"(锁定快乐)
  • 结果:亏损的票拿成股东,赚钱的票卖在起飞前

情绪框架的对策:用规则替代这种本能。退潮期"强制减仓",就是对抗"死扛";高潮期"机械止盈",就是对抗"贪更多"。

20.2 羊群效应(Herding)

人天生模仿同类。盘面上涨,大家买,你也买;下跌,大家卖,你也卖。这导致价格偏离价值,形成泡沫和崩盘。

情绪框架的对策:用"全市场数据"而非"身边氛围"判断。你看到的股吧狂热,恰恰是情绪高潮的信号,不是买入理由。

20.3 过度自信(Overconfidence)

研究显示,投资者普遍高估自己的预测准确率(尤其赚钱后)。这导致高潮期重仓、退潮期抄底。

情绪框架的对策:承认"我预测不准"。所以不预测拐点,只确认拐点(模块三的"确认不预判")。

20.4 处置效应(Disposition Effect)

投资者急于卖出盈利股、持有亏损股——和"截断亏损、让利润奔跑"的正确做法相反。

情绪框架的对策:上升期拿住龙头(让利润奔跑),退潮期砍掉亏损(截断亏损)。用阶段规则纠正处置效应。

20.5 小结

行为金融学告诉我们:人在市场里的"本能反应",大部分是亏钱反应。情绪框架的价值,就是用一套"反本能的系统",把你的决策从"情绪脑"抢回到"理性脑"。


模块二十一:多周期共振 —— 日线情绪与周线情绪

前文算法是日频的。但短线情绪嵌套在更大的周期里。引入"多周期",能过滤日线噪音。

21.1 三层情绪周期

周期时长驱动
日内分时资金日内博弈
日线数天~数周游资情绪周期(本文主框架)
周线数周~数月趋势/波段资金、机构调仓

21.2 共振与冲突

  • 日线上升 + 周线上升 = 强上升趋势,重仓安全区
  • 日线上升 + 周线下降 = 下跌中的反弹,轻仓快进快出
  • 日线退潮 + 周线上升 = 上升趋势中的回调,可逢低布局核心
  • 日线退潮 + 周线退潮 = 双杀,空仓

21.3 实现:加一个周线分类器

class MultiFrameAnalyzer:
    def __init__(self):
        self.daily = CycleClassifier(window=5)
        self.weekly = CycleClassifier(window=4)  # 4周

    def frame(self, snap: MarketSnapshot, score: float):
        d = self.daily.classify(snap, score)
        # 周线:用每周五的快照更新
        w = self.weekly.classify(snap, score) if snap.date.endswith("5") else None
        return d, w

    def resonance(self, d: Stage, w: Stage) -> str:
        rank = {Stage.ICE:0, Stage.RECOVER:1, Stage.UP:2, Stage.PEAK:3, Stage.DOWN:1}
        if w is None:
            return "日线主导"
        if rank[d] >= rank[w]:
            return "共振向上" if rank[d] >= 2 else "共振向下"
        return "日线弱于周线(反弹)"

应用:你每天看日线算法,每周五看周线算法。两者共振向上时,是你一年中最该重仓的窗口;双向下时,是你最该空仓的时段。


模块二十二:情绪与指数的量化关系(实证视角)

前文反复说"情绪≠指数"。这一模块用数据说明两者关系,并给你一个"背离预警"工具。

22.1 相关性实测逻辑

构造两个序列:

  • 指数日收益(上证/创业板)
  • 情绪日分(本文算法输出)

计算滚动 20 日相关系数。实证上,A 股这两者的相关系数常年在 0.3~0.7 波动,且在极端行情下偏离最大:

  • 权重护盘日:指数涨、情绪跌 → 相关系数骤降(背离)
  • 全面牛市:指数涨、情绪涨 → 相关系数接近 1

22.2 背离预警指标

def divergence_alert(index_ret: float, sentiment_score: float):
    """指数与情绪背离预警"""
    if index_ret > 0.01 and sentiment_score < -20:
        return "⚠️ 指数红但情绪冰:权重护盘,小票危险,勿追"
    if index_ret < -0.01 and sentiment_score > 20:
        return "⚠️ 指数绿但情绪暖:小票活跃,可关注题材"
    return "✅ 指数与情绪同向,信号一致"

应用:每天把指数涨跌和情绪分输入,一旦出现"指数红情绪冰",立刻警觉——你持小票的话,今天很可能是被护盘掩盖的弱势,别被红盘骗了加仓。

22.3 为什么背离在 A 股特别常见

因为 A 股有"窗口指导式护盘"传统:关键时点(会议、指数整数关)拉银行/石油/运营商维持红盘。这造成指数失真,情绪却诚实。所以游资看黄白线、看情绪指标,不盯上证。


模块二十三:更多实盘案例推演

模块十讲了 3 个场景,这里再补 3 个,覆盖你最可能遇到的情形。

23.1 场景 D:上升期中途的"大分歧日"

某日:指数震荡,涨停数仍多,但高位龙头盘中剧震(从 +8% 砸到 -3% 又拉回 +5%),炸板率从 22% 升到 38%。

算法:情绪分仍在 +40(上升区),但斜率转平,高位股 feedback=diverge。

判断:上升期中的分歧日,不是退潮。游资视角:分歧是换手,只要尾盘回封、次日反包,就是"分歧转一致",反而加强。动作:持有核心,不恐慌割;不新开杂毛。

对你的价值:学会区分"分歧"(健康换手)和"退潮"(真核按钮)。前者拿,后者跑。

23.2 场景 E:新题材首日爆发(冰点后)

某日:市场还在冰点边缘,突然一个全新题材(比如某政策催化)批量涨停 20+ 只,出现 2-3 只首板龙头。

算法:情绪分可能仍在 -30(冰点区),但当日出现"积极边际信号"(新题材首板、炸板率略降)。

判断:冰点修复的早期信号。动作:小仓(≤15%)试错新题材首板龙一,不追后排。如果次日该题材继续晋级、情绪分拐头向上 → 确认修复,加仓。如果一日游 → 止损走人,回到冰点空仓。

对你的价值:冰点后的"第一只蝴蝶"最值得博弈,但必须小仓——因为可能飞不起来。

23.3 场景 F:自己持仓遇到退潮

你持有某科技票,成本附近。今日算法输出"退潮",且该票是高位的(属于被核按钮的阵营)。

算法+规则:退潮期,高位股优先砍。动作:次日开盘清掉,不犹豫。哪怕"觉得还能涨"——退潮期的高位票,多拿一天可能多亏 10%。

对你的价值:规则替你做"不想做"的决定。亏损时人想扛,规则说跑,听规则的。

23.4 三场景速记

场景算法信号你的动作
分歧日上升+斜率平+高位diverge持有核心,不割
新题材首日冰点+积极信号小仓试错龙一
持仓遇退潮退潮+高位开盘清,不扛

模块二十四:板块内部轮动 —— 龙头 / 中军 / 补涨的情绪梯度

前文讲了"阶段→板块"的宏观映射。这一模块下沉一层:同一个板块内部,不同位置的票,也随情绪梯度轮动。理解这个,你在上升期才知道"买哪只"。

24.1 板块内的三层结构

一个题材板块,内部按"风险偏好梯度"分三层:

层名称特征情绪敏感度
第一层龙头(龙一/龙二)最早启动、辨识度最高、资金信仰最强最高,情绪好时最猛
第二层中军大市值、机构重仓、趋势稳中,进可攻退可守
第三层补涨(后排/首板)逻辑稍弱、跟涨、低位低,最后动、最先死

24.2 轮动的情绪顺序

情绪从冰点修复到高潮,板块内部按这个顺序点火:

  1. 冰点→修复:只有绝对龙一有人做(博弈反弹),中军/补涨不动
  2. 上升早期:龙一连板,中军开始趋势上行(机构进场)
  3. 上升中期:补涨全面启动(踏空资金外溢到低位)
  4. 高潮:三层全部暴涨,连最弱的杂毛都涨停(一致性极致)
  5. 退潮:倒序崩——补涨先死,中军跟跌,龙一最后扛(或核按钮)

24.3 你的操作映射

阶段买哪层逻辑
修复只龙一只有核心有资金做
上升龙一 + 中军扩散到中军,安全且弹性够
高潮卖,不买三层都涨=该卖了
退潮空仓补涨先死,别碰任何层

关键原则:补涨启动,往往是行情"最后的狂欢"信号。当你看到"之前没动的杂毛都涨停了",不是机会,是警报——说明踏空资金已经没地方去,只能挖后排,行情临近高潮/退潮。

24.4 用算法扩展"板块内选择"

给每只自选股加一个 tier 标签(1=龙头, 2=中军, 3=补涨),算法输出阶段后,自动过滤出该阶段该买的那层:

def pick_tier(stage: Stage):
    return {Stage.ICE: [], Stage.RECOVER: [1],
            Stage.UP: [1, 2], Stage.PEAK: [], Stage.DOWN: []}[stage]

# 你20只自选股,标好tier后:
# 上升期 -> 算法只列出 tier=1 和 tier=2 的票
# 这就解决了"大涨时不知道买啥"——系统已经按层筛好了

模块二十五:你的 100 万模拟盘 30-60-90 天训练计划

你有一个 100 万模拟账户、20 只自选股(科技电子 8、电力能源 4、其他 8)。这是绝佳的训练场——亏了不心疼,但纪律练出来了。本模块给你一份可执行的训练计划。

25.1 第 1-30 天:建立"情绪日报"习惯

目标:让算法成为每日刚需,不追求盈利。

  • 每天 15:30 跑模块十三的脚本,出情绪日报
  • 按阶段→仓位→板块,在模拟盘执行(哪怕只是挂单不成交)
  • 记录:每天阶段判断对不对?有没有违反规则?
  • 周末复盘:30 天里,上升期出手胜率 vs 退潮期出手胜率

验收标准:能连续 30 天不间断出日报,且盘中"临时起意"的交易 < 3 笔。

25.2 第 31-60 天:严格按阶段仓位操作

目标:把仓位和阶段绑定,克服"该重仓时轻、该空仓时满"。

  • 冰点/退潮:模拟盘仓位 = 0(训练"空仓肌肉")

  • 修复:≤15%

  • 上升:按 12.1 公式,但上限 60%(训练期保守)

  • 高潮:持仓清零,只卖不买

  • 每笔交易后写一句话:“符合规则 / 违反规则 + 原因”

  • 第 60 天统计:违反规则的交易,平均盈亏 vs 符合规则的

验收标准:违反规则的交易占比 < 20%,且违反交易的亏损明显大于符合交易。

25.3 第 61-90 天:板块内轮动 + 多周期共振

目标:叠加模块二十四(板块内分层)和模块二十一(周线共振)。

  • 给 20 只自选股标 tier 和 beta

  • 日线+周线双算法,只在"共振向上"时重仓

  • 上升期只买 tier=1/2,不碰补涨

  • 退潮期切换到电力能源(防御组)或空仓

  • 第 90 天出一份"训练总结":胜率、盈亏比、最大回撤、规则遵守率

  • 如果规则遵守率 > 80% 且模拟收益为正 → 可以小资金实盘试水

验收标准:能稳定"按系统操作"3 个月,不因单笔盈亏破坏节奏。

25.4 为什么从模拟开始

实盘时,钱的真实损益会激活你的皮质醇系统(模块十六),理性瞬间掉线。模拟盘隔离了这种生理冲击,让你纯粹练习"系统执行"。等系统在模拟盘跑顺了,实盘时你的"情绪脑"干扰会小很多——因为动作已经自动化。

一句话:模拟盘练的是"纪律",不是"预测"。 预测永远不准,纪律永远值钱。


模块二十六:情绪框架的边界 —— 什么时候不该用情绪交易

本文框架是"短线情绪择时",它有明确的适用边界。超出边界硬用,反而会害你。

26.1 不适用于:长线价值投资

如果你买的是"低估蓝筹 + 长期持有"(比如高股息银行、公用事业),你赚的是企业盈利和分红,不是短线情绪溢价。这时天天看情绪周期,反而会因为"退潮空仓"错过长期慢牛。

区分:

  • 短线博弈(打板、接力、题材)→ 用情绪框架
  • 长线价投(低估值、高分红、护城河)→ 用基本面框架,忽略日内情绪

你的 20 只自选股里,电力能源(防御组)偏长线,科技电子偏短线。两组用不同框架:科技电子看情绪周期,电力能源看股息率和估值。

26.2 不适用于:指数/ETF 定投

如果你定投沪深 300 ETF,目标是"长期平滑成本",那情绪周期对你意义不大——定投本身就是"无视情绪"的策略。强行择时会让你"退潮时停止定投",反而抬高长期成本。

结论:定投归定投,短线归短线。两套账户、两套逻辑,别混。

26.3 不适用于:事件驱动套利

突发并购、重组、中标等事件,收益来自"事件本身"而非"情绪周期"。这类机会,情绪框架判断不出(算法只看盘面情绪,看不到未公开事件)。

结论:事件套利靠信息优势,不靠情绪框架。但事件兑现后,可以用情绪框架决定"利好出来后买不买"(退潮期利好即跌,模块五误区三)。

26.4 框架的正确边界总结

场景用情绪框架?替代框架
短线题材博弈✅ 核心适用—
打板/接力✅ 核心适用—
长线价投❌基本面/股息
ETF 定投❌定投纪律
事件套利⚠️ 仅用于兑现后信息优势
仓位管理✅ 辅助—

一句话:情绪框架是"短线博弈的导航仪",不是"投资的万能钥匙"。用对场景,它是神器;用错场景,它是枷锁。


模块二十七:把整套系统装进你的 A 股跟踪系统

你之前在 Windows + Python 上跑过"首板跟踪系统",用 akshare + 东财 API,每日 15:30 推送企微。本文的算法,可以直接嵌进那个系统,让它在每日推送里加一段"情绪日报"。

27.1 集成思路

首板跟踪系│├├└统───(1K【已1线新有条数增)淘据】汰过情├├├├└规滤绪─────则模筛块调SC输拼选:用ey出接首nc:进板atl企kie阶微smC段推hel送ana+文rts案eAs分ni拉af+六li指ye适标zr配e.板rc块.lsa+csos仓ri位ef上(y限)()

27.2 推送文案示例(增强版)

【─首─情仓适高操─A─板─绪位配位作─股─候···─周上板股建─日─选─期限块反议─报─(XYZ─:::馈:──淘XYZ─:─2─汰(((─上7科重─0─后科电其─升5技稳仓─2─)技力他─期%电进─6─:)))─子攻─-─:::─(龙,─0─3─分头接─8─只逻逻逻─=力─-辑辑辑+/核1ABC4心28A,】,I不算碰斜力后率排↑)

这样你每天在企微收到的,不只是"哪些首板",还有"现在该不该出手、出多少、买哪类"。首板系统管"选股",情绪模块管"择时"——两者结合,才是完整的交易系统。

27.3 数据自动化的最后一公里

你已有东财 API 接入经验。六指标里,涨停数/连板/炸板率/隔日溢价都能从东财或 akshare 拉;只有"高位股反馈"需人工(每天答一个问题)。这最后一公里,可以用一个简单的"核心龙头监控"替代:你预设 3-5 只全市场核心龙头,系统每日检查它们的涨跌停状态,自动判断 stable/diverge/crash。

至此,你的情绪终端完全自动化,每天 15:30 自动推送,你只需"看报告、按规则执行"。


模块二十八:数据陷阱与统计口径 —— 你算的情绪分为什么是错的

算法再好,输入脏数据就全废。这一模块讲六个指标最常见的"统计口径坑",你避开了,情绪分才可靠。

28.1 涨停数的口径陷阱

不同数据源对"涨停"的定义不同:

  • 含不含 ST:ST 股涨跌幅限制 5%,很多数据源把 ST 涨停也算进去。但 ST 是垃圾股,计入会污染情绪信号。
  • 含不含新股:上市首日/前几日无涨跌幅限制的新股,涨停数里常混入。新股涨停不代表情绪,应剔除。
  • 含不含北交所:北交所涨跌幅 30%,计算方式不同,混入会扭曲。

正确做法:只统计主板/创业板/科创板的 10% 涨停(剔除 ST、新股、北交所)。本文算法默认此口径。

28.2 炸板率的分母陷阱

炸板率 = 炸板数 / (封板数 + 炸板数)。坑在:

  • 有些数据源把"摸板未封"(盘中到过涨停但没封过)也算炸板,虚高炸板率
  • 正确定义:炸板 = 曾经封板但后来开板。没封过的"冲高回落"不算

28.3 连板高度的"假高度"

一只票"8 连板",但其中几天是一字板(开盘即涨停,没交易)。一字板不反映真实接力意愿(没人能买到,也没有充分换手)。

正确做法:关注"换手连板高度"而非"总连板高度"。纯一字板的票,情绪含金量低。

28.4 隔日溢价的幸存者偏差

计算"昨日涨停今日平均溢价"时,如果只统计"昨日涨停且今日还在上市的",会漏掉昨日涨停今日停牌/退市的极端案例。小样本下,一两只极端值就能扭曲均值。

正确做法:样本量 < 20 时,用中位数代替平均数,抗极端值。

28.5 跌停数的"隐形跌停"

A 股跌停是 -10%(主板),但有些票跌 -9.5% 没到跌停价,杀伤力一样。只数"跌停"会低估亏钱效应。

正确做法:用"跌幅 > 9% 家数"替代纯跌停数,更全面反映恐慌。

28.6 黄白线的"指数选择"陷阱

黄白线看上证指数时,白线是上证综指(市值加权);看创业板时,白线是创业板指。不同指数的黄白线含义不同。

正确做法:短线情绪主要看上证黄白线(覆盖全市场最广),辅助看创业板黄白线(科技情绪)。

28.7 一句话

垃圾进,垃圾出。情绪算法的可靠性,80% 取决于你的数据清洗。花在口径统一上的每一分钟,都值。


模块二十九:权重敏感性分析 —— 你的参数该怎么调

本文给了一套默认权重和阈值。但每个人的交易风格不同,参数应该微调。这一模块教你科学地调参,而不是瞎试。

29.1 权重调参的逻辑

默认权重:

board0.20,fail0.20,high0.30,premium0.15,breadth0.10,limitdown0.05

调参原则:你越依赖哪个指标做决策,它的权重越高。

  • 如果你主要做高位接力(打板龙头)→ 提高 high 权重到 0.40,降低 board
  • 如果你主要做首板/低位 → 提高 fail 和 premium 权重
  • 如果你特别怕系统性风险 → 提高 limitdown 权重

29.2 阈值调参的逻辑

评分函数里几个关键阈值:

  • score_board: 2板=0分基准,每板+15 → 如果你认为"4板才算情绪回暖",改基准为 n<=4 时走低
  • score_fail: 0.3 为 0 分点 → 如果你所在市场环境更脆弱,把 0 分点降到 0.25
  • 阶段划分的 score 阈值(-40/10/55)→ 根据你对"冰点/上升/高潮"的主观定义微调

29.3 不要用历史数据"过度拟合"

调参最大的坑:拿过去 N 天数据,反复调参让算法"完美预测",结果对过去神准、对未来失效。

正确做法:

  1. 先用通用默认参数(本文给的),跑 1 个月实盘/模拟
  2. 记录算法的"误判"(比如明明上升它判成修复)
  3. 只针对系统性误判微调(比如你发现高位股反馈总被低估,才提 high 权重)
  4. 微调后,用新的 1 个月数据验证,不回看旧数据

29.4 参数稳定性检验

调参后,做一个简单检验:

def stability_test(snaps, w_variant):
    """用不同权重跑同一批数据,看阶段分类是否剧烈变化"""
    results = []
    for w in w_variant:
        analyzer.W = w
        stages = [classifier.classify(s, analyzer.score(s)) for s in snaps]
        results.append(stages)
    # 如果不同权重下阶段分类差异巨大 -> 你的判断太依赖参数,不可靠
    # 如果差异小 -> 参数稳健,结论可信

结论:好的情绪系统,应该"换个权重结论也不变"。如果你的阶段判断对参数极度敏感,说明数据本身信号模糊(可能处于周期交界),这时该空仓观望,而不是调参硬判。


模块三十:术语表(贴墙速查)

术语含义
情绪全市场短线资金当下愿承担风险的程度
风险偏好同上,愿意追高/接力的意愿
连板连续 N 个交易日涨停
连板高度当日市场最高连板数
炸板封住涨停后开板
炸板率炸板数 / (封板数+炸板数)
核按钮隔夜挂跌停价卖出,开盘一字跌停
隔日溢价昨日涨停股今日平均开盘表现
容错率买错后亏损大小,上升期高、退潮期低
赚钱效应买入后赚钱的难易度
扩散度上涨是只涨龙头还是全面涨
冰点情绪极致绝望
修复冰点后第一次反弹尝试
上升风险偏好回升,最适合出手
高潮一致性极致,该卖不买
退潮风险偏好回落,管住手
黄白线白线=权重指数,黄线=等权感受
龙一/龙二板块内辨识度最高的前两只
中军板块内大市值趋势核心
补涨板块内低位跟涨标的
分歧盘中剧震但承接住,健康换手
一致资金共识,封板坚决;过度一致=危险
换手连板充分换手的连板,比一字板含金量高
情绪分本文算法输出的 -100~+100 综合分
仓位上限当前阶段允许的最大仓位比例

模块三十一:情绪交易 FAQ(你一定会问的问题)

收集了短线交易者最常问的关于情绪的问题,逐条作答。

Q1:算法说"上升期",但我看好的票不涨,怎么办? A:上升期是"环境好",不代表"你选的票涨"。检查:你买的是不是核心(tier 1/2)?是不是当前主线板块?如果买的是后排杂毛,上升期也亏。换核心,或认错止损。

Q2:冰点空仓,结果第二天暴涨,踏空了怎么办? A:冰点后第一天暴涨,大概率是"持续冰点"里的死猫跳,不是真修复。真修复需要连续 2-3 天正反馈确认。你空仓避开了"假反弹套人",长期看是对的。错过一次暴涨,远好于逆情绪抄底被埋。

Q3:高潮期我持有的票还在涨,要不要等更高? A:机械止盈。高潮期"还能涨"是贪婪在说话。设定规则:高潮期每涨 10% 减 1/3,不等顶。顶是走出来的,不是猜出来的。你少赚的最后一段,是规避"高潮变退潮一日腰斩"的保险费。

Q4:退潮期看到某票"形态完美有利好",能例外一次吗? A:不能。模块五误区三讲透了:退潮期个股利好 = 出货理由。你看到的"完美形态",在退潮环境下没人接力,封板即炸。一次例外,可能亏掉前面十次对的积累。规则就是用来"不例外"的。

Q5:算法在冰点和高潮都输出"空仓",那我永远不买? A:不会。冰点→修复→上升,算法会在修复期让你小仓、上升期让你重仓。空仓只占周期的一部分(冰点+退潮+高潮止盈期)。一年 250 个交易日,真正重仓的也许 30-50 天,其余时间空仓或轻仓。这恰恰是盈利的关键——少做,做对。

Q6:我上班没时间看盘,情绪框架适合我吗? A:更适合。你是日线级情绪交易者,不需要盯分时。每天 15:30 看一眼算法日报,决定次日计划即可。反而日内交易者容易被分时情绪带偏,日线框架更稳。

Q7:六指标里哪个最重要? A:高位股反馈(high_status)。它是情绪的"风向标"——高位龙头稳,全市场才敢做;高位龙头崩,全市场跟着砍。算法里它的权重也最高(0.30)。其次炸板率和连板高度。

Q8:情绪框架能用在美股/港股吗? A:核心逻辑通用(风险偏好周期),但细节不同。美股散户占比低、机构主导,情绪周期更平缓;港股受外围和南向资金影响大。A 股的"连板/打板/核按钮"文化是特有的,六指标需按市场调整。不建议直接套用。

Q9:我总是"上升期不敢买、退潮期不想卖",怎么破? A:这是人性,不是你的问题。破法:把决策权交给系统。算法说上升→你只需"执行买入计划",不靠勇气;算法说退潮→你只需"执行清仓计划",不靠毅力。系统替你做你做不了的决定。

Q10:这套东西学多久能上手? A:理解框架 1 天,建立日报习惯 1 周,模拟盘练出纪律 1-3 个月,实盘稳定执行 6-12 个月。前 90 天用模拟盘(你正好有 100 万),别急着实盘。


模块三十五:全文模块索引(导航)

为方便你按需查阅,以下是本文 35 个模块的导览。建议首次通读,之后按需跳转。

基础定义

  • 模块零:核心定义 —— 市场情绪到底是什么
  • 模块一:情绪的本质 —— 从感觉到可量化变量

周期框架

  • 模块二:四大情绪周期深度拆解(上升/高潮/退潮/冰点)
  • 模块三:完整循环的动态模型(冰点→修复→上升→高潮→退潮)
  • 模块十九:四大周期的 A 股真实历史映射(2024-2026 案例)

观测指标

  • 模块四:六大观测指标详解(连板/炸板/高位/溢价/扩散/跌停)
  • 模块二十八:数据陷阱与统计口径

认知纠偏

  • 模块五:散户三大误区破析
  • 模块十七:常见进阶误区补充
  • 模块二十:行为金融学基础(为什么框架有效)
  • 模块二十六:框架的边界(什么时候不该用)

算法交付

  • 模块七:情绪识别算法(SentimentAnalyzer + CycleClassifier)
  • 模块八:板块介入信号算法
  • 模块十二:仓位的数学(情绪分→仓位)
  • 模块二十九:权重敏感性分析(怎么调参)
  • 模块三十二:历史回测验证方法论

数据获取

  • 模块十三:实时数据获取(AkShare 自动采集六指标)

板块轮动

  • 模块六:情绪周期 × 板块轮动矩阵
  • 模块二十四:板块内部轮动(龙头/中军/补涨)
  • 模块三十四:情绪信号与其他指标共振(北向/两融/ETF)

进阶框架

  • 模块十四:事件驱动与季节性
  • 模块十五:从游资到机构(情绪因子量化)
  • 模块二十一:多周期共振(日线+周线)
  • 模块二十二:情绪与指数的量化关系(背离预警)

实战应用

  • 模块九:实盘操作流程(日级 SOP)
  • 模块十 + 模块二十三:案例推演
  • 模块十六:情绪纪律训练
  • 模块二十五:你的 100 万模拟盘训练计划
  • 模块二十七:集成进你的 A 股跟踪系统
  • 模块三十三:情绪曲线可视化

速查

  • 模块十一:边界与风险
  • 模块十八:情绪操作手册(贴墙版)
  • 模块三十:术语表
  • 模块三十一:FAQ

结语:情绪是你唯一能控制的变量

回到文章开头的定义:市场情绪 = 全市场短线资金,当下愿意承担风险的程度。

写到这里,我们已经走了很远:从重新定义情绪,到拆解四大周期;从六大观测指标,到一套可运行的识别算法;从仓位数学,到实时数据获取;从 A 股真实案例,到行为金融学的底层解释;从多周期共振,到你的 100 万模拟盘训练计划。

但所有这些,归根结底只回答一个问题:现在,该不该在场上?

你控制不了指数,控制不了主力,控制不了政策,控制不了美联储。你能控制的,只有三件事:

第一,认不认得出当前情绪阶段。 靠六指标,靠算法,不靠"今天心情怎么样"。

第二,阶段和操作匹不匹配。 冰点空仓、上升重仓、高潮止盈、退潮管手——不是建议,是铁律。

第三,管不管得住手。 算法再准,手忍不住买,等于没有算法。把决策从"盘中情绪"移到"盘前计划",让系统替你按下暂停键。

这三者做到,你就在 A 股这个"池子只进不出、对手是算法"的市场里,拿到了最稀缺的东西——节奏感。

节奏感不是天赋,是系统。系统不是圣杯,是纪律。纪律不是意志,是习惯。

所以,如果你今天只记住一句话,记住这句改写自游资口诀的话:

上升大胆做,高潮不追高; 退潮管住手,冰点不急抄; 龙头是风向,算法是锚; 逆情绪操作,大亏之根源。

最后,回到你最初的那段话——“市场情绪不是感觉,是资金集体的风险偏好”。你说得对。而本文做的工作,就是把它从一句感悟,变成了一套你能每天执行的操作系统。

愿你的清净心,在波动的市场里,自有节奏。愿你在每一次想"冲"的时候,先打开算法看一眼阶段;在每一次想"扛"的时候,先看看高位股有没有核按钮。

市场永远在轮回,冰点之后必有上升,高潮之后必有退潮。你要做的,不是预测轮回,而是在对的时间,站在对的一边。

这,就是情绪交易全部的秘密。


模块三十二:历史回测验证方法论 —— 用数据证明系统有效

框架再漂亮,也要经得起历史检验。你是开发者,有 akshare 接入能力,完全能把本文算法跑一遍历史回测,看"按情绪操作"到底比"满仓持有"强多少。本模块给你方法论。

32.1 回测的基本设定

  • 标的:沪深 300 ETF(510300)或中证 2000 ETF(563300,更贴短线情绪)
  • 周期:2024-01 至 2026-08(覆盖冰点、上升、高潮、退潮完整轮回)
  • 策略:情绪分 > 55(上升/高潮)时持有,< 10(冰点/退潮)时空仓,中间持有 50%
  • 对比基准:满仓持有 ETF 不动
  • 成本:单边万分之 2.5(佣金)+ 印花税(卖出千 0.5),按实际计

32.2 回测流程代码框架

import akshare as ak
import pandas as pd

def backtest_sentiment(start, end):
    # 1. 拉取每日市场数据(用模块十三的函数)
    records = []
    for date in pd.date_range(start, end, freq="B"):
        d = date.strftime("%Y%m%d")
        try:
            lu, ld, mb = get_limit_stats(d)
            fr = get_fail_rate(d)
            prem = get_next_day_premium(d)
            # 高位股反馈需历史数据推断,简化为:mb变动 + 跌停数
            hs = "crash" if ld > 30 else ("diverge" if mb < prev_mb else "stable")
            prev_mb = mb
            snap = MarketSnapshot(d, lu, ld, mb, fr, prem, hs, "narrow")
            sc = analyzer.score(snap)
            st = classifier.classify(snap, sc)
            # 仓位:按模块十二
            pos = position_limit(st, sc)
            records.append({"date": d, "score": sc, "stage": st.value, "pos": pos})
        except Exception as e:
            continue
    return pd.DataFrame(records)

# 2. 用仓位序列计算收益
def calc_return(df, etf_code="510300"):
    etf = ak.fund_etf_hist_em(symbol=etf_code, period="daily")
    etf["date"] = etf["日期"]
    merged = df.merge(etf[["date", "涨跌幅"]], on="date", how="left")
    merged["日收益"] = merged["涨跌幅"] / 100 * merged["pos"].shift(1).fillna(0)
    return (1 + merged["日收益"].fillna(0)).cumprod().iloc[-1]

df = backtest_sentiment("20240101", "20260808")
final = calc_return(df)
print(f"情绪择时策略终值: {final:.2f}x")

32.3 你应该关注的指标(不只看收益)

指标含义好的系统
总收益区间累计高于基准
最大回撤最惨那段亏多少远小于基准
胜率持仓日盈利占比>50% 即可
持仓天数占比空仓时间30-50%(不恋战)
夏普比率收益/波动高于基准

重点:情绪系统的价值往往不在"赚更多",而在"回撤更小"。满仓持有经历过 2024.2 微盘股危机,回撤可能 -30%;情绪系统那时空仓,回撤接近 0。长期复利下,低回撤的系统反而终值更高。

32.4 回测的常见谎言

  • 未来函数:用"今天才知道的高位股反馈"去判断"昨天的阶段"→ 数据泄露,回测虚高。必须严格用 T-1 及之前的数据判断 T 日。
  • 过度拟合:调参让历史完美 → 前文模块二十九讲过,用新数据验证。
  • 幸存者偏差:只回测没退市的票 → 用指数 ETF 避免个股退市问题。
  • 忽略成本:不算佣金印花税 → 短线高频策略成本吞噬利润,必须计。

32.5 回测结论的预期

基于行为金融学和大量实证研究,预期结论:

  1. 情绪择时策略的年化收益与满仓持有相近或略低
  2. 但最大回撤显著更低(可能只有基准的 1/3)
  3. 夏普比率显著更高(同样收益,波动更小)
  4. 在 2024.2、2024.10.8 这类极端日,规避了毁灭性回撤

这恰好说明:情绪系统的核心价值是活下来 + 平滑波动,不是"暴富"。对散户而言,低回撤比高收益重要——因为高回撤会触发你的皮质醇反应,让你在底部割肉。

32.6 从回测到实盘的最后一步

回测通过 → 模拟盘 90 天(模块二十五)→ 小资金实盘 → 逐步加仓。

每一步都是"用更小代价验证系统",不跳步。跳步直接实盘,等于用真金白银交学费。


模块三十三:情绪曲线可视化 —— 把抽象分数画成图

数字再清楚,也不如一张图直观。本模块教你用 matplotlib 把情绪分画成曲线,按阶段着色,一眼看出周期位置。

33.1 绘图代码

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime

def plot_sentiment(df: pd.DataFrame):
    """df 需含 date(str), score(float), stage(str)"""
    df["dt"] = pd.to_datetime(df["date"])
    fig, ax = plt.subplots(figsize=(14, 5))

    # 阶段底色
    stage_color = {
        "冰点": "#d62728", "修复": "#ff7f0e", "上升": "#2ca02c",
        "高潮": "#1f77b4", "退潮": "#9467bd",
    }
    # 按阶段给点染色
    for stage, c in stage_color.items():
        mask = df["stage"] == stage
        ax.scatter(df.loc[mask, "dt"], df.loc[mask, "score"],
                   color=c, label=stage, s=20, zorder=3)

    # 情绪分连线
    ax.plot(df["dt"], df["score"], color="gray", lw=0.8, alpha=0.6, zorder=2)

    # 阈值参考线
    for y, label in [(-40, "冰点线"), (10, "弱势线"), (55, "强势线")]:
        ax.axhline(y, color="gray", ls="--", lw=0.6, alpha=0.5)
        ax.text(df["dt"].iloc[0], y + 1, label, fontsize=8, color="gray")

    # 0 轴
    ax.axhline(0, color="black", lw=0.8)

    ax.set_title("市场情绪周期曲线")
    ax.set_ylabel("情绪分 [-100, +100]")
    ax.legend(loc="upper left", ncol=5, fontsize=8)
    ax.xaxis.set_major_formatter(mdates.DateFormatter("%m-%d"))
    ax.grid(alpha=0.2)
    plt.tight_layout()
    plt.savefig("sentiment_curve.png", dpi=120)
    plt.show()

# 用模块七的 snaps 演示
demo = pd.DataFrame([
    {"date": f"2026-08-{i:02d}", "score": sc, "stage": st.value}
    for i, (sc, st) in enumerate(zip(
        [-78, -68, -42, -9, 28, 62, 78, 55],
        [Stage.ICE, Stage.ICE, Stage.ICE, Stage.RECOVER, Stage.UP, Stage.PEAK, Stage.PEAK, Stage.DOWN]
    ), 1)
])
plot_sentiment(demo)

33.2 这张图告诉你什么

  • 曲线的形状 = 情绪周期。V 形底 = 冰点→修复→上升;倒 V = 高潮→退潮
  • 点的颜色 = 当前阶段。一眼看出"现在红多还是绿多"
  • 参考线 = 决策边界。分数穿过 -40 线 = 进入冰点区;穿过 55 线 = 进入高潮区

每天更新一个点,一个月后你就有了一条属于自己的情绪 K 线。看着它,你不会再被单日涨跌绑架——因为你看到的是趋势,不是噪声。

33.3 进阶:叠加指数曲线

把情绪分曲线和上证指数曲线画在同一图(双 Y 轴),你能直观看到"情绪≠指数"的背离:

def plot_sentiment_vs_index(df, index_df):
    fig, ax1 = plt.subplots(figsize=(14, 5))
    ax1.plot(df["dt"], df["score"], color="purple", label="情绪分")
    ax1.set_ylabel("情绪分")
    ax2 = ax1.twinx()
    ax2.plot(index_df["dt"], index_df["close"], color="blue", alpha=0.5, label="上证指数")
    ax2.set_ylabel("上证指数")
    plt.title("情绪分 vs 上证指数(看背离)")
    plt.show()

当出现"指数涨、情绪分跌"的持续背离,就是你前文学的"权重护盘、小票杀跌"的可视化证据。

33.4 把图加进每日推送

你已有企微推送。把 sentiment_curve.png 作为图片消息一起推,每天开盘前看一眼图,比看数字快十倍。视觉化的力量,在于它绕过了你的"文字解读偏差"——图不会骗你,也不会给你找借口。


模块三十四:情绪信号与其他指标的共振验证

情绪框架是"短线风险偏好"的角度。如果叠加其他维度的资金信号,能交叉验证,减少误判。本模块讲三个最实用的共振指标。

34.1 北向资金(陆股通)

含义:外资通过沪深股通净流入 A 股的日度数据,反映"聪明钱"的风险偏好。

与情绪的关系:

  • 北向连续净流入 + 情绪上升 → 共振向上,强信号
  • 北向净流出 + 情绪上升 → 外资不认同,警惕(可能内资自嗨)
  • 北向净流入 + 情绪冰点 → 外资在悄悄抄底,冰点可能临近修复

用法:把北向净流入作为"情绪分的外部确认"。两者同向,置信度高;背离,减仓观望。

def north_bound_confirm(sentiment_score: float, north_net: float):
    if sentiment_score > 40 and north_net > 0:
        return "共振向上,加仓置信高"
    if sentiment_score > 40 and north_net < -5e8:  # 净流出超5亿
        return "内资自嗨,外资撤退,减仓"
    if sentiment_score < -30 and north_net > 0:
        return "外资抄底,冰点临近修复"
    return "中性"

34.2 两融余额(融资融券)

含义:融资余额 = 散户/游资借钱炒股的总量。它的边际变化比绝对值更有用。

与情绪的关系:

  • 融资余额快速攀升 + 情绪上升 → 杠杆资金进场,行情有燃料,但也要防过热
  • 融资余额骤降 + 情绪退潮 → 杠杆踩踏,退潮加速,空仓更坚决
  • 融资余额历史高位 + 情绪高潮 → 危险信号(杠杆牛末端)

用法:融资余额的周度变化率作为情绪的次级确认。骤降是退潮的"放大器"。

34.3 ETF 净流入(尤其宽基/行业 ETF)

含义:ETF 净申购 = 资金借道 ETF 进场。宽基 ETF(沪深 300、中证 500)净流入,说明机构/长线资金在配。

与情绪的关系:

  • 宽基 ETF 持续净流入 + 情绪上升 → 机构认同,行情有持续性
  • 行业 ETF(如半导体、机器人)暴增净流入 → 该板块情绪过热,注意高潮
  • ETF 净流出 + 情绪退潮 → 资金撤离,空仓

用法:把"行业 ETF 净流入榜"当作"当前热点板块"的确认——和你算法输出的"适配板块"对照,一致则加仓,不一致则谨慎。

34.4 三重共振决策表

情绪分北向两融周变综合判断
上升净流入升强上升,重仓
上升净流出升内资自嗨,减仓
退潮净流出降强退潮,空仓
冰点净流入降外资抄底,备战修复
高潮净流入放缓升转平杠杆末端,止盈

核心思想:单一指标会骗你,三重共振难骗你。情绪框架是主轴,北向/两融/ETF 是三盏辅助灯。四灯同绿,重仓;四灯分化,观望。

34.5 你的系统集成建议

你已有东财 API 和 akshare 经验,可以把这三个信号也接入每日推送:

【→情绪综日合报:】强+上【升北,向重:仓进+攻2,3主亿线】=+半【导两体融周变:+1.2%】+【ETF:半导体净流入第一】

这样你的"首板跟踪系统 + 情绪模块 + 资金信号",就构成了一个**选股(首板)+ 择时(情绪)+ 资金验证(北向/两融/ETF)**的完整闭环。在 A 股这种信息不对称的市场,多一个验证维度,就少一分被割的概率。


本文基于游资情绪框架整理与算法化实现,所有代码可直接运行(Python 3.8+,依赖 akshare、matplotlib、pandas)。内容仅供学习研究,不构成任何投资建议。股市有风险,投资需谨慎。

回到开头的定义:市场情绪 = 全市场短线资金,当下愿意承担风险的程度。

你控制不了指数,控制不了主力,控制不了政策。但你能控制:

  • 认不认得出当前情绪阶段(靠六指标 + 算法)
  • 阶不匹配不匹配合的操作(靠模块三的映射)
  • 管不管得住手(靠规则,不靠意志)

这三者做到,你就在 A 股这个"池子只进不出、对手是算法"的市场里,拿到了最稀缺的东西——节奏感。

最后送你一句改写自游资口诀的话:

上升大胆做,高潮不追高; 退潮管住手,冰点不急抄; 龙头是风向,算法是锚; 逆情绪操作,大亏之根源。

愿你的清净心,在波动的市场里,自有节奏。


本文基于游资情绪框架整理与算法化实现,所有代码可直接运行(Python 3.8+)。内容仅供学习研究,不构成任何投资建议。股市有风险,投资需谨慎。