用热力图解锁A股板块轮动规律PandasTushare高效分析实战当你在复盘历史行情时是否常遇到这样的困扰面对几十个板块的涨跌数据表格里密密麻麻的数字让人眼花缭乱根本看不出哪些板块在特定时期持续强势传统的排序列表只能反映静态排名而市场真正的秘密往往藏在时间维度与板块联动的动态规律中。今天我要分享的这套方法将用热力图可视化帮你一眼识别板块轮动的时间密码。1. 为什么需要板块热力图分析在A股市场中不同概念板块的涨跌往往呈现出明显的时段特征。比如每年春节后的消费板块行情、年中报期间的科技股异动、年末的金融地产轮动等。这些规律如果仅通过每日涨跌幅排名来观察就像管中窥豹难以把握全局。热力图Heatmap的优势在于时间维度横轴可显示周/月时间序列纵轴排列板块名称强度可视化用颜色深浅直观反映涨跌幅度红色系通常代表上涨绿色系代表下跌模式识别连续的颜色区块能清晰显示板块的持续性行情对比分析不同板块在同一时期的相对强度一目了然提示热力图特别适合分析具有季节性或事件驱动特征的板块表现如节假日消费、政策发布后的相关产业反应等。2. 环境配置与数据获取2.1 工具准备我们需要以下Python库来完成这项分析# 基础数据处理 import pandas as pd import numpy as np # 数据获取 import tushare as ts # 可视化 import seaborn as sns import matplotlib.pyplot as plt安装命令如未安装pip install pandas tushare seaborn matplotlib2.2 Tushare数据接口配置注册Tushare账号并获取API token在代码中设置tokents.set_token(你的token) # 替换为实际获取的token pro ts.pro_api()2.3 获取板块历史数据我们主要使用两个Tushare接口接口名称功能关键字段ths_index()获取所有板块列表ts_code(板块代码), name(板块名称)ths_daily()获取板块日行情数据trade_date(日期), pct_change(涨跌幅)获取板块列表的示例代码# 获取所有A股板块列表 block_list pro.ths_index() a_share_blocks block_list[block_list[exchange]A] block_dict dict(zip(a_share_blocks[ts_code], a_share_blocks[name]))3. 构建板块涨跌矩阵3.1 数据获取与清洗我们需要获取指定时间段内各板块的每日涨跌幅数据。考虑到API调用限制建议分批获取def get_block_data(start_date, end_date): all_data [] for i, (code, name) in enumerate(block_dict.items()): try: df pro.ths_daily(ts_codecode, start_datestart_date, end_dateend_date) df[block_name] name all_data.append(df) if (i1) % 5 0: # 每5次请求暂停1分钟 time.sleep(62) except Exception as e: print(f获取{name}数据失败: {str(e)}) return pd.concat(all_data)3.2 构建透视表原始数据是长格式(每行一个板块一天的记录)我们需要转换为宽格式(行是板块列是日期)# 转换日期格式 df[trade_date] pd.to_datetime(df[trade_date]) # 创建透视表 pivot_df df.pivot_table(indexblock_name, columnstrade_date, valuespct_change, aggfuncmean)3.3 数据重采样可选如果想观察周级或月级趋势可以使用resample# 转换为周数据 weekly_df pivot_df.T.resample(W).mean().T4. 热力图可视化实战4.1 基础热力图使用Seaborn绘制基础热力图plt.figure(figsize(16, 10)) sns.heatmap(pivot_df, cmapRdYlGn, # 红-黄-绿色彩 center0, # 中性点为0 annotFalse, # 不显示具体数值 cbar_kws{label: 涨跌幅(%)}) plt.title(A股板块涨跌热力图, fontsize16) plt.xlabel(日期) plt.ylabel(板块名称) plt.xticks(rotation45) plt.tight_layout() plt.show()4.2 进阶优化技巧聚类分析热力图# 按板块和日期聚类 sns.clustermap(pivot_df.fillna(0), cmapRdYlGn, figsize(16, 12), row_clusterTrue, col_clusterTrue, dendrogram_ratio0.1)交互式热力图Plotlyimport plotly.express as px fig px.imshow(pivot_df, color_continuous_scaleRdYlGn, labelsdict(x日期, y板块, color涨跌幅), width1000, height800) fig.update_layout(titleA股板块涨跌交互热力图) fig.show()4.3 解读热力图的关键点颜色连续性同一板块连续多天的同色系表明趋势持续横向对比同一时期不同板块的颜色差异反映市场热点异常值识别特别深红或深绿的单元格值得深入研究空白处理缺失数据可能因停牌或新板块上市5. 实战案例春节效应分析让我们具体分析一个经典场景——春节前后的板块轮动规律。5.1 数据准备# 获取2023年春节前后一个月的数据 spring_df get_block_data(20230101, 20230331)5.2 春节前后三周表现# 标记春节前后周数 spring_df[week_num] (spring_df[trade_date] - pd.to_datetime(2023-01-22)).dt.days // 7 # 计算每周各板块平均涨跌幅 weekly_avg spring_df.groupby([block_name, week_num])[pct_change].mean().unstack()5.3 可视化结果plt.figure(figsize(12, 16)) sns.heatmap(weekly_avg, cmapRdYlGn, annotTrue, fmt.1f, center0, cbar_kws{label: 周平均涨跌幅(%)}) plt.title(2023春节前后板块表现(周平均), fontsize14) plt.xlabel(周数(0春节当周)) plt.ylabel(板块名称) plt.show()5.4 典型发现从热力图中我们可能观察到节前效应消费、旅游板块通常在春节前1-2周开始走强节后效应科技、制造板块常在节后2-3周表现突出持续性某些板块的强势可能持续3周以上反转信号连续多周强势后出现的颜色转变可能预示行情转折6. 扩展应用与高级技巧6.1 多时间维度分析可以创建不同时间颗粒度的热力图矩阵时间维度适用场景代码调整日频短期热点追踪原始数据直接使用周频中期趋势分析resample(W).mean()月频长期规律研究resample(M).mean()6.2 板块分组分析对板块进行行业分类后分别绘制热力图# 假设我们有行业分类字典 industry_map { 白酒板块: 消费, 半导体: 科技, # ...其他板块映射 } df[industry] df[block_name].map(industry_map) # 按行业分组绘制热力图 for industry, group_df in df.groupby(industry): industry_pivot group_df.pivot_table(indexblock_name, columnstrade_date, valuespct_change) # 绘制单个行业热力图...6.3 异常波动预警系统结合热力图可以建立简单的预警机制def detect_anomalies(pivot_df, threshold3): # 计算Z-score z_scores (pivot_df - pivot_df.mean()) / pivot_df.std() # 标记异常值 anomalies z_scores.abs() threshold return pivot_df[anomalies].stack().dropna() # 找出异常波动 unusual_moves detect_anomalies(pivot_df)6.4 热力图与其他指标的结合将热力图与技术指标叠加分析成交量热力图用颜色深浅代表成交量变化资金流向叠加主力资金流入流出数据情绪指标结合板块新闻热度数据# 示例成交量加权涨跌幅 df[weighted_change] df[pct_change] * df[vol] / df[vol].mean() pivot_weighted df.pivot_table(indexblock_name, columnstrade_date, valuesweighted_change)