Skip to main content

Historical Daily

Query the historical daily market data of futures and options for one trading day by product symbol. One call returns every contract listed that day (the full strike chain for options; every month and spread for futures), or only one contract month with contractMonth. Supports regular and after-hours sessions and goes back to 2010.

historical/daily/{product}
Version Note

Available since v2.5.0

Parameters​

NameTypeDescription
product*stringProduct symbol, e.g. futures TXF, MXF, options TXO (upper case). Weekly contracts are also queried by product symbol and selected with contractMonth (e.g. TXO with 202610W1). A contract code (e.g. TXFJ6) is not accepted as product and returns 400
datestringTrading day (format: yyyy-MM-dd), defaults to today if omitted
sessionstringTrading session, defaults to regular if omitted; offer afterhours for the after-hours session
contractMonthstringReturn only this contract month; all contracts of the day are returned if omitted. Accepts a month yyyyMM (e.g. 202610); a weekly contract yyyyMMWn (Wednesday expiry, e.g. 202610W1) or yyyyMMFn (Friday expiry, e.g. 202610F1); a futures spread yyyyMM/yyyyMM (e.g. 202610/202611). Futures also accept continuous contracts: 1! front month, 2! second month, 3! third month (4! and beyond return 400); options do not support continuous contracts and return 400
info
  • Daily data goes back to 2010. Data for the current day is produced after the close and can be queried from about 17:30.
  • Each call covers one trading day and accepts only three query parameters: date, session and contractMonth; other parameters such as from / to have no effect. For a single contract's series across days, use Historical Candles instead.
  • A non-trading day, data not yet produced, or a product symbol / contract month that does not exist returns 404 Resource Not Found. A date with a time part (e.g. 2026-10-02T00:00:00) returns 400.
  • Per TAIFEX rules an after-hours session belongs to the next trading day, e.g. session=afterhours&date=2026-10-02 returns the after-hours session from 2026-10-01 15:00 to 2026-10-02 05:00.
  • data is ordered by expiry (e.g. 202610W1, 202610F1, 202610W2, 202610F2, 202610, 202610F3, 202611), then by strike price from low to high with calls before puts; futures spread rows come last.
  • Futures responses include spread contract rows, whose contractMonth joins two months with / (e.g. 202610/202611); use it to identify or exclude them.

Response​

NameTypeDescription
date*stringTrading day
product*stringProduct symbol
exchange*stringExchange
session*stringSession, REGULAR or AFTERHOURS
contractMonthstringThe contract month passed in the query; for a continuous contract, the resolved actual month. Not returned when contractMonth is omitted
data*object[]Daily data
data.contractMonth*stringContract month: month yyyyMM, weekly yyyyMMWn / yyyyMMFn, futures spread yyyyMM/yyyyMM
data.strikePrice*numberStrike price; null for futures and spread rows
data.callPut*stringCALL or PUT; null for futures and spread rows
data.exchange*stringExchange
data.openPrice*numberOpening price; null when there is no trade
data.highPrice*numberHighest price; null when there is no trade or TAIFEX does not provide it
data.lowPrice*numberLowest price; null when there is no trade or TAIFEX does not provide it
data.closePrice*numberClose price; null when there is no trade
data.change*numberPrice change; null when there is no trade, and for some spread rows
data.changePercent*numberPrice change (%); null when there is no trade or TAIFEX does not provide it
data.volume*numberVolume (contracts), 0 when there is no trade; for spread rows, the volume traded between spread orders
data.volumeSpread*numberVolume traded between spread and outright orders; set on futures spread rows only, null otherwise. Measured differently from volume — do not add the two
data.openInterest*numberOpen interest; null for the after-hours session and spread rows
data.settlementPrice*numberSettlement price; null for the after-hours session and spread rows

Examples​

Futures: All Months of a Day​

Query every month of TAIEX Futures for the 2026-10-02 regular session; spread rows come last:

from fubon_neo.sdk import FubonSDK, Order

sdk = FubonSDK()

accounts = sdk.login("Your ID", "Your password", "Your cert path", "Your cert password") # Login first before connecting market-data

sdk.init_realtime() # Establish market-data

restfutopt = sdk.marketdata.rest_client.futopt

## After version 2.2.4 (use Exception for exception handling)
from fubon_neo.fugle_marketdata.rest.base_rest import FugleAPIError

try:
daily = restfutopt.historical.daily(**{"product": "TXF", "date": "2026-10-02"})
print(daily)
except FugleAPIError as e:
print(f"Error: {e}")
print("------------")
print(f"Status Code: {e.status_code}") # Ex: 429
print(f"Response Text: {e.response_text}") # Ex: {"statusCode":429,"message":"Rate limit exceeded"}

Response Body (excerpt):

