Consulta información de Banco de México con Python
Consulta el tipo de cambio FIX en Banxico

Consulta de información utilizando la API del Sistema de Información Económica (SIE) de Banxico en pocos pasos.
La API de consulta de Información Económica de Banxico
El API del Sistema de Información Económica permite consultar las series de tiempo de todos los indicadores en el repositorio. Esta herramienta permite la automatización del proceso de extracción de información económica publicada por el Banco de México.
Una API (del inglés, application programming interface, en español, interfaz de programación de aplicaciones) es una pieza de código que permite a dos aplicaciones comunicarse entre sí para compartir información y funcionalidades. Se usan generalmente en bibliotecas de programación. https://es.wikipedia.org/wiki/API#
Foto de Solen Feyissa en Unsplash
Paso 1: Obtener token de la API
Todas las solicitudes que se realicen al API requieren enviar un token de consulta, por lo cual el primer paso es obtener el token que identificará las peticiones enviadas. Esto le permite a Banxico llevar un control del número de consultas enviadas por token, y bloquear el uso excesivo que pidiera afectar el sistema.
El token de consulta es un requisito necesario para poder utilizar el API de series de tiempo. Consta de 64 caracteres alfanuméricos y debe ser enviado cada vez que se interactúe con los servicios provistos.
Entrar a la página: https://www.banxico.org.mx/SieAPIRest/service/v1/ y llenar los formularios para obtener el token.
El token se genera una sola vez y se usa cuantas veces se necesite, respetando los límites de consulta.
IMPORTANTE: No compartas el token.
Paso 2: Seleccionar el identificador de la serie de tiempo a consultar
Para esto es necesario consultar el Catálogo de series en https://www.banxico.org.mx/SieAPIRest/service/v1/doc/catalogoSeries
Por ejemplo, para consultar el tipo de cambio FIX hay que navegar por el catálogo:
En este caso, el ID de la serie del tipo de cambio FIX es: SF43718
Paso 3: Consultar utilizando Python
La forma más sencilla es utilizando la librería banxico-api la cual se encarga de todos los detalles interno del manejo de la API
#### instalar la librería (se corre solo una vez)
!pip install banxicoapi
Collecting banxicoapi
Downloading banxicoapi-1.0.2-py3-none-any.whl.metadata (2.7 kB)
Requirement already satisfied: requests in c:\tools\anaconda3\envs\datascience\lib\site-packages (from banxicoapi) (2.32.3)
Requirement already satisfied: pyyaml in c:\tools\anaconda3\envs\datascience\lib\site-packages (from banxicoapi) (6.0.2)
Requirement already satisfied: charset-normalizer<4,>=2 in c:\tools\anaconda3\envs\datascience\lib\site-packages (from requests->banxicoapi) (3.4.0)
Requirement already satisfied: idna<4,>=2.5 in c:\tools\anaconda3\envs\datascience\lib\site-packages (from requests->banxicoapi) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in c:\tools\anaconda3\envs\datascience\lib\site-packages (from requests->banxicoapi) (2.2.3)
Requirement already satisfied: certifi>=2017.4.17 in c:\tools\anaconda3\envs\datascience\lib\site-packages (from requests->banxicoapi) (2025.4.26)
Downloading banxicoapi-1.0.2-py3-none-any.whl (5.7 kB)
Installing collected packages: banxicoapi
Successfully installed banxicoapi-1.0.2
#### importar la librería
import banxicoapi
### guardar token
token = "ce99e276c8ff03f6d34215c9865___GENERA_TU_TOKEN______"
### generar un objeto tipo API el cual va a manejar las consultas
api = banxicoapi.BanxicoApi(token)
### guardar la serie a consultar en una lista
series = ["SF43718"]
### Consultar TODA la historia
data = api.get(series)
print(data) ## En algunos casos es MUCHA información!!
[{'idSerie': 'SF43718', 'titulo': 'Tipo de cambio Pesos por dólar E.U.A. Tipo de cambio para solventar obligaciones denominadas en moneda extranjera Fecha de determinación (FIX)', 'datos': [{'fecha': '12/11/1991', 'dato': '3.0735'},
{'fecha': '13/11/1991', 'dato': '3.0712'}, {'fecha': '14/11/1991', 'dato': '3.0718'},
{'fecha': '15/11/1991', 'dato': '3.0684'}, {'fecha': '18/11/1991', 'dato': '3.0673'},
{'fecha': '19/11/1991', 'dato': '3.0661'}, {'fecha': '21/11/1991', 'dato': '3.0632'},
{'fecha': '22/11/1991', 'dato': '3.0612'}, {'fecha': '25/11/1991', 'dato': '3.0622'},
{'fecha': '26/11/1991', 'dato': '3.0760'}, {'fecha': '27/11/1991', 'dato': '3.0731'},
{'fecha': '28/11/1991', 'dato': '3.0677'}, {'fecha': '29/11/1991', 'dato': '3.0672'},
{'fecha': '02/12/1991', 'dato': '3.0662'}, {'fecha': '03/12/1991', 'dato': '3.0666'},
{'fecha': '04/12/1991', 'dato': '3.0660'},
...
]}]
### Consultar solo la información entre dos fechas
start_date = "2024-12-31"
end_date = "2025-05-26"
data_in_range = api.get(series, start_date=start_date, end_date=end_date)
## el dato que regresa es de tipo lista
type(data_in_range)
list
data_in_range[0] # el primer dato de la lista es un dictionario
{'idSerie': 'SF43718',
'titulo': 'Tipo de cambio Pesos por dólar E.U.A. Tipo de cambio para solventar obligaciones denominadas en moneda extranjera Fecha de determinación (FIX)',
'datos': [{'fecha': '31/12/2024', 'dato': '20.7862'},
{'fecha': '02/01/2025', 'dato': '20.6917'},
{'fecha': '03/01/2025', 'dato': '20.6708'},
{'fecha': '06/01/2025', 'dato': '20.3195'},
{'fecha': '07/01/2025', 'dato': '20.3440'},
{'fecha': '08/01/2025', 'dato': '20.3823'},
{'fecha': '09/01/2025', 'dato': '20.4742'},
{'fecha': '10/01/2025', 'dato': '20.7045'},
{'fecha': '13/01/2025', 'dato': '20.8012'},
{'fecha': '14/01/2025', 'dato': '20.4820'},
{'fecha': '15/01/2025', 'dato': '20.4875'},
{'fecha': '16/01/2025', 'dato': '20.7732'},
{'fecha': '17/01/2025', 'dato': '20.7180'},
{'fecha': '20/01/2025', 'dato': '20.5430'},
{'fecha': '21/01/2025', 'dato': '20.6358'},
{'fecha': '22/01/2025', 'dato': '20.5397'},
{'fecha': '23/01/2025', 'dato': '20.3943'},
{'fecha': '24/01/2025', 'dato': '20.2255'},
{'fecha': '27/01/2025', 'dato': '20.7002'},
{'fecha': '28/01/2025', 'dato': '20.5668'},
{'fecha': '29/01/2025', 'dato': '20.5677'},
{'fecha': '30/01/2025', 'dato': '20.4497'},
{'fecha': '31/01/2025', 'dato': '20.6068'},
{'fecha': '04/02/2025', 'dato': '20.4268'},
{'fecha': '05/02/2025', 'dato': '20.6363'},
{'fecha': '06/02/2025', 'dato': '20.5125'},
{'fecha': '07/02/2025', 'dato': '20.5512'},
{'fecha': '10/02/2025', 'dato': '20.6693'},
{'fecha': '11/02/2025', 'dato': '20.5680'},
{'fecha': '12/02/2025', 'dato': '20.4917'},
{'fecha': '13/02/2025', 'dato': '20.4978'},
{'fecha': '14/02/2025', 'dato': '20.3082'},
{'fecha': '17/02/2025', 'dato': '20.2830'},
{'fecha': '18/02/2025', 'dato': '20.2617'},
{'fecha': '19/02/2025', 'dato': '20.4208'},
{'fecha': '20/02/2025', 'dato': '20.3733'},
{'fecha': '21/02/2025', 'dato': '20.3448'},
{'fecha': '24/02/2025', 'dato': '20.4640'},
{'fecha': '25/02/2025', 'dato': '20.4683'},
{'fecha': '26/02/2025', 'dato': '20.4277'},
{'fecha': '27/02/2025', 'dato': '20.4722'},
{'fecha': '28/02/2025', 'dato': '20.5080'},
{'fecha': '03/03/2025', 'dato': '20.4333'},
{'fecha': '04/03/2025', 'dato': '20.8518'},
{'fecha': '05/03/2025', 'dato': '20.3893'},
{'fecha': '06/03/2025', 'dato': '20.2777'},
{'fecha': '07/03/2025', 'dato': '20.2830'},
{'fecha': '10/03/2025', 'dato': '20.2922'},
{'fecha': '11/03/2025', 'dato': '20.3388'},
{'fecha': '12/03/2025', 'dato': '20.1828'},
{'fecha': '13/03/2025', 'dato': '20.0848'},
{'fecha': '14/03/2025', 'dato': '19.8693'},
{'fecha': '18/03/2025', 'dato': '19.9845'},
{'fecha': '19/03/2025', 'dato': '20.0553'},
{'fecha': '20/03/2025', 'dato': '20.1345'},
{'fecha': '21/03/2025', 'dato': '20.2163'},
{'fecha': '24/03/2025', 'dato': '20.1123'},
{'fecha': '25/03/2025', 'dato': '20.0762'},
{'fecha': '26/03/2025', 'dato': '20.0963'},
{'fecha': '27/03/2025', 'dato': '20.3182'},
{'fecha': '28/03/2025', 'dato': '20.4003'},
{'fecha': '31/03/2025', 'dato': '20.4380'},
{'fecha': '01/04/2025', 'dato': '20.3587'},
{'fecha': '02/04/2025', 'dato': '20.4568'},
{'fecha': '03/04/2025', 'dato': '19.9708'},
{'fecha': '04/04/2025', 'dato': '20.5010'},
{'fecha': '07/04/2025', 'dato': '20.6947'},
{'fecha': '08/04/2025', 'dato': '20.6867'},
{'fecha': '09/04/2025', 'dato': '20.7653'},
{'fecha': '10/04/2025', 'dato': '20.4920'},
{'fecha': '11/04/2025', 'dato': '20.3363'},
{'fecha': '14/04/2025', 'dato': '20.1025'},
{'fecha': '15/04/2025', 'dato': '20.0213'},
{'fecha': '16/04/2025', 'dato': '19.9737'},
{'fecha': '21/04/2025', 'dato': '19.6718'},
{'fecha': '22/04/2025', 'dato': '19.5688'},
{'fecha': '23/04/2025', 'dato': '19.6278'},
{'fecha': '24/04/2025', 'dato': '19.5825'},
{'fecha': '25/04/2025', 'dato': '19.5478'},
{'fecha': '28/04/2025', 'dato': '19.5723'},
{'fecha': '29/04/2025', 'dato': '19.5868'},
{'fecha': '30/04/2025', 'dato': '19.6095'},
{'fecha': '02/05/2025', 'dato': '19.6570'},
{'fecha': '05/05/2025', 'dato': '19.6365'},
{'fecha': '06/05/2025', 'dato': '19.6785'},
{'fecha': '07/05/2025', 'dato': '19.5880'},
{'fecha': '08/05/2025', 'dato': '19.5642'},
{'fecha': '09/05/2025', 'dato': '19.4912'},
{'fecha': '12/05/2025', 'dato': '19.6162'},
{'fecha': '13/05/2025', 'dato': '19.4373'},
{'fecha': '14/05/2025', 'dato': '19.3630'},
{'fecha': '15/05/2025', 'dato': '19.4780'},
{'fecha': '16/05/2025', 'dato': '19.5147'},
{'fecha': '19/05/2025', 'dato': '19.3723'},
{'fecha': '20/05/2025', 'dato': '19.2648'},
{'fecha': '21/05/2025', 'dato': '19.3198'},
{'fecha': '22/05/2025', 'dato': '19.3227'},
{'fecha': '23/05/2025', 'dato': '19.2748'},
{'fecha': '26/05/2025', 'dato': '19.2188'}]}
## vamos a graficar los datos
import pandas as pd
import numpy as mp
import matplotlib as plt
# extraer los datos a una lista y extraer fecha y dato
data_df = pd.DataFrame( [x for x in data_in_range[0]["datos"]] )
data_df.head()
fecha | dato | |
---|---|---|
0 | 31/12/2024 | 20.7862 |
1 | 02/01/2025 | 20.6917 |
2 | 03/01/2025 | 20.6708 |
3 | 06/01/2025 | 20.3195 |
4 | 07/01/2025 | 20.3440 |
## cambiar el indice y poner las fechas
data_df = data_df.set_index('fecha', drop=True)
data_df.head()
dato | |
---|---|
fecha | |
31/12/2024 | 20.7862 |
02/01/2025 | 20.6917 |
03/01/2025 | 20.6708 |
06/01/2025 | 20.3195 |
07/01/2025 | 20.3440 |
data_df.index = pd.to_datetime(data_df.index, errors='coerce', dayfirst=True)
data_df.dtypes # los datos no están guardados como número, hay que cambiarlos
dato object
dtype: object
data_df["dato"] = data_df["dato"].astype(float)
data_df.plot()
<Axes: xlabel='fecha'>