程式語言-股價爬蟲套件分析
難易程度★★★
此篇文章程式使用 Anaconda的 Jupyter,測試環境 python3.6,事先完成 pandas, matplotlib,pandas_datareader,fix_yahoo_finance,twstock套件安裝
今日來比較股價爬蟲神器『pandas_datareader』、『fix_yahoo_finance』、『twstock』何者較厲害 !
之前教學都是如何用網頁 `request` 資料下來
下載下來的都是當日台股所有資訊
但一般投資人不會看所有資料,只想看自己關心的
今天介紹的3種工具在網路已經紅一陣子,但版主最近才接觸
下面就來簡單分析它們如何使用~
介紹套件
- datetime:讀取時間序列的套件
- pandas: 處理載入的數列(list)型態資料轉成表格(table)格式
- matplotlib:將陣列(array)型態資料繪製成圖型
- pandas_datareader:可抓取yahoo股價的套件
- fix_yahoo_finance:另一種可抓取yahoo股價的套件
- twstock:可抓取台灣證券交易所的套件
程式解析
- 導入所需的套件
#導入套件
import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
2. 設定要爬的『股票代號』及『價格區間』,這邊我們設從現在往回算180天,截止日設定今天
#設定爬蟲股票代號
sid = '0050'#設定爬蟲時間
start = datetime.datetime.now() - datetime.timedelta(days=180)
end = datetime.date.today()
下面開始是3個套件的個別比較~~
pandas_datareader套件教學
3. 導入『pandas_datareader』套件
#導入pandas_datareader
from pandas_datareader import data# 與yahoo請求,套件路徑因版本不同
pd.core.common.is_list_like = pd.api.types.is_list_like
4. 用get_data_yahoo取得股票資料,並用 tail 取出最後10組資料
之前有教過用 head來取出前 5筆資料,請參考 程式語言-股票爬蟲
# 取得股票資料
stock_dr = data.get_data_yahoo(sid+'.TW', start, end)
stock_dr.tail(10)
fix_yahoo_finance套件教學
5. 導入『fix_yahoo_finance』套件
#導入fix_yahoo_finance
import fix_yahoo_finance as yf#把資料抓到本機
yf.pdr_override()
6. 取得股價資料,跟pandas_datareader的做法一模一樣,只是把`get_data_yahoo`改成`download`
# 取得股票資料
stock_yf = yf.download(sid+'.TW', start, end)
stock_yf.tail(10)
twstock套件教學
7. 導入『twstock』套件
#導入twstock
import twstock
8. 用Stock套件抓取股價資料,並用內建fetch_from的方式指定抓取資料區間,此時資料型態是list格式
#用fetch_from抓取資料,並放入dataframe裡
data=twstock.Stock(sid)
data.fetch_from(2018,7)
9. 將list格式轉成dataframe的表格型式,一樣取最後10組,可以看出column顯示的key與上面兩種套件不一樣(因為來源不同),此時也尚未設定index值
#指定日期放入dataframe裡
stock_tw = pd.DataFrame(data.fetch_from(2018,7))
stock_tw.tail(10)
10. 設定date 為 index值,記得加上`inplace = True`
#設定index
stock_tw.set_index('date', inplace = True)
stock_tw.tail(10)
小結
上面3種種套件可以快速地把想要的股票及區間資料下載下來,最終都是以『表格型式』呈現,對於資料處理及輸出相當的方便~
應觀眾要求加碼
利用上面三種套件把資料抓下來似乎有點乾,沒甚麼挑戰性
下面我們利用畫圖來驗證這3組資料是不是一樣
11. 我們用matplotlib套件來畫線形圖,設定畫圖框為16x8
12. 利用`rolling(window=day)`來畫出『移動平均線』
13. 用legend畫出側標,把上面的label放進去,用title放上標題
#線型圖,收盤價、5日均線、20日均線、60日均線
stock['Adj Close'].plot(figsize=(16, 8))
stock['Adj Close'].rolling(window=5).mean().plot(figsize=(16, 8), label='5_Day_Mean')
stock['Adj Close'].rolling(window=20).mean().plot(figsize=(16, 8), label='20_Day_Mean')
stock['Adj Close'].rolling(window=60).mean().plot(figsize=(16, 8), label='60_Day_Mean')#顯示側標
plt.legend(loc='upper right', shadow=True, fontsize='x-large')#顯示標題
plt.title(sid)
三種圖示最終如下
三種圖型都是一樣,得證
附上原始程式碼
這次的教學教了
- 3種抓股價資料的套件教學
- 如何使用tail指令
- 溫習list轉dataframe格式,及index的設定
- 用matplotlib畫圖教學(平均線、側標及標題)