Node.js 量化投資實戰:使用富果歷史行情 API 與回測工具評估交易策略
· 18 min read
在量化投資領域中,回測是指利用歷史市場數據對一個投資策略進行模擬交易,以評估該策略在過去的市場環境下的表現。透過回測,投資者可以根據歷史市場數據得出策略的勝率、獲利和風險等關鍵指標,進而作出投資決策,判斷該策略是否有效以及了解策略在不同市場條件下的表現情況。
在本文中,我們將以 Node.js 為例,介紹如何使用富果提供的歷史行情 API 與回測工具,對過去的市場數據來模擬和驗證各種交易策略。
準備歷史數據
要進行回測,首先我們必須準備任意金融商品(如股票、期貨、外匯、加密貨幣等)的 OHLCV(開盤價、最高價、最低價、收盤價、成交量)歷史數據。為了使用實際的數據做範例,我們以台積電(2330)近三年(2020 至 2022 年)的歷史股價為例說明如何操作。
請確認已準備好 Node.js 開發環境,並已申請富果行情 API。接著,請安裝以下依賴套件:
$ npm install --save @fugle/realtime luxon
上述安裝的套件中,@fugle/realtime 是富果行情 API 客戶端函式庫;luxon 則是一個用於處理時間和日期的模組,可以方便地進行時間計算和日期格式化。
以下是一個取得特定股票近三年歷史股價的範例:
const { HttpClient } = require('@fugle/realtime');
const { DateTime } = require('luxon');
async function getData(options) {
const symbol = options?.symbol ?? '2330';
const lastYear = options?.lastYear ?? 2022;
const recentYears = options?.recentYears ?? 3;
const client = new HttpClient({ apiToken: 'YOUR_API_TOKEN' });
const data = [];
for (let i = 0, dt = DateTime.now().set({ year: lastYear }); i < recentYears; i++, dt = dt.minus({ year: 1 })) {
const historical = await client.historical.candles({
symbolId: symbol,
from: dt.startOf('year').toISODate(),
to: dt.endOf('year').toISODate(),
});
data.push(...historical.data);
}
return data;
}
- 第 1-2 行:使用
require語句引入了兩個模組@fugle/realtime和luxon。@fugle/realtime是富果行情 API 客戶端 SDK,而luxon方便操作時間和日期的模組,協助我們處理時間和日期格式化。 - 第 4 行:定義了一個名為
getData的 async function,用來取得指定股票的歷史數據。這個 function 接收一個名為options的物件參數。 - 第 5-7 行:使用
?.選擇運算子和??null 合併運算子,對options物件參數的symbol、lastYear和recentYears屬性進行空值判斷,若這些屬性沒有被傳入,則使用預設值2330、2022和3。 - 第 8 行:建立一個
HttpClient物件,並將apiToken設為 API 的存取權杖。需要注意的是,這裡的YOUR_API_TOKEN必須替換成有效的 API 存取權杖。 - 第 11-18 行:使用 for 迴圈,從最近的年份開始,每次往前推一年,獲取指定金融商品的該年的 OHLCV 歷史數據。由於富果歷史行情API每次請求的最大時間範圍為一年,我們須逐次取得每年的歷史行情數據。
定義交易策略
定義交易策略是回測的核心,在實作交易策略之前,我們先安裝以下依賴套件:
$ npm install --save @fugle/backtest technicalindicators
