iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 9
1
AI & Data

人工智慧 vs.工人智慧系列 第 9

Day 09:今天漲停還是跌停?

因為我們之後需要知道每篇文章到底講的好不好 (準不準),那我們一定要有一個標準當作參考。一個最簡單的參考就是直接拿每天的股市收盤價當作參考,例如某篇文章在今天提到有一隻股票在未來的走勢不錯(會漲),那我們可以抓今天之後的一段時間來評估看看,例如一個月、兩個月或三個月後的該支股票價格是不是比今天的價格還要高?如果這三個時間點的價格真的都比今日好,那就可以說這篇文章具有良好的公信力。換言之,如果這位作者發表的文章多數的結果都如此的優良,嘿嘿 … 那是不是以後跟著他搭順風車就對了?。

為了方便,我們想一次把台股每支股票每天的收盤價擷取下來,用來當作我們之後的參考與計算使用,那我們就先從擷取目前台股所有的上市、櫃公司名稱與代號開始吧。

在第二篇的時候我們有提到,台股的公司分為上市與上櫃公司。上市公司的清單列表可以到這裡查看:

https://isin.twse.com.tw/isin/C_public.jsp?strMode=2

而上櫃公司的清單列表可以到這裡查看:

https://isin.twse.com.tw/isin/C_public.jsp?strMode=4

有了來源,接下來就是把資料抓回來。放心,這部分的程式碼也準備好了

GetCompany_Main.java

因為證交所在今年三月把網站都改成 https 了,我參考了一下別人擷取 https 網站的寫法再來改寫為這邊的 code。

這個類別會去呼叫另一個類別 get_Company_list,這邊只是把它分開來寫而已,沒什麼特別的意義。執行主類別後,會將上述提到的兩個網址依序丟入 get_Company_list 然後輸出,一樣記得要先改好輸出的資料夾名稱 sourceFolder。

之後輸出兩個檔案,一個是 TWSE_date.txt 另一個是 TPEX_date.txt (這兩個檔案是在 2019年08月20日產生的, 所以結尾就是 20190820)

TWSE_20190820.txt

and

TPEX_20190820.txt

這兩個檔案的格式如下圖,左邊欄位是代號,右邊欄位是公司名稱。

https://ithelp.ithome.com.tw/upload/images/20190906/20119726BS7ysLMlqy.png

這樣應該看得出來 1108 就是『幸福』吧!什麼,你問我幸福是什麼公司?阿是不會自己 Google 哦 ?。1217 應該知道了吧 XD

很好,有了公司名稱和代號後,我們就可以去抓每支股票的收盤價了。現在蠻多現有別人寫好的程式可以使用收盤價的截取,例如:

https://medium.com/renee0918/python-爬取個股歷年股價資訊-b6bc594c8a95
或是
https://ithelp.ithome.com.tw/articles/10205113

不過現有可用的 code 都是用 Python 所開發,因為我們預設是使用 Jave 來實作,所以這邊我們也用 Java 寫了一隻爬蟲來抓各股票每日的收盤價格。台灣證交所有提供 API 讓一般民眾直接抓取相關資訊,所以只要按照 API 的格式就可以把我們想要的時間範圍內的各股價一起抓回來。

https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date={日期}&stockNo={股票代碼}

在 date 後面是你要的日期,stockNo 後面則是接股票代碼。要注意的是因為這隻 API 是擷取整個月的股價資訊,所以得到的 response 是整個月份。這裡我們用台積電這個例子來說,如果要擷取 2019年08月份整個月的 2317 收盤價,那就輸入如下變數即可:

https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date=20190820&stockNo=2330

得到的 resposne 會長這個樣子

https://ithelp.ithome.com.tw/upload/images/20190906/20119726p4FewddKP9.png

回傳一個 JSON format 回來,這邊會得到日期、成交股數、成交金額 … 等,但其實我們只要日期和收盤價,也剛好有這些資訊。每日的資訊都各自被包成一個 object 方便大家使用。我們也寫好了一個可執行檔來抓取這些資料:

GatValues_Main.java

這個類別會先讀取所有公司代號 (就是上面的公司名稱與代號清單),然後將各公司代號與日期依序帶入 API 中就可以。之後再進行 JSON 格式的截取,取出我們想要的資料即可。
我們先把這一年半來的收盤價先抓好,每個檔案就是一間公司的收盤價,時間範圍從 2018 年 1 月 1 日到 2019 年 06 月 30 日:

https://github.com/deternan/PTT_Stock/tree/master/output/Values

要注意的是,因為證交所的 API 有抓取頻率的限制,不能在一定的秒數內連續擷取,經過我自己多次的測驗,發現門檻值大約在 6 秒左右 (就是說如每 6 秒一次已經是最大的範圍),如果在 6 秒內連續擷取兩次,那 IP 就會被鎖住,要一個小時後才能繼續擷取,這部分要自己注意一下。

那時候你可能會想問,我們要這麼多公司又這麼多時間的股價要抓,這樣要抓到何時?沒錯,當初我抓了一個星期才把這一年半的資料抓回來,所以說囉,如果你不想花時間去做收盤價擷取的動作,那就直接用我們上面已經抓好的資料就好。


免責聲明:本文章提到的股市指數與說明皆為他人撰寫文章內容,包括:選股條件,買入條件,賣出條件和風險控制參數,只適用於文章內的解釋與說明,此提示及建議內容僅供參考之用,並不構成投資研究、認購、招攬或邀約任何人士投資任何投資產品或交易策略,亦不應視為投資建議。


上一篇
Day 08:數據資料來源大部分解 (下集)
下一篇
Day 10:真正的工人智慧上線 .. 前
系列文
人工智慧 vs.工人智慧30

尚未有邦友留言

立即登入留言