python 金融應用(三)數據可視化


  matplotlib 庫( http://www.matp1otlìb.org )的基本可視化功能。

 主要是2-D繪圖、金融繪圖和3-D繪圖

一.2-D繪圖

1.1一維數據集

#導入所需要的包
import
matplotlib as mpl import numpy as np import matplotlib.pyplot as plt
np.random.seed(1000)
y=np.random.standard_normal(20)   #生成20個正太分布隨機數
x=range(len(y))  #簡單的繪圖
plt.plot(x,y)

  其實,不需要輸入x參數也可以繪圖,因為plot 會注意到何時傳遞了ndarray 對象。在這種情況下,沒有必要提供x 值的"額外"信息, 如果你只提供y 的, plot 以索') I 值作為對應的x 值、因此,下面一行代碼會生成完全一樣的輸出。

plt.plot(y)

還可以傳遞附加方法:

plt.plot(y.cumsum())  #對y的累計求和

 

 還可以操作細節,

plt.plot(y.cumsum())
plt.grid(True)   #添加表格
plt.axis('tight') #顯示x軸的全刻度
plt.xlim(-1,20)   #規定x軸最大、最小值
plt.ylim(np.min(y.cumsum())-1,np.max(y.cumsum())+1)
plt.show()

plt.axis具體參數:

Empty :返回 當前坐標軸限值
off :關閉做標軸線相標簽
equal :使用等刻度
scalcd :通過尺寸變化平衡刻度
tight :使所有 數據可見{縮小限值)
Image: 使所有數據可見(使用數據限值)
[xmin、xmax, ymin, ymax] :將設置限定為給定(一組)值

plt.figure(figsize=(12,8))
plt.plot(y.cumsum(),'b',lw=1.5)
plt.plot(y.cumsum(),'ro')
plt.grid(True)
plt.axis('tight')
plt.xlabel('index')
plt.ylabel('value')
plt.title('A simple picture')
plt.show()

顏色

可以通過調用matplotlib.pyplot.colors()得到matplotlib支持的所有顏色。

別名 顏色 別名 顏色
b 藍色 g 綠色
r 紅色 y 黃色
c 青色 k 黑色 
m 洋紅色 w 白色

 

 

 

線條標記

標記maker 描述 標記 描述
‘o’ 圓圈 ‘.’
‘D’ 菱形 ‘s’ 正方形
‘h’ 六邊形1 ‘*’ 星號
‘H’ 六邊形2 ‘d’ 小菱形
‘_’ 水平線 ‘v’ 一角朝下的三角形
‘8’ 八邊形 ‘<’ 一角朝左的三角形
‘p’ 五邊形 ‘>’ 一角朝右的三角形
‘,’ 像素 ‘^’ 一角朝上的三角形
‘+’ 加號 ‘\’ 豎線
‘None’,’’,’ ‘ ‘x’ X

 

 

 

 

 

用來該表線條的屬性

風格linestyle或ls 描述 線條風格linestyle或ls 描述
‘-‘ 實線 ‘:’ 虛線 
‘–’ 破折線 ‘None’,’ ‘,’’ 什么都不畫 
‘-.’ 點划線  

 

 

 

1.2  二維數據集

 

np.random.seed(2000)
y=np.random.standard_normal((20,2)).cumsum(axis=0)  #axis=0 按列累加求和

plt.figure(figsize=(8,6))
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.show()

 

添加圖例

plt.figure(figsize=(8,6))
plt.plot(y[:,0],lw=1.5,label='1st')
plt.plot(y[:,1],lw=1.5,label='2st')
plt.plot(y,'ro')
plt.grid(True)
plt.axis('tight')
plt.xlabel('index')
plt.ylabel('value')
plt.legend(loc=0)
plt.title('A simple plot')
plt.show()

圖例位置參數: 

plt.legend(loc='’)

0: ‘best'
1: ‘upper right'
2: ‘upper left'
3: ‘lower left'
4: ‘lower right'
5: ‘right'
6: ‘center left'
7: ‘center right'
8: ‘lower center'
9: ‘upper center'
10: ‘center'

 

 

 

使用雙坐標軸

y[:,0]=y[:,0]*100
fig,ax1=plt.subplots(figsize=(8,6))
plt.plot(y[:,0],'c',lw=1.5,label='1st')
plt.plot(y[:,0],'ro')
plt.legend(loc=8)

ax2=ax1.twinx()    #添加另一個坐標軸
plt.plot(y[:,1],lw=1.5,label='2st')
plt.plot(y[:,1],'ro')

plt.grid(True)
plt.axis('tight')
plt.xlabel('index')
plt.ylabel('value')
plt.legend(loc=0)
plt.title('A simple plot')
plt.show()

 

畫兩個子圖plt.figure(figsize=(8,6))

 

plt.figure(figsize=(8,6))
plt.subplot(211) #2x1 第一個子圖
plt.plot(y[:,0],'c',lw=1.5,label='1st')
plt.plot(y[:,0],'ro')
plt.legend(loc=0)
 plt.subplot(212) #兩行一列 第二個子圖
plt.plot(y[:,1],'g',lw=1.5,label='2st')
plt.plot(y[:,1],'ro')
plt.legend(loc=0)

plt.grid(True)
plt.axis('tight')
plt.xlabel('index')
plt.ylabel('value')
plt.title('A simple plot')
plt.show()

不同種類的兩個子圖

plt.figure(figsize=(8,6))
plt.subplot(211)
plt.plot(y[:,0],'c',lw=1.5,label='1st')
plt.plot(y[:,0],'ro')
plt.legend(loc=0)
plt.grid(True)
plt.axis('tight')
plt.xlabel('index')
plt.ylabel('value')
plt.title('1 dataset')

plt.subplot(212)
plt.bar(np.arange(len(y)),y[:,1],color='g',width=0.5,label='2st')  #條形圖

plt.legend(loc=0)

plt.grid(True)

plt.axis('tight')
plt.xlabel('index')
plt.ylabel('value')
plt.title('2nd dataset')
plt.show() 

其他繪圖樣式

散點圖

np.random.seed(2000)
y=np.random.standard_normal((2000,2))

plt.figure(figsize=(8,6))
plt.scatter(y[:,0],y[:,1])
plt.grid(True)
plt.xlabel('1 data')
plt.ylabel('2 data')
plt.show()

plt.figure(figsize=(8,6))
plt.plot(y[:,0],y[:,1],color='r',marker='o')
plt.grid(True)
plt.xlabel('1 data')
plt.ylabel('2 data')
plt.show()

scatter 繪圖函數可以加入第三維,通過不同的顏色進行可視化.並使用彩條加以描述。為此,我們用隨機數據生成第三個數據集,這次使用的是0 和10 之間的整數:

 展示的散點圖有不同顏色小點表示的第三維,還有作為顏色圖例的影條:

c = np.random.randint(0, 10, len(y))
plt.figure(figsize=(7,5))
plt.scatter(y[: , 0], y [ : , 1] , c=c , marker ='o')
plt.colorbar()
plt.grid(True)
plt.xlabel('lst')
plt.ylabel('2nd')
plt.title('Scatter Plot')

直方圖

plt.figure(figsize=(7,4))
plt.hist(y,label=['1st','2en'],bins=20)  #bins=20 代表分為20組
plt.legend(loc=0)
plt.grid(True)
plt.xlabel('index')
plt.ylabel('value')
plt.show()

詳解hist函數

   matplotlib.pyplot.hist(  
    x, bins=10, range=None, normed=False,   
    weights=None, cumulative=False, bottom=None,   
    histtype=u'bar', align=u'mid', orientation=u'vertical',   
    rwidth=None, log=False, color=None, label=None, stacked=False,   
    hold=None, **kwargs)  

參數描述:
x :列表對象 ndarray 對象
bins: 數據組( bin )數
range: 數據組的下界和上界
nonned :規范化為整數1
weights: x 軸上每個值的權重
cumulative: 每個數據組包含較低組別的計數
hisstype :選項(字符串): ar, barstacked, step、stepfìlled
align: 選項(字符串): left, mid, righl
onentatlon: 選項(字符串): horizontal, vertical
rwideth:條塊的相對寬度
log :對數刻度
color :每個數據集的顏色(類似數組)
label :標簽所用的字符串或者字符串序列
stacked :堆疊多個數據集

 

兩個數據集的數據在直方圖的堆疊,只需要修改hist中參數:

plt.figure(figsize=(7,4))
plt.hist(y,label=['1st','2en'],bins=20)
plt.legend(loc=0)
plt.grid(True)
plt.xlabel('index')
plt.ylabel('value')
plt.show()

箱型圖

fig,ax=plt.subplots(figsize=(7,4))
plt.boxplot(y)
plt.setp(ax,xticklabels=['1st','2nd'])             #    設置(一組)圖表的實例的屬性
plt.grid(True)
plt.xlabel('value')
plt.ylabel('fre')
plt.show()

data=np.random.standard_normal(20)
lin=plt.plot(data,'r')
plt.setp(lin,linestyle='-')
plt.show()

將線的樣式更改為"短划線" 

 

生成積分曲線

#1:積分函數
def fun(x):
    return 0.5*np.exp(x)+1

#2:定義積分區
a,b=0.5,1.5
x=np.linspace(0,2)
y=fun(x)

#3:繪制函數圖像
fig,ax=plt.subplots(figsize=(7,4))
plt.plot(x,y,'r',lw=1.5)
plt.ylim(ymin=0)

from matplotlib.patches import Polygon
#4:使用Polygon 函數生成陰影部分(‘補丁’),表示積分面積:
Ix=np.linspace(a,b)
Iy=fun(x)
verts=[(a,0)]+ list(zip(Ix,Iy)) +[(b,0)] #zip把列表轉化為元組l1= [1,2,3]  l2=[2,3,4]  lsit(zip(l1,l2))=[(1,2),(2,3),(3,4)]
poly = Polygon(verts, facecolor ='0.9',edgecolor='0.1')
ax.add_patch(poly)


plt.text(0.5 * (a + b) , 1, r"$\int_a^b f(x)\mathrm{d}x$" ,horizontalalignment='center' , fontsize=20)
plt.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( [ fun(a) , fun(b)])
ax . set_yticklabels(('$f(a)$' , '$f(b)$'))
plt.grid(True)
plt.show()

 

二 .3-D繪圖

 

strike = np.linspace(50, 150, 24)
ttm = np.linspace(0.5, 2.5, 24)
strike, ttm = np.meshgrid(strike, ttm)


iv = (strike - 100) ** 2 / (100 *strike) / ttm
# generate fake implied νolatilities

from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(9, 6))
ax = fig.gca(projection='3d')
surf = ax.plot_surface(strike, ttm, iv, rstride=2 , cstride=2,
cmap=plt.cm.coolwarm, linewidth=0.5,
antialiased=True)
ax.set_xlabel('strike')
ax.set_ylabel('time-to-maturity')
ax.set_zlabel('implied volatility')
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()

 

plot_surface 參數

X, Y, Z :2D 數組形式的數據值
rstride :數組行距(步長大小)
cstride: 數組列距(步長大小)
color: 曲面塊顏包
cmap: 曲面峽顏色映射
facecolors :單獨曲面塊表面'顏包
norm :將值映射為顏色的Normalize 實例
Vmin:映射的最小值
vmax :映射的最大值

 還有可以用view_init 設置不同的視角:

fig = plt.figure(figsize=(8, 5))
ax = fig.add_subplot(111,projection='3d')
ax.view_init(30, 60)
ax.scatter(strike, ttm, iv, zdir='z' , s=25,
c='b' , marker='^')
ax.set_xlabel('strike')
ax.set_ylabel('time-to-maturity')
ax.set_zlabel('implied volatili ty')
plt.show()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM