01
引言
Pyechartss 是基于Echarts 的开源可视化库,可以制作非常精美的图表。公众号推文《【手把手教你】股票可视化分析之Pyecharts(一)》,以股票交易数据为例,为大家展示了使用 Pyehcarts 构建直角坐标系下常用的图表,包括折线图、柱状图、K线图和热力图等。本文将进一步介绍Pyecharts其他图表的构建方法,包括饼图、地图、日历图、仪表盘、关系图等等,同时分享这些常见的图表在金融量化上的应用实例。本文的pyecharts版本为1.9.1,直接使用pip install pyecharts即可。以下代码使用Jupyter notebook进行编译,相关数据在公众号后台回复“20220327”可免费获取。
02
常用图表及应用实例
#导入数据分析和量化常用库
import pandas as pd
import numpy as np
import talib as ta
import tushare as ts
#导入pyecharts
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
01
饼图Pie
饼图调用基本函数为:(Pie()
.add(series_name='系列名称',data_pair=系列数据项,格式为 [(key1, value1), (key2, value2)], color=系列label颜色))。下面以tushare在线获取A股上市公司基本信息进行可视化。
#tushare pro 120积分(注册后修改个人信息)即可免费调取
token='输入在tushare pro上的token'
pro=ts.pro_api(token)
ts.set_token(token)
stock_basic=pro.stock_basic(list_status='L')
#stock_basic.head()
#CDR一般指中国存托凭证Chinese Depository Receipt,CDR)
#是指由存托人签发、以境外证券为基础在中国境内发行、代表境外基础证券权益的证券。
market=stock_basic.groupby('market')['market'].count()
data_pair=[list(z) for z in zip(market.index,market)]
g = (Pie().add("",data_pair,).set_global_opts(title_opts=opts.TitleOpts(title="A股各交易所上市公司数量"),legend_opts=opts.LegendOpts(is_show=False),).set_series_opts(tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{b}: {c} ({d}%)"),label_opts=opts.LabelOpts(formatter="{b}: {c}({d}%)")))
g.width = "100%"
#g.render_notebook()
02
地图
地图基本调用方法:(Map()
.add('系列名称',data_pair=数据项,maptype='china'地图类型如'广东',))
#A股上市公司各省分布,将‘深圳’与‘广东’数据合并
areas=stock_basic.groupby('area')['ts_code'].count()
areas['广东']=areas['广东']+areas['深圳']
areas.drop(['深圳'],inplace=True)
data_pair=[list(z) for z in zip(areas.index, areas)]
g = (Map().add("", data_pair, "china",is_map_symbol_show=False).set_global_opts(title_opts=opts.TitleOpts(title="A股上市公司各省分布",pos_left='center'),visualmap_opts=opts.VisualMapOpts(max_=int(areas.max()/100+1)*100,orient = "horizontal",pos_left='center',)))
g.width = "100%"
#g.render_notebook()
03
日历图Calendar
日历图基本调用方法:(Calendar(init_opts=opts.InitOpts()初始化参数)
.add(series_name=系列名称,
yaxis_data=系列数据,
is_selected=True是否选中图例,
label_opts=opts.LableOpts()标签配置,
calendar_opts=opts.CalendarOpts(),
tooltip_opts=opts.TooltipOpts()提示框配置项,
itemstyle_opts=opts.ItemStyleOpts()图元样式配置项)
日历坐标系组件配置项:
opts.CalendarOpts(
pos_left='''组件离容器左侧距离, 可填20或'20%'等数字,也可 'left', 'center', 'right';''',
pos_top='top', 'middle', 'bottom',
pos_right=,
pos_bottom=,
orient='horizontal'或 'vertical'日历坐标布局朝向,
range_=必填,日历坐标范围:某一年 range: 2022;某个月 range: '2022-03';某个区间 range: ['2022-03-02', '2022-03-23'],
)
#股票数据可视化分析实例
#获取A股交易数据
def get_price(code='sh',start='2000-01-01',end='2022-03-25'):df=ts.get_k_data(code,start,end)df.index=pd.to_datetime(df.date)#将成交量单位改为10000手并取整数df['volume']=(df['volume']/10000).apply(int)return df[['open','close','high','low','volume']]
#以2021年3月份以来创业板指数的日收益率数据为例
cyb=get_price('cyb',start='2021-03-01')
data0=(cyb.close/cyb.close.shift(1)-1)*100
data=[[i.strftime('%Y-%m-%d'),round(data0[i],2)] for i in data0.index]
g = (Calendar(init_opts=opts.InitOpts(width="900px", height="250px")).add("",data,#添加数据calendar_opts=opts.CalendarOpts(range_=["2021-3-1","2022-3-25"],daylabel_opts=opts.CalendarDayLabelOpts(name_map="cn"),monthlabel_opts=opts.CalendarMonthLabelOpts(name_map="cn"),),).set_global_opts(title_opts=opts.TitleOpts(title="创业板指数日收益率",pos_left='center'),visualmap_opts=opts.VisualMapOpts(is_show=False,max_=5.5,min_=-5,orient="horizontal",is_piecewise=False,)))
#g.render_notebook()
04
漏斗图Funnel
调用方式和相关参数:(Funnel(opts.InitOpts = opts.InitOpts()初始配置项)
.add(series_name='系列名称',data_pair=系列塑化剂项,格式为[(key1, value1), (key2, value2)],color=颜色,sort_='descending'或'ascending'数据排序),label_opts=opts.LabelOpts()标签配置)
codes=['sh','sz','cyb','zxb','hs300']
names=['上证指数','深证综指','创业板指','中小板指','沪深300']
name_code=dict(zip(names,codes))
index_data=pd.DataFrame({name:get_price(code).close for name,code in name_code.items()}).dropna()
#index_data.head()
#2010年6月2日至2022年3月24日各指数累计收益率
rets=(index_data/index_data.iloc[0]-1).iloc[-1]*100
from pyecharts.faker import Faker
g = (Funnel().add("",[list(z) for z in zip(rets.index,rets.round(2))],label_opts=opts.LabelOpts(position="inside"),).set_global_opts(title_opts=opts.TitleOpts(title="指数累计收益率(%)",subtitle='2010.06-2022.03')))
#g.render_notebook()
05
仪表盘Gauge
调用方式和常用参数配置:
Gauge(初始化配置项init_opts: opts.InitOpts = opts.InitOpts()
.add(series_name=''系列名称,data_pair=系列数据项,格式为 [(key1, value1), (key2, value2)],is_selected=True或False是否选中图例,min_= 0最小数据值,max_: Numeric = 100最大数据值,split_number= 10 #仪表盘平均分割段数, radius= "75%"仪表盘半径,start_angle= 225# 仪表盘起始角度。圆心 正右手侧为0度,正上方为 90 度,正左手侧为 180 度,end_angle = -45# 仪表盘结束角度,is_clock_wise= True仪表盘刻度是否是顺时针增长, title_label_opts= opts.GaugeTitleOpts()轮盘内标题文本项标签配置项, detail_label_opts= opts.GaugeDetailOpts(formatter="{value}%")轮盘内数据项标签配置项, pointer= opts.GaugePointerOpts()仪表盘指针配置项目,))
g = (Gauge().add('', [['上涨占比', 75]],title_label_opts=opts.LabelOpts(font_size=20, color="blue", font_family="Microsoft YaHei"),detail_label_opts=opts.GaugeDetailOpts(formatter='{value}%',offset_center=[0,80])))
#g.render_notebook()
06
关系图Graph
关系图基本调用方法:(Graph(init_opts: opts.InitOpts = opts.InitOpts())
.add(series_name='',nodes=关系图节点数据项列表,links=关系图节点间关系数据项列表,categories=关系图节点分类的类目列表,layout="force"图的布局,可选:'none' 不采用任何布局,使用节点中提供的 x, y 作为节点的位置;'circular' 采用环形布局;'force' 采用力引导布局,symbol='circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none'关系图节点标记的图形,symbol_size=10关系图节点标记的大小, edge_length=50边的两个节点之间的距离,gravity=0.2# 节点受到的向中心的引力因子,))
#模拟连接
links=[{'source':'股票'+str(np.random.randint(1,21)),'target':'股票'+str(np.random.randint(1,21))} for i in range(20*18)]
l=[]
for i in links:l.extend(list(i.values()))
d={}
for w in l:d[w]=l.count(w)
#节点连接边数越多,节点size越大
nodes=[{'name':k,'symbolSize':v} for k,v in d.items()]g = (Graph().add("", nodes, links, repulsion=8000).set_global_opts(title_opts=opts.TitleOpts(title="模拟股票关系图")))
g.width = "100%"
g.render_notebook()
pyecharts上的关系图还可以展示更复杂的模型,比如微博转发关系图,案例数据来自pyecharts官网。
with open("weibo.json", "r", encoding="utf-8") as f: j = json.load(f)nodes, links, categories, cont, mid, userl = j
g = (Graph().add("",nodes,links,categories,repulsion=50,linestyle_opts=opts.LineStyleOpts(curve=0.2),label_opts=opts.LabelOpts(is_show=False),).set_global_opts(legend_opts=opts.LegendOpts(is_show=False),title_opts=opts.TitleOpts(title="微博转发关系图"),))
g.width = "100%"
g.render_notebook()
07
水球图Liquid
水球图基本调用方法:(Liquid()
.add('序列名称',data=系列数据[value1, value2, ….],shape=水球外形,有' circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow' 可选,color=波浪颜色, is_animation=True,是否显示波浪动画,is_outline_show= True是否显示边框 ))
l1 = (Liquid().add("今日涨停封板率", [0.65],center=["25%", "50%"]).set_global_opts(opts.TitleOpts(title="涨停板封板率",pos_left='center')))
l2 = (Liquid().add("昨日涨停封板率", [0.69],center=["70%", "50%"],is_outline_show=False))
grid = (Grid().add(l1, grid_opts=opts.GridOpts()).add(l2, grid_opts=opts.GridOpts()))
grid.render_notebook()
08
词云图
词云图基本调用方法和参数:(WordCloud()
.add(series_name='系列名称',data_pair=系列数据项,shape=有 'circle', 'cardioid', 'diamond', 'triangle-forward', 'triangle', 'pentagon', 'star' 可选,mask_image= 自定义的图片(支持jpg, jpeg, png, ico 的格式)支持本地文件路径,如果使用了 mask_image 之后第一次渲染会出现空白的情况,再刷新一次就可以了,word_gap=20单词间隔,word_size_range=# 单词字体大小范围,rotate_step=45旋转单词角度,width=词云图的宽度,height=词云图的高度)
#使用tushare获取新闻数据
import tushare as ts
import jieba
import jieba.analyse
import re
token='输入在tushare pro上的token'
pro=ts.pro_api(token)
df=pro.news(src='sina', start_date='2022-03-27 09:00:00', end_date='2022-03-27 18:50:00')
#df.to_csv('20220327news.csv')
#df=pd.read_csv('20220327news.csv',index_col=0)
stopwords = [i.strip() for i in open('stopwords.txt').readlines()]def cut_word(sentence):text = jieba.lcut(''.join(re.findall('[\u4e00-\u9fa5]', sentence)), cut_all = False)for i in range(len(text)-1, -1, -1):if text[i] in stopwords:del text[i]return textnews_list = list(df.content.values)
word_list = [" ".join(cut_word(sentence)) for sentence in news_list]
new_text = ' '.join(word_list)
tags=jieba.analyse.extract_tags(new_text,topK=200,withWeight=True)
tf=dict((a[0],a[1]) for a in tags)
data=[[k,v] for k,v in tf.items()]
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\tkfy9\AppData\Local\Temp\jieba.cache
Loading model cost 0.573 seconds.
Prefix dict has been built successfully.
c = (WordCloud().add(series_name="热点分析", data_pair=data, word_size_range=[6, 66]).set_global_opts(title_opts=opts.TitleOpts(title="热点分析", title_textstyle_opts=opts.TextStyleOpts(font_size=23)),tooltip_opts=opts.TooltipOpts(is_show=True),))c.width = "100%"
c.render_notebook()
03
结语
可视化分析是数据解读和传达信息的重要窗口,是掌握金融量化不可或缺的基本技能。本文简要介绍了如何使用pyecharts构建饼图、日历图、仪表盘、地图、关系图、词云图等,并分享了这些图表在股票可视化分析上的应用实例。读者可根据自己的应用场景,在上述可视化模板的基础上进行拓展和深化。
参考资料:Pyechart官网(https://pyecharts.org/)
https://pywebio-charts.pywebio.online/?app=pyecharts
关于Python金融量化
专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。添加博主微信(sky2blue2)可咨询相关优惠信息。