1. 程式人生 > >python繪圖練習——股票分析(一):基礎分析

python繪圖練習——股票分析(一):基礎分析

此篇文章將通過對股票資料進行基礎分析來實際運用python的繪相簿。
首先,引入所需要的庫:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


然後,匯入股票資料,這裡選用了特斯拉,通用汽車和福特汽車三隻股票2012年到2016年的資料。這裡是直接使用的下載好的csv檔案,另外也可以直接利用python從雅虎或者Quandl上載入資料,具體方法就不過多解釋了。


Tesla=pd.read_csv('Tesla_Stock.csv',index_col='Date')
Tesla.index=pd.to_datetime(Tesla.index)

GM=pd.read_csv('GM_stock.csv'
,index_col='Date') GM.index=pd.to_datetime(GM.index) Ford=pd.read_csv('Ford_Stock.csv',index_col='Date') Ford.index=pd.to_datetime(Ford.index)

1.這裡使用pd.to_datetime將資料集時間轉化為時間序列,便於股票的分析。

首先看看資料長相:

Tesla.head()

這裡寫圖片描述

資料集包含了股票的開盤價、收盤價、每日最低價與最高價、交易量等資訊。
接下來,我們來看看三支股票的開盤價走勢:


plt.figure(figsize=(16
,6)) Tesla['Open'].plot() GM['Open'].plot() Ford['Open'].plot() plt.legend(['Tesla','GM','Ford'],loc='upper right')

這裡寫圖片描述
1.plt.legend用於設定影象的圖例,loc是圖例位置,upper right代表圖例在右上角。

接下來看看成交量:

plt.figure(figsize=(16,6))
Tesla['Volume'].plot()
GM['Volume'].plot()
Ford['Volume'].plot()
plt.legend(['Tesla','GM'
,'Ford'],loc='upper right') plt.xlim(Tesla.index[0],Tesla.index[-1])

這裡寫圖片描述
1.這裡plt.xlim設定x軸的範圍。

通過圖形,我們可以看到frod在其中有一天有異常的交易量,我們可以通過python定位這一天:

Ford['Volume'].argmax()

Tesla['Total Traded']=Tesla['Open']*Tesla['Volume']
GM['Total Traded']=GM['Open']*GM['Volume']
Ford['Total Traded']=Ford['Open']*Ford['Volume']

plt.figure(figsize=(16,6))
Tesla['Total Traded'].plot()
GM['Total Traded'].plot()
Ford['Total Traded'].plot()
plt.legend(['Tesla','GM','Ford'],loc='upper right')
plt.xlim(Tesla.index[0],Tesla.index[-1])

這裡寫圖片描述
可以看到Tesla在其中也有一天存在異常,具體新聞:Tesla is on a hot streak again

接下來看看通用汽車這隻股票的收盤價及其移動平均線:

GM['Close'].plot(figsize=(16,6),xlim=(GM.index[0],GM.index[-1]),label='Close')
GM['Close'].rolling(50).mean().plot(label='GM MA50')
GM['Close'].rolling(200).mean().plot(label='GM MA200')
plt.legend()

這裡寫圖片描述
1.使用DataFrame的rolling()函式得到移動平均值。
2.由於在上面的語句中已經提前輸入了標籤,所以在plt.legend中無需再輸入。

接下來,我們可以通過繪圖看看三隻股票大概的相關關係:


from pandas.plotting import scatter_matrix
stockOpen=pd.DataFrame(columns=['Tesla','GM','Ford'],index=GM.index)
stockOpen['Tesla']=Tesla['Open']
stockOpen['GM']=GM['Open']
stockOpen['Ford']=Ford['Open']
#stockOpen = pd.concat([Tesla['Open'],GM['Open'],Ford['Open']],axis=1)
scatter_matrix(stockOpen.dropna(), alpha=0.2, figsize=(9, 9), hist_kwds={'bins':50})

這裡寫圖片描述
另外還可以通過seaborn庫中的pairplot函式繪製:

import seaborn as sns
sns.pairplot(stockOpen.dropna())

這裡寫圖片描述
從圖上可以看出,通用汽車和福特汽車的股票有比較明顯的正相關性。

接著,我們可以嘗試通過計算每隻股票的日收益率:

Tesla['Return']=(Tesla['Close']-Tesla['Close'].shift(1))/Tesla['Close'].shift(1)
Tesla=Tesla.dropna()

import ffn
GM['Return']=ffn.to_returns(GM['Close'])

Ford['Return']=Ford['Close'].pct_change(1)
Ford=Ford.dropna()

1.這裡了三種方法來計算日收益率,第一種是直接使用計算公式計算;第二種是匯入專用於金融領域的第三方庫ffn.to_returns函式計算;第三種是利用pandas自帶的函式pct_change(1)進行計算。
使用直方圖來觀察一下Tesla的收益率:

plt.hist(Tesla['Return'],bins=50)

這裡寫圖片描述

同時也可以使用核密度圖進行觀察:

sns.kdeplot(Tesla['Return'],label='Tesla')
GM['Return'].plot(kind='kde',label='GM')
Ford['Return'].plot(kind='kde',label='Ford')
plt.ylim(0,35)
plt.legend()

這裡寫圖片描述
1.同樣,kde圖也可以使用seaborn中的函式。

箱圖也是一種很好的觀察收益率分佈的圖形:

box_df = pd.concat([Tesla['Return'],GM['Return'],Ford['Return']],axis=1)
box_df.columns = ['Tesla Returns','GM Returns','Ford Returns']
box_df.plot(kind='box',figsize=(8,11),colormap='jet')

這裡寫圖片描述
從圖中我們可以看出,三支股票的平均日收益率大致為0,但是Tesla的日收益率上下波動明顯大於GM和Ford。

最後,我們可以來計算一下三隻股票的累計收益率:


Tesla['Cumulative Return']=(1+Tesla['Return']).cumprod()
GM['Cumulative Return']=(1+GM['Return']).cumprod()
Ford['Cumulative Return']=(1+Ford['Return']).cumprod()


Tesla['Cumulative Return'].plot(label='Tesla',figsize=(16,8),title='Cumulative Return')
Ford['Cumulative Return'].plot(label='Ford')
GM['Cumulative Return'].plot(label='GM')
plt.legend()

這裡寫圖片描述
1.使用cumprod函式可以計算DataFrame中指定列的累乘積。
從圖中可以明顯看出,Tesla的累積收益率遠大於其它兩隻股票,但其波動也十分明顯。