每日台股大盤收盤指數 — Java 實作

Chao-Hsuan Ke
小小實驗室
Published in
6 min readOct 3, 2019

要擷取大盤指數可以從證券交易所提供的 API 擷取。格式為

https://www.twse.com.tw/exchangeReport/MI_INDEX?response=json&date={日期}&type=IND

{日期}及為要抓取日期代號,格式為“yyyymmdd”。例如想擷取 2019 年 06月 18日的大盤收盤指數,那 API 即是:

https://www.twse.com.tw/exchangeReport/MI_INDEX?response=json&date=20190618&type=IND

不過 type=IND 會把許多的指數一併抓回,例如:『寶島指數』、『發行量加權股價指數』、『臺灣公司治理100指數』等。這個 Json response 內 data1 的『發行量加權股價指數』即是我們要的大盤指數。

我們可以看出在 data1 裡有許多陣列,每個陣列代表著一個指數,然而每個陣列(指數)內有 5 個 property,在 field4 裡面有寫出各代表著:

所以『收盤指數』就是要抓data1 內第 2 個陣列內的第 2 個數值。

所有的程式碼直接放在 git 上,有興趣也可以直接抓下來用。

分成三個檔案

1. getStockValue_Main.java2. GetValueandProcessing_StockValue.java3. HttpsGet.java

getStockValue_Main 是主程式,主程式只是當作用入口(接口),會呼叫其他類別來進行工作。主要的變數直接在主程式這邊設定,有兩個變數需要設定:

startDate

這是要擷取大盤指數的起始日期,格式為“yyyymmdd”。例如想擷取從 2018 年 01 月 01 日到今日(預設)的每日大盤收盤指數,那變數要設定為 startDate = “20180101”

而擷取到的每日大盤指數我們使用文字檔儲存起來,所以要設定輸出檔的檔案路徑:

outputFolder

輸出檔名先預設為 “value.txt”,如果想換名字,直接修改 StockValue 即可。

另外一個變數值 為 sleepTime,單位需設定為“毫秒”。

sleepTime = 5200

這是因為每從證交所每抓一筆資料需要停留(暫停)的時間,若太頻繁發出 request 你的IP 很有可能會被鎖一段時間,記得至少等一些時間再重新送出另一個 request。經過我自己測試發現只要間隔 5 秒以上就屬於安全範圍,故我們先設定會暫停 5,200 毫秒,也就是 5.2 秒。

GetValueandProcessing_StockValue 才是主要執行 functions 所在,分別執行:

1. 打 API 網址並接收回傳值2. 處理回傳的 JSON 格式3. 儲存處理後的數值

把起始日(dBegin)到今日(dEnd)的全部日期先經過 findDates 方法計算,會回傳一個用陣列 lDate 儲存這兩個日期之間全部日期的字串。

private static List<Date> findDates(Date dBegin, Date dEnd) 
{
List lDate = new ArrayList();
lDate.add(dBegin);
// 起始日期
Calendar calBegin = Calendar.getInstance();
calBegin.setTime(dBegin);
// 結束日期
Calendar calEnd = Calendar.getInstance();
calEnd.setTime(dEnd);
while (dEnd.after(calBegin.getTime()))
{
calBegin.add(Calendar.DAY_OF_MONTH, 1);
lDate.add(calBegin.getTime());
}

return lDate;
}

做 for 迴圈執行 lDate,依序發出不同日期的 request。若該日有開盤就會有回傳數值,遇到假日等非開盤日,則會儲存為 false。下面是輸出範例:

2018 年 06 月 15 日是星期五,收盤指數為 11,087.47,後面兩日為六日未開盤,而 06 月 18 日 星期一是端午節所以也沒開盤,等到 06 月 19 日才開盤。從這個範例就可以知道在輸出格式為:

日期    收盤指數 or {狀態}

這個 sample 是從 2018 年 01 月 01 日至 2019 年 10 月 02 日的大盤收盤指數,若有需要新增就在自行跑一下範例程式就好 (但要記得修改相關變數)。

https://github.com/deternan/Medium/blob/master/code/output/DateValue.txt

好,那也差不多就是這樣了,只要設定兩個變數就一切解決了。

若程式碼有任何錯誤也歡迎大家幫忙指正囉!!

--

--

Chao-Hsuan Ke
小小實驗室

永遠熱愛自己的工作,總是找一堆事把自己的時間塞滿。喜歡接觸不同領域,像是 歷史、文化、金融和公共政策 等議題,期許著自己會什麼就分享什麼。