Quantcast
Channel: WFU BLOG
Viewing all articles
Browse latest Browse all 571

排程自動抓台幣美元匯率成交量資料﹍Google Apps Script

$
0
0
上一篇說明「如何排程抓證交所台股交易資料」,本篇同樣利用 Google 試算表作為資料庫,使用 Google Apps Script(以下簡稱 GAS)進行排程及寫程式,來抓取「美元/台幣」匯率交易資料,用以觀察長期趨勢,尋找合適的買賣點。 (圖片出處: pexels.com)

一、公開資訊來源

1. 臺灣期貨交易所 API這是期交所 API 網址: 往下找到「每日外幣參考匯率」即可看到 API 呼叫網址:
  • https://openapi.taifex.com.tw/v1/DailyForeignExchangeRates
操作的方式可參考上一篇「如何排程抓證交所台股交易資料」→「一、證交所 API」→「1. 新版 API」,有圖解範例說明。 2. 台北外匯市場發展基金會「台北外匯市場發展基金會」提供了 1990 年以來的每日外匯成交資料,且包含「成交量」紀錄,這是前面「期交所 API」無法提供的。 進入以下頁面後,可下載每一年的 csv 檔紀錄: 如果不需要成交量的話,可以使用「期交所 API」;如果需要成交量,就得瞭解如何抓 csv 檔後進行解析。

二、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 相關文章:

Viewing all articles
Browse latest Browse all 571

Trending Articles