Wenn eine Zentralbank eine Zinsentscheidung veröffentlicht oder ein Statistikbüro einen neuen Inflationsdruck veröffentlicht, kommt die rohe Ankündigung oft mit Lärm: Codierung von Artefakten, teilweisen Seiten, fehlenden Feldern oder Revisionen, die dem Vormonat widersprechen.
Bei FXMacroData behandeln wir Datenqualität als erstklassige Produktbedenken. Jeder Indikator aus jeder Währung durchläuft eine deterministische Validierung Pipeline, bevor er an Firestore geschrieben und durch die API ausgesetzt wird. Dieser Beitrag geht durch diese Pipeline Schicht für Schicht vom Moment, in dem ein Fetcher eine Rohantwort herunterlädt, bis zu dem Moment, an dem ein Wert abfragbar wird
Endpunkte wie /v1/announcements/{currency}/{indicator}- Ich weiß .
Pipeline auf einen Blick
Stufe 1: Einnahme
Stufe 1 Einnahme: Strukturierte Quelle-Befanger
Die Validierung beginnt, bevor ein einzelner Wert extrahiert wird. Jede Währung hat eine eigene Fetcher-Klasse, die sich an eine offizielle Primärquelle richtet die Website der Zentralbank, das nationale Statistikbüro oder ein Regierungsdatentor. Wir vermeiden absichtlich sekundäre Aggregatoren auf dem Einnahmeweg: ihre Verzögerung, Lizenzbedingungen und gelegentliche stille Revisionen bringen Unsicherheit mit sich, die wir nicht kontrollieren können.
Fetcher sind asynchrone Python-Klassen , die eine async with Bei Eingabe öffnen sie eine aiohttp.ClientSession mit einer realistischen User-Agent Die Daten werden in einem System mit einer geringen Anzahl von Daten aus der Datenbank gesammelt, die von einem einzelnen Datenträger ausgeht. lxml Oder ... BeautifulSoup JSON-API werden über eingetippte Accessor-Tasten aufgerufen, die sofort angezeigt werden, wenn ein Feld fehlt oder nach oben umbenannt wird.
Fetcher-Vertrag erforderliche Ausgabe-Schlüssel
{
"date": "2026-03-31", # ISO-8601 Datumsschnur
"val": 3.5, # schwimmen nie String
"announcement_datetime": "..." # UTC ISO-8601 wenn verfügbar
}
Der Ausgabevertrag wird an der Grenze des Holers durchgesetzt: fehlende Aufzeichnungen date Oder ... val wird entsorgt, bevor es die nächste Stufe erreicht. announcement_datetime ist bei der Einnahme optional, jedoch für Publikations-Endpunkte erforderlich, die den API-Nutzern den Ereigniszeitplan offenlegen.
Schritt 2: Überprüfung des Schemas
Stufe 2 Schemaüberprüfung: Typ- und Vollständigkeitsvalidierung
Die Roh-Fetcher-Ausgabe wird an einen Schema-Validierer übergeben , der vier Kontrollen an jedem Datensatz durchführt:
Datumformat
Parsiert als ISO-8601-Datum. Nicht-parsierbare Zeichenfolgen, zukünftige Daten über ein Zwei-Tage-Grace-Fenster hinaus und Daten vor 1960 werden alle abgelehnt.
Wertart
val muss zu einem endlichen Python zwingen float- Ich weiß . NaN- Ich weiß . Inf, und nicht-numerische Zeichenfolgen (z. B. "n/a", leere Zeichenfolgen) werden eher abgelehnt als auf Null gezwungen.
Doppeldeckung
Wenn zwei Datensätze dasselbe haben (currency, indicator, date) Die Pipeline speichert den letzten eingesammelten und protokolliert die Kollision.
Währungs-/Indikatorpaarung
Jeder Eintrag wird mit dem veröffentlichten Indikatorkatalog abgeglichen. unemployment für eine Währung, die diesen Indikator nicht zeigt, erhebt er einen Fehler und stoppt die Charge.
Schemafehler werden als strukturierte Cloud Logging-Einträge mit severity=ERROR- Ich weiß . stage=schema_checkDies macht Cross-Run Differenzierung einfach in der GCP-Konsole.
Stufe 3: Außenschichtfilter
Stufe 3 Filter für Bereich und Ausreißer
Strukturelle Gültigkeit ist notwendig, aber nicht ausreichend. 250.0 for USD CPI is syntactically valid but obviously wrong. Stage 3 applies two complementary checks to catch these semantic errors.
Grenzen für die harte Reichweite
Jeder Indikator hat einen Katalogbeitrag, der optionale Angaben enthält min_val Und ... max_val Die Zinssätze sind z. B. zwischen -5.0 Und ... 30.0 Die Inflation liegt zwischen -30.0 Und ... 300.0 Die Daten für die Schwellenländer sind nicht zu überschreiten, da sie nicht in der Lage sind, die Daten zu übertragen.
Ermittlung von Ausreißern für rollende Z-Score
Für Indikatoren mit mindestens 24 Monaten Firestore-Geschichte berechnet die Pipeline einen 36-monatigen gleitenden Durchschnitt und eine Standardabweichung und markiert alle neuen Rekorde, deren Z-Score übersteigt. |4.0|Im Gegensatz zu harten Grenzen werden mit den Z-Score-Flaggen keine Datensätze automatisch entfernt. outlier_flag: true Das Programm kann die Daten des Anwenders in einem anderen Feld als dem Firestore-Dokument aufnehmen, damit API-Nutzer in ihren eigenen Workflows möglichst die mit Ausreißer-Flaggen versehenen Datensätze filtern können.
Warum 4σ statt 3σ?
Makroindikatoren zeigen wirklich Fettschwänze. COVID-19-Versorgungs-Schocks, die Energiekrise von 2022 und schnelle Wanderzyklen der Zentralbank ergaben alle statistisch seltene, aber echte Messwerte. Ein 3σ-Schwellenwert würde legitime Daten während Regimewechseln unter Quarantäne stellen, genau wenn genaue Messwerte am wichtigsten sind.
Schritt 4: Versöhnung zwischen Quellen
Stufe 4 Quellenübergreifende Aussöhnung
Für eine Teilmenge von hochwichtigen Indikatoren Zentralbankpolitik, Haupt-CPI und Arbeitslosigkeit unterhält die Pipeline eine sekundäre Quelle, mit der sie abgeglichen werden kann.
Wenn die primären und sekundären Werte für die gleiche (currency, indicator, date) Die Zinssätze werden in einem System mit einer Abweichung von mehr als einer konfigurierbaren Toleranz angezeigt, wobei eine Warnung ausgelöst wird und der primäre Wert in Erwartung einer Untersuchung aufbewahrt wird. 5 basis pointsFür den CPI ist es 0.1 percentage pointsDie Toleranzen sind für diese Indikatoren absichtlich eng, da selbst kleine Abweichungen oft auf einen Parserfehler, eine Berichtsverzögerung oder einen Konflikt zwischen vorläufiger und abschließender Revision hinweisen.
Primäre Quellen
- Amtsberichte der Zentralbanken
- Nationale statistische Ämter
- Regierungsdatenportale
Quellen für Querverweise
- Parallele amtliche Endpunkte (z. B. BIS)
- Überarbeitungspflagge für historische Aufzeichnungen
- Interne Kohärenzprüfung vor dem Zeitraum
Neben den Überprüfungen pro Dokument führt die Pipeline auch eine Monatsüberschreitende Kontinuitätsprüfung: wenn ein neuer Datensatz eine Änderung von mehr als N Die Daten sind in der Regel in der Form von Daten, die in der Datenbank aufgenommen werden, und in der Veröffentlichung von Daten über die Daten, in der die Daten über den Zeitraum der letzten 12 Monate erfasst werden. revised Flaggen, wenn der Wert eines Datums nach der Erstveröffentlichung aktualisiert wird.
===== Stufe 5: BUSINESS-DAY Integrität ======
Stufe 5 Integrität im Geschäftsbetrieb
Die letzte Validierungsphas befasst sich mit einer subtilen, aber wichtigen Einschränkung: jeder announcement_datetime muss an einem gültigen Werktag des Marktzeitzone Die Statistikbüros und Zentralbanken veröffentlichen keine Ankündigungen an Wochenenden oder Feiertagen , wenn also die Pipeline einen Zeitstempel erzeugt, der an einem Samstag in Tokio oder an einem Feiertag in Sydney landet, ist etwas falsch vorgelaufen.
Der Validierer ruft . is_valid_announcement_date(currency, local_date)Die Daten werden in der Datenbank von der API AUD, EUR, GBP, JPY, USD, CAD, CHF, NZD und allen anderen übertragen. Jede Währung hat ihre eigene Zeitzone und ihre eigenes Urlaubstafeln. Währungen erben nicht von ihrer FX-Sitzung; ein Freitag in New York kann Samstag in Sydney sein, und der Validierer behandelt dies genau.
Validierung am Geschäftstag (vereinfacht)
- Das ist nicht wahr. ist_gültig_Ankündigung_Datum(currency: str, local_date: date) -> bool: tz = CURRENCY_TIMEZONE[currency] # Verwerfe Wochenenden if local_date.weekday() >= 5: Rückkehr False # Verwerfe Feiertage if local_date in _build_holiday_set(currency, local_date.year): Rückkehr False Rückkehr True
Wenn ein berechnetes Datum diesen Check nicht erfüllt, next_valid_announcement_date Diese Geschäftstage Regeln werden auch durch eine CI-Testsuite durchgesetzt, die den Build versagt, wenn eine Währung im Katalog Zeitzone oder Urlaubsdaten fehlt.
Genauigkeit des Kalenders der Veröffentlichung: Die Daten für bevorstehende Ereignisse ab dem Endpunkt des Kalenders wie die nächste Fed-Sitzung oder die RBA-Ratenentscheidung fallen garantiert an gültigen Werktagen in der Zeitzone des Währungsmarktes. /api/v1/kalender/{Währung} Dieser validierte Zeitplan wird direkt reflektiert.
Überwachen
Kontinuierliche Überwachung und Warnung
Die Pipeline läuft nach einem Zeitplan, der von Cloud Tasks und Backfill-Workflows ausgelöst wird, und jeder Lauf erzeugt eine strukturierte Telemetrie, die eine Überwachungsschicht speist.
Alarm in der Stufe
Fehlfunktionen in jeder Pipeline-Phase geben sofort einen Cloud Logging-Eintrag zur Triage aus.
Inhaltshash
Jeder Firestore-Schreiben enthält eine content_hash um stillschweigende Revisionen vor der Produktion zu erkennen und aufzudecken.
Überprüfung der Verfallserfahrung
Die Lesegeräte erkennen, wenn gespeicherte Daten mehr als N Tage hinter dem gewünschten Bereich liegen und ein Lückensignal auftauchen, anstatt stillschweigend veraltete Werte zurückzugeben.
Wenn ein Fetcher keine Daten zurückgibt Netzwerk-Timeout, Änderung der vorgelagerten Website oder Änderung der Antwortstruktur fällt die Pipeline nicht zur Live-Upstream-Anrufe zur Anforderungszeit zurück. Stattdessen gibt sie einen Validierungsfehler aus und gibt ein leeres Ergebnis oder eine strukturierte DataUnavailableError Dies verhindert, dass veraltete oder teilweise validierte Daten die API-Schicht erreichen, auch wenn dies nur vorübergehend geschieht.
===== Überarbeitung der Handhabung ======
Wie man mit Überarbeitungen und Neufassung umgeht
Die Makrodatenrevisionen sind eine Tatsache des Lebens. Die ursprünglichen BIP-Schätzungen werden zwei- bis dreimal überarbeitet. Die Gehaltslisten werden erheblich neu angegeben. Die Pipeline behandelt die Revisionen explizit, anstatt sie stillschweigend zu überschreiben:
- Aufbewahrung des ersten Drucks: Die Pipeline speichert den ersten Wert für eine bestimmte
(currency, indicator, date)Mit einemrevised: falseDie Flagge. - Überarbeitungserkennung: Bei nachfolgenden Einnahmeverläufen wird, wenn sich der Wert für ein Datum um mehr als die Revisionsschwelle des Indikators geändert hat, das Dokument aktualisiert und
revised: trueist eingestellt. - Die Erhaltung der Geschichte: Der Originalwert des ersten Drucks wird in einem
prior_valFeld für Prüf- und Vergleichszwecke. - Transparenz der API: Die ...
revisedDie Daten des Feldes werden in den API-Antworten ausgesetzt, so daß die Anwendungen, die sie konsumieren, die vorläufigen von den endgültigen Messungen unterscheiden können.
Dies ist besonders wichtig für Indikatoren wie die Non-Farm Payrolls, bei denen sich der vorläufige Druck und die anschließende Überarbeitung um Zehntausende Arbeitsplätze unterscheiden können. Endpunkt für die Lohnlisten außerhalb der Landwirtschaft- Ich weiß .
Was bedeutet das für die API-Konsumenten?
Was dies für die API-Verbraucher bedeutet
Das praktische Ergebnis dieser Pipeline für alle, die die API abfragen:
- Nein .
NaNOder ...nullWerte in der Reihe Aufzeichnungen mit ungültigen Werten werden in Stufe 2 ausgeschlossen und nicht als Löcher durchgegeben. - Sie können sich darauf verlassen Jedes Datum in einer Antwort ist ein gültiges Kalenderdatum an einem Geschäftstag für den Markt dieser Währung, das für die direkte Verwendung in Handelskalendern oder Backtesting-Engines geeignet ist.
- Zeitstempel mit Sekundenabschätzung wenn verfügbar,
announcement_datetimespiegelt die genaue UTC-Sekunde der offiziellen Veröffentlichung, nicht einen Platzhalter zur Mitternacht, wider. - Revisionsflaggen die
revisedDas Feld erlaubt Ihnen zu unterscheiden, ob Sie mit einer Vorlesung oder einer Abschlusslesung arbeiten. - Einheitliche Indikatoren Die Zinsindikatoren sind in Prozent und nicht in Dezimalzahlen (z. B.
5.25Nein .0.0525), die der Darstellung auf den offiziellen Websites der Zentralbanken entspricht.
Die Datenkatalogen dokumentieren genau, welche Quellen jede Serie speisen, so dass Sie die Herkunft eines beliebigen Datenpunktes unabhängig überprüfen können.
Abschluss der CTA