Jupyter Notebook es la herramienta de elección para analistas y desarrolladores que desean combinar código, datos y comentarios en un solo documento compartible. Esta guía lo guía a través de un flujo de trabajo completo de extremo a extremo: instalar el SDK de FXMacroData Python, configurar su clave API, obtener series de indicadores macro, realizar análisis y producir gráficos listos para publicación todo dentro de un solo cuaderno. Al final tendrá un cuader notables funcional y reproducible que puede ampliar con cualquiera de los más de 80 indicadores que FXMacrodata expone.
Lo que construirás
Un cuaderno Jupyter autónomo que se autentica en la API REST FXMacroData, extrae las series de tiempo de tasas de política y inflación para cuatro monedas del G10, calcula los diferenciales de tasos reales y presenta gráficos interactivos de varias series listos para compartir o programar como un informe recurrente.
Los requisitos previos
- Python 3.9 o posterior
- Jupyter Notebook o JupytorLab instalar con
pip install jupyterlab - Los siguientes paquetes:
requests¿ Qué ?pandas¿ Qué ?matplotlib¿ Qué ?seaborn - Una clave de la API de FXMacroData registrarse en / suscribirse para conseguir uno
Puede instalar todas las dependencias en un solo comando:
pip install requests pandas matplotlib seaborn jupyterlab
Luego, inicie JupyterLab desde su carpeta de proyectos:
jupyter lab
Paso 1 Asegure su clave API
Nunca las credenciales de código duro en un archivo de cuaderno los cuadernos son fáciles de compartir accidentalmente, y una clave de API filtrada puede ser mal utilizada.
En Linux/macOS, añade esta línea a tu ~/.bashrc ¿ Qué ? ~/.zshrc (entonces reinicie su terminal o ejecute source ~/.bashrc):
export FXMD_API_KEY="your_actual_api_key_here"
En Windows (PowerShell):
$env:FXMD_API_KEY = "your_actual_api_key_here"
Luego lee la tecla en la parte superior de tu cuaderno en una celda de configuración dedicada:
import os
API_KEY = os.environ.get("FXMD_API_KEY")
if not API_KEY:
raise EnvironmentError(
"FXMD_API_KEY environment variable is not set. "
"See https://fxmacrodata.com/subscribe to get a key."
)
print("API key loaded ✓")
Consejo: python-dotenv para los secretos a nivel de proyecto
Si prefiere un .env archivo por proyecto, instalar pip install python-dotenv y añadir
from dotenv import load_dotenv; load_dotenv() Antes de la os.environ.get() - ¿Qué pasa? .env archivo en su .gitignore- ¿ Qué ?
Paso 2 Escriba un ayudante de búsqueda reutilizable
Cada punto final del indicador FXMacroData sigue la misma estructura de URL:
GET https://fxmacrodata.com/api/v1/announcements/{currency}/{indicator}?api_key=YOUR_API_KEY
La respuesta JSON contiene un data matriz donde cada objeto tiene un date campo, a val campo, y (para el tiempo preciso) un announcement_datetime El siguiente ayudante convierte esa respuesta directamente en un DataFrame de pandas:
import requests
import pandas as pd
BASE_URL = "https://fxmacrodata.com/api/v1"
def fetch_indicator(currency: str, indicator: str,
start: str = None, end: str = None) -> pd.DataFrame:
"""Fetch a macro indicator time series from FXMacroData.
Parameters
----------
currency : ISO currency code, e.g. 'usd', 'eur', 'gbp'
indicator : Indicator slug, e.g. 'policy_rate', 'inflation', 'gdp'
start : Optional start date 'YYYY-MM-DD'
end : Optional end date 'YYYY-MM-DD'
Returns
-------
pd.DataFrame with columns: date (datetime64), val (float64),
announcement_datetime (datetime64, nullable),
currency (str), indicator (str)
"""
params = {"api_key": API_KEY}
if start:
params["start"] = start
if end:
params["end"] = end
url = f"{BASE_URL}/announcements/{currency}/{indicator}"
resp = requests.get(url, params=params, timeout=15)
resp.raise_for_status()
rows = resp.json().get("data", [])
if not rows:
return pd.DataFrame(columns=["date", "val", "announcement_datetime",
"currency", "indicator"])
df = pd.DataFrame(rows)
df["date"] = pd.to_datetime(df["date"])
df["val"] = pd.to_numeric(df["val"], errors="coerce")
if "announcement_datetime" in df.columns:
df["announcement_datetime"] = pd.to_datetime(
df["announcement_datetime"], errors="coerce", utc=True
)
df["currency"] = currency.upper()
df["indicator"] = indicator
return df.sort_values("date").reset_index(drop=True)
El ayudante levanta un HTTPError En las respuestas 4xx/5xx, se convierte el date la columna a una correcta datetime64 El sistema de las redes de transporte de mercancías y de los servicios de transporte en línea, que se utiliza para la comunicación de datos, incluye el tipo de transporte, y coloca etiquetas de moneda e indicador haciendo triviales las uniones aguas abajo.
Paso 3 Traiga su primera serie
Verifiquemos el ayudante buscando las decisiones de la política de tasas de la Reserva Federal desde 2022:
usd_rate = fetch_indicator("usd", "policy_rate", start="2022-01-01")
usd_rate.head(10)
Deberías ver un DataFrame con columnas como:
date val announcement_datetime currency indicator
0 2022-03-16 0.25 2022-03-16T18:00:00+00:00 USD policy_rate
1 2022-05-04 0.75 2022-05-04T18:00:00+00:00 USD policy_rate
2 2022-06-15 1.50 2022-06-15T18:00:00+00:00 USD policy_rate
3 2022-07-27 2.25 2022-07-27T18:00:00+00:00 USD policy_rate
...
¿ Se fijan en el ? announcement_datetime columna esto le da precisión de lanzamiento de segundo nivel para estrategias basadas en eventos o backtests que dependen del momento exacto del anuncio. /api-data-docs/usd/taxa de política- ¿ Qué ?
Paso 4 Obtener varias monedas
Uno de los patrones más poderosos es tirar del mismo indicador para varias monedas simultáneamente y apilar los resultados.
currencies = ["usd", "eur", "gbp", "aud"]
START = "2022-01-01"
policy_rates = pd.concat(
[fetch_indicator(ccy, "policy_rate", start=START) for ccy in currencies],
ignore_index=True
)
print(f"Fetched {len(policy_rates)} rows across {policy_rates['currency'].nunique()} currencies")
policy_rates.groupby("currency").tail(2)
Las babosas de indicadores disponibles
El catálogo completo de indicadores se encuentra en El número de datos de la base de datos es el siguiente:Las series clave para el análisis de divisas incluyen:
policy_rate¿ Qué ?
inflation¿ Qué ?
gdp¿ Qué ?
unemployment¿ Qué ?
pmi, y
trade_balanceCada serie utiliza el mismo patrón de búsqueda código de moneda de cambio y la cara de indicador.
Paso 5 Combinar varios indicadores
Para calcular las tasas de interés reales se necesita tanto la tasa de interés y la inflación global para cada moneda.
inflation = pd.concat(
[fetch_indicator(ccy, "inflation", start=START) for ccy in currencies],
ignore_index=True
)
# Stack all observations into one long-form DataFrame
macro = pd.concat([policy_rates, inflation], ignore_index=True)
print(macro.groupby(["currency", "indicator"]).size().to_string())
Paso 6 Reforma y relleno de la caja
Las decisiones del banco central son escasas ocurren 612 veces al año. Para alinearlas con otras series mensuales, construye una columna vertebral de fechas mensuales y rellena hacia adelante el último valor conocido:
import numpy as np
# Floor each observation to month start for alignment
macro["month"] = macro["date"].dt.to_period("M").dt.to_timestamp()
# Pivot to wide: one column per currency+indicator combination
wide = (
macro
.groupby(["month", "currency", "indicator"])["val"]
.last() # latest reading within the month
.unstack(["currency", "indicator"])
)
# Build a complete monthly date spine and forward-fill
date_spine = pd.date_range(START, pd.Timestamp.today(), freq="MS")
wide = wide.reindex(date_spine).ffill()
wide.tail(3)
Paso 7 Calcular los diferenciales de tipos reales
Un diferencial de tipo de interés real es el tipo de cambio nominal menos la inflación general. Un diferente positivo indica una política monetaria restrictiva; un diferencial negativo significa que el banco central sigue siendo acomodaticio en relación con el crecimiento de los precios al consumidor.
for ccy in [c.upper() for c in currencies]:
try:
wide[(ccy, "real_rate")] = (
wide[(ccy, "policy_rate")] - wide[(ccy, "inflation")]
)
except KeyError:
pass # skip if either series is missing
# EUR minus USD real rate differential
wide[("spread", "eur_usd")] = (
wide[("EUR", "real_rate")] - wide[("USD", "real_rate")]
)
wide[[("USD", "real_rate"), ("EUR", "real_rate"), ("spread", "eur_usd")]].tail(6)
Paso 8 Visualizar con Matplotlib
Con el DataFrame listo, un gráfico de múltiples paneles toma sólo unas pocas líneas.
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
fig, axes = plt.subplots(3, 1, figsize=(13, 11), sharex=True)
fig.patch.set_facecolor("#F8FAFC")
COLORS = {"USD": "#2563EB", "EUR": "#16A34A", "GBP": "#7C3AED", "AUD": "#F97316"}
# Panel 1: Policy rates
ax1 = axes[0]
for ccy in [c.upper() for c in currencies]:
try:
series = wide[(ccy, "policy_rate")].dropna()
ax1.step(series.index, series.values, where="post",
label=ccy, color=COLORS[ccy], linewidth=1.8)
except KeyError:
pass
ax1.set_ylabel("Policy rate (%)")
ax1.set_title("Central Bank Policy Rates — G4", fontweight="bold")
ax1.legend(loc="upper left", fontsize=9)
ax1.grid(axis="y", alpha=0.3)
# Panel 2: Real rates
ax2 = axes[1]
for ccy in [c.upper() for c in currencies]:
try:
series = wide[(ccy, "real_rate")].dropna()
ax2.plot(series.index, series.values,
label=ccy, color=COLORS[ccy], linewidth=1.8)
except KeyError:
pass
ax2.axhline(0, color="#94A3B8", linewidth=0.8, linestyle="--")
ax2.set_ylabel("Real rate (%)")
ax2.set_title("Real Interest Rates (Policy Rate − Inflation)", fontweight="bold")
ax2.legend(loc="upper left", fontsize=9)
ax2.grid(axis="y", alpha=0.3)
# Panel 3: EUR–USD spread
ax3 = axes[2]
spread = wide[("spread", "eur_usd")].dropna()
ax3.fill_between(spread.index, spread.values, 0,
where=spread.values >= 0,
color="#16A34A", alpha=0.30, label="EUR favoured")
ax3.fill_between(spread.index, spread.values, 0,
where=spread.values < 0,
color="#2563EB", alpha=0.30, label="USD favoured")
ax3.plot(spread.index, spread.values, color="#374151", linewidth=1.6)
ax3.axhline(0, color="#94A3B8", linewidth=0.8, linestyle="--")
ax3.set_ylabel("Spread (pp)")
ax3.set_title("EUR−USD Real Rate Differential", fontweight="bold")
ax3.legend(loc="upper left", fontsize=9)
ax3.grid(axis="y", alpha=0.3)
ax3.xaxis.set_major_formatter(mdates.DateFormatter("%b %Y"))
ax3.xaxis.set_major_locator(mdates.MonthLocator(interval=4))
plt.setp(ax3.xaxis.get_majorticklabels(), rotation=30, ha="right")
fig.tight_layout(h_pad=1.6)
plt.savefig("macro_analysis.png", dpi=150, bbox_inches="tight")
plt.show()
Consejo: Utilice gráficos de pasos para las series de tipos de interés
ax.step(..., where="post") En el caso de las series macro, el valor de las decisiones del banco central se representa correctamente como movimientos de escaleras discretos en lugar de como una línea interpolada lisa. ax.plot() es apropiado.
Paso 9 Revisa el calendario de las ediciones
Antes de programar las búsquedas recurrentes, es útil saber exactamente cuándo se deben publicar los próximos datos. punto final del calendario de liberación devuelve las fechas de anuncio próximas para cualquier moneda, para que pueda programar las actualizaciones de su cuaderno para que se ejecuten minutos después de cada lanzamiento en lugar de votar en un horario fijo:
def fetch_calendar(currency: str) -> pd.DataFrame:
"""Fetch upcoming release dates for a currency from the FXMacroData calendar."""
url = f"{BASE_URL}/calendar/{currency}"
resp = requests.get(url, params={"api_key": API_KEY}, timeout=15)
resp.raise_for_status()
events = resp.json().get("data", [])
df = pd.DataFrame(events)
if df.empty:
return df
df["release_date"] = pd.to_datetime(df["release_date"], errors="coerce")
return df.sort_values("release_date").reset_index(drop=True)
# Upcoming USD releases
usd_calendar = fetch_calendar("usd")
upcoming = usd_calendar[usd_calendar["release_date"] >= pd.Timestamp.today()]
print(upcoming[["release_date", "indicator"]].head(10).to_string(index=False))
Paso 10 Guardar y programar
Para un análisis repetible puede exportar el DataFrame ancho a CSV y ejecutar el cuaderno de notas en un horario a través de papermill, que ejecuta las libretas desde la línea de comandos con la inyección de parámetros:
pip install papermill
# At the end of your notebook: persist the dataset
wide.to_csv("macro_data.csv")
print(f"Saved {wide.shape[0]} rows × {wide.shape[1]} columns to macro_data.csv")
# Execute the notebook from the command line (e.g. from cron or a CI job)
papermill macro_analysis.ipynb macro_analysis_output.ipynb \
-p START "2022-01-01"
Apare esto con el calendario de lanzamiento para que su trabajo programado solo se ejecute cuando se esperan nuevos datos de indicadores manteniendo el uso de la API eficiente en los días de baja actividad.
Cuaderno completo en un solo lugar
Todas las celdas de arriba forman un solo cuaderno autónomo.
FXMD_API_KEY En su entorno, y ejecutar todas las celdas tendrá un análisis macro totalmente interactivo en menos de dos minutos.
Resumen de las actividades
Ha creado un flujo de trabajo completo de Jupyter Notebook que:
- Se autentica con FXMacroData de forma segura a través de una variable de entorno
- Implementa un sistema reutilizable
fetch_indicator()ayudante que convierte las respuestas de API a pandas DataFrames - Las series de tipos de interés y de inflación de las monedas del G10
- Reforma de los datos escasos del banco central en una columna de fecha mensual regular con relleno a plazo
- Calcula los diferenciales de tipos reales y los diferencia les entre divisas
- Produce un gráfico Matplotlib de tres paneles listo para informes o compartir
- Consulta el calendario de lanzamiento para actualizar de forma inteligente
- Exporta resultados a CSV y programa la ejecución de cuadernos con
papermill
Como siguiente paso, extienda el cuaderno con series adicionales de FXMacroData como
el desempleo¿ Qué ?
Balanza comercial, y
PMI Para construir una tarjeta de puntuación macro más completa.
fetch_indicator() sólo el slug del indicador necesita actualización.