第三讲 数据可视化本讲主要介绍Python的matplotlib库提供的基本绘图功能。虽然还有很多其他绘图方面的库,matplotlib是最基础的,并且在很多情况下,这是一种稳定和可靠的可视化工具。无论是标准的绘图还是复杂绘图和个性化,matplotlib都提供了灵活的工具。另外,它与NumPy及其数据结构也是结合在一起的。本讲主要讨论以下两个话题:
2D绘图:最简单的图形是二维的或者是不同的子图,我们会讨论金融中常见的图形,比如蜡烛图等。
3D绘图:提供了金融中一系列常用的3D图形绘制方法。本讲对于Python的matplotlib库提供的绘图功能的介绍并不是面面俱到的,但是提供了最基础和金融中最常用的一些例子。其他的例子我们在后面的章节中也会介绍,比如第五讲中关于pandas库如何可视化时间序列的数据等。比如我们先把matplotlib引入进来
import matplotlib as mplimport numpy as npimport matplotlib.pyplot as plt%matplotlib inline
相关的库都已经引入进来,我们先做2D图,要求x上面是一个列表,y轴也是一个列表,列表的长度是相同的。我们用随机数函数生成随机数,再生成y坐标,用标准正态分布的随机数,一共生成20个数。
np.random.seed(1000)y=np.random.standard_normal(20)
我们来看一下y这个数
yOut[5]: array([-0.8044583 , 0.32093155, -0.02548288, 0.64432383, -0.30079667, 0.38947455, -0.1074373 , -0.47998308, 0.5950355 , -0.46466753, 0.66728131, -0.80611561, -1.19606983, -0.40596016, -0.18237734, 0.10319289, -0.13842199, 0.70569237, 1.27179528, -0.98674733])
可以看到生成的是均值为零,方差为一的随机数,那我们要把这20个数放到坐标轴上面,我们要生成一个x轴坐标,x坐标应该和y的值的个数相同,我们用range这个函数来生成。
x=range(len(y))
接下来我们就可以用plot函数作图,就是下图。
plt.plot(x,y)
因为我们的y是通过numpy 生成的,所以我们可以直接画图,而不用考虑y。这样作图的效果其实跟上图是一样的。
plt.plot(y)
在我们画图的时候,我们还可以对y进行一些运算表示在图上,如下对y进行累加。
plt.plot(y.cumsum())
我们之前还学过这个图还可以加格点。
plt.plot(y.cumsum())plt.grid(True)plt.axis('tight')
我们还可以进行更细致的调整,比如说调整x的取值范围,调整y轴的取值范围。如下,x调整到(-1,20)。y调整到所有数的和的最小值+1,到所有数的和的最大值+1。
plt.plot(y.cumsum())plt.grid(True)plt.xlim(-1,20)plt.ylim(np.min(y.cumsum())-1,np.max(y.cumsum())+1)
默认的线是蓝色线,我们还可以把蓝色的线变成其他的颜色,再加上一些其他的含义。
plt.figure(figsize=(7,4)) 横是7、竖是4的这么一个图片plt.plot(y.cumsum(),'b',lw=1.5)颜色变成,线宽是1.5plt.plot(y.cumsum(),'ro')ro是红色的点plt.grid(True)网格生成plt.axis('tight')坐标轴调成tight,从最小值到最大值plt.xlabel('index')x轴的含义plt.ylabel('value')y轴的含义是valueplt.title('A Simplot plot')图片的标题
刚才画的是1维数据集,现在我们画多维数据集。首先生成一组随机数,20行两列。
np.random.seed(2000)y=np.random.standard_normal((20,2)).cumsum(axis=0)
yOut[20]: array([[ 1.73673761, 1.89791391], [-0.37003581, 1.74900181], [ 0.21302575, -0.51023122], [ 0.35026529, -1.21144444], [-0.27051479, -1.6910642 ], [ 0.93922398, -2.76624806], [ 1.74614319, -3.05703153], [ 1.52519555, -3.22618757], [ 2.62602999, -3.14367705], [ 2.6216544 , -4.8662353 ], [ 3.67921082, -7.38414811], [ 1.7685707 , -6.07769276], [ 2.19296834, -6.54686084], [ 1.18689581, -7.46878388], [ 1.81330034, -7.11160718], [ 1.79458178, -6.89043591], [ 2.49318589, -6.05592589], [ 0.82754806, -8.95736573], [ 0.77890953, -9.00274406], [ 2.25424343, -9.51643749]])
我们要把这两条线画到一张图上,首先生成一个figure记录一下。
plt.figure(figsize=(7,4))plt.plot(y,lw=1.5)plt.plot(y,'ro')plt.grid(True)plt.axis('tight')plt.xlabel('index')plt.ylabel('value')plt.title('A Simple Plot')
我们也可以加一点细节。
plt.figure(figsize=(7,4))plt.plot(y[:,0],lw=1.5,label='1st')第一条线加上labelplt.plot(y[:,1],lw=1.5,label='2nd')第二条线加上labelplt.plot(y,'ro')plt.grid(True)plt.legend(loc=0)加一个图示,把它放到0这个位置,就是左下角这个位置plt.axis('tight')plt.xlabel('index')plt.ylabel('value')plt.title('A Simple Plot')
我们在执行上列语句之前,把数组之中的第一列变一下,每个数字都乘以100,我们再去作图。
y[:,0]=y[:,0]*100plt.figure(figsize=(7,4))plt.plot(y[:,0],lw=1.5,label='1st')plt.plot(y[:,1],lw=1.5,label='2nd')plt.plot(y,'ro')plt.grid(True)plt.legend(loc=0)plt.axis('tight')plt.xlabel('index')plt.ylabel('value')plt.title('A Simple Plot')
我们就会发现从坐标上相比相差很大,第二条直线基本上就是一条直线,那么我们就只能用双轴图来解决这个问题。
fig,ax1=plt.subplots()plt.plot(y[:,0],'b',lw=1.5,label='1st')plt.plot(y[:,0],'ro')plt.grid(True)plt.legend(loc=0)plt.axis('tight')plt.xlabel('index')plt.ylabel('value 1st')plt.title('A Simplot plot')ax2=ax1.twinx()plt.plot(y[:,1],'g',lw=1.5,label='2nd')plt.plot(y[:,1],'ro')plt.legend(loc=0)plt.ylabel('value 2nd')
绘制子图:plt.subplot使用三个数(numrows,numcols和fignum)来确定每一个子图的位置,子图的位置因此就是从1开始到numrows*numcols。这个方法还支持对不同的子图使用不同的绘图格式与方法。
plt.figure(figsize=(7,5))plt.subplot(211)有两个图,是第一行第一列的图plt.plot(y[:,0],'b',lw=1.5,label='1st')plt.plot(y[:,0],'ro')plt.grid(True)plt.legend(loc=0)plt.axis('tight')plt.xlabel('index')plt.ylabel('value 1st')plt.title('A Simplot plot')plt.subplot(212)第一行第二个图plt.plot(y[:,1],'g',lw=1.5,label='2nd')plt.plot(y[:,1],'ro')plt.legend(loc=0)plt.ylabel('value 2nd')
如果你想画一个折线图,一个柱状图,你应该怎么办呢。
plt.figure(figsize=(9,4))plt.subplot(121)plt.plot(y[:,0],'b',lw=1.5,label='1st')plt.plot(y[:,0],'ro')plt.grid(True)plt.legend(loc=0)plt.axis('tight')plt.xlabel('index')plt.ylabel('value')plt.title('1st data set')plt.subplot(122)plt.bar(np.arange(len(y)),y[:,1],width=0.5,color='g',label='2nd')plt.grid(True)plt.legend(loc=0)plt.axis('tight')plt.xlabel('index')plt.title('2nd Data Set')
前面我们画了折线图和柱状图,我们也可以画散点图和其他的图标。首先我们生成数据,1000行2列的数据。
y=np.random.standard_normal((1000,2))
plt.figure(figsize=(7,5))plt.plot(y[:,0],y[:,1],'ro')x轴上是第一列,y轴上是第二列plt.grid(True)plt.xlabel('1st')plt.ylabel('2nd')plt.title('Scatter Plot')
plt.figure(figsize=(7,5))plt.plot(y[:,0],y[:,1],marker='o')点之间都连成了线plt.grid(True)plt.xlabel('1st')plt.ylabel('2nd')plt.title('Scatter Plot')
我们接下来画三维的数,我们怎么画三维的数呢,就是我们在边上再加一个这个柱状条,让它和这个图配合起来我们先生成第三维,生成均匀分布的1000个随机数
c=np.random.randint(0,10,len(y))
我们来看看c是什么
cOut[37]: array([9, 9, 7, 5, 0, 1, 6, 2, 7, 6, 6, 2, 2, 7, 1, 2, 3, 7, 9, 5, 5, 7, 8, 2, 2, 9, 1, 9, 9, 3, 3, 6, 1, 1, 6, 5, 0, 2, 7, 1, 5, 8, 9, 3, 4, 6, 4, 9, 7, 6, 4, 0, 3, 1, 8, 5, 6, 2, 7, 4, 6, 9, 4, 1, 7, 0, 7, 3, 3, 4, 9, 6, 0, 4, 1, 7, 7, 1, 5, 5, 0, 9, 2, 3, 2, 3, 7, 6, 8, 8, 9, 0, 0, 9, 8, 0, 8, 1, 7, 5, 2, 6, 4, 2, 5, 7, 2, 8, 6, 2, 6, 6, 0, 1, 4, 8, 2, 9, 7, 3, 1, 9, 7, 5, 6, 4, 5, 4, 7, 2, 1, 3, 2, 7, 2, 9, 2, 7, 6, 7, 9, 9, 0, 8, 1, 5, 1, 3, 8, 5, 7, 3, 2, 4, 0, 6, 6, 0, 0, 8, 1, 4, 1, 4, 0, 8, 1, 2, 4, 4, 5, 5, 6, 3, 1, 5, 5, 1, 0, 7, 7, 0, 8, 6, 5, 5, 3, 7, 2, 3, 7, 1, 7, 0, 8, 1, 2, 4, 8, 1, 6, 5, 6, 9, 7, 7, 3, 7, 8, 3, 9, 8, 3, 5, 2, 4, 2, 3, 6, 5, 4, 3, 8, 7, 1, 0, 3, 3, 7, 3, 0, 9, 4, 0, 0, 6, 3, 7, 4, 8, 2, 6, 5, 5, 4, 2, 6, 5, 3, 4, 2, 9, 0, 3, 5, 1, 5, 5, 7, 6, 7, 5, 1, 3, 2, 6, 2, 9, 8, 6, 9, 2, 5, 1, 2, 7, 8, 2, 6, 2, 5, 9, 4, 8, 2, 8, 7, 2, 7, 1, 7, 9, 1, 8, 8, 8, 5, 0, 7, 9, 0, 4, 2, 5, 7, 0, 1, 9, 5, 0, 6, 0, 3, 3, 6, 0, 2, 6, 3, 8, 7, 8, 8, 8, 8, 3, 4, 1, 9, 1, 2, 0, 6, 2, 0, 0, 1, 9, 6, 1, 7, 8, 5, 7, 8, 4, 0, 5, 6, 8, 8, 0, 9, 0, 6, 5, 1, 2, 3, 3, 6, 5, 4, 2, 3, 5, 1, 5, 4, 3, 3, 2, 1, 3, 3, 7, 1, 9, 1, 2, 5, 0, 9, 6, 0, 5, 6, 7, 8, 4, 9, 5, 5, 0, 8, 6, 5, 8, 7, 3, 9, 3, 6, 6, 6, 3, 1, 1, 8, 5, 6, 0, 6, 3, 8, 6, 4, 7, 5, 6, 2, 3, 5, 6, 0, 4, 9, 6, 5, 8, 5, 0, 6, 6, 1, 0, 2, 8, 0, 3, 5, 9, 4, 1, 8, 5, 0, 5, 9, 0, 1, 4, 3, 4, 8, 4, 0, 9, 9, 3, 2, 5, 8, 7, 2, 9, 8, 4, 0, 2, 0, 7, 1, 8, 8, 6, 8, 9, 8, 4, 9, 7, 4, 6, 4, 1, 0, 7, 2, 9, 7, 4, 5, 1, 2, 5, 9, 5, 4, 5, 3, 2, 4, 9, 5, 7, 2, 4, 0, 6, 7, 3, 0, 0, 7, 8, 5, 5, 9, 2, 0, 8, 8, 9, 9, 9, 3, 8, 4, 0, 1, 7, 6, 7, 2, 3, 2, 7, 6, 6, 3, 1, 9, 1, 1, 8, 2, 9, 4, 6, 4, 0, 5, 9, 3, 1, 9, 2, 4, 3, 0, 5, 1, 8, 2, 9, 6, 0, 3, 7, 1, 4, 2, 6, 3, 1, 7, 4, 8, 3, 3, 5, 6, 8, 8, 0, 2, 1, 3, 4, 5, 0, 3, 0, 3, 7, 2, 3, 5, 3, 6, 9, 3, 3, 4, 1, 7, 1, 9, 3, 3, 9, 9, 4, 2, 6, 0, 6, 1, 9, 8, 8, 9, 1, 5, 2, 0, 8, 4, 6, 7, 7, 6, 1, 3, 4, 3, 3, 0, 8, 6, 4, 1, 9, 6, 2, 5, 5, 8, 9, 1, 7, 7, 9, 9, 9, 6, 8, 3, 8, 2, 5, 2, 8, 4, 2, 9, 8, 3, 4, 4, 5, 1, 4, 5, 9, 1, 9, 7, 5, 7, 4, 2, 7, 9, 2, 6, 9, 2, 3, 2, 2, 4, 2, 2, 3, 8, 9, 4, 0, 9, 1, 8, 8, 1, 3, 2, 2, 3, 3, 1, 3, 5, 2, 1, 8, 7, 4, 8, 0, 6, 1, 2, 2, 4, 5, 8, 5, 4, 2, 1, 0, 5, 6, 2, 0, 3, 5, 5, 5, 8, 9, 5, 3, 7, 0, 4, 3, 0, 9, 4, 9, 0, 3, 2, 0, 4, 2, 4, 3, 1, 4, 8, 9, 6, 3, 3, 4, 5, 0, 0, 1, 1, 5, 5, 4, 9, 5, 3, 6, 7, 8, 4, 0, 3, 5, 1, 7, 1, 0, 1, 7, 4, 9, 6, 2, 9, 8, 8, 7, 8, 5, 5, 4, 1, 8, 3, 3, 9, 3, 5, 2, 5, 1, 7, 0, 7, 1, 5, 1, 5, 0, 7, 5, 0, 2, 1, 1, 6, 5, 0, 5, 5, 1, 0, 3, 1, 2, 9, 3, 0, 8, 2, 6, 9, 4, 4, 6, 1, 2, 8, 7, 1, 1, 4, 8, 1, 7, 4, 6, 1, 2, 3, 4, 4, 2, 7, 8, 7, 5, 9, 1, 7, 4, 9, 1, 8, 1, 1, 5, 1, 3, 9, 5, 1, 0, 0, 8, 7, 3, 0, 0, 9, 8, 4, 2, 7, 3, 5, 9, 9, 6, 4, 8, 1, 1, 0, 4, 8, 9, 7, 7, 7, 1, 4, 8, 8, 6, 0, 3, 4, 7, 4, 7, 0, 7, 9, 1, 2, 7, 0, 2, 8, 5, 4, 7, 8, 4, 6, 0, 7, 9, 8, 4, 2, 3, 6, 8, 6, 7, 5, 1, 2, 5, 2, 0, 6, 2, 0, 1, 3, 5, 1, 4, 0, 7, 7, 2, 8, 9, 0, 3, 7, 9, 6, 5, 8, 9, 7, 5, 9, 2, 4, 8, 3, 0, 8, 0, 2, 6, 4, 6, 3, 2, 5, 3, 4, 6, 5, 2])
plt.figure(figsize=(7,5))plt.scatter(y[:,0],y[:,1],c=c,marker='o')这里用scatter才能画出三维的图plt.colorbar()plt.grid(True)plt.xlabel('1st')plt.ylabel('2nd')plt.title('Scatter Plot')
还有一种我们在金融上经常用的图叫做直方图,就是我们要对数据进行统计需要这种图,这个图也是可以做出来的。
plt.figure(figsize=(7,4))plt.hist(y,label=['1st','2nd'],bins=25)plt.grid(True)plt.legend(loc=0)plt.xlabel('value')plt.ylabel('frequency')plt.title('Histogram')
plt.figure(figsize=(7,4))plt.hist(y,label=['1st','2nd'],color=['b','g'],stacked=True,bins=25)不同的颜色,而且是堆积起来的(stacked=True)plt.grid(True)plt.legend(loc=0)plt.xlabel('value')plt.ylabel('frequency')plt.title('Histogram')
另外一个使用的比较多的图形叫做箱体图。箱体表示的是频率,就是说从哪到哪,有一个最大值和一个最小值。
fig,ax=plt.subplots(figsize=(7,4))plt.boxplot(y)plt.grid(True)plt.setp(ax,xticklabels=['1st','2nd'])plt.xlabel('data set')plt.ylabel('value')plt.title('boxplot')
作为二维绘图的结束,我们来考虑一个数学上很有用的图,可以由matplotlib来实现,我们来做一个函数,然后显示函数下方在某个下限和上限中间的部分,换句话说也就是某个区间上的定积分。第一步:定义被积函数。第二步:定义积分界限,并生成所需的数值。第三步:做出函数本身。第四步:这一步是核心,我们生成阴影区域,使用Polygen函数来描述积分区域。第五步:把数学公式和相关的文字说明加入到图形中,使用plt.text和plt.figtext函数。另外在这之后设置坐标轴标志我们首先把函数定义出来
def fun(x): return 0.5*np.exp(x)+1
我们再定义积分区间
a,b=0.5,1.5x=np.linspace(0,2)y=fun(x)
xOut[57]: array([0. , 0.04081633, 0.08163265, 0.12244898, 0.16326531, 0.20408163, 0.24489796, 0.28571429, 0.32653061, 0.36734694, 0.40816327, 0.44897959, 0.48979592, 0.53061224, 0.57142857, 0.6122449 , 0.65306122, 0.69387755, 0.73469388, 0.7755102 , 0.81632653, 0.85714286, 0.89795918, 0.93877551, 0.97959184, 1.02040816, 1.06122449, 1.10204082, 1.14285714, 1.18367347, 1.2244898 , 1.26530612, 1.30612245, 1.34693878, 1.3877551 , 1.42857143, 1.46938776, 1.51020408, 1.55102041, 1.59183673, 1.63265306, 1.67346939, 1.71428571, 1.75510204, 1.79591837, 1.83673469, 1.87755102, 1.91836735, 1.95918367, 2. ]) yOut[56]: array([1.5 , 1.52083038, 1.54252857, 1.56513073, 1.5886745 , 1.61319913, 1.63874548, 1.6653561 , 1.69307534, 1.72194939, 1.75202635, 1.78335634, 1.81599156, 1.84998639, 1.88539748, 1.92228381, 1.96070686, 2.00073064, 2.04242184, 2.08584993, 2.13108726, 2.17820922, 2.22729432, 2.27842433, 2.33168447, 2.38716346, 2.44495374, 2.50515162, 2.56785738, 2.63317552, 2.70121485, 2.77208876, 2.84591533, 2.92281757, 3.00292362, 3.08636694, 3.17328658, 3.26382736, 3.35814013, 3.45638205, 3.55871679, 3.66531489, 3.77635394, 3.89201896, 4.01250268, 4.13800583, 4.26873755, 4.40491565, 4.54676703, 4.69452805])
我们看x是零到二之间生成的均匀分布的数,y是对这每一个数带进去算出来的函数的值。
fig.ax=plt.subplots(figsize=(7,5))plt.plot(x,y,'b',linewidth=2)plt.ylim(ymin=0)
接下来我们生成阴影的区域
ix=np.linspace(a,b)iy=fun(ix)verts=[(a,0)]+list(zip(ix,iy))+[(b,0)]
vertsOut[65]: [(0.5, 0), (0.5, 1.824360635350064), (0.5204081632653061, 1.8413571658631893), (0.5408163265306123, 1.8587041280164196), (0.5612244897959183, 1.8764087469510438), (0.5816326530612245, 1.8944783967751135), (0.6020408163265306, 1.9129206036348134), (0.6224489795918368, 1.9317430488491592), (0.6428571428571428, 1.9509535721093245), (0.6632653061224489, 1.9705601747439323), (0.6836734693877551, 1.9905710230516687), (0.7040816326530612, 2.010994451702609), (0.7244897959183674, 2.031838967209668), (0.7448979591836735, 2.053113251471632), (0.7653061224489796, 2.0748261653892324), (0.7857142857142857, 2.096986752555777), (0.8061224489795917, 2.119604243023879), (0.8265306122448979, 2.14268805714984), (0.846938775510204, 2.166247809517302), (0.8673469387755102, 2.190293312941794), (0.8877551020408163, 2.2148345825578435), (0.9081632653061225, 2.239881839990358), (0.9285714285714286, 2.2654455176120063), (0.9489795918367346, 2.291536262888382), (0.9693877551020408, 2.3181649428127558), (0.9897959183673469, 2.345342648432257), (1.010204081632653, 2.373080699467381), (1.030612244897959, 2.401390649026739), (1.0510204081632653, 2.4302842884190143), (1.0714285714285714, 2.459773652064131), (1.0918367346938775, 2.489871022505683), (1.1122448979591835, 2.5205889355267064), (1.1326530612244898, 2.5519401853709276), (1.1530612244897958, 2.5839378300716604), (1.1734693877551021, 2.6165951968905823), (1.193877551020408, 2.6499258878686325), (1.2142857142857142, 2.6839437854913717), (1.2346938775510203, 2.718663058471137), (1.2551020408163265, 2.7540981676484226), (1.2755102040816326, 2.7902638720149264), (1.2959183673469385, 2.827175234860783), (1.316326530612245, 2.8648476300485406), (1.3367346938775508, 2.9032967484164853), (1.3571428571428572, 2.942538604314003), (1.3775510204081631, 2.9825895422716675), (1.3979591836734693, 3.0234662438088704), (1.4183673469387754, 3.065185734381794), (1.4387755102040816, 3.1077653904746465), (1.4591836734693877, 3.1512229468370982), (1.4795918367346939, 3.1955765038709383), (1.5, 3.2408445351690323), (1.5, 0)]
我们把这个图生成出来,先引进Polygon这个包
from matplotlib.patches import Polygon
poly = Polygon(verts,facecolor='0.7',edgecolor='0.5')ax.add_patch(poly)
在ax上增加一些数学公式和标签
fig,ax=plt.subplots(figsize=(7,5))plt.plot(x,y,'b',linewidth=2)plt.ylim(ymin=0)ix=np.linspace(a,b)iy=fun(ix)verts=[(a,0)]+list(zip(ix,iy))+[(b,0)]ploy=Polygon(verts,facecolor='0.7',edgecolor='0.5')ax.add_patch(poly)plt.text(0.5*(a+b),1,r"$\int_a^b f(x)\mathrm{d}*$",horizontalalignment='center',fontsize=20plt.figtext*(0.9,0.075,'$x$')plt.figtext(0.075,0.9,'$f(x)$')ax.set_xticks((a,b))ax.set_xticklabels(('$a$','$b$'))ax.set_yticks([func(a),func(b)])ax.set_yticklabels(('$f(a)$','$f(b)$'))plt.grid(True)
在金融中,有很多领域需要三维作图,但是最突出的一个领域是显示某一到期日和执行价格下期权隐含波动率的波动率曲面。我们在这里人工的生成一个波动率曲面,其中我们考虑:执行价格是从50到150。到期期限从0.5年至2.5年。这样就提供了一个二维的坐标系统,可以使用NumPy的meshgrid函数处理这两个向量来生成这样的系统。对每一个格点,计算假想的隐含波动率。作图,并可以对相关的图形属性做出一些设置,比如使用view_init函数可以设置3D图形的角度。
strike=np.linspace(50,150,24)从50到150之间生成24个点ttm=np.linspace(0.5,2.5,24)最短的到期日是0.5,最长的到期日是2.5,也是生成24个数strike,ttm=np.meshgrid(strike,ttm)生成格点
我们先来看一下数据
strike[:2]Out[24]: array([[ 50. , 54.34782609, 58.69565217, 63.04347826, 67.39130435, 71.73913043, 76.08695652, 80.43478261, 84.7826087 , 89.13043478, 93.47826087, 97.82608696, 102.17391304, 106.52173913, 110.86956522, 115.2173913 , 119.56521739, 123.91304348, 128.26086957, 132.60869565, 136.95652174, 141.30434783, 145.65217391, 150. ], [ 50. , 54.34782609, 58.69565217, 63.04347826, 67.39130435, 71.73913043, 76.08695652, 80.43478261, 84.7826087 , 89.13043478, 93.47826087, 97.82608696, 102.17391304, 106.52173913, 110.86956522, 115.2173913 , 119.56521739, 123.91304348, 128.26086957, 132.60869565, 136.95652174, 141.30434783, 145.65217391, 150. ]])
我们接下来生成一个隐含波动率,strike执行价格
iv=(strike-100)**2/(100*strike)/ttm
先引进这么一个包
from mpl_toolkits.mplot3d import Axes3D
fig=plt.figure(figsize=(9,6))生成图形ax=fig.gca(projection='3d')坐标轴,视图是3Dsurf=ax.plot_surface(strike,ttm,iv,rstride=2,cstride=2,cmap=plt.cm.coolwarm,linewidth=0.5,antialiased=True)转动的角度,cmap=plt.cm.coolwarm作图的方式,由蓝色到红色,ax.set_xlabel('strike')ax.set_ylabel('time-to-maturity')ax.set_zlabel('implied volatility')fig.colorbar(surf,shrink=0.5,aspect=5)
你可以看到波动率比较高的时候就是红色,波动率比较低的时候就是蓝色。这个图形可以转变视角,画一个三维散点图。
fig=plt.figure(figsize=(8,5))ax=fig.add_subplot(111,projection='3d')ax.view_init(30,60)设置视角是30,60这个视角ax.scatter(strike,ttm,iv,zdir='z',s=25,c='b',marker='^')marker就是用什么标记ax.set_xlabel('strike')ax.set_ylabel('time-to-maturity')x.set_zlabel('implied volatility')
在使用Python处理数据可视化的时候matplotlib可以被看作一个基准情形,它与NumPy是密切相关的而且基本的功能是非常容易和方便的使用的。但是本章只是对matplotlib的一个简单介绍,因为它具有相对比较复杂的一个API。本章介绍了matplotlib在处理金融图形中,包括2D和3D绘图中的作用,其他的章节也会提供关于这个库的更多应用。