每日台股大盤收盤指數 — Java 實作
抓股市資料很多人都用 Python 開發 (也的確比較好寫),例如 ..
但 Java 也是做得到的 …
這邊我們直接用 Java 來做一件事:擷取每日大盤收盤指數。
如果你問我為什麼有需要做件事?原因有兩個,一個是正在進行中的 side project 有需要 (之後會再把成果公告出來),另一個是之前在痞客邦鐵人賽時剛好需要這資料。
要擷取大盤指數可以從證券交易所提供的 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
好,那也差不多就是這樣了,只要設定兩個變數就一切解決了。
若程式碼有任何錯誤也歡迎大家幫忙指正囉!!