2016年8月30日 星期二

[機器學習練習] [Machine Learning Practice] 用 Scikit 學習台灣指數趨勢(三)- 資料整理

上一篇講到怎麼從期貨交易所上抓下自己想要的資料

這一篇會實現抓下每一天的資料並且整理進去 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/

[4] Codecademy, https://www.codecademy.com/

4 則留言:

  1. 請問一下這篇,我用您提供的程式碼update了資料,但是會出現
    stock market was not open on 2016/10/22....
    stock market was not open on 2017/11/20

    請問是哪裡需要再修改嗎,我這邊python版本是3.6.3

    回覆刪除
    回覆
    1. kerker
      code 很舊了
      剛改了一下
      https://github.com/khanwhlee/crawler_for_TX
      應該可以用惹,有問題再麻煩你留言

      刪除
  2. 您好想請問一下
    因為期交所網站有做更新
    所以我找不到版主上面所說的syear等名稱
    期交所的日期名稱已經改成queryDate了
    但是我一直只能抓到最新的一天的資料

    回覆刪除
    回覆
    1. 對啊!我之前也是剛維護完,他就立刻更新。我現在改用 selenium 爬了,相較比較麻煩,有空才能教學,目前傾向開看盤軟體 Flask 教學。你有需要的話,我可以 dump 資料庫給你。

      刪除