热力图是一种用颜色编码数据密度的二维图表。它的含义是通过不同颜色的渐变来显示数据的相对密度或值的大小。
热力图通常用于可视化矩阵或二维表格数据,其中每个单元格的值被映射到一个颜色,从而形成一个色阶。较小的值通常用较浅的颜色表示,较大的值用较深的颜色表示,以此来显示数据的相对大小。
在Matplotlib中,可以使用imshow()函数来绘制热力图
X:要绘制的数据,可以是二维数组或类似数组的对象。
cmap:颜色映射,用于指定热力图的颜色主题,默认为"viridis"。
aspect:热力图的宽高比,默认为"auto"。
interpolation:插值方法,用于确定如何在像素之间进行插值,默认为"nearest"。
norm:用于对数据进行归一化的归一化器,默认为None。
vmin、vmax:用于设置颜色映射的最小值和最大值,用于控制颜色的范围。
alpha:透明度,范围在0到1之间,默认为1。
origin:确定热力图的原点位置,默认为"upper"。
extent:用于指定热力图的数据范围,以[xmin, xmax, ymin, ymax]的形式指定。
ax:要绘制热力图的坐标轴对象,默认为当前活动的坐标轴。
热力图在量化交易中的应用包括:
总的来说,热力图在量化交易中可以帮助量化交易者发现市场的相关性、相似性和相对强弱,从而辅助投资决策和交易策略的制定。它提供了一种直观且可视化的方式来分析和理解市场数据。
在下面这个案例中,我们将展示银行和IT设备制造这两个版块的股票在2023年1季度中每周的交易量情况。如果交易量越大,则热力图越鲜明,说明版块交易活动频繁,投资者的关注度上升,导致交易机会出现的概率增加;反之亦然。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 设置为默认字体
plt.rcParams['font.family'] = 'SimHei'
# 显示负数
plt.rcParams['axes.unicode_minus'] = False
# 导入数据
df = pd.read_excel("2023年一季度A股日线行情.xlsx")
# 将日期列转化为日期格式
df["trade_date"] = df["trade_date"].astype("str").apply(lambda x:x[:4]+"-"+x[4:6]+"-"+x[6:])
# 将日期列转换为日期类型,并设置为索引列
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date', inplace=True)
# 筛选2023年1-3月的行情数据
start_date = '2023-01-03'
end_date = '2023-03-31'
df = df.loc[start_date:end_date]
# 创建股票池列表-深圳交易所银行类版块股票池,共9支
stock_list1 = ['000001.SZ','001227.SZ','002142.SZ','002807.SZ','002839.SZ',
'002936.SZ','002948.SZ','002958.SZ','002966.SZ']
# 创建股票池列表-深圳交易所IT设备制造类版块股票池,共9支
stock_list2 = ['000066.SZ','000977.SZ','002180.SZ','002197.SZ','002236.SZ',
'002351.SZ','002415.SZ','002528.SZ','002866.SZ']
# 从DataFrame中将股票池中的交易数据筛选出来
stock_1 = df[df['ts_code'].isin(stock_list1)]
stock_2 = df[df['ts_code'].isin(stock_list2)]
# 相比交易量,交易额更能反映出某个版块当前的交易热度
# 按周统计银行类版块的每只股票每周的交易额
stock1_amout_weekly = []
for i in range(len(stock_list1)):
df_temp = stock_1[stock_1['ts_code']==stock_list1[i]]
temp_a = df_temp.resample('W').sum()
temp_b = temp_a['amount'].to_list()
stock1_amout_weekly.append(temp_b)
# 同理
stock2_amout_weekly = []
for i in range(len(stock_list2)):
df_temp = stock_2[stock_2['ts_code']==stock_list2[i]]
temp_a = df_temp.resample('W').sum()
temp_b = temp_a['amount'].to_list()
stock2_amout_weekly.append(temp_b)
# 现在得到两个9*13的列表,行代表某银行或某车企,列代表每周的交易额总量
# 创建一个1x2的子图布局
fig, ax = plt.subplots(1, 2, figsize=(20, 20))
# 绘制热力图
im1 = ax[0].imshow(stock1_amout_weekly, cmap='hot')
# 设置图表标题和标签
ax[0].set_title('Stock Trading Amount Heatmap')
# 横坐标设置为周数,纵坐标为各银行
ax[0].set_xlabel("Weeks")
ax[0].set_ylabel("Banks")
# 添加颜色条
#cbar = ax[0].figure.colorbar(im1, ax=ax)
ax[0].figure.colorbar(im1, ax=ax[0],shrink =0.28)
# 同理
im2 = ax[1].imshow(stock2_amout_weekly, cmap='hot')
ax[1].set_xlabel("Weeks")
ax[1].set_ylabel("Banks")
ax[1].figure.colorbar(im2, ax=ax[1], shrink =0.28)
# 显示图表
plt.show()
最终效果图如下:
如图所示,左图是银行类股票的交易热力图,右图是IT设备制造类股票的交易热力图,相比而言,银行股中除了两只股票交易比较活跃之外,其余的股票交易热度不高;相比IT设备制造类股票,在1月份整体沉默之后,在2-3月,交易量明显上升,说明市场情绪逐渐高涨,此时此类个股容易出现涨停机会。