Um painel de macro coloca os mais importantes indicadores do banco central e econômicos em um só lugar, para que você possa escanear as condições do mercado em segundos em vez de saltar entre terminais de dados. Pandas, e a render com - Com um plano .Cada painel é atualizado a partir de uma única chave de API e de um punhado de chamadas de funções.
O que você vai construir
Um script Python autônomo que puxa taxas de juros, inflação, desemprego e PMI para quatro principais moedas FX (USD, EUR, GBP, AUD), monta um Panda DataFrame limpo para cada indicador e renderiza um painel de quatro painéis Plotly tudo em menos de 150 linhas de código.
Requisitos prévios
Precisa dos seguintes antes de começar:
- Python 3.9+
- Chave da API do FXMacroData Inscreva-se em / subscrever e copiar a chave do painel
- Pacotes Python- Não .
requests- Não .pandas- Não .plotly
Instale as dependências num comando:
pip install requests pandas plotly
Armazenar sua chave de API como uma variável de ambiente nunca credenciais de código rígido em scripts:
export FXMD_API_KEY="YOUR_API_KEY"
Passo 1 Entender a forma do ponto final do indicador
Cada indicador FXMacroData segue o mesmo padrão REST, o que torna trivial generalizar em uma única função de busca.
GET https://fxmacrodata.com/api/v1/announcements/usd/policy_rate?api_key=YOUR_API_KEY&start=2020-01-01
A resposta JSON é um objeto plano com um data Arquivo:
{
"data": [
{ "date": "2025-03-19", "val": 4.25, "announcement_datetime": "2025-03-19T18:00:00Z" },
{ "date": "2025-01-29", "val": 4.25, "announcement_datetime": "2025-01-29T19:00:00Z" },
{ "date": "2024-12-18", "val": 4.25, "announcement_datetime": "2024-12-18T19:00:00Z" }
]
}
Cada disco tem um date (AAAA-MM-DD), numérica val, e quando disponível um UTC de segundo nível announcement_datetimeA forma consistente em todos os indicadores é o que permite que uma função sirva a cada painel no painel.
Passo 2 Escreva uma função de busca reutilizável
Crie um módulo chamado macro_fetch.pyA função abaixo solicita qualquer indicador para qualquer moeda, converte a resposta para uma série de pandas e retorna indexado por data pronto para ser colocado diretamente num DataFrame.
import os
import requests
import pandas as pd
BASE_URL = "https://fxmacrodata.com/api/v1"
API_KEY = os.environ["FXMD_API_KEY"]
def fetch_indicator(currency: str, indicator: str, start: str = "2020-01-01") -> pd.Series:
"""
Fetch a single indicator series from FXMacroData and return it as a
pandas Series with a DatetimeIndex, named '{currency.upper()}_{indicator}'.
"""
url = f"{BASE_URL}/announcements/{currency}/{indicator}"
resp = requests.get(url, params={"api_key": API_KEY, "start": start}, timeout=15)
resp.raise_for_status()
records = resp.json().get("data", [])
if not records:
return pd.Series(name=f"{currency.upper()}_{indicator}", dtype=float)
series = (
pd.DataFrame(records)
.assign(date=lambda df: pd.to_datetime(df["date"]))
.set_index("date")["val"]
.sort_index()
.rename(f"{currency.upper()}_{indicator}")
)
return series
Porquê uma série por indicador?
Os indicadores de diferentes moedas são lançados em datas diferentes, por isso nunca compartilham um índice perfeitamente alinhado. pd.concat(..., axis=1) permite que os pandas tratem automaticamente do alinhamento de datas, preenchendo as lacunas com NaN onde uma moeda ainda não foi relatada.
Passo 3 Obter todos os indicadores para o painel
Com o auxiliar de busca no lugar, puxando quatro indicadores para quatro moedas é um loop conciso.
import time
CURRENCIES = ["usd", "eur", "gbp", "aud"]
INDICATORS = {
"policy_rate": "Policy Rate (%)",
"inflation": "CPI Inflation (% YoY)",
"unemployment": "Unemployment Rate (%)",
"pmi": "Manufacturing PMI",
}
def fetch_all(start: str = "2020-01-01", retries: int = 3) -> dict[str, pd.DataFrame]:
"""
Return a dict mapping each indicator slug to a wide DataFrame where
each column is one currency (e.g. USD_policy_rate, EUR_policy_rate).
"""
frames: dict[str, list[pd.Series]] = {ind: [] for ind in INDICATORS}
for currency in CURRENCIES:
for indicator in INDICATORS:
for attempt in range(retries):
try:
s = fetch_indicator(currency, indicator, start=start)
frames[indicator].append(s)
break
except requests.HTTPError as exc:
if attempt == retries - 1:
print(f"Warning: could not fetch {currency}/{indicator}: {exc}")
else:
time.sleep(1.5 ** attempt)
return {ind: pd.concat(series, axis=1) for ind, series in frames.items() if series}
Você pode inspecionar qualquer DataFrame interativamente para verificar o aspecto dos dados antes de renderizar:
data = fetch_all(start="2021-01-01")
print(data["policy_rate"].tail())
# Output (example):
# USD_policy_rate EUR_policy_rate GBP_policy_rate AUD_policy_rate
# date
# 2025-01-29 4.25 NaN NaN NaN
# 2025-02-06 NaN NaN 4.50 NaN
# 2025-02-18 NaN NaN NaN 4.10
# 2025-03-06 NaN 2.50 NaN NaN
# 2025-03-19 4.25 NaN NaN NaN
Passo 4 Formar os dados para gráficos
O Plot funciona melhor com ... Preenchidos de antemão série para gráficos de linhas, de modo que o valor mais recente conhecido é carregado para a frente até o próximo lançamento.
def prepare_for_chart(df: pd.DataFrame) -> pd.DataFrame:
"""
Forward-fill each column so lines in the chart step at each release date
rather than showing gaps between announcements.
Resample to a monthly frequency for a cleaner visual.
"""
return (
df
.ffill()
.resample("ME") # month-end
.last()
.dropna(how="all")
)
Para o PMI, que é um indicador mensal, o preenchimento antecipado é menos relevante mas a função lida com elegante, simplesmente passando pelos dados já mensais inalterados.
Passo 5 Construir o Painel Plotly
- É o Plotly. make_subplots Utilidade permite organizar vários gráficos em um único objeto de figura, que você pode exibir em um navegador, exportar como HTML, ou incorporar em um bloco de notas Jupyter.
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# Palette aligned with FXMacroData brand colours
COLORS = {
"usd": "#3B82F6", # finance blue
"eur": "#D97706", # gold
"gbp": "#16A34A", # green
"aud": "#7C3AED", # purple
}
SUBPLOT_TITLES = list(INDICATORS.values())
def build_dashboard(data: dict[str, pd.DataFrame]) -> go.Figure:
fig = make_subplots(
rows=2, cols=2,
subplot_titles=SUBPLOT_TITLES,
shared_xaxes=False,
vertical_spacing=0.12,
horizontal_spacing=0.08,
)
positions = [(1, 1), (1, 2), (2, 1), (2, 2)]
for (indicator, label), (row, col) in zip(INDICATORS.items(), positions):
df = prepare_for_chart(data[indicator])
for col_name in df.columns:
currency = col_name.split("_")[0].lower()
fig.add_trace(
go.Scatter(
x=df.index,
y=df[col_name],
mode="lines",
name=currency.upper(),
line=dict(color=COLORS[currency], width=2),
legendgroup=currency,
showlegend=(indicator == "policy_rate"), # one legend entry per currency
hovertemplate=f"%{{x|%b %Y}}: %{{y:.2f}}{moeda.superior() } ",
),
row=row, col=col,
)
fig.update_layout(
title=dict(
text="G4 Central Bank Macro Dashboard",
font=dict(size=22, color="#1e3a5f"),
x=0.5,
),
paper_bgcolor="#f8fafc",
plot_bgcolor="#f1f5f9",
font=dict(family="Inter, system-ui, sans-serif", size=12, color="#334155"),
legend=dict(
orientation="h",
yanchor="bottom",
y=1.04,
xanchor="center",
x=0.5,
),
height=700,
margin=dict(t=100, b=50, l=60, r=40),
)
fig.update_xaxes(showgrid=True, gridcolor="#e2e8f0", zeroline=False)
fig.update_yaxes(showgrid=True, gridcolor="#e2e8f0", zeroline=False)
return fig
Passo 6 Acerte o Painel
Liga tudo num ... dashboard.py - O script do ponto de entrada. fig.show()
abre o painel no seu navegador padrão. fig.write_html() salva um arquivo HTML autônomo que pode ser compartilhado ou incorporado em qualquer lugar.
if __name__ == "__main__":
print("Fetching macro data …")
data = fetch_all(start="2021-01-01")
print("Building dashboard …")
fig = build_dashboard(data)
# Option A: open in browser
fig.show()
# Option B: save as portable HTML file
fig.write_html("macro_dashboard.html", include_plotlyjs="cdn")
print("Saved macro_dashboard.html")
Executa-o do terminal:
python dashboard.py
O Plotly abrirá uma janela do navegador que mostrará um painel de duas linhas e duas colunas com quatro painéis em tempo real um para cada indicador codificado por cor por moeda.
Adicionar mais indicadores em segundos
O painel de instrumentos é projetado para ser dimensionado. INDICATORS Dicte por exemplo
"core_inflation": "Core CPI (% YoY)" Ou ... "gdp_quarterly": "GDP Growth (% QoQ)" e as etapas de busca, forma e gráfico são todas recolhidas automaticamente. Documentação da API- Não .
Passo 7 Adicionar anotações de calendário de lançamento (opcional)
Uma das melhorias mais úteis do painel é a sobreposição . marcadores de liberação linhas verticais ou pontos que mostram exatamente quando cada anúncio foi feito.
announcement_datetime marcas de tempo, para que você possa adicioná-los sem qualquer adivinhação:
def fetch_release_datetimes(currency: str, indicator: str, start: str) -> pd.Series:
"""Return a Series of UTC announcement datetimes for a given indicator."""
url = f"{BASE_URL}/announcements/{currency}/{indicator}"
resp = requests.get(url, params={"api_key": API_KEY, "start": start}, timeout=15)
resp.raise_for_status()
records = resp.json().get("data", [])
if not records:
return pd.Series(dtype="datetime64[ns, UTC]")
df = pd.DataFrame(records)
if "announcement_datetime" not in df.columns:
return pd.Series(dtype="datetime64[ns, UTC]")
return pd.to_datetime(df["announcement_datetime"], utc=True)
def add_release_markers(fig: go.Figure, currency: str, indicator: str,
start: str, row: int, col: int) -> None:
"""Overlay vertical dashed lines on a subplot at each release datetime."""
datetimes = fetch_release_datetimes(currency, indicator, start)
for dt in datetimes:
fig.add_vline(
x=dt.timestamp() * 1000, # Plotly uses ms since epoch for datetime axes
line_width=1,
line_dash="dot",
line_color=COLORS[currency],
opacity=0.35,
row=row, col=col,
)
Ligue . add_release_markers Depois . build_dashboard e antes . fig.show()
Os marcadores de liberação são especialmente úteis no painel de taxas de juro, onde as datas de decisão são raras mas de alto impacto.
Passo 8 Exportar painéis como imagens individuais
Se você quiser incluir gráficos individuais em um relatório ou slide deck, o Plotly pode exportar cada subplot como um PNG através do Kaleido- Não .
pip install kaleido
fig.write_image("macro_dashboard.png", width=1400, height=700, scale=2)
Para as exportações por painel, construir cada indicador como independente go.Figure usando o mesmo
go.Scatter - O que é ? write_image As funções de recolha e de forma desenvolvidas em etapas anteriores funcionam inalteradas para figuras de um único painel.
Referência completa do script
Abaixo está o script completo, que combina todos os passos acima.
dashboard.py- Está bem . FXMD_API_KEYE a dirigir.
"""
macro_dashboard.py — G4 Central Bank Macro Dashboard
Requires: requests, pandas, plotly
Usage: FXMD_API_KEY=your_key python macro_dashboard.py
"""
import os
import time
import requests
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
BASE_URL = "https://fxmacrodata.com/api/v1"
API_KEY = os.environ["FXMD_API_KEY"]
CURRENCIES = ["usd", "eur", "gbp", "aud"]
INDICATORS = {
"policy_rate": "Policy Rate (%)",
"inflation": "CPI Inflation (% YoY)",
"unemployment": "Unemployment Rate (%)",
"pmi": "Manufacturing PMI",
}
COLORS = {"usd": "#3B82F6", "eur": "#D97706", "gbp": "#16A34A", "aud": "#7C3AED"}
def fetch_indicator(currency: str, indicator: str, start: str = "2020-01-01") -> pd.Series:
url = f"{BASE_URL}/announcements/{currency}/{indicator}"
resp = requests.get(url, params={"api_key": API_KEY, "start": start}, timeout=15)
resp.raise_for_status()
records = resp.json().get("data", [])
if not records:
return pd.Series(name=f"{currency.upper()}_{indicator}", dtype=float)
return (
pd.DataFrame(records)
.assign(date=lambda df: pd.to_datetime(df["date"]))
.set_index("date")["val"]
.sort_index()
.rename(f"{currency.upper()}_{indicator}")
)
def fetch_all(start: str = "2020-01-01", retries: int = 3) -> dict[str, pd.DataFrame]:
frames: dict[str, list[pd.Series]] = {ind: [] for ind in INDICATORS}
for currency in CURRENCIES:
for indicator in INDICATORS:
for attempt in range(retries):
try:
frames[indicator].append(fetch_indicator(currency, indicator, start))
break
except requests.HTTPError as exc:
if attempt == retries - 1:
print(f"Warning: {currency}/{indicator}: {exc}")
else:
time.sleep(1.5 ** attempt)
return {ind: pd.concat(series, axis=1) for ind, series in frames.items() if series}
def prepare_for_chart(df: pd.DataFrame) -> pd.DataFrame:
return df.ffill().resample("ME").last().dropna(how="all")
def build_dashboard(data: dict[str, pd.DataFrame]) -> go.Figure:
fig = make_subplots(
rows=2, cols=2,
subplot_titles=list(INDICATORS.values()),
vertical_spacing=0.12,
horizontal_spacing=0.08,
)
for (indicator, _), (row, col) in zip(INDICATORS.items(), [(1,1),(1,2),(2,1),(2,2)]):
df = prepare_for_chart(data[indicator])
for col_name in df.columns:
currency = col_name.split("_")[0].lower()
fig.add_trace(
go.Scatter(
x=df.index, y=df[col_name], mode="lines",
name=currency.upper(),
line=dict(color=COLORS[currency], width=2),
legendgroup=currency,
showlegend=(indicator == "policy_rate"),
hovertemplate=f"%{{x|%b %Y}}: %{{y:.2f}}{moeda.superior() } ",
),
row=row, col=col,
)
fig.update_layout(
title=dict(text="G4 Central Bank Macro Dashboard", font=dict(size=22, color="#1e3a5f"), x=0.5),
paper_bgcolor="#f8fafc", plot_bgcolor="#f1f5f9",
font=dict(family="Inter, system-ui, sans-serif", size=12),
legend=dict(orientation="h", yanchor="bottom", y=1.04, xanchor="center", x=0.5),
height=700, margin=dict(t=100, b=50, l=60, r=40),
)
fig.update_xaxes(showgrid=True, gridcolor="#e2e8f0", zeroline=False)
fig.update_yaxes(showgrid=True, gridcolor="#e2e8f0", zeroline=False)
return fig
if __name__ == "__main__":
print("Fetching macro data …")
data = fetch_all(start="2021-01-01")
print("Building dashboard …")
fig = build_dashboard(data)
fig.show()
fig.write_html("macro_dashboard.html", include_plotlyjs="cdn")
print("Saved macro_dashboard.html")
Resumo
Agora tem um painel de macro que funciona:
- A taxa de juro, a inflação, o desemprego e o PMI para o dólar americano, o euro, a libra esterlina e o dóla australiano são obtidos Ponto final de anúncios FXMacroData
- Reforma os dados em pandas alinhados e preenchidos para a frente DataFrames
- Render um painel interativo de quatro gráficos com linhas de moeda codificadas por cores
- Exporta um arquivo HTML autônomo que pode ser compartilhado ou incorporado
A partir daqui, pode alargar o painel de instrumentos em várias direcções: adicionar mais moedas, sobreposição desemprego O catálogo completo dos indicadores incluindo balança comercial, crescimento do crédito e posicionamento COT está disponível em Aplicativo de informação- Não .