利用python進行股票數據分析及其可視化
來自專欄傳統行業小白的數據之旅
前言:
本文利用python中的pandas_datareader包從雅虎財經上抓取阿里巴巴、谷歌、亞馬遜、Facebook、蘋果以及騰訊幾家公司2017年8月到2018年8月這一年的股票數據,並生成可視化圖表。在安裝及使用pandas_datareader包時,遇到一些常見問題及其解決方案祥見l此文: https://blog.csdn.net/huang_susan/article/details/80655628
其中:
- 獲取國內股票數據的方式是:「股票代碼」+「對應股市」(港股為.hk,A股為.ss)
例如騰訊是港股是:0700.hk。
- 每日股票價位信息含義:Open:開盤價,High:最高加,Low:最低價,Close:收盤價,Volume:成交量
import pandas as pdfrom pandas_datareader import dataimport fix_yahoo_finance as fyfy.pdr_override()gafataDict={谷歌:GOOG,亞馬遜:AMZN,Facebook:FB, 蘋果:AAPL,阿里巴巴:BABA,騰訊:0700.hk}
首先,建立一個函數計算各家股票累計變化:其中騰訊為港股,為方便幾家股票對比,需做港幣和美元轉化:
定義函數函數功能:計算股票漲跌幅=(現在股價-買入價格)/買入價格輸入參數:column是收盤價這一列的數據返回數據:漲跌幅def change(column): buy_price = column[0] now_price = column[column.size-1] price_change = (buy_price-now_price)/buy_price if(price_change)>0: print(累計股價上漲=,price_change*100,%) if(price_change)==0: print(累計股價沒有變化) if(price_change)<0: print(累計股價下跌=,price_change*100,%) return price_change
選擇要截取的時間範圍股票:
start_time = 2017-08-01end_time = 2018-08-01
以阿里為例,計算股票漲跌幅度:同理,得到其他幾家公司股價變化:
#從雅虎財經數據源(get_data_yahoo)獲取阿里巴巴股票數據baba_data = data.get_data_yahoo(gafataDict[阿里巴巴],start_time,end_time)#計算累計漲幅baba_clo = baba_data[Close]baba_change = change(baba_clo)
計算得到阿里的累計股價下跌= -20.8325263795 %
同理,得到其他幾家公司股價變化:
谷歌: -30.8178409457 %
亞馬遜:-79.9428910098 %
Facebook:-1.96750487445 %
蘋果:-27.9432516088 %
騰訊:-12.9134881599 %
其中騰訊為港股,為方便幾家股票對比,需做港幣和美元轉化:
#2018.08.25港幣兌美元匯率exchange = 0.1274 #為了方便後期多家公司的股價比較,增加新的一列收盤價(美元)tx_data[Close_dollar]= tx_data[Close]* exchangetx_data.head()
股票數據可視化:
我們給plot傳入的橫軸x坐標軸數據成交量這一列的數據,縱軸y坐標軸數據是收盤價這一列的數據,同時增加了一個參數叫kind這個值表示繪製圖形的類型,這裡的值等於scatter表示繪製散點圖。kind取值(圖形類型)參考官方文檔:http://pandas.pydata.org/pandas-docs/stable/visualization.htmlbaba_data.plot(x=Volume,y=Close,kind=scatter)#x坐標軸文本plt.xlabel(成交量)#y坐標軸文本plt.ylabel(股價(美元))#圖片標題plt.title(成交量和股價)#顯示網格plt.grid(True)#顯示圖形plt.show()
#得到相關係數矩陣baba_data.corr()
我們做一個各家公司股票累計漲幅的對比圖:在這之前由於直接進行index索引繪圖容易出現邏輯錯誤,這裡用reset_index處理index,將其變成如下形式:
tx_data.reset_index(inplace=True)tx_data.head()
ax2 = plt.subplot(2,1,1)goog_data.plot(ax = ax2,x=Date,y = Close,label =谷歌)amaz_data.plot(ax = ax2,x=Date,y = Close,label = 亞馬遜)plt.xlabel(時間)plt.ylabel(股價(美元))plt.title(2018年GAFATA股價累計漲幅比較)plt.grid(True)plt.show()ax3 = plt.subplot(2,1,2)baba_data.plot(ax = ax3,x=Date,y=Close,label =阿里巴巴)fb_data.plot(ax = ax3,x=Date,y = Close,label = Facebook)aapl_data.plot(ax = ax3,x=Date,y = Close,label = 蘋果)tx_data.plot(ax = ax3,x=Date,y = Close_dollar,label = 騰訊)plt.xlabel(時間)plt.ylabel(股價(美元))plt.title(2018年GAFATA股價累計漲幅比較)plt.grid(True)plt.show()
製作條形圖觀察各家股票收盤價的平均值:
gafata_mean = [baba_data[Close].mean(), goog_data[Close].mean(), amaz_data[Close].mean(), fb_data[Close].mean(), aapl_data[Close].mean(), tx_data[Close_dollar].mean() ]gafata_mean=pd.Series(gafata_mean, index=[阿里巴巴, 谷歌, 亞馬遜, Facebook, 蘋果, 騰訊])gafata_mean.plot(kind=bar,label=GAFATA,color = y)#圖片標題plt.title(2017年GAFATA股價平均值)#x坐標軸文本plt.xlabel(公司名稱)#y坐標軸文本plt.ylabel(股價平均值(美元))plt.grid(True)plt.show()
平均值對異常值不敏感,我們可以繼續做箱體圖:
close_data = pd.DataFrame()close_data = pd.concat([close_data,baba_data[Close], goog_data[Close], amaz_data[Close], fb_data[Close], aapl_data[Close], tx_data[Close_dollar]],axis = 1)#print(close_data)#重命名列名close_data.columns = [阿里巴巴,谷歌,亞馬遜,Facebook,蘋果,騰訊]close_data.head()close_data.plot(kind = box)plt.grid(True)plt.show()
附:箱形圖最大的優點就是不受異常值的影響(異常值也稱為離群值),可以以一種相對穩定的方式描述數據的離散分布情況。
推薦閱讀:
※低維度(二維)數據可視化
※看板--精益生產可視化管理工具
※數據可視化實例 seaborn(1)
※將文字、思路可視化?魚骨圖幫你追根溯源,找出真正的「元兇」
※「360杯」ChinaVis挑戰賽落幕 百支隊伍創歷史之最