-->
量化研究:条件格式图-A股热门行业历年收益
周嘉楠 / 2020-08-20 / 策略 / 阅读量 6724

量化研究:条件格式图-A股热门行业历年收益

提示:必须使用Windows系统,而且必须拥有Wind账户,并设置好量化接口。

from WindPy import *  # 导入 API 接口
w.start()
import pandas as pd
from datetime import datetime # 导入处理时间的 python 库
from datetime import timedelta

# 显示所有列
pd.set_option('display.max_columns', None)
# 显示所有行
pd.set_option('display.max_rows', None)

Step1:获取数据

  • 标的:指数 -> 股票指数 -> 申万指数 > 申银万国一级行业指数;
  • 指标:涨跌幅pct_chg,取得是年度涨跌幅数据。
startdate =  "2005-01-01"
enddate = (datetime.now() - timedelta(1)).strftime('%Y-%m-%d')  #以当前时刻的前一天为结束时间

# 调用Wind API调取行业数据
error,data = w.wsd("801780.SI,801120.SI,801010.SI,801050.SI,801150.SI,801180.SI,801740.SI,801750.SI,801760.SI,801770.SI,801790.SI", "pct_chg", startdate, enddate, "Period=Y", usedf=True)
assert error==0, 'WSD 未成功提取数据,ErrorCode={},含义为{}'.format(error, data.values)

# 重命名表格
data.columns = ['银行','食品饮料','农林牧渔','有色金属','医药生物','房地产','国防军工','计算机','传媒','通信','非银行金融']
data.index = [str(i.year) for i in data.index]
data

Step2:数据处理

给涨跌幅保留2位小数,添加百分号%,合并品种名称和涨跌幅。

  • 每年都需要将各行业的涨跌幅进行由大到小排序(每行排序);
  • 将排序后的行业和涨跌幅进行拼接,而且还要支持换行,行业在上,涨跌幅在下;
  • 对涨跌幅保留2位小数,并加上百分号%;

DataFrame的分组聚合操作:

分组聚合操作就是拆分-应用-聚合(split-apply-combine),首先DataFrame会在它的行方向(axis=0)或列方向(axis=1)按照某些规则(如按照某列的取值)进行分组,然后一个函数就可以应用到各个组中,每组都会产生相应的值,最后将各组的计算结果聚合到一张表中。

data = data.round(2)  # 保留 2 位小数
# 这里对data每行数据进行apply函数应用操作(因为年份是按行的,所以axis=1),使用.items()将columns和内容生成一个zip文件
data = data.apply(lambda a :pd.Series( ['{}\n{}%'.format(i,j) for i,j in a.sort_values(ascending=False).items()]), axis=1)

Step 3:初步绘图

import matplotlib.pyplot as plt 
plt.style.use('seaborn-white')                   # 设置主题
plt.rcParams['font.sans-serif'] = ['SimHei']     # 设置字体
plt.rcParams['axes.unicode_minus'] = False       # 显示负号
  1. 绘制表格函数:Axes.table()
Axes.table(ax, cellText=None, cellColours=None, cellLoc='right', colWidths=None, rowLabels=None, rowColours=None, rowLoc='left', colLabels=None, colColours=None, colLoc='center', loc='bottom', bbox=None, edges='closed', **kwargs)
参数类型是否可选含义
cellText2D list of str可选参数表格单元格中须填写的文本。
cellColours2D list of colors可选参数对应表格单元格的颜色。
cellLocstr可选参数单元格文字对其方式,'left' 左对齐, 'center' 居中, 'right' 右对齐,默认为 'right'。
colWidthslist of float可选参数表格列宽,默认为1/ncol
rowLabels/colLabelslist of str可选参数表格行标题和列标题。
rowColours/colColourslist of colors可选参数表格行标题和列标题的单元格颜色。
rowLoc/colLocstr可选参数表格行标题和列标题在单元格中的对其方式,'left' 左对齐, 'center' 居中, 'right' 右对齐,行标题默认为 'left',列标题默认为'center'。
locstr可选参数表格单元格相对于 坐标系 的位置,默认在底部 'bottom'。
bboxbbox可选参数绘制表格的区域,(x, y, width, height) 将图例放在 xy 处且设置了宽度和高度,该设置优于loc。
edgesstr可选参数绘制单元格边框,'open' 无边框, 'closed' 有边框, 'horizontal' 只显示水平边框, 'vertical' 只显示垂直边框 。
  1. 设置图标题:Axes.set_title()
