画图:matplotlib模块

结合金融场景演示Matplotlib模块的操作

一、数据来源——Tushare

Tushare大数据开放社区免费提供各类金融数据。数据丰富:拥有丰富的数据内容,如股票、基金、期货、数字货币等行情数据,公司财务、基金经理等基本面数据;获取简单:SDK开发包支持语言,同时提供HTTP Restful接口,最大程度方便不同人群的使用;落地方便:提供多种数据储存方式,如Oracle、MySQL,MongoDB、HDF5、CSV等,为数据获取提供了性能保证。

二、成果展示

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl  
mpl.rcParams['font.sans-serif']=['SimHei']  #以黑体的字体显示中文
mpl.rcParams['axes.unicode_minus']=False  #解决保存图像是负号'-'显示为方块的问题
beta=np.linspace(0.5,2.0,100)  #一个beta的数组
Rf=0.03
Rm=0.12
Ri=Rf+beta*(Rm-Rf)
plt.figure(figsize=(9,6))
plt.plot(beta,Ri,'r-',label=u'证券市场线',lw=2.0)
plt.plot(1.0,Rf+1.0*(Rm-Rf),'o',lw=2.5)
plt.axis('tight')
plt.xticks(fontsize=14)
plt.xlabel(u'贝塔值',fontsize=14)
plt.xlim(0.4,2.1)
plt.yticks(fontsize=14)
plt.ylabel(u'单一股票收益率',fontsize=14,rotation=0)
plt.ylim(0.07,0.22)
plt.title(u'资本资产定价模型',fontsize=14)
#annotate:添加图形内容细节的指向型注释文本
plt.annotate(u'贝塔等于1 的收益',fontsize=14,xy=(1.0,0.12),xytext=(0.8,0.15),arrowprops=dict(facecolor='b',shrink=0.05))
plt.legend(loc=0,fontsize=14)
plt.grid()

画图:matplotlib模块

import tushare as ts
pro=ts.pro_api()
HS300 = pro.index_daily(ts_code='399300.SZ', start_date='20160101', end_date='20190101')  #导入沪深300数据
HS300.head(3).append(HS300.tail(3))
ts_code trade_date close open high low pre_close change pct_chg vol amount
0 399300.SZ 20181228 3010.6536 2994.7950 3024.3525 2984.8177 2990.5057 20.1479 0.6737 71053779.0 7.814531e+07
1 399300.SZ 20181227 2990.5057 3042.9491 3047.2348 2990.5057 3002.0327 -11.5270 -0.3840 80541785.0 8.115927e+07
2 399300.SZ 20181226 3002.0327 3012.8690 3029.0608 2996.4829 3017.2815 -15.2488 -0.5054 55647032.0 5.857497e+07
728 399300.SZ 20160106 3539.8080 3482.4060 3543.7390 3468.4670 3478.7800 61.0280 1.7543 145966144.0 1.609472e+08
729 399300.SZ 20160105 3478.7800 3382.1770 3518.2170 3377.2800 3469.0660 9.7140 0.2800 162116984.0 1.960171e+08
730 399300.SZ 20160104 3469.0660 3725.8560 3726.2450 3468.9490 3731.0050 -261.9390 -7.0206 115370674.0 1.459682e+08
HS300_new=HS300.set_index('trade_date') #将时间作为索引
HS300_new=HS300_new.sort_index(axis=0,ascending=True)  #按照行索引由小到大排序
HS300_new.head(3).append(HS300_new.tail(3))  #查看首尾三行
ts_code close open high low pre_close change pct_chg vol amount
trade_date
20160104 399300.SZ 3469.0660 3725.8560 3726.2450 3468.9490 3731.0050 -261.9390 -7.0206 115370674.0 1.459682e+08
20160105 399300.SZ 3478.7800 3382.1770 3518.2170 3377.2800 3469.0660 9.7140 0.2800 162116984.0 1.960171e+08
20160106 399300.SZ 3539.8080 3482.4060 3543.7390 3468.4670 3478.7800 61.0280 1.7543 145966144.0 1.609472e+08
20181226 399300.SZ 3002.0327 3012.8690 3029.0608 2996.4829 3017.2815 -15.2488 -0.5054 55647032.0 5.857497e+07
20181227 399300.SZ 2990.5057 3042.9491 3047.2348 2990.5057 3002.0327 -11.5270 -0.3840 80541785.0 8.115927e+07
20181228 399300.SZ 3010.6536 2994.7950 3024.3525 2984.8177 2990.5057 20.1479 0.6737 71053779.0 7.814531e+07
HS300_new['open'].plot()
plt.grid()

