# TAIFEX Options Chain — 台指選擇權逐履約價行情 API (`chamarix/taifex-options-chain`) Actor

Full Taiwan options chain by strike and expiry, back to the first TAIEX options session in 2001-12-24, with the exchange's own published Delta joined on. TXO, sector, gold and stock options. Every row re-checks the change against the previous settlement price.

- **URL**: https://apify.com/chamarix/taifex-options-chain.md
- **Developed by:** [chris](https://apify.com/chamarix) (community)
- **Categories:** AI, Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## TAIFEX Options Chain (台指選擇權逐履約價行情) API

Get structured JSON access to the **full Taiwan options chain, strike by strike and expiry by expiry**, back to **2001-12-24 — the first TAIEX options session ever traded**. Open, high, low, close, change, volume, settlement price, open interest and the last best bid/ask for every series, in both the daytime and overnight sessions, with the exchange's **own published Delta** joined on.

TXO (TAIEX options) is the headline contract, but the same download covers the sector and gold options and all **43 currently listed contracts**, including the single-stock options on TSMC, Hon Hai, MediaTek and the ETF options.

### Why this data matters

- **The exchange publishes Delta. No pricing model needed.** TAIFEX computes an official Delta per strike, per expiry, per side, and this Actor joins it straight onto the chain — 8,550 series on a typical session. No Black-Scholes, no implied-volatility fit, no assumptions about the risk-free rate or the dividend stream. It is checked on every run: calls must sit in `[0, 1]`, puts in `[-1, 0]`, and Delta must fall as the strike rises. On 2026-08-27 that held for all 8,550 rows and all 8,285 adjacent strike pairs.
- **Twenty-five years of history, one month per request.** The exchange serves at most a month per download, so the Actor splits any range into monthly windows automatically. The archive genuinely reaches 2001-12-24: that session comes back with 50 rows across the two January 2002 expiries. *This is not the case for the TAIFEX futures downloads, which are limited to a rolling three-year window* — the options archive is the deeper one.
- **Every row re-checks the change against the previous settlement price.** The exchange prints a change but never says what it measured against. Measured across every TXO series in August 2026: `close − previous session's regular-hours settlement price` equals the printed change for **15,485 of 15,485 regular rows and 12,985 of 12,985 overnight rows**, exactly, with no exceptions. That basis is now asserted on every run and published as `previous_settlement_price` so you can check it yourself. The printed percentage is checked against the same basis, down to the rounding rule: TAIFEX rounds **away from zero**, not to even — −15.625 prints as −15.63 — which reproduces all 28,400 published percentages where half-to-even gets only 28,293.
- **Weekly expiries are classified, not left as an opaque string.** `202609` settles on the third Wednesday; `202609W1` settles on a Wednesday of its own week; `202608F4` settles on a **Friday**. Confirmed against the exchange's own settlement-date column rather than assumed — `expiry_kind` gives you `MONTHLY`, `WEEKLY_WEDNESDAY` or `WEEKLY_FRIDAY`, plus the settlement date itself where the exchange prints it.
- **Cross-validated against two independently built feeds.** With `crossCheck` on, the parsed chain is compared value-by-value against the exchange's open-data mirror of the same session, and its put/call ratio is recomputed from the parsed rows and compared against the published one. On 2026-08-27: **11,782 series matched with nothing unmatched on either side, and every price, volume, settlement and open-interest value identical**; the put/call totals reproduced all four published columns exactly.
- **Nobody serves this in English, or for free.** The source is a Big5-encoded CSV behind a form that rejects most of what you send it, in a market where the chain is the most heavily traded derivative in the country.

### Output

One record per strike, per expiry, per side, per session. A real TXO put on the weekly expiry settling 2026-09-02, as published:

```json
{
  "date": "2026-08-27",
  "contract_code": "TXO",
  "contract_name": "臺指選擇權",
  "contract_name_en": "TAIEX Options",
  "underlying_group": "TXO",
  "expiry_code": "202609W1",
  "expiry_month": "2026-09",
  "expiry_kind": "WEEKLY_WEDNESDAY",
  "expiry_week": 1,
  "expiry_date": "2026-09-02",
  "strike": 44000.0,
  "call_put": "PUT",
  "trading_session": "REGULAR",
  "open": 86.0,
  "high": 88.0,
  "low": 59.0,
  "close": 76.0,
  "change": -44.0,
  "change_pct": -36.67,
  "previous_settlement_price": 120.0,
  "change_matches_previous_settlement": true,
  "volume": 260,
  "settlement_price": 76.0,
  "open_interest": 255,
  "best_bid": 73.0,
  "best_ask": 78.0,
  "historical_high": 780.0,
  "historical_low": 59.0,
  "delta": -0.1384,
  "delta_as_of": "2026-08-27",
  "trading_halt": false,
  "trading_halt_note": null,
  "source_report": "TAIFEX optDataDown"
}
```

Both printed figures reconcile against the basis: `76.0 − 120.0 = −44.0`, and `−44.0 / 120.0 × 100 = −36.666…`, which rounds to the −36.67 the exchange printed.

### Input

| Field | What it does |
| --- | --- |
| `contracts` | Contract codes: `TXO`, `TEO`, `TFO`, `TGO`, stock options such as `CDO` (TSMC) or `DHO` (Hon Hai), or `ALL`. Empty means `TXO`. |
| `startDate` / `endDate` | `YYYY-MM-DD`. Empty means the latest session. |
| `callPut` | `ALL`, `CALL` or `PUT`. |
| `tradingSession` | `ALL`, `REGULAR` (daytime) or `AFTER_HOURS` (overnight). |
| `onlyTraded` | Drop strikes that did not trade. A full chain quotes hundreds that never do. |
| `minOpenInterest` | Keep only strikes carrying at least this many open contracts. |
| `includeDelta` | Join the exchange's published Delta. Latest session only. |
| `crossCheck` | Compare against the open-data mirror and the published put/call ratio. |

The exchange serves **one month per download**, so a range is split into monthly requests: 24 per run for named contracts, 3 when `ALL` is asked for (a whole-market session is ~11,800 rows). Ranges starting before **2001-12-24** are rejected up front rather than returning an empty run. A contract listed later than your start date simply returns nothing for the years before it existed.

### Things this dataset is honest about

**The two sessions are scoped differently, and it matters for aggregation.** TAIFEX runs a daytime session (一般) and an overnight one (盤後), and prints a row for each. Only the daytime rows carry a settlement price and open interest; the overnight rows print a dash for both. This is not a gap in the data — it is how the exchange defines the columns, and reproducing its own published put/call ratio proves it:

| TXO, 2026-08-27 | Sum of daytime rows | Sum of both sessions | Published by TAIFEX |
| --- | --- | --- | --- |
| Call volume | 85,819 | **129,911** | 129,911 |
| Put volume | 110,905 | **158,174** | 158,174 |
| Call open interest | **58,254** | — | 58,254 |
| Put open interest | **61,636** | — | 61,636 |

Volume spans both sessions; open interest is daytime only. Filter on `trading_session` accordingly.

**Run before the daytime session publishes and you get yesterday, plus last night.** The overnight session trades ahead of the day it is filed under, so at 10am the newest date in the download holds overnight rows only. Asked for "the latest session" the Actor publishes the most recent **complete** session together with the overnight rows filed after it, and says so in the log, rather than handing back a few hundred overnight rows and calling that a day.

**One underlying can have more than one contract code, and they are not interchangeable.** TSMC options trade as both `CDO` and `CDA`, Hon Hai as `DHO` and `DHA`. On 2026-08-27, `CDO` quoted 27 strikes on a standard ladder while `CDA` quoted a single strike of 2,100 — different ladders, and nothing here merges them. `underlying_group` gives you the shared two-letter family for grouping; the rows themselves stay exactly as the exchange published them.

**The open-data mirror is sparser than the download.** The exchange's JSON feed leaves `best_bid`, `best_ask`, `historical_high` and `historical_low` blank on rows where the CSV carries a value — 9,711 times on 2026-08-27, always in that direction, never the reverse. The Actor takes the download's values and reports the blanks separately from a real disagreement, of which there were none.

**Delta covers the latest session only.** The feed carries no date of its own, so it is only ever joined onto the session the exchange's daily report says it was published with; historical rows come back with `delta: null`. `delta_as_of` records which session a Delta belongs to, so a multi-day pull never leaves you guessing.

**A dash is not a zero.** Hundreds of strikes go a whole session without a trade, and the exchange prints a dash for their prices. Those become `null`, not `0.0` — writing a zero close into an untraded far-out-of-the-money strike would invent a price that never existed.

**The report changed shape in December 2025.** It gained a 契約到期日 (settlement date) column, and everything before that layout has `expiry_date: null` rather than a derived date. Every column here is read by name, so the next addition will not silently shift a column into the wrong field — and a column that disappears fails the run instead of quietly producing garbage.

### Taiwan Market Data Suite

This Actor is part of a suite of 25 Taiwan market data APIs by [chamarix](https://apify.com/chamarix) — official sources only, cross-validated against independent official endpoints, clean JSON out. Code samples for the whole suite: [GitHub](https://github.com/cc77556/taiwan-market-data-actors).

**Market data:**

- [taiwan-stock-daily-quotes](https://apify.com/chamarix/taiwan-stock-daily-quotes) — Daily OHLCV for every listed & OTC stock, with P/E, P/B and dividend yield
- [twse-institutional-trades](https://apify.com/chamarix/twse-institutional-trades) — Daily institutional buy/sell (foreign, investment trust, dealer) per stock — TWSE listed
- [tpex-institutional-trades](https://apify.com/chamarix/tpex-institutional-trades) — Daily institutional buy/sell per stock — TPEx OTC market
- [taiwan-monthly-revenue](https://apify.com/chamarix/taiwan-monthly-revenue) — Monthly revenue of 1,900+ listed & OTC companies, MoM/YoY
- [taiwan-financial-statements](https://apify.com/chamarix/taiwan-financial-statements) — Quarterly income statement, balance sheet & cash flow back to 2013
- [taiwan-dividend-calendar](https://apify.com/chamarix/taiwan-dividend-calendar) — Ex-dividend / ex-rights dates, reference prices & payouts back to 2003
- [taiwan-margin-trading](https://apify.com/chamarix/taiwan-margin-trading) — Daily margin trading & short sale balances per stock
- [taiwan-sbl-short-sale-balance](https://apify.com/chamarix/taiwan-sbl-short-sale-balance) — Securities-lending short sale balances per stock
- [taiwan-day-trading-stats](https://apify.com/chamarix/taiwan-day-trading-stats) — Day-trading volume, value & ratio per stock since 2014
- [tdcc-shareholding-dispersion](https://apify.com/chamarix/tdcc-shareholding-dispersion) — Weekly TDCC shareholding dispersion (retail vs whale structure)
- [taiwan-foreign-shareholding](https://apify.com/chamarix/taiwan-foreign-shareholding) — Foreign ownership percentage & remaining quota per stock
- [taifex-institutional-derivatives](https://apify.com/chamarix/taifex-institutional-derivatives) — Institutional futures & options positions (TAIFEX), incl. put/call ratio
- [taiwan-warrants-daily](https://apify.com/chamarix/taiwan-warrants-daily) — Daily quotes, strike, expiry & moneyness for every listed/OTC warrant since 2004
- [taiwan-stock-alerts](https://apify.com/chamarix/taiwan-stock-alerts) — Watch-list, disposition & short-sale suspension alerts
- [taiwan-insider-share-transfers](https://apify.com/chamarix/taiwan-insider-share-transfers) — Insider share-transfer filings (directors, officers, 10% holders) since 2002
- [taiwan-director-shareholdings](https://apify.com/chamarix/taiwan-director-shareholdings) — Monthly director/officer shareholdings & share-pledge ratio since 1999
- [taiwan-block-trades](https://apify.com/chamarix/taiwan-block-trades) — Every block trade (鉅額交易) with price, size & basket constituents since 2005
- [taiwan-shareholder-meetings](https://apify.com/chamarix/taiwan-shareholder-meetings) — Shareholder meeting dates, book closure periods & e-voting since 2005
- [taiwan-emerging-stock-quotes](https://apify.com/chamarix/taiwan-emerging-stock-quotes) — Emerging (興櫃) board quotes, pre-IPO register & history since 2003
- [taiwan-etf-regular-investment](https://apify.com/chamarix/taiwan-etf-regular-investment) — Monthly regular savings plan (定期定額) rankings for stocks & ETFs since 2020
- [taiwan-treasury-stock-buybacks](https://apify.com/chamarix/taiwan-treasury-stock-buybacks) — Every treasury-stock buyback (庫藏股) filing, plan vs execution, since 2000

**Property market:**

- [taiwan-real-estate-transactions](https://apify.com/chamarix/taiwan-real-estate-transactions) — Actual registered sale, presale & lease prices (實價登錄) for all 22 cities since 2012

**Government & civic data:**

- [taiwan-legislator-monitor](https://apify.com/chamarix/taiwan-legislator-monitor) — Legislative Yuan bills, legislators & meetings
- [taiwan-tender-monitor](https://apify.com/chamarix/taiwan-tender-monitor) — Government e-procurement tenders (open calls, awards, failures)

### Data source

Taiwan Futures Exchange 選擇權每日交易行情下載 (optDataDown), plus the 選擇權每日交易行情 (DailyMarketReportOpt), 選擇權 Delta 值 (DailyOptionsDelta) and 臺指選擇權 Put/Call 比 (PutCallRatio) open-data feeds used for independent verification. Public data, no login required.

# Actor input Schema

## `contracts` (type: `array`):

Contract codes as the exchange prints them: TXO (TAIEX options), TEO, TFO, TGO, or a stock-option code such as CDO (TSMC), DHO (Hon Hai), NYO (Yuanta Taiwan 50 ETF). Use ALL for every listed contract, which is roughly 11,800 rows a session and is capped at three monthly downloads. Leave empty for TXO.

## `startDate` (type: `string`):

First trading day to fetch. Leave both dates empty for the latest session. The archive starts at 2001-12-24, the first TAIEX options session; a contract listed later simply returns nothing for the years before it existed.

## `endDate` (type: `string`):

Last trading day to fetch, inclusive. The exchange serves at most one month per download, so a range is split into monthly requests — 24 of them per run for named contracts, 3 when ALL is asked for.

## `callPut` (type: `string`):

Filters the chain after it is parsed, so the consistency checks still run on the whole download either way.

## `tradingSession` (type: `string`):

TAIFEX runs two sessions a day and publishes a row for each. REGULAR (一般) is the daytime session and is the only one that carries settlement prices and open interest; AFTER\_HOURS (盤後) is the overnight session, which prints volume and prices but a dash for open interest.

## `onlyTraded` (type: `boolean`):

Drops rows with zero volume. A full chain quotes hundreds of strikes that never trade in a session; the exchange still prints a row for each, with dashes where the prices would be.

## `minOpenInterest` (type: `integer`):

Keeps only strikes carrying at least this many open contracts. Applies to the regular session, since after-hours rows do not report open interest.

## `includeDelta` (type: `boolean`):

TAIFEX publishes an official Delta per strike, so no pricing model is needed. It covers the latest session only, so it is joined on when the run includes that session and left null otherwise. Costs two extra requests.

## `crossCheck` (type: `boolean`):

The exchange publishes the latest session a second time through its open-data API, and publishes a put/call ratio computed independently of both. With this on, the parsed chain is compared against them value by value and the result is written to the log. Costs two extra requests.

## Actor input object example

```json
{
  "contracts": [
    "TXO"
  ],
  "startDate": "",
  "endDate": "",
  "callPut": "ALL",
  "tradingSession": "ALL",
  "onlyTraded": false,
  "minOpenInterest": 0,
  "includeDelta": true,
  "crossCheck": true
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

One record per strike per expiry per side per session — open, high, low, close, change, volume, settlement price and open interest, with the exchange's own published Delta joined on for the latest session.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "contracts": [
        "TXO"
    ],
    "startDate": "",
    "endDate": "",
    "callPut": "ALL",
    "tradingSession": "ALL",
    "onlyTraded": false,
    "minOpenInterest": 0,
    "includeDelta": true,
    "crossCheck": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("chamarix/taifex-options-chain").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "contracts": ["TXO"],
    "startDate": "",
    "endDate": "",
    "callPut": "ALL",
    "tradingSession": "ALL",
    "onlyTraded": False,
    "minOpenInterest": 0,
    "includeDelta": True,
    "crossCheck": True,
}

# Run the Actor and wait for it to finish
run = client.actor("chamarix/taifex-options-chain").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "contracts": [
    "TXO"
  ],
  "startDate": "",
  "endDate": "",
  "callPut": "ALL",
  "tradingSession": "ALL",
  "onlyTraded": false,
  "minOpenInterest": 0,
  "includeDelta": true,
  "crossCheck": true
}' |
apify call chamarix/taifex-options-chain --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,chamarix/taifex-options-chain"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/eAt2spRwemGABKNf0/builds/f5EkdoN0BB3Git8TP/openapi.json