Axes.set_title( label, fontdict=None, loc=None, pad=None, **kwargs)
参数类型是否可选含义
labelstr不可选参数图标题文本的内容。
fontdictdict可选参数用于控制标题文本的样式:{'fontsize': rcParams['axes.titlesize'], 'fontweight' : rcParams['axes.titleweight'],
'color' : rcParams['axes.titlecolor'], 'verticalalignment': 'baseline', 'horizontalalignment': loc},默认为 None。
locstr可选参数用于设置标题的位置:'center' 正上方 , 'left' 左上方, 'right' 右上方,默认为 center 。
padfloat可选参数标题距轴顶部的偏移量(以磅为单位), 默认为 None, 对应 rcParams [“ axes.titlepad”]=6.0 。
  1. 设置文本标签:Axes.text()
Axes.text(x, y, s, fontdict=None, withdash=<deprecated parameter>, **kwargs)
参数含义
x,y(标量)用于放置文本的位置。
s(字符串)文本展示的内容。
fontdict(字典)用于设置文本的样式,将相关设置参数和取值组成字典,赋值给 fontdict。
fontsize用于设置字体大小。
color用于设置字体颜色。
alpha用于设置字体透明度。
horizontalalignment/ha用于设置文本与水平 y 坐标的相对位置。
verticalalignment/va用于设置文本与垂直 x 坐标的相对位置。
position用于设置文本位置(x,y),与单独设置想 x,y 等价。
rotation用于设置文本旋转的角度。
# 设置颜色
# 字符串正则表达式,对中括号的字符进行匹配,然后用 sub 函数删除匹配的字符
import re 
colors = ['#fd9e9a', '#e95e35','#31b271', '#ffcd22','#4672d5','#16aec6','#404040','#3b4aff','#2053a6','#e12f23','#dd9f10']
furtures = ['银行','食品饮料','农林牧渔','有色金属','医药生物','房地产','国防军工','计算机','传媒','通信','非银行金融']
colors_dic = dict(zip(furtures, colors ))
colors_df = data.apply(lambda a : pd.Series([colors_dic[re.sub('[0-9\.\-\%\\n]', '', i)] for i in a]), axis=1)
# 生成一个颜色与行业一一对应的dataframe
colors_df
# 设置画布
fig,ax = plt.subplots(figsize=(10,13), dpi=90)

# 设置字体为白色
plt.rcParams['text.color']= 'white' 

# 绘制表格
ax.set_axis_off()  # 除去坐标系
table = ax.table(cellText = data.values, 
                             bbox=(0,0,1,1),                             # 设置表格位置 (x0, y0, width, height)
                             rowLabels=data.index,                       # 设置行标题
                             rowLoc = 'center',                          # 行标题居中
                             cellLoc='center' ,
                             rowColours = ['#8c8c8c']*len(data.index),   # 设置行标题的颜色
                             cellColours = colors_df.values              # 设置单元格颜色
                            )

# 设置字体大小
table.set_fontsize(15)

# 设置图标题:标题颜色为黑色
ax.set_title('A股热门行业历年收益',  loc='center', pad=25, fontsize=20, color='black') 

# 设置数据来源
ax.text(0.82,-0.04 ,'数据来源:WindQuant', fontsize=13, alpha=0.5, ha='left', va='bottom',color='#5a5a5a') 
ax.text(0.82,-0.06 ,'日期:2020年8月20日', fontsize=13, alpha=0.5, ha='left', va='bottom',color='#5a5a5a') 
ax.text(0.82,-0.08 ,'作者:周嘉楠', fontsize=13, alpha=0.5, ha='left', va='bottom',color='#5a5a5a') 

fig.tight_layout()

trellisdiagram