擷取台股個股收盤股價 — Java 實作

Chao-Hsuan Ke
小小實驗室
Published in
6 min readDec 8, 2019

使用 Java 撰寫擷取特定個股的收盤指數,只要輸入要擷取的起始日期以及個股代號,即可以得到該個股從指定日期之後至今日的收盤數值。

主要分為三個部分:

1. 判斷股票代號2. 計算起始日期(該月份)至今要擷取的日期3. 擷取該股收盤數值

直接來看 code

1. 判斷股票代號

判斷輸入 id 是“上市”(TWSE)或是“上櫃”(TPEX)

在第一個部分是要先判斷所輸入的個股是屬於上市或是上櫃,上市的股票屬於台灣證券交易所管理,英文為 Taiwan Stock Exchange,因此簡稱 TWSE,而上櫃個股票屬於證卷櫃檯買賣中心,英文為 Taipei Exchange,簡稱為TPEX。

為了判斷出所輸入的 stockid 是屬於上市或上櫃,需要先做一個區別。這邊直接事先把現有的上市與上櫃清單存成文字檔,將輸入的 stockid 與文字檔進行比對就可以知道屬於何者?若是上市股票會回傳 twse,若是屬於上櫃股票則是回傳 tpex。

Read_TWSE();     // 讀取 twse 清單Read_TPEX();     // 讀取 tpex 清單stockTag = checkstockId_Tag(stockId);  // 比對後回傳

在變數宣告時 twselistFile 與 tpexlistFile 指定著兩個檔案的置放處,請再自行修改為該檔案存放之處。

而 twse 與 tpex 兩者清單可以直接從這邊下載:

https://github.com/deternan/Medium/blob/master/code/data/TWSE.txt

https://github.com/deternan/Medium/blob/master/code/data/TPEX.txt

2. 計算時間差

計算起始日期(該月份)至今要擷取的日期

由於證交所提供的 API 一次回傳的資料都是以月為單位 (也就是不管輸入某月的哪一個日期,就是都回傳該月一整月的收盤資料)。為了讓收集資料時可以更有效率,我們直接收集輸入日期到今日的全部收盤資料,例如若使用者輸入了某股號代號與 20190618 這個日期,程式執行時間為 2019年12月07日,則會依序收集 2019 年 06、07、08、09、10、11 以及至 12 月 06 日的該股收盤數值。

Date today = Calendar.getInstance().getTime();
SimpleDateFormat sdf = new SimpleDateFormat(ADDate_pattern);
String todayStr = sdf.format(today);
String specificDateStr = startYear + startMonth + startDay;
// 月份差距
monthGap = getMonthGap(todayStr, specificDateStr);
// 月份列表
List<String> monthList = MonthIncrement(startYear + startMonth, monthGap);

3. 擷取該股收盤數值

拼湊出擷取網址,擷取收盤數值

因為證交所提供的上市與上櫃分別是不同的 API,所以必須依據輸入的股票代號拼出完整個 API url 之後再呼叫。

TWSE

若股票是屬於 TWSE 的部分,其擷取的 API url 為:

https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date={yyyymmdd}&stockNo={xxxx}

其中 yyyymmdd 是日期,例如 20191207,而 xxxx 為股票代碼,例如 2330 (台積電)。因此若想要知道台積電在 2019 年 11 月整個月的收盤價,這使用這樣的 url

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

前面有提到,這個 API 都是一次抓一個月的資料,因此日期填入幾號都沒差,都是把一整個月的數值抓回,但還是要填滿 8 位字元就是。這邊年份是使用西元而不是民國。

TPEX

若是屬於 TPEX 的部分,其擷取的 API url 為:

https://www.tpex.org.tw/web/stock/aftertrading/daily_trading_info/st43_result.php?d={yyy/mm}&stkno={xxxx}

tpex 除了位址不同外,其跟 twse 最大的差別是日期是使用民國的代碼。yyy/mm 中的 yyy 是民國數值,例如同樣想抓 2019 年 11 月的台積電股價,這邊日期就要改成 108/11,因此完整的 url 則為:

https://www.tpex.org.tw/web/stock/aftertrading/daily_trading_info/st43_result.php?d=108/11&stkno=2330

當依據日期與股號完成 url 的組成後,直接呼叫 httpsGet 這個類別讓他去打 API 後再接回 response 並進行剖析。

回傳的結果會用 dateoutput 與 valueoutput 兩個 ArrayList 分別儲存日期與股價,印出之後的結果如下圖:

--

--

Chao-Hsuan Ke
小小實驗室

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