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的累積收益率遠大於其它兩隻股票,但其波動也十分明顯。