Di mana data makro memenuhi pasar prediksi
Pasar prediksi telah beralih dari rasa ingin tahu ke infrastruktur. Kalshi bursa prediksi pertama yang diatur CFTC di Amerika Serikat memungkinkan Anda untuk memperdagangkan kontrak pada hasil seperti "Will US CPI Lebih dari 3,5% pada bulan April?" atau "Apakah Federal Reserve Polymarket, yang berjalan di Polygon blockchain, menawarkan pasar hasil biner serupa pada acara makro dengan akses terbuka global. USD/JPYAku akan pergi. EUR/USD, dan sisanya dari kompleks FX.
Jika Anda sudah menggunakan FXMacroData untuk melacak kalender bank sentral, memantau kejutan CPI, dan menarik sejarah suku bunga kebijakan, Anda memiliki bahan baku untuk membangun keunggulan sistematis di pasar ini.
Pada akhir panduan ini Anda akan memiliki skrip Python yang mengambil pengumuman makro mendatang dari FXMacroData, mencocokkannya dengan kontrak pasar prediksi yang relevan di Kalshi dan Polymarket, dan menghitung sinyal arah dari data kejutan historis untuk membantu menginformasikan posisi Anda.
Persyaratan
- Kunci API FXMacroData Langganan disini untuk uji coba gratis.
- Python 3.10 atau lebih baru dengan
requestsdipasang (pip install requests)). - Akun Kalshi dengan akses API diaktifkan, atau dompet Polymarket untuk referensi silang manual.
- Keterampilan dasar dengan apa yang CPI, Gaji non-perhutanan, dan suku bunga kebijakan keputusan adalah.
Langkah 1 Tarik kalender rilis mendatang
Hal pertama yang Anda butuhkan adalah gambaran yang jelas tentang pengumuman apa yang akan datang dan kapan. Endpoint kalender rilis FXMacroData mengembalikan semua acara makro yang dijadwalkan untuk mata uang, dengan tanggal dan waktu pengumuman yang diharapkan.
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"))
Setiap entri membawa indicator Slang (misalnya inflationAku akan pergi. non_farm_payrollsAku akan pergi. policy_ratejika kontrak diselesaikan pada "CPI untuk Maret 2026" Anda membutuhkan tanggal pengumuman yang tepat untuk mengukur cakrawala waktu Anda dengan benar.
Langkah 2 Mengambil data pengumuman historis dan menghitung seri kejutan
Prediksi pasar kemungkinan harga berdasarkan informasi yang tersedia. Jika Anda dapat menghitung indeks kejutan sejarah baru-baru ini untuk indikator tertentu seberapa sering cetakan aktual mengalahkan konsensus, dan berapa banyak Anda memiliki garis dasar untuk mengkalibrasi posisi Anda. Tarik dua belas bulan terakhir data aktual vs perkiraan dari titik akhir pengumuman:
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%}")
- Apa? predicted_value Ini adalah sinyal konsensus yang sama yang menanamkan harga pasar prediksi, sehingga seri kejutan Anda akan secara langsung sebanding dengan probabilitas implisit yang tertanam dalam kontrak Kalshi CPI.
Langkah 3 Indikator peta untuk kontrak pasar prediksi
Baik Kalshi dan Polymarket menyusun kontrak makro mereka di sekitar ambang batas indikator tertentu. Pemetaan mudah sekali Anda mengetahui slug indikator FXMacroData. Di bawah ini adalah tabel referensi untuk kontrak paling likuid:
| Jenis kontrak pasar prediksi | FXMacroData indikator slug | Mata uang | Dokumen API |
|---|---|---|---|
| Apakah IPC akan melebihi X%? | inflation |
USD | /api-data-docs/usd/inflasi |
| Apakah Core CPI akan melebihi X%? | core_inflation |
USD | /api-data-docs/usd/core_inflation |
| Apakah NFP akan melebihi X.000? | non_farm_payrolls |
USD | /api-data-docs/usd/non_farm_payrolls |
| Apakah Fed akan memotong / menahan / kenaikan di FOMC? | policy_rate |
USD | /api-data-docs/usd/policy_rate |
| Apakah pertumbuhan PDB akan melebihi X%? | gdp_quarterly |
USD | /api-data-docs/usd/GDP_quarterly |
| Apakah tingkat pengangguran akan turun di bawah X%? | unemployment |
USD | /api-data-docs/usd/pengangguran |
| Apakah ECB akan menurunkan suku bunga pada pertemuan berikutnya? | policy_rate |
EUR | /api-data-docs/eur/policy_rate |
- Apa? Kalender rilis Jika kontrak Kalshi mencantumkan tanggal resolusi, rujuklah dengan next_release_date Tidak cocok dimana kontrak diselesaikan pada perkiraan awal versus revisi akhir adalah sumber yang umum dari harga yang salah.
Langkah 4 Menanyakan titik akhir prediksi untuk perekat konsensus
FXMacroData's prediksi endpoint memberikan nilai konsensus yang menatap ke depan yang berasal dari data survei resmi survei yang sama yang digunakan oleh peserta pasar prediksi untuk menanamkan riwayat mereka.
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']}")
Bentuk respons sampel:
{
"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"
}
]
}
]
}
Jika kontrak Kalshi bertanya "Apakah April CPI cetak di atas 2,9%?" dan konsensus SPF adalah 2,8%, Anda sekarang memiliki titik awal yang dikuantifikasi: konsensus mengatakan tidak dengan buffer 0,1 poin persentase. Seri kejutan historis Anda dari Langkah 2 kemudian memberi tahu Anda berapa sering CPI telah mengalahkan konsensus lebih dari 0,1 poin persen, memberi Anda tingkat dasar empiris untuk membandingkan dengan kemungkinan tersirat kontrak.
Langkah 5 Membangun sinyal keputusan penuh
Mengumpulkan tiga input ke dalam fungsi keputusan tunggal. Logika ini sengaja sederhana tujuannya adalah sinyal yang dapat direproduksi, berbasis data, bukan kotak hitam:
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))
Contoh output:
{
"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"
}
Baca ini sebagai: konsensus adalah 2,8% (di bawah ambang 2,9%), rasio dasar historis rilis 24 untuk cetak CPI di atas 2,9% adalah 33%, dan kejutan rata-rata telah menjadi bias ke atas +0,04 ppt. Sinyal mentah adalah NO, tetapi kombinasi rasio basis dan bias kejutan memberi tahu Anda ini bukan ukuran posisi yang sangat kuat menyesuaikan sesuai.
Langkah 6 Perluasan ke kontrak non-USD dan lintas pasar
Pasar prediksi semakin daftar kontrak pada non-USD peristiwa makro: keputusan ECB, UK CPI, kebijakan Bank of Japan, dan pekerjaan Australia.
# 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,
)
- Apa? EUR/USD Dan GBP/USD Dashboard menampilkan riwayat suku bunga kebijakan dan tren CPI untuk setiap pasangan, memberi Anda pemeriksaan konteks visual sebelum berkomitmen untuk posisi. ECB telah secara konsisten memotong selama empat pertemuan terakhir, kontrak bertanya "Apakah ECB akan memotong pada bulan Juni?" memiliki dinamika dasar yang sangat berbeda dari satu bertanya "Bukankah ECB akan menaikkan?"
Langkah 7 Memantau posisi COT sebagai lapisan konfirmasi
Kontrak Kalshi dan Polymarket pada hasil makro tidak diperdagangkan secara terpisah posisi spekulatif dalam berjangka FX sering mencerminkan pandangan arah yang sama. Panel COT Jika spesifikasi sangat panjang USD dan sinyal CPI NO (di bawah ambang), ada potensi double edge: kontrak pasar prediksi mungkin layak memudar, dan posisi FX juga mungkin rentan terhadap penyempitan.
Tarik data COT secara programmatic untuk memasukkan ke dalam kerangka sinyal Anda:
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")
Menggabungkan semuanya
Alur kerja lengkap terlihat seperti ini:
- Tarik Kalender rilis untuk mengidentifikasi pengumuman mendatang dan jadwal waktu mereka.
- Tanggal pengumuman pertandingan adalah kontrak pasar prediksi terbuka di Kalshi atau Polymarket.
- Ambil itu. Prediksi titik akhir untuk nilai konsensus saat ini.
- Menghitung seri kejutan sejarah untuk mengukur bias arah dan tingkat dasar.
- Menghasilkan sinyal arah dengan membandingkan konsensus dengan ambang kontrak.
- Opsional lapisan di Posisi COT dari FX berjangka sebagai sinyal konfirmasi.
- Ukur posisi Anda berdasarkan kesenjangan antara kemungkinan tersirat dalam kontrak dan perkiraan tingkat dasar empiris Anda.
FXMacroData menyediakan tingkat kedua
announcement_datetime time stamp untuk setiap rilis sangat penting untuk pasar prediksi yang diselesaikan dalam hitungan detik dari cetakan resmi. Selalu verifikasi bahwa sumber resolusi kontrak yang dinyatakan (misalnya "BLS CPI untuk Maret 2026, rilis pertama") persis sesuai dengan indikator FXMacroData dan bendera revisi yang Anda kueri. Perkiraan awal dan revisi akhir disimpan sebagai titik data terpisah.
Mulailah
Semua titik akhir yang digunakan dalam panduan ini tersedia dalam uji coba gratis tidak memerlukan kartu kredit. Indikator USD termasuk CPI, NFP, PDB, pengangguran, PCE inti, dan tingkat kebijakan semuanya dapat diakses pada tingkat gratis. Indikator non-USD dan data COT memerlukan rencana Profesional.
- Berlangganan dan dapatkan kunci API AndaAku tidak tahu. /langganan
- Kalender rilisAku tidak tahu. /dashboard/kalender rilis
- Katalog indikator USDAku tidak tahu. /api-data-docs/usd
- Panel COTAku tidak tahu. /dashboard/crib