API de Mercado de Taiwán

5 endpoints

Última actualización 2026-10
URL base
https://api.blave.org
Autenticación
Encabezados api-key + secret-key en cada solicitud
Acceso
API plan or Blave Agent plan
Límite de uso
500 solicitudes / 5 min por clave y por IP

Convenciones

Series diarias de todo el mercado (sin stock_id). start / end son YYYY-MM-DD opcionales; omítalos para obtener el historial completo. No sume los endpoints por acción como sustituto — la cobertura y las unidades difieren.

OHLC diario del TAIEX

GET/studio/market/twmarket/index/<index_id>
Datos desde
1999-01-05
Actualización
Diaria

Parámetros

NombreDescripciónValores permitidosPredeterminado
index_id
string · pathObligatorio
Solo se admite TAIEXTAIEX (sin distinguir mayúsculas de minúsculas)
start
string · query
Primera fechaYYYY-MM-DD1999-01-05
end
string · query
Última fechaYYYY-MM-DDhoy

Ejemplo

Python
body = requests.get(f"{BASE_URL}/studio/market/twmarket/index/TAIEX", headers=headers,                    params={"start": "2024-01-01", "end": "2024-12-31"}, timeout=60).json()# {"index_id": "TAIEX", "data": [{"date": "2024-01-02", "open": 17939.79, "high": 17956.74, "low": 17784.97, "close": 17853.76}, ...]}

Respuesta

{"index_id": "TAIEX", "data": [{"date", "open", "high", "low", "close"}]}; precios en puntos del índice. Sin volumen — use /twmarket/turnover.

Errores

EstadoCuerpoCuándo
400{"error": "Unsupported index"}No es TAIEX
404mensaje de errorSin datos
503{"error": "Market data is not ready on this server. Please retry later."} / rate limit del origen de datosAlmacén no disponible todavía / origen de datos caído

Notas

  • La serie es el índice tal como lo publica oficialmente TWSE.
  • Caché del servidor: 5 minutos.

Volumen negociado del mercado

GET/studio/market/twmarket/turnover
Datos desde
1990-01-04
Actualización
Diaria

Parámetros

NombreDescripciónValores permitidosPredeterminado
start
string · query
Primera fechaYYYY-MM-DD1990-01-04
end
string · query
Última fechaYYYY-MM-DDhoy

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twmarket/turnover", headers=headers,                    params={"start": "2024-01-01"}, timeout=60).json()["data"]# [{"date": "2024-01-02", "volume": 6411778806.0, "value": 301290668897.0, "trades": 2267660.0}, ...]

Respuesta

{"data": [...]}.

CampoUnidadDescripción
date—Día de negociación
volumeacciones成交股數
valueTWD成交金額
tradesnúmero成交筆數

Errores

404 sin datos; 503 almacén no disponible todavía o rate limit del origen de datos.

Notas

  • Las cifras son las estadísticas de negociación del mercado publicadas oficialmente por TWSE.
  • Caché del servidor: 5 minutos.

Compra/venta neta institucional del mercado

GET/studio/market/twmarket/institutional
Datos desde
2004-04-07
Actualización
Diaria

Parámetros

NombreDescripciónValores permitidosPredeterminado
start
string · query
Primera fechaYYYY-MM-DD2004-04-07
end
string · query
Última fechaYYYY-MM-DDhoy

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twmarket/institutional", headers=headers,                    params={"start": "2024-01-01"}, timeout=60).json()["data"]# [{"date": "2024-01-02", "foreign": 1047078183.0, "investment_trust": 189637635.0,#   "dealer": -4448119903.0, "total": -3211404085.0}, ...]

Respuesta

{"data": [{"date", "foreign", "investment_trust", "dealer", "total"}]}; todos los valores son netos (compra − venta) en TWD.

Errores

404 sin datos; 503 rate limit del origen de datos.

Notas

  • Capa de todo el mercado. foreign es 外資及陸資 sin la operativa por cuenta propia de los operadores extranjeros (外資自營商); dealer es 自營商 (自行買賣 + 避險), donde TWSE ya incluye 外資自營商. El endpoint por acción (GET /studio/market/twstock/institutional/<stock_id>) es una capa distinta: devuelve las columnas sin procesar de cada categoría y no agrupa nada. No deben mezclarse.
  • foreign + investment_trust + dealer es igual a total, el 三大法人合計 publicado por la bolsa, todos los días. 外資自營商 no es una columna aparte: corresponde a warrants/ETN, que Blave no sirve, y ha sido 0 todos los días después de 2024-08-16.
  • Caché del servidor: 5 minutos.

Saldo de margen del mercado

GET/studio/market/twmarket/margin
Datos desde
2001-01-03
Actualización
Diaria

Parámetros

NombreDescripciónValores permitidosPredeterminado
start
string · query
Primera fechaYYYY-MM-DD2001-01-03
end
string · query
Última fechaYYYY-MM-DDhoy

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twmarket/margin", headers=headers,                    params={"start": "2024-01-01"}, timeout=60).json()["data"]# [{"date": "2024-01-02", "margin_balance": 8012561, "margin_balance_prev": 7999081,#   "margin_balance_value": 248424271000, "short_balance": 369678, "short_balance_prev": 359738}, ...]

Respuesta

{"data": [...]}.

CampoUnidadDescripción
date—Día de negociación
margin_balance / margin_balance_prevlotes (張)融資餘額 de hoy / del día anterior
margin_balance_valueTWD融資餘額金額
short_balance / short_balance_prevlotes (張)融券餘額 de hoy / del día anterior

Errores

404 sin datos; 503 rate limit del origen de datos.

Notas

  • Caché del servidor: 5 minutos.

Puntos de dividendo diarios del TAIEX

GET/studio/market/twmarket/dividend_points
Datos desde
2003-01-02 (realizados); previsiones hasta hoy + 120 días
Actualización
Diaria, hacia las 17:00 (hora de Taipéi) (realizados)

Parámetros

NombreDescripciónValores permitidosPredeterminado
start
string · query
Primera fechaYYYY-MM-DD estricto2003-01-02
end
string · query
Última fecha; se recorta sin aviso a hoy + 120 díasYYYY-MM-DD estrictohoy + 120 días

Ejemplo

Python
import pandas as pdpayload = requests.get(f"{BASE_URL}/studio/market/twmarket/dividend_points", headers=headers,                       params={"start": "2026-08-01"}, timeout=60).json()# {"data": [{"date": "2026-08-03", "points": 2.853, "estimated": false}, ...,#           {"date": "2026-08-28", "points": 3.846, "estimated": true}, ...],#  "meta": {"estimated_coverage": 0.9999, "degraded": false}}df = pd.DataFrame(payload["data"])future_div = df[df["estimated"]].set_index("date")["points"]# fair basis at t for settlement T: futures_price - (spot_index - future_div.loc[t_plus_1:T].sum())

Respuesta

{"data": [{"date", "points", "estimated"}], "meta": {"estimated_coverage", "degraded"}}.

CampoTipoDescripción
data[].datestringDía
data[].pointsfloatPuntos del índice descontados por los eventos ex-dividendo de ese día
data[].estimatedboolfalse = realizado (a partir del diferencial entre el índice de rentabilidad total y el índice de precios; días sin ex-dividendo ≈ 0); true = previsión (días laborables futuros, con ceros donde no hay evento)
meta.estimated_coveragefloat | nullFracción del peso del TAIEX cuyos datos de entrada pudieron leerse para la previsión; null cuando no hay filas estimadas
meta.degradedbooltrue = previsión con cobertura claramente insuficiente — debe tratarse como un límite inferior

Errores

EstadoCuerpoCuándo
400{"error": "Invalid start date, expected YYYY-MM-DD"} (o end)Fecha mal formada
404{"error": "No TAIEX index data available"}Almacén vacío y sin datos en el origen
503mensaje de errorCobertura de la previsión inferior al 90%, almacén no disponible todavía o rate limit del origen de datos

Notas

  • Antes de las ~17:00 (hora de Taipéi), la última fila realizada es la del día de negociación anterior.
  • Las previsiones a más de ~2 semanas se apoyan en la plantilla del año anterior.
  • Las filas de previsión siempre se devuelven desde mañana hasta end, incluso cuando start es posterior a mañana — filtre en el cliente.
  • Caché del servidor: 5 minutos (datos de entrada de la previsión, 1 hora).
  • La parte realizada es el índice de rentabilidad total frente al índice de precios; las previsiones usan los dividendos anunciados más una plantilla del año anterior.