Fundamental
In Taiwan stock fundamental data, we have 13 datasets, as follows:
- Income Statement TaiwanStockFinancialStatements
- Balance Sheet TaiwanStockBalanceSheet
- Cash Flows Statement TaiwanStockCashFlowsStatement
- Dividend Policy Table TaiwanStockDividend
- Ex-Dividend/Ex-Right Result Table TaiwanStockDividendResult
- Monthly Revenue Table TaiwanStockMonthRevenue
- Capital Reduction Resumption Reference Price TaiwanStockCapitalReductionReferencePrice
- Taiwan Stock Market Value Table TaiwanStockMarketValue
- Taiwan Stock Delisting Table TaiwanStockDelisting
- Taiwan Stock Market Value Weight Table TaiwanStockMarketValueWeight
- Taiwan Stock Post-Split Reference Price TaiwanStockSplitPrice
- Taiwan Stock Par Value Change Resumption Reference Price TaiwanStockParValueChange
- Taiwan Stock Financial Report and Annual Report PDF TaiwanStockFinancialReportFile
Income Statement TaiwanStockFinancialStatements¶
- Data range: 1990-03-01 ~ now
- Coverage: listed (TWSE), OTC (TPEx) and emerging market companies, distinguished by
stock_id(useTaiwanStockInfoto look up market type)
Amount unit, currency and how single-quarter values are derived
- Currency: all companies are reported in New Taiwan Dollars (TWD), including foreign (KY) companies. No other currency is used.
- Unit:
valueis in TWD (dollars). The financial statements report amounts in thousand TWD; this table multiplies them by 1000.EPSis in TWD per share and is not converted. - Single-quarter values:
dateis the quarter-end date, and every amount item is a single-quarter figure. Financial statements report year-to-date cumulative amounts; this table subtracts consecutive quarters within the same fiscal year: Q1 = Q1 YTD, Q2 = H1 YTD − Q1 YTD, Q3 = 9-month YTD − H1 YTD, Q4 = full year − 9-month YTD, so the four quarters sum to the full-year figure. For example, 2330's 2024 quarterlyRevenueis 592.6 / 673.5 / 759.7 / 868.5 billion TWD, matching the sum of the three months ofTaiwanStockMonthRevenuein each quarter. - Companies that only file semi-annual and annual reports (some emerging-market and public companies): such a year has only two rows, 06-30 and 12-31. The 06-30 row is the first-half total and the 12-31 row is the second-half total (full year − first half). Check whether the year has 03-31 / 09-30 rows to tell.
- Financial companies: banks, financial holding companies, securities firms and insurers use different income statement items. For example, a financial holding company's
Revenuemaps to "net revenue" (淨收益). Use theorigin_namecolumn to see the original item name of each row.
EPS is a single-quarter figure and is retroactively restated after a stock dividend / split — summing quarters will not match the cumulative EPS
The EPS (basic earnings per share) in this table is a single-quarter figure, and each quarter stores the value as originally reported in that quarter's financial statements.
Under IAS 33, share-count changes with no consideration received — stock dividends (bonus issues) and stock splits — require the weighted average number of shares to be retroactively restated for every period presented. So once a bonus issue happens, that quarter's report restates the EPS of all earlier quarters downward, but this table does not rewrite the values already published. The result: within the same fiscal year, the share base behind each quarter's EPS is inconsistent, so summing them will not match the cumulative EPS in the financial statements.
Example — 3081 (Landmark Optoelectronics), FY2026. The company went ex-rights on 2026-07-15 with a stock dividend of NT$1 (100 shares per 1,000 shares held, i.e. a 10% bonus issue). This table reports EPS of 3.44 for 2026 Q1 (as originally reported, pre-bonus share count) and 4.62 for 2026 Q2 (already on the restated share count), which sum to 8.06 — but the reported first-half cumulative EPS is 7.75. The gap arises because Q1's 3.44 was restated in the Q2 report to 3.44 ÷ 1.1 = 3.13, and 3.13 + 4.62 = 7.75.
Recommended approach: to aggregate across quarters, do not sum EPS. Sum IncomeAfterTaxes (net income for the period) instead and divide by a single weighted average share count. For the example above: (317,515,000 + 468,487,000) TWD ÷ approx. 101,420,000 shares = 7.75.
To detect whether a bonus issue occurred within your query range, check the StockEarningsDistribution (stock dividend) field in TaiwanStockDividend; in the example above its value is 1.0.
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockFinancialStatements",
"data_id": "2330",
"start_date": "2019-01-01",
}
data = requests.get(url, headers=headers, params=parameter)
data = data.json()
data = pd.DataFrame(data['data'])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockFinancialStatements",
data_id="2330",
start_date= "2019-01-02"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
from FinMind.data import DataLoader
from loguru import logger
import datetime
api = DataLoader()
api.login_by_token(api_token='token')
start = datetime.datetime.now()
df = api.taiwan_stock_financial_statement(
stock_id_list=['2330', '2317', '2454', '3008'],
start_date='2024-01-01',
end_date='2024-12-31',
use_async=True,
)
cost = datetime.datetime.now() - start
logger.info(cost)
Output
| date | stock_id | type | value | origin_name | |
|---|---|---|---|---|---|
| 0 | 2019-03-31 | 2330 | CostOfGoodsSold | 1.28352e+11 | 營業成本 |
| 1 | 2019-03-31 | 2330 | EPS | 2.37 | 基本每股盈餘(元) |
| 2 | 2019-03-31 | 2330 | EquityAttributableToOwnersOfParent | 6.60098e+10 | 綜合損益總額歸屬於母公司業主 |
| 3 | 2019-03-31 | 2330 | GrossProfit | 9.03576e+10 | 營業毛利(毛損)淨額 |
| 4 | 2019-03-31 | 2330 | IncomeAfterTaxes | 6.13873e+10 | 本期淨利(淨損) |
Fetch all data for a specific date at once (available only to backer, sponsor members)¶
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockFinancialStatements",
"start_date": "2019-03-31",
}
data = requests.get(url, headers=headers, params=parameter)
data = data.json()
data = pd.DataFrame(data['data'])
print(data)
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockFinancialStatements",
start_date= "2019-03-31"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
Output
| date | stock_id | type | value | origin_name | |
|---|---|---|---|---|---|
| 0 | 2019-03-31 | 000116 | EPS | 0.24 | 基本每股盈餘(元) |
| 1 | 2019-03-31 | 000116 | EquityAttributableToOwnersOfParent | 4.65569e+08 | 綜合損益總額歸屬於母公司業主 |
| 2 | 2019-03-31 | 000116 | Expense | 8.95498e+08 | 支出及費用 |
| 3 | 2019-03-31 | 000116 | Income | 1.07791e+09 | 收益 |
| 4 | 2019-03-31 | 000116 | IncomeAfterTaxes | 2.74322e+08 | 本期淨利(淨損) |
Balance Sheet TaiwanStockBalanceSheet¶
- Data range: 2011-12-01 ~ now
- Coverage: listed (TWSE), OTC (TPEx) and emerging market companies, distinguished by
stock_id(useTaiwanStockInfoto look up market type)
Amount unit, currency and the _per items
- Currency / unit: all companies are reported in New Taiwan Dollars (TWD), including foreign (KY) companies.
valueis in TWD (dollars) — the statements report thousand TWD, and this table multiplies by 1000. - Point-in-time values: the balance sheet shows balances as of each quarter-end date, so there is no single-quarter vs. cumulative distinction.
typevalues ending in_per(e.g.TotalAssets_per): the item as a percentage of total assets, in %, not an amount.TotalAssets_peris 100.
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockBalanceSheet",
"data_id": "2330",
"start_date": "2019-01-01",
}
data = requests.get(url, headers=headers, params=parameter)
data = data.json()
data = pd.DataFrame(data['data'])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockBalanceSheet",
data_id="2330",
start_date= "2019-01-02"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
from FinMind.data import DataLoader
from loguru import logger
import datetime
api = DataLoader()
api.login_by_token(api_token='token')
start = datetime.datetime.now()
df = api.taiwan_stock_balance_sheet(
stock_id_list=['2330', '2317', '2454', '3008'],
start_date='2024-01-01',
end_date='2024-12-31',
use_async=True,
)
cost = datetime.datetime.now() - start
logger.info(cost)
Output
| date | stock_id | type | value | origin_name | |
|---|---|---|---|---|---|
| 0 | 2019-03-31 | 2330 | AccountsPayable | 2.71009e+10 | 應付帳款 |
| 1 | 2019-03-31 | 2330 | AccountsPayable_per | 1.24 | 應付帳款 |
| 2 | 2019-03-31 | 2330 | AccountsPayableToRelatedParties | 5.60941e+08 | 應付帳款-關係人 |
| 3 | 2019-03-31 | 2330 | AccountsPayableToRelatedParties_per | 0.03 | 應付帳款-關係人 |
| 4 | 2019-03-31 | 2330 | AccountsReceivableDuefromRelatedPartiesNet | 3.09821e+08 | 應收帳款-關係人淨額 |
Fetch all data for a specific date at once (available only to backer, sponsor members)¶
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockBalanceSheet",
"start_date": "2019-03-31",
}
data = requests.get(url, headers=headers, params=parameter)
data = data.json()
data = pd.DataFrame(data['data'])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockBalanceSheet",
start_date= "2019-03-31"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
Output
| date | stock_id | type | value | origin_name | |
|---|---|---|---|---|---|
| 0 | 2019-03-31 | 1101 | AccountsPayable | 7.84411e+09 | 應付帳款 |
| 1 | 2019-03-31 | 1101 | AccountsPayable_per | 2.15 | 應付帳款 |
| 2 | 2019-03-31 | 1101 | AccountsReceivableDuefromRelatedPartiesNet | 2.64638e+08 | 應收帳款-關係人淨額 |
| 3 | 2019-03-31 | 1101 | AccountsReceivableDuefromRelatedPartiesNet_per | 0.07 | 應收帳款-關係人淨額 |
| 4 | 2019-03-31 | 1101 | AccountsReceivableNet | 8.3396e+09 | 應收帳款淨額 |
Cash Flows Statement TaiwanStockCashFlowsStatement¶
- Data range: 2008-06-01 ~ now
- Coverage: listed (TWSE), OTC (TPEx) and emerging market companies, distinguished by
stock_id(useTaiwanStockInfoto look up market type)
Amount unit, currency and year-to-date cumulative values
- Currency / unit: all companies are reported in New Taiwan Dollars (TWD), including foreign (KY) companies.
valueis in TWD (dollars) — the statements report thousand TWD, and this table multiplies by 1000. - Year-to-date cumulative: unlike the income statement, this table is not converted to single quarters. Each quarter stores the year-to-date cumulative amount as reported, so the 12-31 row is the full-year figure. For example, 2330's 2024
CashFlowsFromOperatingActivitiesis 436.3 / 814.0 / 1,206.0 / 1,826.2 billion TWD. To get single-quarter values, subtract the previous quarter within the same fiscal year (Q1 needs no subtraction).
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockCashFlowsStatement",
"data_id": "2330",
"start_date": "2019-01-01",
}
data = requests.get(url, headers=headers, params=parameter)
data = data.json()
data = pd.DataFrame(data['data'])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockCashFlowsStatement",
data_id="2330",
start_date= "2019-01-02"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
from FinMind.data import DataLoader
from loguru import logger
import datetime
api = DataLoader()
api.login_by_token(api_token='token')
start = datetime.datetime.now()
df = api.taiwan_stock_cash_flows_statement(
stock_id_list=['2330', '2317', '2454', '3008'],
start_date='2024-01-01',
end_date='2024-12-31',
use_async=True,
)
cost = datetime.datetime.now() - start
logger.info(cost)
Output
| date | stock_id | type | value | origin_name | |
|---|---|---|---|---|---|
| 0 | 2019-03-31 | 2330 | HedgingFinancialLiabilities | -2.27383e+08 | 除列避險之金融負債 |
| 1 | 2019-03-31 | 2330 | CashFlowsFromOperatingActivities | 1.5267e+11 | 營業活動之淨現金流入(流出) |
| 2 | 2019-03-31 | 2330 | CashProvidedByInvestingActivities | -6.41885e+10 | 投資活動之淨現金流入(流出) |
| 3 | 2019-03-31 | 2330 | CashBalancesIncrease | 6.78559e+10 | 本期現金及約當現金增加(減少)數 |
| 4 | 2019-03-31 | 2330 | NetIncomeBeforeTax | 6.81817e+10 | 本期稅前淨利(淨損) |
Fetch all data for a specific date at once (available only to backer, sponsor members)¶
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockCashFlowsStatement",
"start_date": "2019-03-31",
}
data = requests.get(url, headers=headers, params=parameter)
data = data.json()
data = pd.DataFrame(data['data'])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockCashFlowsStatement",
start_date= "2019-03-31"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
Output
| date | stock_id | type | value | origin_name | |
|---|---|---|---|---|---|
| 0 | 2019-03-31 | 1101 | DecreaseInShortTermLoans | 7.59053e+09 | 短期借款減少 |
| 1 | 2019-03-31 | 1101 | ReceivableIncrease | -1.15069e+08 | 應收帳款(增加)減少 |
| 2 | 2019-03-31 | 1101 | PropertyAndPlantAndEquipment | -1.48367e+09 | 取得不動產、廠房及設備 |
| 3 | 2019-03-31 | 1101 | NetIncomeBeforeTax | 5.6035e+09 | 本期稅前淨利(淨損) |
| 4 | 2019-03-31 | 1101 | CashProvidedByInvestingActivities | -4.31058e+09 | 投資活動之淨現金流入(流出) |
Dividend Policy Table TaiwanStockDividend¶
- Data range: 2005-05-01 ~ now
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockDividend",
"data_id": "2330",
"start_date": "2019-01-01",
}
data = requests.get(url, headers=headers, params=parameter)
data = data.json()
data = pd.DataFrame(data['data'])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockStockDividend",
data_id="2330",
start_date= "2019-01-02"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
from FinMind.data import DataLoader
from loguru import logger
import datetime
api = DataLoader()
api.login_by_token(api_token='token')
start = datetime.datetime.now()
df = api.taiwan_stock_dividend(
stock_id_list=['2330', '2317', '2454', '3008'],
start_date='2024-01-01',
end_date='2024-12-31',
use_async=True,
)
cost = datetime.datetime.now() - start
logger.info(cost)
Output
| date | stock_id | year | StockEarningsDistribution | StockStatutorySurplus | StockExDividendTradingDate | TotalEmployeeStockDividend | TotalEmployeeStockDividendAmount | RatioOfEmployeeStockDividendOfTotal | RatioOfEmployeeStockDividend | CashEarningsDistribution | CashStatutorySurplus | CashExDividendTradingDate | CashDividendPaymentDate | TotalEmployeeCashDividend | TotalNumberOfCashCapitalIncrease | CashIncreaseSubscriptionRate | CashIncreaseSubscriptionpRrice | RemunerationOfDirectorsAndSupervisors | ParticipateDistributionOfTotalShares | AnnouncementDate | AnnouncementTime | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2019-06-30 | 2330 | 107年 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | 0 | 2019-06-24 | 2019-07-18 | 0 | 0 | 0 | 0 | 0 | 2.59304e+10 | 2019-06-06 | 15:47:30 | |
| 1 | 2019-09-25 | 2330 | 108年第1季 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 2019-09-19 | 2019-10-17 | 0 | 0 | 0 | 0 | 0 | 2.59304e+10 | 2019-07-09 | 18:33:02 | |
| 2 | 2019-12-25 | 2330 | 108年第2季 | 0 | 0 | 0 | 0 | 0 | 0 | 2.5 | 0 | 2019-12-19 | 2020-01-16 | 0 | 0 | 0 | 0 | 0 | 2.59304e+10 | 2019-08-14 | 15:27:02 | |
| 3 | 2020-03-25 | 2330 | 108年第3季 | 0 | 0 | 0 | 0 | 0 | 0 | 2.5 | 0 | 2020-03-19 | 2020-04-16 | 0 | 0 | 0 | 0 | 0 | 2.59304e+10 | 2019-11-14 | 17:01:07 | |
| 4 | 2020-06-24 | 2330 | 108年第4季 | 0 | 0 | 0 | 0 | 0 | 0 | 2.5 | 0 | 2020-06-18 | 2020-07-16 | 0 | 0 | 0 | 0 | 0 | 2.59304e+10 | 2020-02-14 | 15:10:50 |
{
date: str, # rights distribution record date
stock_id: str, # stock code
year: str, # dividend fiscal year
StockEarningsDistribution: float64, # stock dividend: capitalization of earnings
StockStatutorySurplus: float64, # stock dividend: capitalization of statutory and capital surplus
StockExDividendTradingDate: str, # ex-rights trading date
TotalEmployeeStockDividend: float64, # employee stock dividend
TotalEmployeeStockDividendAmount: float64, # employee stock dividend amount
RatioOfEmployeeStockDividendOfTotal: float64, # ratio of employee stock dividend to total earnings dividend
RatioOfEmployeeStockDividend: float64, # employee stock dividend ratio
CashEarningsDistribution: float64, # cash dividend: capitalization of earnings
CashStatutorySurplus: float64, # cash dividend: capitalization of statutory and capital surplus
CashExDividendTradingDate: str, # ex-dividend trading date
CashDividendPaymentDate: str, # cash dividend payment date
TotalEmployeeCashDividend: float64, # total employee cash bonus
TotalNumberOfCashCapitalIncrease: float64, # total shares of cash capital increase
CashIncreaseSubscriptionRate: float64, # cash capital increase subscription ratio
CashIncreaseSubscriptionpRrice: float64, # cash capital increase subscription price
RemunerationOfDirectorsAndSupervisors: float64, # directors and supervisors remuneration
ParticipateDistributionOfTotalShares: float64, # total shares participating in distribution
AnnouncementDate: str, # announcement date
AnnouncementTime: str # announcement time
}
Fetch all data for a specific date at once (available only to backer, sponsor members)¶
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockDividend",
"start_date": "2025-10-06",
}
data = requests.get(url, headers=headers, params=parameter)
data = data.json()
data = pd.DataFrame(data['data'])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockStockDividend",
start_date= "2025-10-06"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
Output
| date | stock_id | year | StockEarningsDistribution | StockStatutorySurplus | StockExDividendTradingDate | TotalEmployeeStockDividend | TotalEmployeeStockDividendAmount | RatioOfEmployeeStockDividendOfTotal | RatioOfEmployeeStockDividend | CashEarningsDistribution | CashStatutorySurplus | CashExDividendTradingDate | CashDividendPaymentDate | TotalEmployeeCashDividend | TotalNumberOfCashCapitalIncrease | CashIncreaseSubscriptionRate | CashIncreaseSubscriptionpRrice | RemunerationOfDirectorsAndSupervisors | ParticipateDistributionOfTotalShares | AnnouncementDate | AnnouncementTime | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2025-10-06 | 2540 | 113年 | 3 | 0.999999 | 2025-09-30 | 0 | 0 | 0 | 0 | 0.4 | 0.6 | 2025-09-30 | 2025-10-31 | 0 | 0 | 0 | 0 | 0 | 6.7491e+08 | 2025-09-12 | 17:35:32 |
| 1 | 2025-10-06 | 3312 | 不適用 | 0 | 0 | 2025-09-30 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2e+07 | 9.84 | 39.8 | 0 | 1.62627e+08 | 2025-09-22 | 16:52:52 |
{
date: str, # rights distribution record date
stock_id: str, # stock code
year: str, # dividend fiscal year
StockEarningsDistribution: float64, # stock dividend: capitalization of earnings
StockStatutorySurplus: float64, # stock dividend: capitalization of statutory and capital surplus
StockExDividendTradingDate: str, # ex-rights trading date
TotalEmployeeStockDividend: float64, # employee stock dividend
TotalEmployeeStockDividendAmount: float64, # employee stock dividend amount
RatioOfEmployeeStockDividendOfTotal: float64, # ratio of employee stock dividend to total earnings dividend
RatioOfEmployeeStockDividend: float64, # employee stock dividend ratio
CashEarningsDistribution: float64, # cash dividend: capitalization of earnings
CashStatutorySurplus: float64, # cash dividend: capitalization of statutory and capital surplus
CashExDividendTradingDate: str, # ex-dividend trading date
CashDividendPaymentDate: str, # cash dividend payment date
TotalEmployeeCashDividend: float64, # total employee cash bonus
TotalNumberOfCashCapitalIncrease: float64, # total shares of cash capital increase
CashIncreaseSubscriptionRate: float64, # cash capital increase subscription ratio
CashIncreaseSubscriptionpRrice: float64, # cash capital increase subscription price
RemunerationOfDirectorsAndSupervisors: float64, # directors and supervisors remuneration
ParticipateDistributionOfTotalShares: float64, # total shares participating in distribution
AnnouncementDate: str, # announcement date
AnnouncementTime: str # announcement time
}
Ex-Dividend/Ex-Right Result Table TaiwanStockDividendResult¶
- Data range: 2003-05-01 ~ now
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockDividendResult",
"data_id": "2330",
"start_date": "2019-01-01",
}
data = requests.get(url, headers=headers, params=parameter)
data = data.json()
data = pd.DataFrame(data['data'])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockDividendResult",
data_id="2330",
start_date= "2019-01-02"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
from FinMind.data import DataLoader
from loguru import logger
import datetime
api = DataLoader()
api.login_by_token(api_token='token')
start = datetime.datetime.now()
df = api.taiwan_stock_dividend_result(
stock_id_list=['2330', '2317', '2454', '3008'],
start_date='2024-01-01',
end_date='2024-12-31',
use_async=True,
)
cost = datetime.datetime.now() - start
logger.info(cost)
Output
| date | stock_id | before_price | after_price | stock_and_cache_dividend | stock_or_cache_dividend | max_price | min_price | open_price | reference_price | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2019-06-24 | 2330 | 248.5 | 240.5 | 8 | 息 | 264.5 | 216.5 | 240.5 | 240.5 |
| 1 | 2019-09-19 | 2330 | 267 | 265 | 2 | 息 | 291.5 | 238.5 | 265 | 265 |
| 2 | 2019-12-19 | 2330 | 344.5 | 342 | 2.5 | 息 | 376 | 308 | 342 | 342 |
| 3 | 2020-03-19 | 2330 | 260 | 257.5 | 2.5 | 息 | 283 | 232 | 257.5 | 257.5 |
| 4 | 2020-06-18 | 2330 | 315 | 312.5 | 2.5 | 息 | 343.5 | 281.5 | 312.5 | 312.5 |
{
date: str, # date
stock_id: str, # stock code
before_price: float32, # closing price before ex-dividend/ex-right
after_price: float32, # closing price after ex-dividend/ex-right
stock_and_cache_dividend: float32, # dividend value
stock_or_cache_dividend: float32, # right/dividend
max_price: float32, # limit-up price
min_price: float32, # limit-down price
open_price: float32, # open price
reference_price: float32 # reference price after dividend deduction
}
Fetch all data for a specific date at once (available only to backer, sponsor members)¶
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockDividendResult",
"start_date": "2019-06-24",
}
data = requests.get(url, headers=headers, params=parameter)
data = data.json()
data = pd.DataFrame(data['data'])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockDividendResult",
start_date= "2019-06-24"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
Output
| date | stock_id | before_price | after_price | stock_and_cache_dividend | stock_or_cache_dividend | max_price | min_price | open_price | reference_price | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2019-06-24 | 00697B | 42.48 | 42.21 | 0.27 | 除息 | 9999.95 | 0.01 | 42.21 | 42.21 |
| 1 | 2019-06-24 | 00751B | 46.05 | 45.46 | 0.59 | 除息 | 9999.95 | 0.01 | 45.46 | 45.46 |
| 2 | 2019-06-24 | 1707 | 220 | 213.5 | 6.5 | 息 | 234.5 | 192.5 | 213.5 | 213.5 |
| 3 | 2019-06-24 | 1711 | 17 | 16.5 | 0.5 | 息 | 18.15 | 14.85 | 16.5 | 16.5 |
| 4 | 2019-06-24 | 1906 | 13.55 | 13.05 | 0.5 | 息 | 14.35 | 11.75 | 13.05 | 13.05 |
{
date: str, # date
stock_id: str, # stock code
before_price: float32, # closing price before ex-dividend/ex-right
after_price: float32, # closing price after ex-dividend/ex-right
stock_and_cache_dividend: float32, # dividend value
stock_or_cache_dividend: float32, # right/dividend
max_price: float32, # limit-up price
min_price: float32, # limit-down price
open_price: float32, # open price
reference_price: float32 # reference price after dividend deduction
}
Monthly Revenue Table TaiwanStockMonthRevenue¶
- Data range: 2002-02-01 ~ now
- Coverage: listed (TWSE), OTC (TPEx) and emerging market companies, distinguished by
stock_id(useTaiwanStockInfoto look up market type)
create_time only exists from 2026-04-21 onwards, and reflects when the row entered the FinMind database
create_time is the date (YYYY-MM-DD) on which the monthly revenue row entered the FinMind database. It has only been recorded since 2026-04-21; rows older than that carry no create_time and the field is an empty string.
It is therefore not the official announcement time filed by the company on the Market Observation Post System - it only tells you when FinMind observed the row. That said, FinMind collects monthly revenue several times a day, so in practice the gap to the announcement time should be negligible, and the field can still be used as an approximation of "roughly when this revenue figure was published".
Note also that rows written on 2026-04-21 (the day the column went live) all carry create_time = 2026-04-21, which is the initial backfilled value of the column rather than the day those figures were announced.
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockMonthRevenue",
"data_id": "2330",
"start_date": "2019-01-01",
}
data = requests.get(url, headers=headers, params=parameter)
data = data.json()
data = pd.DataFrame(data['data'])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockMonthRevenue",
data_id="2330",
start_date= "2019-01-02"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
from FinMind.data import DataLoader
from loguru import logger
import datetime
api = DataLoader()
api.login_by_token(api_token='token')
start = datetime.datetime.now()
df = api.taiwan_stock_month_revenue(
stock_id_list=['2330', '2317', '2454', '3008'],
start_date='2024-01-01',
end_date='2024-12-31',
use_async=True,
)
cost = datetime.datetime.now() - start
logger.info(cost)
Output
| date | stock_id | country | revenue | revenue_month | revenue_year | create_time | |
|---|---|---|---|---|---|---|---|
| 0 | 2019-04-01 | 2330 | Taiwan | 79721587000 | 3 | 2019 | |
| 1 | 2019-05-01 | 2330 | Taiwan | 74693615000 | 4 | 2019 | |
| 2 | 2019-06-01 | 2330 | Taiwan | 80436931000 | 5 | 2019 | |
| 3 | 2019-07-01 | 2330 | Taiwan | 85867929000 | 6 | 2019 | |
| 4 | 2019-08-01 | 2330 | Taiwan | 84757724000 | 7 | 2019 |
Fetch all data for a specific date at once (available only to backer, sponsor members)¶
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockMonthRevenue",
"start_date": "2019-01-01",
}
data = requests.get(url, headers=headers, params=parameter)
data = data.json()
data = pd.DataFrame(data['data'])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockMonthRevenue",
start_date= "2019-01-01"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
Output
| date | stock_id | country | revenue | revenue_month | revenue_year | create_time | |
|---|---|---|---|---|---|---|---|
| 0 | 2019-05-01 | 1101 | Taiwan | 10596314000 | 4 | 2019 | |
| 1 | 2019-05-01 | 1102 | Taiwan | 8434811000 | 4 | 2019 | |
| 2 | 2019-05-01 | 1103 | Taiwan | 160751000 | 4 | 2019 | |
| 3 | 2019-05-01 | 1104 | Taiwan | 418992000 | 4 | 2019 | |
| 4 | 2019-05-01 | 1108 | Taiwan | 323834000 | 4 | 2019 |
Capital Reduction Resumption Reference Price TaiwanStockCapitalReductionReferencePrice¶
- Data range: 2011-01-01 ~ now
data_id (stock id) is not required
Omitting data_id and providing only the date range returns the capital reduction resumption reference prices of all stocks within that range. This whole-market query without data_id is available to backer/sponsor members; free members should query a single stock with data_id.
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockCapitalReductionReferencePrice",
"data_id": "2327",
"start_date": "2010-01-01",
}
data = requests.get(url, headers=headers, params=parameter)
data = data.json()
data = pd.DataFrame(data['data'])
print(data.head())
date stock_id ClosingPriceonTheLastTradingDay PostReductionReferencePrice LimitUp LimitDown OpeningReferencePrice ExrightReferencePrice ReasonforCapitalReduction
0 2013-09-18 2327 10.20 10.28 10.95 9.57 10.3 -1.0 Cash refund
1 2014-10-09 2327 22.05 49.82 53.30 46.35 49.8 -1.0 Cash refund
2 2016-08-15 2327 54.80 65.96 72.50 59.40 66.0 -1.0 Cash refund
3 2017-08-18 2327 120.50 168.13 184.50 151.50 168.0 -1.0 Cash refund
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockCapitalReductionReferencePrice",
data_id="2327",
start_date= "2010-01-01"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
date stock_id ClosingPriceonTheLastTradingDay PostReductionReferencePrice LimitUp LimitDown OpeningReferencePrice ExrightReferencePrice ReasonforCapitalReduction
1 2013-09-18 2327 10.20 10.28 10.95 9.57 10.3 -1.0 Cash refund
2 2014-10-09 2327 22.05 49.82 53.30 46.35 49.8 -1.0 Cash refund
3 2016-08-15 2327 54.80 65.96 72.50 59.40 66.0 -1.0 Cash refund
4 2017-08-18 2327 120.50 168.13 184.50 151.50 168.0 -1.0 Cash refund
from FinMind.data import DataLoader
from loguru import logger
import datetime
api = DataLoader()
api.login_by_token(api_token='token')
start = datetime.datetime.now()
df = api.taiwan_stock_capital_reduction_reference_price(
stock_id_list=['2330', '2317', '2454', '3008'],
start_date='2024-01-01',
end_date='2024-12-31',
use_async=True,
)
cost = datetime.datetime.now() - start
logger.info(cost)
Taiwan Stock Market Value Table TaiwanStockMarketValue (available only to backer, sponsor members)¶
- Data range: 2004-01-01 ~ now
- Data update time: Monday to Friday 23:30. The actual update time is based on the API data.
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockMarketValue",
"data_id": "2330",
"start_date": "2023-01-01",
"end_date": "2024-01-01",
}
resp = requests.get(url, headers=headers, params=parameter)
data = resp.json()
data = pd.DataFrame(data["data"])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockMarketValue",
data_id= "2330",
start_date= "2023-01-01",
end_date= "2024-01-01"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
Output
Fetch all data for a specific date at once (available only to backer, sponsor members)¶
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockMarketValue",
"start_date": "2023-01-03",
}
resp = requests.get(url, headers=headers, params=parameter)
data = resp.json()
data = pd.DataFrame(data["data"])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockMarketValue",
start_date= "2023-01-03"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
Output
Taiwan Stock Delisting Table TaiwanStockDelisting¶
- Data range: 2001-01-01 ~ now
- Data update time: Monday to Friday 23:30. The actual update time is based on the API data.
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockDelisting",
}
resp = requests.get(url, headers=headers, params=parameter)
data = resp.json()
data = pd.DataFrame(data["data"])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockDelisting"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
from FinMind.data import DataLoader
from loguru import logger
import datetime
api = DataLoader()
api.login_by_token(api_token='token')
start = datetime.datetime.now()
df = api.taiwan_stock_delisting(
stock_id_list=['2330', '2317', '2454', '3008'],
start_date='2024-01-01',
end_date='2024-12-31',
use_async=True,
)
cost = datetime.datetime.now() - start
logger.info(cost)
Output
Taiwan Stock Market Value Weight Table TaiwanStockMarketValueWeight (available only to backer, sponsor members)¶
- Data range: 2024-10-30 ~ now
- Data update time: 23:45 on the 1st, 2nd, 3rd, 28th, 29th, 30th, and 31st of each month. The actual update time is based on the API data.
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockMarketValueWeight",
"data_id": "2330",
"start_date": "2024-01-01",
"end_date": "2025-01-01",
}
resp = requests.get(url, headers=headers, params=parameter)
data = resp.json()
data = pd.DataFrame(data["data"])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockMarketValueWeight",
data_id= "2330",
start_date= "2024-01-01",
end_date= "2025-01-01"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
Output
Fetch all data for a specific date at once (available only to backer, sponsor members)¶
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockMarketValueWeight",
"start_date": "2024-10-30",
}
resp = requests.get(url, headers=headers, params=parameter)
data = resp.json()
data = pd.DataFrame(data["data"])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockMarketValueWeight",
start_date= "2024-10-30"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
Output
| rank | stock_id | stock_name | weight_per | date | type | |
|---|---|---|---|---|---|---|
| 0 | 43 | 1101 | 台泥 | 0.3327 | 2024-10-30 | twse |
| 0 | 63 | 1102 | 亞泥 | 0.2282 | 2024-10-30 | twse |
| 0 | 394 | 1103 | 嘉泥 | 0.0192 | 2024-10-30 | twse |
| 0 | 305 | 1104 | 環泥 | 0.0286 | 2024-10-30 | twse |
| 0 | 651 | 1108 | 幸福 | 0.0082 | 2024-10-30 | twse |
Taiwan Stock Post-Split Reference Price TaiwanStockSplitPrice¶
- Provides Taiwan stock post-split reference prices.
- Data update time: Monday to Friday 18:00. The actual update time is based on the API data.
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockSplitPrice",
}
resp = requests.get(url, headers=headers, params=parameter)
data = resp.json()
data = pd.DataFrame(data["data"])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockSplitPrice"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
Output
| date | stock_id | type | before_price | after_price | max_price | min_price | open_price | |
|---|---|---|---|---|---|---|---|---|
| 0 | 2024-12-11 | 00632R | 反分割 | 3.28 | 22.96 | 25.25 | 20.67 | 22.96 |
| 1 | 2025-02-19 | 00676R | 反分割 | 2.04 | 12.23 | 13.45 | 11.01 | 12.23 |
| 2 | 2025-06-11 | 00663L | 分割 | 170.15 | 24.3 | 29.16 | 19.44 | 24.3 |
| 3 | 2025-06-18 | 0050 | 分割 | 188.65 | 47.16 | 51.85 | 42.45 | 47.16 |
Taiwan Stock Par Value Change Resumption Reference Price TaiwanStockParValueChange¶
- Data range: 2020-01-01 ~ now
Example
import requests
import pandas as pd
url = "https://api.finmindtrade.com/api/v4/data"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockParValueChange",
"start_date": "2020-01-01",
}
data = requests.get(url, headers=headers, params=parameter)
data = data.json()
data = pd.DataFrame(data['data'])
print(data.head())
library(httr)
library(data.table)
library(dplyr)
url = 'https://api.finmindtrade.com/api/v4/data'
token = "" # Refer to login to obtain the token
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockParValueChange",
start_date= "2020-01-01"
),
add_headers(Authorization = paste("Bearer", token))
)
data = content(response)
df = data$data %>%
do.call('rbind',.) %>%
data.table
head(df)
Output
| date | stock_id | stock_name | before_close | after_ref_close | after_ref_max | after_ref_min | after_ref_open | |
|---|---|---|---|---|---|---|---|---|
| 0 | 2020-08-17 | 8070 | 長華 | 190 | 19 | 20.9 | 17.1 | 19 |
| 1 | 2021-10-18 | 6531 | 愛普 | 750 | 375 | 412.5 | 337.5 | 375 |
| 2 | 2022-07-13 | 6415 | 矽力-K | 2485 | 621.25 | 683 | 560 | 621 |
| 3 | 2024-11-11 | 8476 | 台境 | 58.8 | 29.4 | 32.3 | 26.5 | 29.4 |
| 4 | 2025-06-30 | 4763 | 材料-KY | 885 | 88.5 | 97.3 | 79.7 | 88.5 |
{
date: str, # date
stock_id: str, # stock code
stock_name: str, # stock name
before_close: float64, # closing price before suspension
after_ref_close: float64, # resumption reference price
after_ref_max: float64, # limit-up price
after_ref_min: float64, # limit-down price
after_ref_open: float64 # opening auction reference price
}
Taiwan Stock Financial Report and Annual Report PDF TaiwanStockFinancialReportFile (available only to sponsorpro members)¶
- Provides the full PDF files of financial reports and annual shareholders' meeting reports of TWSE-listed, TPEx-listed and emerging-market companies.
- Data range: financial reports 2013-03-31 ~ now (from 2013 Q1, one per quarter); annual reports 2013-12-31 ~ now (from fiscal year 2013, one per year)
- Download one file per request via
/api/v4/storage_objectswithdata_id(stock id),year(calendar year),quarter(1 to 4) andreport_category; all four are required. Whole-market downloads are not supported. quarter=1to3is the financial report for that quarter;quarter=4has the annual financial report (financial_report) and the annual shareholders' meeting report (annual_report).
Download parameters and response
| Parameter | Description |
|---|---|
dataset |
TaiwanStockFinancialReportFile |
data_id |
Stock id, required |
year |
Calendar year, required |
quarter |
Quarter 1 to 4, required |
report_category |
financial_report (financial report) or annual_report (annual shareholders' meeting report), required; annual_report is only available for quarter=4 |
- The response is a redirect; follow it to download the file itself.
- Downloaded file name format:
TaiwanStockFinancialReportFile_{data_id}_{date}_{report_category}.pdf(dateis the period end date, e.g.2025-12-31). - Returns 404 when there is no matching file for that period.
- Returns 400 when parameters are missing or invalid (e.g.
quarternot 1 to 4,report_categorynot one of the two values above, orannual_reportwith aquarterother than 4).
Provides PDF files, not financial statement figures
This dataset provides the report PDF files. For financial statement figures such as income, balance sheet and cash flow items, please use Income Statement TaiwanStockFinancialStatements, Balance Sheet TaiwanStockBalanceSheet and Cash Flows Statement TaiwanStockCashFlowsStatement.
Coverage
- Financial reports (
financial_report): one Chinese report per period, primarily the consolidated financial report; when no consolidated financial report is available, the individual, restated, or parent-company-only financial report is included, in that order. English versions are not included. - Files are mostly PDF; for a small number of 2013 financial reports, the source only provides a Word file, so the downloaded file is a .doc file.
- Annual reports (
annual_report) are the Chinese annual shareholders' meeting reports. - The text layer of some annual report PDFs may be garbled or incomplete (as in the source files); OCR may be needed if you need to extract text.
Usage scope
Rights in the files belong to the issuing company. See Commercial Use Q&A.
Read reports with AI (MCP)
With the FinMind MCP Server (version 0.1.1 or later) you don't need to write download code: just ask "What is the inventory breakdown in the notes of TSMC's Q2 2026 financial report?" and the AI uses download_financial_report to download the PDF, check its table of contents and read the relevant pages.
Example
from FinMind.data import DataLoader
api = DataLoader()
# api.login_by_token(api_token='token')
# Downloads one file and returns its content (bytes); raises an exception when there is no file for the period
content = api.taiwan_stock_financial_report_file_download(
stock_id="2330",
year=2025,
quarter=4,
report_category="annual_report",
)
with open("TaiwanStockFinancialReportFile_2330_2025-12-31_annual_report.pdf", "wb") as f:
f.write(content)
import requests
url = "https://api.finmindtrade.com/api/v4/storage_objects"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
parameter = {
"dataset": "TaiwanStockFinancialReportFile",
"data_id": "2330",
"year": 2025,
"quarter": 4,
"report_category": "annual_report",
}
# requests follows redirects by default and gets the file itself
resp = requests.get(url, headers=headers, params=parameter)
resp.raise_for_status() # 404 when there is no file for the period
# A small number of 2013 financial reports are Word files (.doc); others are PDF
ext = "doc" if resp.headers.get("Content-Type") == "application/msword" else "pdf"
with open(f"TaiwanStockFinancialReportFile_2330_2025-12-31_annual_report.{ext}", "wb") as f:
f.write(resp.content)
library(httr)
url = 'https://api.finmindtrade.com/api/v4/storage_objects'
token = "" # Refer to login to obtain the token
# httr follows redirects by default; write_disk writes the file to disk
response = httr::GET(
url = url,
query = list(
dataset="TaiwanStockFinancialReportFile",
data_id= "2330",
year= 2025,
quarter= 4,
report_category= "annual_report"
),
add_headers(Authorization = paste("Bearer", token)),
write_disk("TaiwanStockFinancialReportFile_2330_2025-12-31_annual_report.pdf", overwrite = TRUE)
)
stop_for_status(response) # 404 when there is no file for the period
import requests
url = "https://api.finmindtrade.com/api/v4/storage_objects"
token = "" # Refer to login to obtain the token
headers = {"Authorization": f"Bearer {token}"}
quarter_end = {1: "03-31", 2: "06-30", 3: "09-30", 4: "12-31"}
# Download 2330's quarterly financial reports and annual reports for 2024-2025
for year in [2024, 2025]:
for quarter in [1, 2, 3, 4]:
categories = ["financial_report"]
if quarter == 4:
categories.append("annual_report") # annual reports are Q4 only
for report_category in categories:
parameter = {
"dataset": "TaiwanStockFinancialReportFile",
"data_id": "2330",
"year": year,
"quarter": quarter,
"report_category": report_category,
}
resp = requests.get(url, headers=headers, params=parameter)
if resp.status_code == 404:
print(year, quarter, report_category, "no file for this period")
continue
resp.raise_for_status()
ext = "doc" if resp.headers.get("Content-Type") == "application/msword" else "pdf"
file_name = (
f"TaiwanStockFinancialReportFile_2330_"
f"{year}-{quarter_end[quarter]}_{report_category}.{ext}"
)
with open(file_name, "wb") as f:
f.write(resp.content)
print(file_name, len(resp.content))