结合金融场景演示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()
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()
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()
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)
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)
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)
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)
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)
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()
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()
参考书目:基于python的金融分析与风险管理第5章(斯文著)