上一篇說明「如何排程抓證交所台股交易資料」,本篇同樣利用 Google 試算表作為資料庫,使用 Google Apps Script(以下簡稱 GAS)進行排程及寫程式,來抓取「美元/台幣」匯率交易資料,用以觀察長期趨勢,尋找合適的買賣點。
(圖片出處: pexels.com)
一、公開資訊來源
1. 臺灣期貨交易所 API這是期交所 API 網址: 往下找到「每日外幣參考匯率」即可看到 API 呼叫網址:- https://openapi.taifex.com.tw/v1/DailyForeignExchangeRates
二、GAS 解析 CSV 檔
1. 官方工具參考 GAS 官網說明書「parseCsv」,使用以下工具可解析 CSV 檔內容:Utilities.parseCsv("csv 檔內容")
以上指令會將 csv 檔內容解析並回傳二維陣列資料,例如原本的 csv 內容為:
名稱, 性別, 編號
Wayne, Male, 001
解析後回傳:
[
[名稱, 性別, 編號],
[Wayne, Male, 001],
]
2. 操作範例這篇「How to fetch and parse a CSV in Google Apps Script」提供了實作範例:
function myFunc(){
var res = UrlFetchApp.fetch('http://www.example.com/my.csv')
var csvraw = res.getContentText()
var csv = Utilities.parseCsv(csvraw)
}
csv 即為回傳的二維陣列內容。
三、取得歷史外匯資料範例
以下為 GAS 範例程式碼:var ss = SpreadsheetApp.getActiveSpreadsheet(),
fx_sheet = ss.getSheetByName("匯率");
// 取得匯率歷史價量資料
function getFxHistory() {
var startYear = 1989,
endYear = 2023,
apiUrl = "https://www.tpefx.com.tw/uploads/service/tw/", // api 呼叫網址
fetchUrl, i, j, response, data, date, rate, volume, rowData, lastRow;
// loop 年份
for (i = startYear; i < endYear; i++) {
fetchUrl = apiUrl + i + "nt.csv"; // 組合 api 參數
response = UrlFetchApp.fetch(fetchUrl).getContentText();
data = Utilities.parseCsv(response);
// 去除 row 1 「欄位名稱」資料
data.shift();
rowData = [];
// loop 所有資料
for (j in data) {
date = data[j][0];
// 沒有日期不處理
if (!date) {
continue;
}
rate = data[j][2]; // 匯率
volume = data[j][5]; // 成交量
rowData.push([date, rate, volume]);
}
// 寫入試算表
lastRow = fx_sheet.getLastRow();
fx_sheet.getRange(lastRow + 1, 1, rowData.length, 3).setValues(rowData);
// 休息
Utilities.sleep(5000);
}
}
四、取得每日外匯資料範例
1. GAS 範例想要每日取得最新外匯成交資料的話,由於收盤時間為 16:00,最好 17:00 以後再設定排程執行程式。 以下為操作「期交所 API」的範例程式碼:var ss = SpreadsheetApp.getActiveSpreadsheet(),
fx_sheet = ss.getSheetByName("匯率"),
today = new Date(),
todayFormat = Utilities.formatDate(today, "GMT+8", "yyyyMMdd"); // 格式化今天日期
// 取得匯率歷史價量資料
function getFxToday() {
var apiUrl = "https://openapi.taifex.com.tw/v1/DailyForeignExchangeRates", // api 呼叫網址
response = UrlFetchApp.fetch(apiUrl).getContentText(),
data = JSON.parse(response),
i, j, rowData, date, rate;
// loop data
for (i in data) {
rowData = data[i];
// loop 每日資料
for (j in rowData) {
date = rowData[j]["Date"];
// 今日才處理
if (date == todayFormat) {
rate = rowData[j]["USD/NTD"]; // 美元台幣匯率
fx_sheet.appendRow([date, rate]);
}
}
}
}
2. 注意事項奇怪的是,「期交所 API」我在 GAS 執行時,總是回傳 404 錯誤,不曉得是否有人頻繁用 GAS 呼叫「期交所 API」,導致 GAS 伺服器 IP 被期交所伺服器封鎖。
然而我改用 Node.js 呼叫「期交所 API」就沒有任何問題,所以如果以上程式碼你也遇上 404 錯誤的話,可以參考「使用 Node.js 爬蟲定期抓網頁資料,結合 Google 試算表作為資料庫」,改用 Node.js 的環境來修改程式碼,進行爬蟲排程抓資料。
五、補充
本篇操作寫得比較簡略,如有疑問可先閱讀上一篇「如何排程抓證交所台股交易資料」的內容,來瞭解以下如何操作:- Google 試算表察看資料
- GAS 設定排程
- 自動寄信通知
更多 Google Apps Script 相關文章: