Historical Candles
查詢上市櫃及興櫃歷史股價(依代碼查詢)。單次查詢區間最長為 1 年;上市櫃個股日資料最遠可回溯至 2010 年,指數部分最遠可回溯至 2015 年,興櫃則可回溯至 2024 年。
historical/candles/{symbol}
Parameters
| Name | Type | Description |
|---|---|---|
symbol* | string | 股票代碼 |
from | string | 開始日期(格式:yyyy-MM-dd),未帶時預設為 1 個月前 |
to | string | 結束日期(格式:yyyy-MM-dd),未帶時預設為今日 |
timeframe | string | K 線週期,未帶時預設為 D 日 K;可選 1 1 分 K;3 3 分 K;5 5 分 K;10 10 分 K;15 15 分 K;30 30 分 K;60 60 分 K;D 日 K;W 週 K;M 月 K |
adjusted | string | 還原股價啟用,可選 true、false(僅日/週/月 K 有效) (v2.2.8 新增) |
fields | string | 欄位選擇,可選 open、high、low、close、volume、average、turnover、change(各欄位適用 timeframe 請見 Response 表格) |
sort | string | 時間排序,預設為 desc 降冪;可選 asc 升冪 |
info
- 日資料更新時間暫定為每交易日 15:30。
- 查詢區間(
from~to)一次最長為 1 年,超過會回傳 400 Bad Request(錯誤訊息:Date range must be less than one year)。 - 分 K 歷史資料自 2023-05-23 起提供。若查詢區間完全落在起始日前、或完全為非交易日,會回傳 404 Resource Not Found(而非空陣列)。
- 興櫃歷史資料可回溯至 2024 年(實際起點依標的而異)。
Response
| Name | Type | Description | 適用 timeframe |
|---|---|---|---|
type* | string | 證券類型 | — |
exchange* | string | 交易所 | — |
market* | string | 市場別 | — |
symbol* | string | 股票代號 | — |
timeframe* | string | K 線週期 | — |
data* | object[] | K 線資料 | — |
data.date* | string | 日期(日/週/月 K 為 yyyy-MM-dd;分 K 為 ISO 8601 含時區,例:2026-07-09T13:30:00.000+08:00) | 全部 |
data.open | number | K 線開盤價 | 全部 |
data.high | number | K 線最高價 | 全部 |
data.low | number | K 線最低價 | 全部 |
data.close | number | K 線收盤價 | 全部 |
data.volume | number | K 線成交量/成交金額,單位請見下方說明 | 全部 |
data.average | number | 成交均價(自開盤累計) | 僅分 K |
data.turnover | number | K 線成交金額(元) | 僅日/週/月 K |
data.change | number | K 線漲跌 | 僅日/週/月 K |
caution
volume 單位依標的與 timeframe 不同:
- 整股標的:分 K 為「成交張數」,日/週/月 K 為「成交股數」(1 張 = 1,000 股)。
- 興櫃股票:分 K 與日/週/月 K 皆為「成交股數」。
- 指數:分 K 為「成交金額」,日/週/月 K 為「成交股數」。
Examples
日 K 範例
查詢日 K 並指定日期區間:
- Python
- Node.js
- C#
from fubon_neo.sdk import FubonSDK, Order
sdk = FubonSDK()
accounts = sdk.login("Your ID", "Your password", "Your cert path", "Your cert password") # 需登入後,才能取得行情權限
sdk.init_realtime() # 建立行情連線
reststock = sdk.marketdata.rest_client.stock
# reststock.historical.candles(**{"symbol": "0050", "from": "2026-06-01", "to": "2026-06-05"}) # 2.2.3 及以前版本
## 2.2.4 及以後版本 (使用 Exception 進行例外處理)
from fubon_neo.fugle_marketdata.rest.base_rest import FugleAPIError
try:
reststock.historical.candles(**{"symbol": "0050", "from": "2026-06-01", "to": "2026-06-05", "fields": "open,high,low,close,volume,turnover,change"})
except FugleAPIError as e:
print(f"Error: {e}")
print("------------")
print(f"Status Code: {e.status_code}") # 例: 429
print(f"Response Text: {e.response_text}") # 例: {"statusCode":429,"message":"Rate limit exceeded"}
const { FubonSDK } = require('fubon-neo');
const sdk = new FubonSDK();
const accounts = sdk.login("Your ID", "Your Password", "Your Cert Path", "Your Cert Password");
sdk.initRealtime(); // 建立行情連線
const client = sdk.marketdata.restClient
client.stock.historical.candles({ symbol: '0050', from: '2026-06-01', to: '2026-06-05', fields: 'open,high,low,close,volume,turnover,change' })
.then(data => console.log(data));
using FubonNeo.Sdk;
using FugleMarketData.QueryModels.Stock.History; //引入 HistoryTimeFrame
using FugleMarketData.QueryModels; //引入 FieldsType
var sdk = new FubonSDK();
var result = sdk.Login("Your ID", "Your Password", "Your Cert Path", "Your Cert Password");
sdk.InitRealtime(); // 建立行情連線
var rest = sdk.MarketData.RestClient.Stock;
var candle = await rest.History.Candles("0050", new(new DateTime(2026,6,1), new DateTime(2026,6,5), HistoryTimeFrame.Day, FieldsType.Volume|FieldsType.Change));
var candle_con = candle.Content.ReadAsStringAsync().Result;
Console.WriteLine(candle_con);
Response Body:
{
"symbol": "0050",
"type": "EQUITY",
"exchange": "TWSE",
"market": "TSE",
"timeframe": "D",
"data": [
{
"date": "2026-06-05",
"open": 105,
"high": 105.35,
"low": 102.8,
"close": 104.15,
"volume": 337031371,
"turnover": 34914259576,
"change": -1.95
},
{
"date": "2026-06-04",
"open": 106.75,
"high": 107,
"low": 106.05,
"close": 106.1,
"volume": 236782252,
"turnover": 25181889523,
"change": -1.5
},
{
"date": "2026-06-03",
"open": 107.3,
"high": 107.85,
"low": 107.1,
"close": 107.6,
"volume": 79592362,
"turnover": 8559208311,
"change": 1.9
}
]
}
分 K 範例
查詢 1 分 K 並指定日期區間(含均價 average):
- Python
- Node.js
- C#
from fubon_neo.sdk import FubonSDK, Order
sdk = FubonSDK()
accounts = sdk.login("Your ID", "Your password", "Your cert path", "Your cert password") # 需登入後,才能取得行情權限
sdk.init_realtime() # 建立行情連線
reststock = sdk.marketdata.rest_client.stock
## 2.2.4 及以後版本 (使用 Exception 進行例外處理)
from fubon_neo.fugle_marketdata.rest.base_rest import FugleAPIError
try:
reststock.historical.candles(**{"symbol": "2330", "from": "2026-07-09", "to": "2026-07-09", "timeframe": "1", "fields": "open,high,low,close,volume,average"})
except FugleAPIError as e:
print(f"Error: {e}")
print("------------")
print(f"Status Code: {e.status_code}") # 例: 429
print(f"Response Text: {e.response_text}") # 例: {"statusCode":429,"message":"Rate limit exceeded"}
const { FubonSDK } = require('fubon-neo');
const sdk = new FubonSDK();
const accounts = sdk.login("Your ID", "Your Password", "Your Cert Path", "Your Cert Password");
sdk.initRealtime(); // 建立行情連線
const client = sdk.marketdata.restClient
client.stock.historical.candles({ symbol: '2330', from: '2026-07-09', to: '2026-07-09', timeframe: '1', fields: 'open,high,low,close,volume,average' })
.then(data => console.log(data));
using FubonNeo.Sdk;
using FugleMarketData.QueryModels.Stock.History; //引入 HistoryTimeFrame
using FugleMarketData.QueryModels; //引入 FieldsType
var sdk = new FubonSDK();
var result = sdk.Login("Your ID", "Your Password", "Your Cert Path", "Your Cert Password");
sdk.InitRealtime(); // 建立行情連線
var rest = sdk.MarketData.RestClient.Stock;
var candle = await rest.History.Candles("2330", new(new DateTime(2026,7,9), new DateTime(2026,7,9), HistoryTimeFrame.OneMin));
var candle_con = candle.Content.ReadAsStringAsync().Result;
Console.WriteLine(candle_con);
Response Body:
{
"symbol": "2330",
"type": "EQUITY",
"exchange": "TWSE",
"market": "TSE",
"timeframe": "1",
"data": [
{
"date": "2026-07-09T13:30:00.000+08:00",
"open": 2415,
"high": 2415,
"low": 2415,
"close": 2415,
"volume": 6261,
"average": 2433.85
},
{
"date": "2026-07-09T13:24:00.000+08:00",
"open": 2430,
"high": 2435,
"low": 2430,
"close": 2435,
"volume": 114,
"average": 2439.56
},
{
"date": "2026-07-09T13:23:00.000+08:00",
"open": 2435,
"high": 2440,
"low": 2430,
"close": 2430,
"volume": 262,
"average": 2439.6
}
]
}
info
'*' 表示必揭示欄位。