画图:matplotlib模块

plt.figure(figsize=(11,9))
plt.subplot(2,2,1)  #代表第1行,第1列的子图,即第一幅图
plt.plot(HS300['open'],'r-',label=u'沪深300开盘点位',lw=2.0)
plt.xticks(fontsize=13,rotation=30)
plt.xlabel(u'日期',fontsize=13)
plt.yticks(fontsize=13)
plt.ylabel(u'点位',fontsize=13)
plt.legend(loc=0,fontsize=13)
plt.grid()
plt.subplot(2,2,2)  #代表第1行,第2列的子图,即第二幅图
plt.plot(HS300['high'],'b-',label=u'沪深300最高点位',lw=2.0)
plt.xticks(fontsize=13,rotation=30)
plt.xlabel(u'日期',fontsize=13)
plt.yticks(fontsize=13)
plt.ylabel(u'点位',fontsize=13)
plt.legend(loc=0,fontsize=13)
plt.grid()
plt.subplot(2,2,3)
plt.plot(HS300['low'],'c-',label=u'沪深300最低点位',lw=2.0)
plt.xticks(fontsize=13,rotation=30)
plt.xlabel(u'日期',fontsize=13)
plt.yticks(fontsize=13)
plt.ylabel(u'点位',fontsize=13)
plt.legend(loc=0,fontsize=13)
plt.grid()
plt.subplot(2,2,4)
plt.plot(HS300['close'],'k-',label=u'沪深300收盘点位',lw=2.0)
plt.xticks(fontsize=13,rotation=30)
plt.xlabel(u'日期',fontsize=13)
plt.yticks(fontsize=13)
plt.ylabel(u'点位',fontsize=13)
plt.legend(loc=0,fontsize=13)
plt.grid()

画图:matplotlib模块

import numpy.random as npr
I=1000
x_norm=npr.normal(loc=0.8,scale=1.5,size=I)  #从均值为0.8,标准差为1.5的正态分布中抽取I个样本
x_logn=npr.lognormal(mean=0.8,sigma=1.0,size=I)  #从均值为0.8,标准差为1.5的对数正态分布中抽取I个样本
x_chi=npr.chisquare(df=4,size=I)  #从*度为4的卡方分布中抽取I个样本
x_beta=npr.beta(a=2,b=4,size=I)  #从alpha=2,beta=4的贝塔分布中抽取I个样本
plt.figure(figsize=(12,10))
plt.subplot(2,2,1)
plt.hist(x_norm,label=u'正太分布的抽样',bins=20,facecolor='y',edgecolor='k')
plt.xticks(fontsize=13)
plt.xlabel(u'样本值',fontsize=13)
plt.yticks(fontsize=13)
plt.ylabel(u'频数',fontsize=13)
plt.legend(loc=0,fontsize=13)
plt.grid(True)
plt.subplot(2,2,2)
plt.hist(x_logn,label=u'对数正太分布的抽样',bins=20,facecolor='r',edgecolor='k')
plt.xticks(fontsize=13)
plt.xlabel(u'样本值',fontsize=13)
plt.yticks(fontsize=13)
plt.ylabel(u'频数',fontsize=13)
plt.legend(loc=0,fontsize=13)
plt.grid(True)
plt.subplot(2,2,3)
plt.hist(x_chi,label=u'卡方分布的抽样',bins=20,facecolor='b',edgecolor='k')
plt.xticks(fontsize=13)
plt.xlabel(u'样本值',fontsize=13)
plt.yticks(fontsize=13)
plt.ylabel(u'频数',fontsize=13)
plt.legend(loc=0,fontsize=13)
plt.grid(True)
plt.subplot(2,2,4)
plt.hist(x_beta,label=u'贝塔分布的抽样',bins=20,facecolor='c',edgecolor='k')
plt.xticks(fontsize=13)
plt.xlabel(u'样本值',fontsize=13)
plt.yticks(fontsize=13)
plt.ylabel(u'频数',fontsize=13)
plt.legend(loc=0,fontsize=13)
plt.grid(True)

