【Python量化实战宝典 #22】涨跌停、连板情绪手册:情绪指标构建(Python 可跑)
手册定位:模块三第 6 篇。市场情绪是择时的「温度表」------涨停数量多、连板高度高代表风险偏好强;反之恐慌。本篇讲用涨跌停/连板数据构建情绪指标。
数据来源复用 #01 涨跌股池(
/hs/pool/ztgc/{date}、/hs/pool/dtgc/{date})+ #02 历史K线。
1. 你将得到什么
- 每日涨停数、跌停数、连板高度的取数(涨跌停股池端点);
- 情绪温度指数(涨停/跌停比 + 连板高度归一)的构建;
- 用情绪指标做「冰点买入、沸点减仓」的反向择时;
- 情绪指标的 4 个坑(牛熊基准不同、一字板、新股、样本偏差)。
2. 取数约定(复用)
| 信号 | 来源端点 | 见 |
|---|---|---|
| 涨停股池 | /hs/pool/ztgc/{日期} |
#01 |
| 跌停股池 | /hs/pool/dtgc/{日期} |
#01 |
| 连板需逐日追踪 | 涨停股池 + 历史 | #01/#02 |
3. 数据来源(复用,不重复罗列)
详见 #01 实时行情接口手册(涨跌股池 /hs/pool/*)。
4. 核心模板函数(自包含可跑)
python
import pandas as pd
import numpy as np
_MOCK = True
def sentiment_index(zt_count, dt_count, max_board, window=20):
"""情绪温度:涨停/跌停比 与 连板高度 归一后合成 0~1。"""
ratio = zt_count / max(dt_count, 1) # 涨停/跌停比
# 比例取 log 压缩,连板高度直接归一
r_norm = np.log1p(ratio) / (np.log1p(ratio) + 1)
b_norm = min(max_board / 10.0, 1.0) # 连板以10板为满
return 0.6 * r_norm + 0.4 * b_norm
def board_height_today(stocks_with_board):
"""stocks_with_board: 当日涨停股 [(代码, 连板天数)]。返回最高连板。"""
return max((b for _, b in stocks_with_board), default=0)
def run_check():
# 演示:某日 涨停80 跌停10 最高连板7板
temp = sentiment_index(80, 10, 7)
h = board_height_today([("600519", 1), ("000001", 7), ("600036", 3)])
assert 0 <= temp <= 1 and h == 7
print("校验通过 | 情绪温度=%.2f 最高连板=%d板" % (temp, h))
return temp
if __name__ == "__main__":
run_check()
5. 跑通示例
python
temp = run_check()
# 情绪冰点(temp<0.2) 反向买入,沸点(temp>0.8) 减仓
print("当前情绪:", "冰点-可考虑" if temp < 0.2 else ("沸点-注意风险" if temp > 0.8 else "中性"))
6. 坑与注意事项
- 牛熊基准不同:牛市涨停数天然多,用绝对值比历史会误判,要做滚动分位(见 window 思想)。
- 一字板:一字涨停无法买入,算情绪要区分「可参与涨停」与「一字板」。
- 新股/ST:新股上市连板、ST 涨跌幅不同,计入情绪要剔除或单独处理。
- 样本偏差:情绪指标只在有涨跌停制度的 A 股有效,港股/美股不适用。
7. 小结与下一篇预告
情绪指标补上「市场温度」维度。下一篇讲多信号综合择时打分------把 #17--#22 所有择时信号加权合成一个总决策。
下一篇预告:《【Python量化实战宝典 #23】多信号综合择时打分手册:加权合成(Python 可跑)》
8. 免责声明
本文为择时方法示例,演示数据为虚构,不构成投资建议。