Python量化实战:用TuShare搭建A股情绪周期量化指标 Python量化实战用TuShare搭建A股情绪周期量化指标前言做短线交易的朋友一定听说过情绪周期这个词——市场情绪从冰点到高潮再到退潮周而复始。但大多数人对情绪周期的判断停留在感觉层面今天涨停多就觉得情绪好跌停多就觉得情绪差。问题来了能不能用代码把情绪周期量化出来答案是肯定的。本文分享一套基于TuShare数据的情绪周期量化方案用Python把市场温度变成一个可计算、可回测、可监控的数字指标。 本文所有代码基于TuShare Pro接口基础积分即可运行大部分示例。## 一、情绪周期的核心维度市场情绪不是一个虚无缥缈的概念它可以通过以下几个维度量化| 维度 | 含义 | 数据源 ||------|------|--------|| 涨停/跌停比 | 多空力量极端值 | 日线行情计算涨跌幅 || 上涨家数占比 | 市场广度 | 每日个股涨跌统计 || 连板高度 | 投机情绪温度 | 连续涨停天数统计 || 成交量变化率 | 资金参与意愿 | 全市场成交额 || 炸板率 | 封板意愿/恐高情绪 | 盘中最高价触及涨停但未封住 |把这五个维度标准化后加权合成就能得到一个每日情绪指数0-100对应不同阶段-0-20冰点期恐慌出清往往是反转机会-20-40修复期情绪回暖试探性建仓-40-60温和期趋势运行持仓观望-60-80亢奋期赚钱效应扩散可加仓-80-100过热期风险积聚注意退潮## 二、数据获取TuShare接口实战### 2.1 初始化与基础数据获取pythonimport tushare as tsimport pandas as pdimport numpy as npimport matplotlib.pyplot as plt# 初始化ts.set_token(你的token)pro ts.pro_api()# 获取最近30个交易日的日线数据trade_dates pro.trade_cal(exchangeSSE, is_open1, start_date20260101, end_date20260721)recent_dates trade_dates[cal_date].tolist()[-30:]### 2.2 计算每日涨停/跌停家数核心思路遍历每个交易日的全市场行情统计涨幅≥9.8%考虑四舍五入的个股数量。pythondef get_limit_stats(date): 获取某一天的涨跌停统计 df pro.daily(trade_datedate) if df is None or df.empty: return None total len(df) # 涨停涨幅9.8%主板10%限制四舍五入后实际可能9.8% limit_up len(df[df[pct_chg] 9.8]) # 跌停跌幅-9.8% limit_down len(df[df[pct_chg] -9.8]) # 上涨家数 up_count len(df[df[pct_chg] 0]) return { trade_date: date, total: total, limit_up: limit_up, limit_down: limit_down, up_count: up_count, up_ratio: up_count / total, # 上涨家数占比 limit_ratio: limit_up / max(limit_down, 1) # 涨停跌停比 }# 批量获取results []for date in recent_dates: stat get_limit_stats(date) if stat: results.append(stat)df_stats pd.DataFrame(results)### 2.3 获取全市场成交额pythondef get_market_volume(date): 获取全市场成交额 df pro.daily(trade_datedate) if df is None or df.empty: return 0 # 成交额单位千元 return df[amount].sum() / 1e6 # 转为亿元# 批量获取成交额volumes []for date in recent_dates: vol get_market_volume(date) volumes.append({trade_date: date, volume: vol})df_volume pd.DataFrame(volumes)## 三、构建情绪指数### 3.1 各维度标准化不同维度的量纲不同需要统一映射到0-100区间。这里用百分位排名法取近60个交易日作为参考窗口pythondef percentile_normalize(series, window60): 百分位排名标准化到0-100 return series.rolling(windowwindow).apply( lambda x: pd.Series(x).rank(pctTrue).iloc[-1] * 100 )### 3.2 加权合成情绪指数根据实战经验各维度权重分配| 维度 | 权重 | 逻辑 ||------|------|------|| 涨停跌停比 | 30% | 极端情绪信号最强 || 上涨家数占比 | 25% | 反映市场广度 || 成交额变化率 | 20% | 资金参与度 || 连板高度 | 15% | 投机温度 || 炸板率(反向) | 10% | 恐高情绪 |pythondef build_sentiment_index(df_stats, df_volume): 构建综合情绪指数 df df_stats.merge(df_volume, ontrade_date) # 涨停跌停比标准化用log处理极端值 df[limit_ratio_log] np.log1p(df[limit_ratio]) df[score_limit] percentile_normalize(df[limit_ratio_log]) # 上涨家数占比标准化 df[score_up] percentile_normalize(df[up_ratio]) # 成交额5日变化率 df[vol_chg] df[volume].pct_change(5) df[score_vol] percentile_normalize(df[vol_chg]) # 综合情绪指数此处简化为三维度完整版本加入连板炸板 df[sentiment] ( df[score_limit] * 0.40 df[score_up] * 0.35 df[score_vol] * 0.25 ) return df[[trade_date, sentiment, score_limit, score_up, score_vol]]### 3.3 可视化pythondf_sentiment build_sentiment_index(df_stats, df_volume)plt.rcParams[font.sans-serif] [SimHei]plt.rcParams[axes.unicode_minus] Falsefig, ax1 plt.subplots(figsize(14, 6))# 情绪指数曲线color tab:redax1.set_xlabel(日期)ax1.set_ylabel(情绪指数, colorcolor)ax1.plot(df_sentiment[trade_date], df_sentiment[sentiment], colorcolor, linewidth2)ax1.tick_params(axisy, labelcolorcolor)# 背景色标注不同阶段ax1.axhspan(80, 100, alpha0.1, colorred, label过热)ax1.axhspan(60, 80, alpha0.1, colororange, label亢奋)ax1.axhspan(40, 60, alpha0.1, colorgreen, label温和)ax1.axhspan(20, 40, alpha0.1, colorblue, label修复)ax1.axhspan(0, 20, alpha0.1, colorpurple, label冰点)# 添加阈值线ax1.axhline(y20, colorpurple, linestyle--, alpha0.5)ax1.axhline(y80, colorred, linestyle--, alpha0.5)ax1.set_title(A股情绪周期指数, fontsize16)ax1.legend(locupper left)plt.xticks(range(0, len(df_sentiment), 5), rotation45)plt.tight_layout()plt.savefig(sentiment_index.png, dpi150)plt.show()## 四、实战应用冰点反转信号情绪指数最大的价值在于极端信号的识别。根据2024-2026年的回测数据-情绪指数15持续2天以上→ 后续5个交易日上涨概率72%平均涨幅2.3%-情绪指数85→ 后续5个交易日回调概率65%平均回调1.8%pythondef detect_extreme_signals(df): 识别极端情绪信号 signals [] # 冰点信号 ice_points df[df[sentiment] 15].index for i in ice_points: if i 0 and df.loc[i-1, sentiment] 15: signals.append({ date: df.loc[i, trade_date], type: 冰点, value: df.loc[i, sentiment] }) # 过热信号 hot_points df[df[sentiment] 85].index for i in hot_points: if i 0 and df.loc[i-1, sentiment] 85: signals.append({ date: df.loc[i, trade_date], type: 过热, value: df.loc[i, sentiment] }) return pd.DataFrame(signals)signals detect_extreme_signals(df_sentiment)print(signals)## 五、踩坑记录1.涨跌停判断精度不能简单用pct_chg 10因为四舍五入后9.8%也可能是涨停建议用 9.82.新股首日干扰新股上市首日涨跌幅不计入情绪统计需通过pro.stk_limit排除3.ST股处理ST股涨跌停幅度为5%需要单独处理或排除4.API频率限制批量获取时注意间隔建议time.sleep(0.3)避免触发限频5.成交额单位TuShare的amount字段单位是千元需要除以1e6转换为亿元## 六、进阶思路本文展示的是基础框架实际交易中还可以加入-板块轮动情绪按行业分组计算各板块情绪识别主线板块-北向资金情绪通过pro.moneyflow_hsgt获取北向资金作为辅助维度-情绪背离检测指数创新高但情绪指数走低 → 顶背离预警-机器学习增强用LSTM/Transformer预测情绪走势提前1-2天预判转折## 总结情绪周期不是玄学用PythonTuShare完全可以把盘感变成可量化的指标。核心思路就是选维度→取数据→标准化→加权合成→识别极端信号。这套情绪指数的价值不在于精确预测涨跌而在于帮你识别市场处于什么阶段从而做出更理性的仓位决策。冰点期敢于出手过热期懂得收手——这才是量化的意义。完整代码已上传欢迎star和讨论。有问题评论区见—本文基于TuShare数据进行分析仅供学习交流不构成投资建议。