画图:matplotlib模块

x_normal=npr.normal(loc=0.8,scale=1.5,size=(I,2))  #从均值0.8,标准差1.5的正态分布中抽取样本并生成1000行、2列的数组
plt.figure(figsize=(8,5))
plt.hist(x_normal,label=[u'正态分布的抽样数组 1',u'正态分布的抽样数组 2'],stacked=True,edgecolor='k',bins=30)  
plt.xticks(fontsize=13)
plt.xlabel(u'样本值',fontsize=13)
plt.yticks(fontsize=13)
plt.ylabel(u'频数',fontsize=13)
plt.title(u'正态分布随机抽取的两组样本值堆叠的直方图')
plt.legend(loc=0,fontsize=13)
plt.grid(True)

画图:matplotlib模块

plt.figure(figsize=(8,5))
plt.hist(x_normal,label=[u'正态分布的抽样数组 1',u'正态分布的抽样数组 2'],edgecolor='k',bins=30)
plt.xticks(fontsize=13)
plt.xlabel(u'样本值',fontsize=13)
plt.yticks(fontsize=13)
plt.ylabel(u'频数',fontsize=13)
plt.title(u'正态分布随机抽取的两组样本值并排的直方图')
plt.legend(loc=0,fontsize=13)
plt.grid(True)

画图:matplotlib模块

return_list=[0.003731,0.021066,-0.004854,0.006098,-0.006061,-0.001838,0.001842,
-0.016544,-0.003738,0.003752,-0.003087,-0.000344,-0.033391,0.007123,0.004597,-0.024112,
0.011704,-0.029563,-0.014570,0.016129]
return_array=np.array(return_list)
return_array=return_array.reshape(4,5)
date=['2018-09-03','2018-09-04','2018-09-05','2018-09-06','2018-09-07']
stock=['中国石油','工商银行','上汽集团','宝钢股份']
return_dataframe=pd.DataFrame(data=return_array.T,index=date,columns=stock)
return_dataframe
中国石油 工商银行 上汽集团 宝钢股份
2018-09-03 0.003731 -0.001838 -0.003087 -0.024112
2018-09-04 0.021066 0.001842 -0.000344 0.011704
2018-09-05 -0.004854 -0.016544 -0.033391 -0.029563
2018-09-06 0.006098 -0.003738 0.007123 -0.014570
2018-09-07 -0.006061 0.003752 0.004597 0.016129
plt.figure(figsize=(12,10))
plt.subplot(2,2,1)
plt.bar(x=return_dataframe.columns,height=return_dataframe.iloc[0],width=0.5,label=u'2018年9月3日涨跌幅',facecolor='y')
plt.xticks(fontsize=13)
plt.yticks(fontsize=13)
plt.ylim(-0.035,0.025)
plt.ylabel(u'涨跌幅',fontsize=13)
plt.legend(loc=0,fontsize=13)
plt.grid(True)
plt.subplot(2,2,2)
plt.bar(x=return_dataframe.columns,height=return_dataframe.iloc[2],width=0.5,label=u'2018年9月5日涨跌幅',facecolor='c')
plt.xticks(fontsize=13)
plt.yticks(fontsize=13)
plt.ylim(-0.035,0.025)
plt.ylabel(u'涨跌幅',fontsize=13)
plt.legend(loc=0,fontsize=13)
plt.grid(True)
plt.subplot(2,2,3)
plt.bar(x=return_dataframe.columns,height=return_dataframe.iloc[3],width=0.5,label=u'2018年9月6日涨跌幅',facecolor='b')
plt.xticks(fontsize=13)
plt.yticks(fontsize=13)
plt.ylim(-0.035,0.025)
plt.ylabel(u'涨跌幅',fontsize=13)
plt.legend(loc=0,fontsize=13)
plt.grid(True)
plt.subplot(2,2,4)
plt.bar(x=return_dataframe.columns,height=return_dataframe.iloc[4],width=0.5,label=u'2018年9月7日涨跌幅',facecolor='g')
plt.xticks(fontsize=13)
plt.yticks(fontsize=13)
plt.ylim(-0.035,0.025)
plt.ylabel(u'涨跌幅',fontsize=13)
plt.legend(loc=0,fontsize=13)
plt.grid(True)

