# Taiwan Regular Savings Plan Rankings — ETF & Stock 定期定額 (`chamarix/taiwan-etf-regular-investment`) Actor

Taiwan's monthly regular savings plan (定期定額) league table: the top 20 stocks and top 20 ETFs by number of investor accounts paying in, every month back to 2020-10, with month-on-month account and rank moves, plus the securities firms licensed to run the scheme.

- **URL**: https://apify.com/chamarix/taiwan-etf-regular-investment.md
- **Developed by:** [chris](https://apify.com/chamarix) (community)
- **Categories:** AI, Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 100.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/platform/actors/running/actors-in-store#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

## Taiwan Regular Savings Plan (定期定額) ETF & Stock Rankings API

Get structured JSON access to **Taiwan's monthly regular savings plan league table** — the official TWSE ranking of the stocks and ETFs that the most Taiwanese investors are paying into by monthly instalment. The top 20 of each, every month back to **2020-10**, with month-on-month account and rank moves, plus the 21 securities firms licensed to run the scheme.

A regular savings plan (定期定額, the Taiwanese equivalent of a dollar-cost-averaging or systematic investment plan) debits an investor's account on a fixed day each month and buys a fixed amount of one security. The exchange publishes how many accounts successfully paid into each of the most popular ones. It is the closest thing Taiwan has to a public retail fund-flow series — **1,241,976 accounts paid into 0050 in 2026-07, against 236,742 for TSMC**.

The exchange's open-data feed carries **only the newest month and no month label at all**. This Actor reaches back to the first month ever published, checks every month against the guarantees the ranking makes, and cross-checks the newest one value by value against that open-data feed before emitting anything.

### Why this data matters

- **It is retail flow, not price.** Every other Taiwanese market publication tells you what was traded. This one tells you how many individual people committed to buying something every month — a slow, sticky, decision-driven series that does not move with the tape.
- **The ETF story is in the ratio, and it is enormous.** In 2020-10 the ranked ETFs held 2.26 accounts for every one on the ranked stocks. By 2026-07 that is **6.35** (3,026,009 against 476,255). `etf_to_stock_accounts_ratio` gives you that series directly.
- **New ETFs show up here before they show up anywhere else.** Taiwan's actively managed ETFs launched into this table — 00981A 主動統一台股增長 went from outside the top 20 to rank 6 within months, and five of the 42 ETFs ever ranked are active funds. `is_new_entry` and `etf_new_entries` flag each arrival the month it lands.
- **Month-on-month moves come computed.** `rank_change`, `accounts_change`, `accounts_change_pct` and `consecutive_months_in_window` are derived by fetching the prior month as a baseline, so a single-month run still tells you what moved.
- **Nobody serves this in English.** There is no English-language source for Taiwanese savings-plan participation, and the exchange's own feed cannot even tell you which month it is describing.

### Output

Three record types, selected with `recordTypes`.

**`RANKING`** — one record per security per month:

```json
{
  "record_type": "RANKING",
  "market": "TWSE",
  "month": "2026-07",
  "security_type": "ETF",
  "rank": 1,
  "security_code": "0050",
  "security_name": "元大台灣50",
  "trading_accounts": 1241976,
  "rank_previous_month": 1,
  "rank_change": 0,
  "accounts_previous_month": 1204776,
  "accounts_change": 37200,
  "accounts_change_pct": 3.0877,
  "is_new_entry": false,
  "consecutive_months_in_window": 4,
  "share_of_table_pct": 41.0434
}
```

**`MONTHLY_SUMMARY`** — one record per month, both league tables at once:

```json
{
  "record_type": "MONTHLY_SUMMARY",
  "market": "TWSE",
  "month": "2026-04",
  "list_size": 20,
  "stock_table_size": 20,
  "stock_accounts_total": 444428,
  "stock_accounts_total_previous_month": 459892,
  "stock_accounts_total_change_pct": -3.3625,
  "stock_leader_code": "2330",
  "stock_leader_name": "台積電",
  "stock_leader_accounts": 202626,
  "stock_new_entries": ["2382"],
  "stock_dropped_out": ["1216"],
  "etf_table_size": 20,
  "etf_accounts_total": 2551825,
  "etf_leader_code": "0050",
  "etf_leader_name": "元大台灣50",
  "etf_leader_accounts": 1008911,
  "etf_new_entries": [],
  "etf_dropped_out": [],
  "etf_to_stock_accounts_ratio": 5.7418
}
```

**`BROKER`** — one record per securities firm licensed to run the scheme:

```json
{
  "record_type": "BROKER",
  "market": "TWSE",
  "broker_code": "9200",
  "broker_name": "凱基",
  "brokerage_channel_since": "2017-04-24",
  "wealth_management_channel_since": "2017-01-16",
  "offers_brokerage_channel": true,
  "offers_wealth_management_channel": true,
  "regular_investment_since": "2017-01-16"
}
```

### Input

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `recordTypes` | array | `["RANKING", "MONTHLY_SUMMARY"]` | Which of the three record types to emit |
| `startMonth` | string | newest published month | First month, `YYYY-MM`. The archive starts at `2020-10` |
| `endMonth` | string | same as `startMonth` | Last month, inclusive. One month is one request |
| `securityTypes` | array | `["STOCK", "ETF"]` | Which league table to keep. Both arrive in the same request |
| `securityCodes` | array | all | Keep only these codes, e.g. `["0050", "2330"]`. Affects `RANKING` only |
| `crossCheck` | boolean | `true` | Reconcile against the open-data mirror, the TWSE listing and the second securities-firm publication |

Leaving both months empty fetches the newest published month — the sensible schedule is a monthly run on the 8th trading day.

### What the numbers mean

- **`trading_accounts` counts accounts, not investors and not money.** The exchange states the rule: one investor ID with one account that paid twice in a month counts as **1**; the same investor with accounts at two firms counts as **2**. Both the brokerage channel and the wealth-management channel are included.
- **The two tables are independent.** Rank 1 on the stock table has nothing to do with rank 1 on the ETF table — the report simply prints them side by side.
- **`stock_accounts_total` is the ranked total, not the market.** The exchange publishes only the top 20 of each, so this is the sum over those 20 and nothing wider. There is no published market-wide account count.
- **`share_of_table_pct` measures concentration inside the top 20**, not share of the whole scheme.
- **`consecutive_months_in_window` counts only the months this run fetched.** It is a run length within your window, not an all-time streak.
- **Names are back-filled to the current one.** A 2021 row for 2887 reads 台新新光金 — the name that company only took after its 2025 merger. Codes are stable; names are as-of-today.
- **ETF codes can contain a letter.** `00981A` and the other actively managed ETFs are ranked here, so treat the code as a string.

### Data source & reliability

- Direct from TWSE: the 定期定額交易戶數統計排行月報表 report, its open-data mirror (`ETFReport/ETFRank`), the licensed-securities-firm register (`brokerService/secRegData`) and the exchange's own report of that register — no third-party intermediaries
- **Coverage starts 2020-10**, the first month published. The exchange ranked **10** of each until 2021-07 and **20** from 2021-08 — this Actor reproduces that break exactly and flags any month whose table is a different length
- Published on the **7th trading day** of the following month; asking for a month that is not out yet is refused by the exchange rather than answered with stale data, and this Actor moves `endMonth` back to the newest published month instead of failing
- Every month is asserted before it is emitted: ranks dense from 1, account counts never rising as rank falls, no code listed twice in one table, and the month the report echoes matching the month that was asked for. All held across all **70 published months and 2,600 entries** when this Actor was written
- The newest month is compared value by value against the open-data mirror — a separate host and a separate pipeline — and every ranked code and name is checked against the exchange's own listing of securities
- The column layout and the column-group block are both pinned. The report's header alone is ambiguous (代號/名稱/交易戶數 appear twice), and the group block is what says which half is the stock table, so a change to either stops the run rather than risking the two tables being swapped
- **TPEx publishes no equivalent.** This ranking covers TWSE-listed securities only

### Use cases

- **Retail flow research** — a monthly, decision-level participation series for Taiwan's largest ETFs and blue chips, independent of price and volume
- **ETF product monitoring** — watch a newly launched ETF enter the table and track how fast it accumulates savings-plan accounts against incumbents
- **Fund-manager competitive analysis** — issuer-level share of the ranked ETF accounts, and how it shifts month by month
- **Financial media and research notes** — the ETF-to-stock ratio is the cleanest available measure of Taiwan's shift from stock picking to indexing
- **Brokerage strategy** — the register dates say when each firm entered the scheme and through which channel
- **Cross-referencing** — join `security_code` to shareholding dispersion, dividends and foreign ownership from the rest of the suite to separate savings-plan accumulation from institutional flow

### Taiwan Market Data Suite

This Actor is part of a suite of 23 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:**

- [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)

# Actor input Schema

## `recordTypes` (type: `array`):

RANKING is one record per security per month — its rank, how many accounts paid into it, and how both moved. MONTHLY\_SUMMARY is one record per month for the two league tables as a whole. BROKER is the register of securities firms licensed to run the scheme.

## `startMonth` (type: `string`):

First month to fetch, e.g. 2020-10 — the first month the exchange ever published. Leave empty for the newest published month. The exchange publishes a month on the 7th trading day of the month after it.

## `endMonth` (type: `string`):

Last month to fetch, inclusive. Leave empty to fetch only the start month. One month is one request, so the whole archive since 2020-10 is around 70 requests.

## `securityTypes` (type: `array`):

The report ranks stocks and ETFs separately and side by side. They are unrelated rankings — an ETF at rank 1 has nothing to do with the stock at rank 1. Both are fetched in the same request either way, so filtering here is free.

## `securityCodes` (type: `array`):

Optional list of codes to keep, e.g. \['0050', '2330', '00878']. Only affects RANKING records; MONTHLY\_SUMMARY is always computed over the full published table so its totals stay comparable.

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

Compare the newest month against its open-data mirror value by value, check every ranked code and name against the exchange's own listing, and reconcile the two securities-firm publications. Costs up to three requests and never changes the output.

## Actor input object example

```json
{
  "recordTypes": [
    "RANKING",
    "MONTHLY_SUMMARY"
  ],
  "startMonth": "",
  "endMonth": "",
  "securityTypes": [
    "STOCK",
    "ETF"
  ],
  "securityCodes": [],
  "crossCheck": true
}
```

# Actor output Schema

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

One record per ranked stock or ETF per month — accounts paying in, rank, and the month-on-month move — plus a summary row per month and the securities firms running the scheme.

# 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 = {
    "recordTypes": [
        "RANKING",
        "MONTHLY_SUMMARY"
    ],
    "startMonth": "",
    "endMonth": "",
    "securityTypes": [
        "STOCK",
        "ETF"
    ],
    "securityCodes": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("chamarix/taiwan-etf-regular-investment").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 = {
    "recordTypes": [
        "RANKING",
        "MONTHLY_SUMMARY",
    ],
    "startMonth": "",
    "endMonth": "",
    "securityTypes": [
        "STOCK",
        "ETF",
    ],
    "securityCodes": [],
}

# Run the Actor and wait for it to finish
run = client.actor("chamarix/taiwan-etf-regular-investment").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 '{
  "recordTypes": [
    "RANKING",
    "MONTHLY_SUMMARY"
  ],
  "startMonth": "",
  "endMonth": "",
  "securityTypes": [
    "STOCK",
    "ETF"
  ],
  "securityCodes": []
}' |
apify call chamarix/taiwan-etf-regular-investment --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,chamarix/taiwan-etf-regular-investment"
        }
    }
}

```

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/RGBzC0aX0KKT9StlC/builds/DaI2IEsh2XCCneMgs/openapi.json