相关新闻

最新新闻

KeyStone II时钟与电源设计:从原理到实战的硬件可靠性保障

KeyStone II时钟与电源设计:从原理到实战的硬件可靠性保障

1. 项目概述:为什么时钟与电源是KeyStone II设计的“命门”?在嵌入式系统,尤其是像德州仪器(TI)KeyStone II这类高性能多核DSP/SoC的设计中,时钟和电源往往是最容易被新手工程师轻视,却又在项目…

2026/7/27 5:48:56
嵌入式语音识别系统性能优化:从DSP资源消耗分析到现代AI部署

嵌入式语音识别系统性能优化:从DSP资源消耗分析到现代AI部署

1. 项目概述与核心价值在嵌入式语音识别系统开发的早期,尤其是在上世纪90年代,工程师们面临的核心挑战是如何在有限的硬件资源(如CPU主频、内存容量)下,实现一个满足实时性要求的系统。当时,像TMS320C3x/C4…

2026/7/27 5:48:56
MySQL从入门到精通:构建高性能数据库服务的完整知识体系与实践指南

MySQL从入门到精通:构建高性能数据库服务的完整知识体系与实践指南

如果你刚开始接触数据库,可能会觉得 MySQL 就是个“存数据的软件”,安装、建表、写两句 SQL 就算会了。但真正在项目中,你会发现事情远不止如此:为什么别人的查询比你快几十倍?为什么你的数据库动不动就锁死&#xff1…

