Data methodology

Our data methodology: sources, coverage, gaps, and what we do not claim

This page covers where the data comes from, how far it reaches, and where it falls short. Every figure is measured against the database (snapshot 2026-07-11), not estimated for marketing. There is also a section on what we do NOT claim — a data provider willing to state its own limits is the one whose other statements you can weigh.

Five principles

First-hand from the official sources

Everything is collected and parsed from the primary source: prices from TWSE and TPEx, company filings (monthly revenue, the three financial statements, material announcements) from MOPS, and derivatives from TAIFEX. We do not resell a second-hand feed, and we do not mix in third-party data of unclear origin. The official open data is itself free and authoritative and anyone can call it directly — what we add is one consistent, traceable interface with real historical depth.

Survivorship-bias-free: stopped-trading names stay

Most price datasets drop a stock entirely once it stops trading, leaving a historical universe of today's survivors and systematically inflating backtest returns. We keep the full price history of 311 names that have stopped trading, 262 of them carrying an official delisting date. This is checkable: query any delisted ticker and the history is there.

Every row traces back to its source

Each response carries source_role and its source markers, stating whether a value came straight from an official endpoint or was derived. You do not have to take our word for the provenance — you can follow it field by field. Research that has to be replayable and auditable needs that as a precondition.

Gaps are labelled, never interpolated away

Where data is missing, it is marked missing — not filled with an interpolated or carried-forward value. The difference shows up in backtests: a silently patched series never throws an error, it just makes results look better than reality, and it is very hard to notice afterwards. We would rather show you a hole than hand you a plausible-looking invented number.

One interface, built for programs and agents

Every dataset shares a consistent response structure, openapi.json and llms.txt let an agent discover the endpoints on its own, and appending .md to any page URL returns that page as plain markdown. Developers call the REST API with an API key.

Coverage, measured

The figures below are measured against the database as of 2026-07-11. We publish what we can measure and leave out what we cannot.

DatasetWindowSize
TWSE listed daily pricesfrom 20045,215,311 rows / 1,682 names (incl. 311 stopped trading, 262 with an official delisting date)
TPEx OTC daily pricesfrom 19943,920,223 rows
Monthly revenue (MOPS filings)from 2010-01331,109 rows / 2,096 companies

Measured from a database snapshot (2026-07-11); the numbers move as data accumulates. Every page on this site quotes that same snapshot rather than estimating independently.

What we do not claim

Three things we have not done, and therefore never claim anywhere on this site. This is not a disclaimer — it tells you which of our statements you can safely reuse and which you cannot.

Weekly official reconciliation: not yet
The value-by-value verification harness against the official sources is built and has run once. It is not scheduled and not automated, so we do not say weekly reconciliation — that is a planned capability, not a current one.
MCP: preview, not a production service
There is no production hosted MCP endpoint. MCP functionality is labelled preview, and the integration path that actually ships is the REST API with an X-API-Key header.
Disclosure-date point-in-time: not fully covered
The report_date (actual disclosure date) on fundamentals is not fully covered, so we do not claim complete disclosure-date PIT. For monthly revenue, where an exact announcement timestamp is unavailable, the statutory filing deadline is used as the knowledge date and labelled as such. The price-side point-in-time universe is unaffected, because the history of stopped-trading names is retained in full.

Check it yourself

You do not have to trust this page. Five symbols (2330, 2317, 2454, 0050 and 2603) are callable with no API key, and the response carries source_role and coverage information. To test the delisted claim, query the price history of a ticker that has stopped trading.

curl "https://api.twmarketdata.com/v2/datasets/twse-daily-price?symbol=2330&limit=2"

Read next