這一篇會實現抓下每一天的資料並且整理進去 DataFrame,
開始吧!
------------------------------------------------------------------------------------------------------------
Step 3 : 用爬蟲爬資料
Step 3 真的很久,但是等等爬資料的時候,心情會非常好 :)
延續上一集的概念,我們現在要寫一個 loop 來把每一天的資料都抓下來,
在 getTodayIndex 方法下面,加入程式碼如下:
def getData(start):
# 先把 DataFrame 架構寫好
data = {'date':[], 'open':[], 'high':[], 'low':[], 'settlement':[], 'volume':[],
'close':[], 'open_int':[], 'close_best_bid':[], 'close_best_ask':[]}
# 這邊匯入我們想要的資料的起始日期
day = date(start[0], start[1], start[2])
# 這邊把停止日期設置在今天
today = date.today()
# 起始日至今日的總日數
span = ((today - day).days) + 1
# 因為是每日資料,所以間隔設為一日
interval = timedelta(days=1)
# 多定義一個把爬下來的資料放進 DataFrame 的方法
def addtoData(column, index):
try:
data[column].append(int(soup_data[index].text))
except Exception as e:
print (e)
data[column].append(np.nan)
# 把整個 span 內的 soup_data 中的當日期指各項資料抓下來
for _ in range(span):
try:
soup_data = getTodayIndex(day.year, day.month, day.day)
data['date'].append(day)
addtoData('open', 2)
addtoData('high', 3)
addtoData('low', 4)
addtoData('settlement', 5)
addtoData('volume', 8)
addtoData('close', 9)
addtoData('open_int', 10)
addtoData('close_best_bid', 11)
addtoData('close_best_ask', 12)
print ('%d/%d/%d is loaded' %(day.year, day.month, day.day))
except Exception as e:
#print (e)
print ('stock market was not open on %d/%d/%d' %(day.year, day.month, day.day))
# 日期往後加一天
day += interval
# 把 data 放到 DataFrame 裡面
df = pd.DataFrame(data)
return df
# 從 1998/7/21 開始爬
df = getData([1998,7,21])
print (df[['date','open','close','volume']])
到這邊,算是實現「把資料都整理進去 DataFrame 裡面」的程式碼了!
所以就要真的去爬爬看才會知道有沒有抓到資料~
一樣終端機輸入以下
python crawler.py
應該會看到這個
看到資料一天一天被抓下來,等等還會被我們丟進去 DataFrame 裡面,
照理說,應該是很有快感的。
這個爬取的過程,端看每個人網路速度不一樣,幾十分鐘到一小時都有可能。
但是,假如每天都要花一個小時,才能開始處理資料,就要早起一小時準備看盤。
或是說,每次要執行程式前,都要這樣爬一次,那豈不是太累惹嗎?
所以我們就要使用 Pickle !!!!
------------------------------------------------------------------------------------------------------------
Step 4 : 用 Pickle 做資料存取
Pickle 是 python 中非常好用的套件,Pickle 可以存取很多種東西,
所以我們只要把 DataFrame 整個存進去,以後就可以隨時開起來用,
每天就可以多睡一個小時了!
在 crawler.py 程式碼底下,繼續加入以下程式碼,
with open('TWfuture.pickle','wb') as f:
pickle.dump(df, f)
這樣在資料全部爬完以後,就可以把資料儲存在與檔案相同路徑的資料夾裡面了!
資料的名稱會叫做: TWfuture.pickle
那要怎麼把資料叫出來,並且繼續使用呢?
再在程式碼底下,加入以下,
pickle_in = open('TWfuture.pickle', 'rb')
df = pickle.load(pickle_in)
print (df.tail())
這樣以後就算沒有執行爬取資料的方法,也可以直接使用抓取下來的資料了!
很神奇吧!?
短短幾行 code 就可以完成這件事情,這代表什麼意思呢?
如果我們今天有一套超級複雜的 Deep Learning Model 偏偏我們又沒有 GPU,
電腦又只是普通電腦,那跑個幾天是絕對的!
但因為有了 Pickle 哥,我們只需要租個超強的雲端伺服器,
把我們的 Model 丟上去,training 完之後,把 training 後的 classifier 用 Pickle 存起來,
再把這個 classifier 抓下來就可以使用了!
前後只需要租一兩個小時,絕對比買一塊 GPU 划算!
感謝 Pickle 哥。
######################################################
這邊附上已經爬好的資料和爬資料的程式碼。
######################################################
所以讓我們把 getData([1998,7,21]) 這一段 comment out 吧!
comment out 後,執行一下這個程式,
python crawler.py
應該會出現這個可愛的東西,
大功告成!!!
現在我們已經把全部資料抓下來而且整理好了!
接下來就可以用機器學習來玩這一個資料然後賺大錢惹~~~~~
這邊大家可以想一下,要怎麼用機器學習來學台指期,
還有,要用什麼樣的策略以及什麼樣的 feature 呢?
下一集會分享,我假設的策略以及如何用 Scikit 實現台指期機器學習。
------------------------------------------------------------------------------------------------------------
Reference
[1] 期貨 wikipedia
[2] 股票指數 wikipedia
[3] 台灣期貨交易所, http://www.taifex.com.tw/
[5] A beautiful soup, https://www.crummy.com/software/BeautifulSoup/bs4/doc/
[6] Pickle, https://docs.python.org/2/library/pickle.html
[7] Scikit-Learn, http://machine-learning-python.kspax.io
[8] Scikit-Learn, http://scikit-learn.org/stable/
下一集:
[機器學習練習] [Machine Learning Practice] 用 Scikit 學習台灣指數趨勢(四)
[8] Scikit-Learn, http://scikit-learn.org/stable/
下一集:
[機器學習練習] [Machine Learning Practice] 用 Scikit 學習台灣指數趨勢(四)
請問一下這篇,我用您提供的程式碼update了資料,但是會出現
回覆刪除stock market was not open on 2016/10/22....
stock market was not open on 2017/11/20
請問是哪裡需要再修改嗎,我這邊python版本是3.6.3
kerker
刪除code 很舊了
剛改了一下
https://github.com/khanwhlee/crawler_for_TX
應該可以用惹,有問題再麻煩你留言
您好想請問一下
回覆刪除因為期交所網站有做更新
所以我找不到版主上面所說的syear等名稱
期交所的日期名稱已經改成queryDate了
但是我一直只能抓到最新的一天的資料
對啊!我之前也是剛維護完,他就立刻更新。我現在改用 selenium 爬了,相較比較麻煩,有空才能教學,目前傾向開看盤軟體 Flask 教學。你有需要的話,我可以 dump 資料庫給你。
刪除