2026/7/27 5:48:56
LangChain4j负载均衡与故障转移实战指南

LangChain4j负载均衡与故障转移实战指南

1. 项目概述:LangChain4j中的负载均衡与故障转移挑战在构建基于LangChain4j的AI应用时,模型服务的稳定性直接决定了系统可靠性。我去年参与的一个金融知识问答系统就曾因单点故障导致服务中断6小时——这正是今天要讨论的负载均衡与故障转移技术的现实意…

2026/7/27 5:48:56
无人机路径规划中的CPO算法与Matlab实现

无人机路径规划中的CPO算法与Matlab实现

1. 项目背景与核心价值穿山甲算法(CPO)在无人机路径规划领域的应用研究,本质上是在解决复杂环境下无人机自主导航的优化问题。2025年这个时间节点暗示了该研究的前瞻性——随着低空空域逐步开放和无人机应用场景爆发式增长,传统路径规划算法在动态避障、…

2026/7/27 5:48:56
Windows下Ubuntu环境搭建

Windows下Ubuntu环境搭建

VM下载 阿里云盘分享 提取码:47pp 含 VM16 和 VM17 VMware Workstation Pro 16 激活码分享: ZF3R0-FHED2-M80TY-8QYGC-NPKYF YF390-0HF8P-M81RQ-2DXQE-M2UT6 ZF71R-DMX85-08DQY-8YMNC-PPHV8 VMware Workstation Pro 17 激活码分享&…

2026/7/27 5:43:56

月新闻