画图:matplotlib模块

plt.figure(figsize=(9,6))
plt.barh(y=return_dataframe.columns,width=return_dataframe.iloc[3],height=0.5,label=u'2018年9月6日涨跌幅')
plt.barh(y=return_dataframe.columns,width=return_dataframe.iloc[4],height=0.5,label=u'2018年9月7日涨跌幅')
plt.xticks(fontsize=13)
plt.xlabel(u'涨跌幅',fontsize=13)
plt.yticks(fontsize=13)
plt.title(u'水平条形图可视化股票的涨跌幅',fontsize=13)
plt.legend(loc=0,fontsize=13)
plt.grid(True)

画图:matplotlib模块

SZ = pro.index_daily(ts_code='000001.SH', start_date='20160101', end_date='20190101')  #上证指数
HS = pro.index_daily(ts_code='399300.SZ', start_date='20160101', end_date='20190101')  #沪深指数
SZ.head()
ts_code trade_date close open high low pre_close change pct_chg vol amount
0 000001.SH 20181228 2493.8962 2483.6171 2505.1138 2478.3250 2483.0864 10.8098 0.4353 119245250.0 105980853.0
1 000001.SH 20181227 2483.0864 2527.7167 2532.0022 2483.0864 2498.2939 -15.2075 -0.6087 135406843.0 112479760.5
2 000001.SH 20181226 2498.2939 2501.1199 2513.8264 2492.0758 2504.8190 -6.5251 -0.2605 108799629.0 93989532.6
3 000001.SH 20181225 2504.8190 2503.9498 2513.9641 2462.8448 2527.0070 -22.1880 -0.8780 140670560.0 114766008.8
4 000001.SH 20181224 2527.0071 2506.7372 2529.4395 2500.4430 2516.2505 10.7566 0.4275 97339852.0 85760935.8
SZ=SZ.set_index('trade_date')
SZ=SZ.rename(columns={'pct_chg':'上证涨跌幅'})
HS=HS300.set_index('trade_date') #将时间作为索引
HS=HS.rename(columns={'pct_chg':'沪深300涨跌幅'})
HS300_SZ=pd.concat([HS['沪深300涨跌幅'],SZ['上证涨跌幅']],axis=1)  #按列合并
HS300_SZ
沪深300涨跌幅 上证涨跌幅
trade_date
20181228 0.6737 0.4353
20181227 -0.3840 -0.6087
20181226 -0.5054 -0.2605
20181225 -0.6885 -0.8780
20181224 0.2906 0.4275
... ... ...
20160108 2.0392 1.9651
20160107 -6.9333 -7.0449
20160106 1.7543 2.2547
20160105 0.2800 -0.2593
20160104 -7.0206 -6.8638

731 rows × 2 columns

plt.figure(figsize=(9,6))
plt.scatter(x=HS300_SZ.iloc[:,0],y=HS300_SZ.iloc[:,1],c='m',marker='o')
plt.xticks(fontsize=14)
plt.xlabel(u'沪深300指数涨跌幅',fontsize=14)
plt.yticks(fontsize=14)
plt.ylabel(u'上证指数涨跌幅',fontsize=14)
plt.title(u'沪深300指数与上证指数的涨跌幅散点图',fontsize=14)
plt.grid()

画图:matplotlib模块

currency=['美元','欧元','人民币','日元','英镑']
perc=[0.4173,0.3093,0.1092,0.0833,0.0809]
plt.figure(figsize=(9,7))
plt.pie(x=perc,labels=currency)
plt.axis('equal')  #使饼图是一个圆形
plt.legend(loc=1,fontsize=13)
plt.title(u'特别提款权中不同币种的占比',fontsize=13)
plt.show()

画图:matplotlib模块

参考书目:基于python的金融分析与风险管理第5章(斯文著)

上一篇:Nginx+Keepalived实现简单的服务高可用


下一篇:什么是缺陷密度?计算的公式及示例