Compare

Moving from FinMind to TW Market Data

Both are REST APIs returning JSON over HTTPS, so the shape of your code does not change: you swap a base URL, a token header and a set of dataset names. What you gain is per-response lineage and a declared point-in-time status on each dataset. What you should budget for is renaming datasets and re-checking any date filter you wrote against event dates.

What maps to what

FinMindTW Market Data
Base URL api.finmindtrade.com/api/v4/Base URL https://api.twmarketdata.com
Token passed as a request parameterX-API-Key headerA header rather than a query parameter, so keys stop appearing in proxy logs and browser history.
dataset=TaiwanStockPriceThe TWSE/TPEx daily price datasets, addressed by slug
start_date / end_date on the event dateThe same range, plus a knowledge_date column on every disclosure rowThis is the row worth reading twice. Porting your query as-is reproduces your current behaviour exactly. To remove look-ahead, pass as_of — it is applied on the REST endpoints as well as on MCP, and the response reports as_of_applied, the field it cut on, and how many rows it removed, so you can confirm it took effect. On disclosure datasets the cutoff runs against knowledge_date, which every disclosure row carries and which is set conservatively to the statutory filing deadline rather than the observed announcement: data is never made available earlier than it truly was, which is the safe direction for a backtest, but it is conservative rather than exact.
Rate limit counted per hourRate limit counted per minute, with a monthly included quotaDifferent unit, so a burst that was fine hourly may need spacing, and a steady poller usually needs less.

When to stay with FinMind

  • You are on the free tier, your volume fits inside it, and lineage on each response is not something your work needs.
  • Your code depends on FinMind dataset names or column names that you would rather not touch right now.
  • You need a market we do not cover. We are Taiwan-only; check our dataset catalogue before planning a move.

Questions

Can I run both during a migration?

Yes, and it is the approach we would suggest. Point a copy of your pipeline here, compare the two outputs over a window you already trust, and cut over when they agree. Nothing about either service prevents running them side by side.

Will my numbers change?

For the same official source and the same dates they should not, and if they do we would like to hear about it — every response states the upstream endpoint and the underlying table so a disagreement can be traced rather than argued about. Numbers WILL differ once you apply as_of, because that is the point of it: it drops rows that were not yet public at the date you are testing. as_of is applied on the REST endpoints, and the response says so — it echoes as_of_applied and counts the rows the cutoff removed.

The four-way comparison table sets out the same ground with every factual cell cited to the vendor's own documentation.

Compare all four →

Statements about FinMind on this page reflect its own published documentation, read on the date shown on the comparison page.

Related articles