{
"date": "2026-10-02",
"product": "TXF",
"exchange": "TAIFEX",
"session": "REGULAR",
"data": [
{
"contractMonth": "202610",
"strikePrice": null,
"callPut": null,
"exchange": "TAIFEX",
"openPrice": 48552,
"highPrice": 48802,
"lowPrice": 48472,
"closePrice": 48671,
"change": -27,
"changePercent": -0.06,
"volume": 34014,
"volumeSpread": null,
"openInterest": 106691,
"settlementPrice": 48669
},
{
"contractMonth": "202611",
"strikePrice": null,
"callPut": null,
"exchange": "TAIFEX",
"openPrice": 48730,
"highPrice": 48981,
"lowPrice": 48668,
"closePrice": 48841,
"change": -17,
"changePercent": -0.03,
"volume": 450,
"volumeSpread": null,
"openInterest": 1445,
"settlementPrice": 48840
},
...
{
"contractMonth": "202610/202611",
"strikePrice": null,
"callPut": null,
"exchange": "TAIFEX",
"openPrice": 174,
"highPrice": 180,
"lowPrice": 173,
"closePrice": 180,
"change": null,
"changePercent": null,
"volume": 255,
"volumeSpread": 156,
"openInterest": null,
"settlementPrice": null
},
...
]
}

Options: One Contract Month​

Query every strike of TAIEX Options for contract month 202610 in the 2026-10-02 regular session:

from fubon_neo.sdk import FubonSDK, Order

sdk = FubonSDK()

accounts = sdk.login("Your ID", "Your password", "Your cert path", "Your cert password") # Login first before connecting market-data

sdk.init_realtime() # Establish market-data

restfutopt = sdk.marketdata.rest_client.futopt

## After version 2.2.4 (use Exception for exception handling)
from fubon_neo.fugle_marketdata.rest.base_rest import FugleAPIError

try:
daily = restfutopt.historical.daily(**{"product": "TXO", "date": "2026-10-02", "contractMonth": "202610"})
print(daily)
except FugleAPIError as e:
print(f"Error: {e}")
print("------------")
print(f"Status Code: {e.status_code}") # Ex: 429
print(f"Response Text: {e.response_text}") # Ex: {"statusCode":429,"message":"Rate limit exceeded"}

Response Body (excerpt):

{
"date": "2026-10-02",
"product": "TXO",
"exchange": "TAIFEX",
"session": "REGULAR",
"contractMonth": "202610",
"data": [
...
{
"contractMonth": "202610",
"strikePrice": 47000,
"callPut": "CALL",
"exchange": "TAIFEX",
"openPrice": 1910,
"highPrice": 2060,
"lowPrice": 1870,
"closePrice": 1970,
"change": -20,
"changePercent": -1.01,
"volume": 17,
"volumeSpread": null,
"openInterest": 893,
"settlementPrice": 1930
},
{
"contractMonth": "202610",
"strikePrice": 47000,
"callPut": "PUT",
"exchange": "TAIFEX",
"openPrice": 330,
"highPrice": 340,
"lowPrice": 245,
"closePrice": 259,
"change": -35,
"changePercent": -11.9,
"volume": 280,
"volumeSpread": null,
"openInterest": 494,
"settlementPrice": 259
},
...
]
}

After-hours Example (Continuous Contract)​

Query the after-hours session with session=afterhours and take only the front month with the continuous contract 1!. Set date to the trading day the session belongs to (2026-10-02); the response is the after-hours session from 2026-10-01 15:00 to 2026-10-02 05:00, and the top-level contractMonth is the resolved actual month:

from fubon_neo.sdk import FubonSDK, Order

sdk = FubonSDK()

accounts = sdk.login("Your ID", "Your password", "Your cert path", "Your cert password") # Login first before connecting market-data

sdk.init_realtime() # Establish market-data

restfutopt = sdk.marketdata.rest_client.futopt

## After version 2.2.4 (use Exception for exception handling)
from fubon_neo.fugle_marketdata.rest.base_rest import FugleAPIError

try:
daily = restfutopt.historical.daily(**{"product": "TXF", "date": "2026-10-02", "session": "afterhours", "contractMonth": "1!"})
print(daily)
except FugleAPIError as e:
print(f"Error: {e}")
print("------------")
print(f"Status Code: {e.status_code}") # Ex: 429
print(f"Response Text: {e.response_text}") # Ex: {"statusCode":429,"message":"Rate limit exceeded"}

Response Body:

{
"date": "2026-10-02",
"product": "TXF",
"exchange": "TAIFEX",
"session": "AFTERHOURS",
"contractMonth": "202610",
"data": [
{
"contractMonth": "202610",
"strikePrice": null,
"callPut": null,
"exchange": "TAIFEX",
"openPrice": 48622,
"highPrice": 48661,
"lowPrice": 48210,
"closePrice": 48475,
"change": -223,
"changePercent": -0.46,
"volume": 37554,
"volumeSpread": null,
"openInterest": null,
"settlementPrice": null
}
]
}
info

'*' Indicates mandatory disclosure fields.