Quando os dados macro correspondem aos mercados de previsão
Os mercados de previsão passaram da curiosidade para a infraestrutura. Kalshi a primeira bolsa de previsão regulada pela CFTC nos Estados Unidos permite negociar contratos com resultados como "Will IPC dos EUA A taxa de crescimento do PIB em Abril excederá 3,5%?" ou "Será que o Reserva Federal As duas plataformas de preços de probabilidade em tempo real e ambas são sensíveis a exatamente os mesmos lançamentos de dados macro que se movem. USD/JPY- Não . EUR/USD, e o resto do complexo FX.
Se você já usa o FXMacroData para rastrear calendários de bancos centrais, monitorar surpresas do IPC e extrair histórico de taxas de juros, você tem os ingredientes brutos para construir uma vantagem sistemática nesses mercados.
No final deste guia, você terá um script Python que recupera os próximos anúncios macro da FXMacroData, os combina com contratos de mercado de previsão relevantes no Kalshi e Polymarket e calcula um sinal direcional a partir de dados históricos surpresa para ajudar a informar sua posição.
Requisitos
- Uma chave da API FXMacroData Assine aqui para uma avaliação gratuita.
- Python 3.10 ou mais recente com
requestsinstalados (pip install requests)). - Uma conta Kalshi com acesso API habilitado, ou uma carteira Polymarket para referência manual.
- Familiarização básica com o que é o IPC, Salarios não agrícolasE ... Taxa de política decisões são.
Passo 1 Desligue o calendário de lançamento próximo
A primeira coisa que você precisa é de uma imagem clara de quais anúncios estão chegando e quando. O ponto final do calendário de lançamento do FXMacroData retorna todos os eventos macro agendados para uma moeda, com suas datas e horários de anúncio esperados.
import requests
API_KEY = "YOUR_API_KEY"
BASE = "https://fxmacrodata.com/api/v1"
def get_upcoming_releases(currency: str) -> list[dict]:
url = f"{BASE}/calendar/{currency}?api_key={API_KEY}"
resp = requests.get(url, timeout=10)
resp.raise_for_status()
return resp.json().get("data", [])
usd_calendar = get_upcoming_releases("usd")
for event in usd_calendar[:5]:
print(event["indicator"], event.get("announcement_datetime"), event.get("next_release_date"))
Cada entrada tem um indicator Escaramuça (por exemplo: inflation- Não . non_farm_payrolls- Não . policy_ratese um contrato se resolver em "CPI para março de 2026" você precisa da data exata de anúncio para dimensionar seu horizonte de tempo corretamente.
Passo 2 Obter dados históricos de anúncios e calcular a série surpresa
Se você puder calcular um índice de surpresa de história recente para um determinado indicador com que frequência as impressões reais superam o consenso e em quanto você tem uma linha de base para calibrar sua posição.
def get_announcement_history(currency: str, indicator: str, limit: int = 24) -> list[dict]:
url = f"{BASE}/announcements/{currency}/{indicator}?api_key={API_KEY}&limit={limit}"
resp = requests.get(url, timeout=10)
resp.raise_for_status()
return resp.json().get("data", [])
def compute_surprise_series(records: list[dict]) -> list[dict]:
surprises = []
for r in records:
actual = r.get("actual_value")
consensus = r.get("predicted_value")
if actual is not None and consensus is not None:
surprises.append({
"date": r["date"],
"actual": actual,
"consensus": consensus,
"surprise": actual - consensus,
"direction": "beat" if actual > consensus else "miss",
})
return surprises
cpi_history = get_announcement_history("usd", "inflation", limit=24)
cpi_surprises = compute_surprise_series(cpi_history)
beat_count = sum(1 for s in cpi_surprises if s["direction"] == "beat")
miss_count = len(cpi_surprises) - beat_count
print(f"CPI beat rate (last 24 releases): {beat_count}/{len(cpi_surprises)} = {beat_count/len(cpi_surprises):.0%}")
O ... predicted_value Este é o mesmo sinal de consenso que ancora os preços do mercado de previsão, por isso sua série surpresa será diretamente comparável à probabilidade implícita incorporada em um contrato Kalshi CPI.
Etapa 3 Indicadores de mapa para contratos de mercado de previsão
Tanto a Kalshi quanto a Polymarket estruturam seus contratos macro em torno de limiares de indicadores específicos. O mapeamento é direto quando você conhece as lesmas do indicador FXMacroData. Abaixo está uma tabela de referência para os contratos mais líquidos:
| Tipo de contrato de mercado de previsão | Indicador FXMacroData slug | Moeda | Documentação da API |
|---|---|---|---|
| O IPC excederá X%? | inflation |
USD | /api-data-docs/usd/inflação |
| O IPC Core excederá X%? | core_inflation |
USD | /api-data-docs/usd/core_inflation |
| Será que o NFP excederá X.000? | non_farm_payrolls |
USD | /api-data-docs/usd/non_farm_payrolls |
| O Fed vai cortar/manter/alcançar o FOMC? | policy_rate |
USD | /api-data-docs/usd/policy_rate |
| O crescimento do PIB excederá X%? | gdp_quarterly |
USD | /api-data-docs/usd/gdp_quarterly |
| O desemprego cairá abaixo de X%? | unemployment |
USD | /api-data-docs/usd/desemprego |
| O BCE reduzirá as taxas na próxima reunião? | policy_rate |
EUR | /api-data-docs/eur/policy_rate |
O ... Calendário de lançamento Quando um contrato Kalshi lista uma data de resolução, cruzar referências com o next_release_date Os desajustes em que o contrato se resolve com base numa estimativa antecipada versus uma revisão final são uma fonte comum de preco incorreta.
Passo 4 Consultar os pontos finais das previsões para a fixação do consenso
O endpoint de previsões do FXMacroData fornece valores de consenso prospectivos provenientes de dados oficiais de pesquisa as mesmas pesquisas que os participantes do mercado de previsão usam para ancorar seus antecedentes.
def get_predictions(currency: str, indicator: str) -> list[dict]:
url = f"{BASE}/predictions/{currency}/{indicator}?api_key={API_KEY}"
resp = requests.get(url, timeout=10)
resp.raise_for_status()
return resp.json().get("data", [])
cpi_predictions = get_predictions("usd", "inflation")
# Most recent upcoming prediction
if cpi_predictions:
next_pred = cpi_predictions[0]
for p in next_pred.get("predictions", []):
print(f"Source: {p['prediction_source_label']}")
print(f"Consensus: {p['predicted_value']}%")
print(f"For release date: {next_pred['date']}")
Forma da resposta da amostra:
{
"currency": "USD",
"indicator": "inflation",
"count": 1,
"prediction_count": 1,
"data": [
{
"announcement_id": "usd_inflation_2026-05-14",
"currency": "usd",
"indicator": "inflation",
"date": "2026-05-14",
"announcement_datetime": 1747216200,
"predictions": [
{
"predicted_value": 2.8,
"prediction_type": "market_consensus",
"prediction_source": "philly_fed_spf",
"prediction_source_label": "Philadelphia Fed Survey of Professional Forecasters"
}
]
}
]
}
Se um contrato Kalshi pergunta "O IPC de abril será superior a 2,9%?" e o consenso SPF é de 2,8%, você agora tem um ponto de partida quantificado: o concesso diz não com um buffer de 0,1 ponto percentual.
Passo 5 Construir o sinal de decisão completo
A lógica é intencionalmente simples o objetivo é um sinal reproduzível, baseado em dados, não uma caixa preta:
def prediction_market_signal(
currency: str,
indicator: str,
contract_threshold: float,
contract_direction: str, # "above" or "below"
lookback: int = 24,
) -> dict:
"""
Returns a signal dict for a prediction market contract.
contract_threshold: the numeric threshold in the contract question
(e.g. 2.9 for "Will CPI exceed 2.9%?")
contract_direction: "above" means YES if actual > threshold
"""
history = get_announcement_history(currency, indicator, limit=lookback)
surprises = compute_surprise_series(history)
predictions = get_predictions(currency, indicator)
consensus = None
release_date = None
if predictions:
latest_preds = predictions[0].get("predictions", [])
if latest_preds:
consensus = latest_preds[0]["predicted_value"]
release_date = predictions[0]["date"]
# Base rate: how often did actual exceed the threshold historically?
actuals_above = sum(1 for r in history if r.get("actual_value") is not None
and r["actual_value"] > contract_threshold)
base_rate = actuals_above / len(history) if history else None
# Surprise bias: mean surprise (positive = beat)
mean_surprise = (sum(s["surprise"] for s in surprises) / len(surprises)
if surprises else None)
# Directional signal
if consensus is not None:
buffer = consensus - contract_threshold # positive = consensus above threshold
signal = "NO" if (contract_direction == "above" and buffer > 0) else "YES"
else:
signal = "NEUTRAL"
return {
"currency": currency.upper(),
"indicator": indicator,
"contract_threshold": contract_threshold,
"contract_direction": contract_direction,
"consensus": consensus,
"release_date": release_date,
"historical_base_rate_above_threshold": base_rate,
"mean_surprise_last_n": mean_surprise,
"lookback": lookback,
"signal": signal,
}
result = prediction_market_signal(
currency="usd",
indicator="inflation",
contract_threshold=2.9,
contract_direction="above",
lookback=24,
)
import json
print(json.dumps(result, indent=2))
Exemplo de saída:
{
"currency": "USD",
"indicator": "inflation",
"contract_threshold": 2.9,
"contract_direction": "above",
"consensus": 2.8,
"release_date": "2026-05-14",
"historical_base_rate_above_threshold": 0.33,
"mean_surprise_last_n": 0.04,
"lookback": 24,
"signal": "NO"
}
Leia isto como: o consenso é de 2,8% (abaixo do limiar de 2,9%), a taxa de base histórica de 24 lançamentos para a impressão do IPC acima de 2, 9% é de 33%, e a surpresa média tem sido um modesto viés ascendente de +0,04 ppt. O sinal bruto é NÃO, mas a combinação de taxa de referência e viés surpresa diz que esta não é uma posição magra de alta convicção ajuste o tamanho da posição em conformidade.
Passo 6 Extensão aos contratos não denominados em USD e aos contratos transfronteiriços
Os mercados de previsão listam cada vez mais contratos sobre eventos macro não USD: decisões do BCE, IPC do Reino Unido, política do Banco do Japão e emprego australiano.
# ECB rate decision signal
ecb_signal = prediction_market_signal(
currency="eur",
indicator="policy_rate",
contract_threshold=3.15, # "Will ECB rate fall below 3.15%?"
contract_direction="below",
lookback=12,
)
# UK inflation signal
uk_cpi_signal = prediction_market_signal(
currency="gbp",
indicator="inflation",
contract_threshold=2.5,
contract_direction="above",
lookback=18,
)
# Australian employment signal
aus_employment_signal = prediction_market_signal(
currency="aud",
indicator="employment",
contract_threshold=30.0, # thousands, "Will employment add 30K+?"
contract_direction="above",
lookback=18,
)
O ... EUR/USD E ... GBP/USD Os painéis de controlo mostram o histórico das taxas de juro e a tendência do IPC para cada par, permitindo uma verificação visual do contexto antes de se comprometer com uma posição. Banco Central Europeu A taxa de juro base é muito diferente da taxa de câmbio base que é fixada em uma moeda única.
Passo 7 Monitorizar o posicionamento do COT como camada de confirmação
Os contratos Kalshi e Polymarket sobre resultados macro não são negociados isoladamente o posicionamento especulativo em futuros de câmbio reflete frequentemente as mesmas opiniões direcionais. Painel de instrumentos COT Se as especificações forem fortemente longas em dólares e o sinal do IPC for NO (abaixo do limiar), há um potencial de dupla vantagem: o contrato de mercado de previsão pode valer a pena desvanecer-se e a posição FX também pode ser vulnerável a um aperto.
Extrair dados COT programaticamente para incluí-lo em seu quadro de sinal:
def get_cot(currency: str) -> list[dict]:
url = f"{BASE}/cot/{currency}?api_key={API_KEY}&limit=4"
resp = requests.get(url, timeout=10)
resp.raise_for_status()
return resp.json().get("data", [])
usd_cot = get_cot("usd")
if usd_cot:
latest = usd_cot[0]
net_position = latest.get("net_position")
print(f"USD spec net position (latest week): {net_position:+,.0f} contracts")
A juntar tudo
O fluxo de trabalho completo parece assim:
- Puxa o ... Calendário de lançamento Identificar os próximos anúncios e os seus horários previstos.
- As datas de anúncio do jogo são para ... contratos de mercado de previsão aberta em Kalshi ou Polymarket.
- Traz o ... previsões ponto final para o valor de consenso actual.
- Calcule o série histórica surpresa Para medir o viés direcional e a taxa de base.
- Gerencie um sinal direcional Comparando o consenso com o limiar do contrato.
- Opcionalmente , camada de entrada . Posicionamento COT de futuros de câmbio como sinal de confirmação.
- Avalie a sua posição com base na diferença entre a probabilidade implícita no contrato e a sua estimativa empírica da taxa de base.
O FXMacroData fornece o segundo nível
announcement_datetime marcas de tempo para cada lançamento criticamente importante para mercados de previsão que se resolvem em segundos após a impressão oficial. Verifique sempre se a fonte de resolução declarada do contrato (por exemplo, "BLS CPI para março de 2026, primeira versão") corresponde exatamente ao indicador FXMacroData e à bandeira de revisão que você está consultando. Estimativas antecipadas e revisões finais são armazenadas como pontos de dados separados.
Começa .
Todos os endpoints utilizados neste guia estão disponíveis em uma versão de teste gratuita sem necessidade de cartão de crédito. Os indicadores em USD, incluindo IPC, PFN, PIB, desemprego, PCE principal e taxa de política, são todos acessíveis no nível gratuito. Os indicativos não em USD e os dados COT exigem um plano profissional.
- Inscreva-se e obtenha a sua chave API- Não . / subscrever
- Calendário de lançamento- Não . /panela/calendário de lançamento
- Catálogo de indicadores USD- Não . /api-data-docs/usd
- Painel de instrumentos COT- Não . /pintura/cova