作者:老余捞鱼
原创不易,转载请标明出处及原作者。

文中示例仅用于技术讨论,不构成任何操作建议。
量化策略开发应以学习和技术交流为目的。
本号不荐股、不卖课、不承诺收益。
市场有风险,请合法合规投资。
本文约 2300 字 | 预计阅读 5 分钟,后有源代码下载地址,建议先收藏。
· · ·
最近看到一篇很有意思的分析,篇幅很短但信息密度极高。
核心就干了一件事:把”市场现在是泡沫还是恐慌”这个纯感觉问题,翻译成了一个数学问题。
这个框架我在做量化策略时也用过类似思路,这次用 NVDA 和 META 的实盘数据跑了一遍,直观到不需要任何金融背景就能看懂,有兴趣的请往下看。
一、情绪是散户最贵的成本
不管你承认不承认,散户的决策路径基本上都长这样:
- 涨的时候怕踏空 → 高位追进去;
- 跌的时候怕深套 → 割在地板上。
这两个动作的背后是同一个原因:你在用情绪做仓位决策。FOMO(Fear Of Missing Out)和恐慌抛售是同一枚硬币的两面。
有没有办法把这个问题结构化?答案之一是看下面这套非常轻量的方案。
核心思路:不看方向,只判断位置。当价格偏离正常范围太远了,均值回归的概率就会急剧上升。你需要的是一个能告诉你”现在有多不正常”的数字。
二、3步搭建情绪温度计
这个框架叫 Riding the Waves:”乘风破浪”。名字起得好。不是问波浪什么时候来,是在波浪最极端的时候识别出它的位置。

框架只有三层逻辑,我来按顺序拆:
第一层:找一个”引力中心”
用 50 日均线(SMA 50)作为基准线。为什么非要用 50 ?因为 50 个交易日约等于一个季度,既保留了中短期趋势,又足够平滑,能过滤掉日内的噪声。
核心规则:价格在 SMA50 上方偏离越远,向下回归的引力越强;在 SMA50 下方偏离越远,向上回归的引力越强。
第二层:算偏离度,但用”这个股票自己的标准”
不是所有偏离都是极端。你用 50 日均线算出一个比率:
Price / SMA50 = 偏离比率比如比率 1.15 就是价格高于均线 15%,0.85 就是低于均线 15%。
但这个数字本身没有意义。NVDA 这种高波动股的正常偏离范围完全不同。所以拉过去 3 年的偏离比率数据,算出:
- 均值(μ):这个股票”正常”的偏离水平
- 标准差(σ):这个股票”正常”的波动幅度
第三层:Z-Score → Risk Score,把数学变成直觉
Z-Score = (当前偏离比率 - 历史均值) / 历史标准差然后用正态分布的累积分布函数(CDF)把 Z-Score 映射成 0 到 100% 的概率:
Risk Score = norm.cdf(Z_Score) × 100结果:
- Risk Score > 95%→ 当前价格相对于 SMA50 的偏离程度,在过去 3 年的历史中排进前 5%。这是泡沫区。历史上这个时候往下走的概率远大于继续涨。
- Risk Score < 5%→ 当前偏离排进后 5%。这是恐慌区。卖方已经枯竭。
区间中间那些 Risk Score(比如 30%、60%),模型的态度是”没什么特别”:既不够贵也不够便宜,不值得做动作。
这种”只在极端时发出信号”的设计,恰恰是这个框架最聪明的地方。大多数指标的问题是噪音太多、信号太杂,你分不清哪个该听。Risk Score 的设计哲学是:只有真正极端才出声,其他时候闭嘴。
三、用 NVDA 和 META 跑一遍实盘
理论讲完了,直接看图。

先看 NVDA。上面是价格走势 + SMA50(蓝色虚线),Risk Probability%在下面红区。
注意 2024 年初:Risk Score 冲到了接近 100% 的位置,同时价格在图表上用红叉标了 Market Bubble。随后发生了什么?NVDA 从 90 多跌到了 70 附近,跌幅超过 20%。
再看 2024 年中和 2025 年的几个绿三角:Risk Score < 5%,标了 Panic Sell。每一次绿三角出现之后,NVDA 都开启了一段上涨。不是精准判断,是统计概率:当偏离程度极端到历史后 5% 时,均值回归的胜率会大幅提高。

META 同样清晰。2024 年初的红叉泡沫信号之后经历了大回撤。之后多次绿三角恐慌信号,同样对应了阶段性底部。
值得注意的是,两张图的 Risk Probability 曲线波动节奏完全不同。NVDA 的震荡更剧烈、更频繁,META 的相对缓和。这正是”3 年历史统计”这一步的意义:每只股票有自己的波动 DNA,你不需要拍脑袋决定”偏离多少算极端”,让历史数据自己说话。
四、这个框架能做和不能做的
接下来说清楚边界,比画大饼更重要。
它能做的:在极端情绪区域给你一个客观的”锚”。当所有人喊着”这次不一样”往上冲的时候,Risk Score > 95% 是一瓢冷水。当所有人觉得”完了要归零”的时候,Risk Score < 5% 是一盏灯。它不解决方向问题,它解决的是”现在脑子热不热”的问题。
它不能做的:不能精准判断顶部和底部的位置。Risk Score > 95% 不代表明天就跌,有可能在泡沫区呆好几天甚至几周才反转。同样,<5% 也不代表立即反弹。它是概率分布,不是水晶球。
最适合的使用场景:仓位管理工具,而不是进出场信号。Risk Score > 95% 时降低仓位或收紧止损,<5% 时开始分批逐步入场或减少空头敞口。把它放在你现有交易系统的”情绪过滤器”位置,而不是替代你的进出场逻辑。
五、源代码分享
下面我附了 Google Colab 链接,全开源,你可以直接在上面换 ticker、换参数跑自己的结果。
https://colab.research.google.com/drive/1qc41vs7_TAPrD6ZL5Gzl_dzj9bDO7hSx#scrollTo=O2OMoTUD3ILS
核心代码就几行,逻辑非常干净:
# 计算 SMA50 和偏离比率
data['SMA_50'] = data['Close'].rolling(50).mean()
data['Price_SMA50_Ratio'] = data['Close'] / data['SMA_50']
# 用 3 年历史算 Z-Score
mu = data['Price_SMA50_Ratio'].mean()
sigma = data['Price_SMA50_Ratio'].std()
data['Z_Score'] = (data['Price_SMA50_Ratio'] - mu) / sigma
# 转成 Risk Score
data['Risk_Score'] = norm.cdf(data['Z_Score']) * 100我们团队内部也在使用类似的指标,但这个版本的好处是极简,好上手。你甚至不需要用 Python,用 AI 转一转,就能在 TradingView 的 Pine Script 里使用。
如果你跑完之后想进一步优化,两个方向值得尝试:
- 把 SMA 50 换成 EMA 30 或 EMA 60,看哪个在你的标的上效果更好。A 股有些品种波动结构跟美股不一样。
- 把 95%/5% 阈值换成自定义分位数。有些标的 90%/10% 可能更实用,密度更高、信号更多。你改两行代码就能对比。
你平时怎么判断市场过冷过热?有没有自己用得很顺的情绪指标?评论区聊聊。
#市场情绪 #ZScore #泡沫检测 #恐慌抛售 #NVDA #META #SMA50 #量化思维 #RiskScore #技术指标
老余捞鱼 · 用数据冷眼看市场
Be First to Comment