trading-system-docs/notes/trading/system-docs/historical-v2-foundation-milestone.md
Red Queen 7ae7249c00 feat(tolaria): migrate auto-safe knowledge batch 2 to schema v1
15 knowledge objects (log, note, index, module, history) migrated to
C3 knowledge schema v1. Bodies unchanged, metadata preserved.
2026-08-25 18:48:25 +00:00

151 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: object/90957134-8e8b-021b-717c-e9c7ca6cd887
type: arch
role: history
representation: canonical
state: historical
knowledge_schema: 1
_organized: true
---
# Historical Data Foundation V2 + M12/M13 Shared Repository — Meilenstein
> **Meilenstein:** Historical Data Foundation V2 + M12/M13 Shared Repository Schritt 1
> **Stand:** 22.08.2026 | **Autor:** Rain Ocampo (Hermes)
> **Status:** ✅ Schritt 1 fachlich abgeschlossen + verifiziert. Phase 2 NICHT begonnen.
---
## 1. Architektur-Überblick
Zwei getrennte Systeme, die über eine gemeinsame Repository-Schicht verbunden sind:
- **Historical-Service V2** (`/opt/historical-v2/`, Container `historical-service` + `historical-db`): Dukascopy-basierte historische Marktdaten mit Dataset-Versionierung, Quality-/Session-/Eligibility-Modellen, Fixture-Trennung.
- **M12/M13** (`Modul-12-Backtesting`, `Modul-13-Optimization`): Backtesting + Optimization, lesen Marktdaten über die gemeinsame `HistoricalRepository`-Schicht.
**Netzwerk-Grenze (aktuell):** historical-db (10.0.8.2, Netz `f2afda69`) und M12/M13 (10.0.13.x, Netz `c17337ef`) liegen in **verschiedenen Docker-Netzwerken** — die Produktiv-Container erreichen die historical-db NICHT. Für Schritt 1 korrekt: Produktiv bleibt auf Legacy. V2 wurde lokal via SSH-Port-Forward gegen die echte DB getestet.
---
## 2. Dataset-Versioning
- `dataset_version`-Tabelle: `dataset_version_id`, `version_label`, `dataset_version_hash`, `feed_type`, `provider_id`, `instrument_id`, `timeframe`, `start_utc`, `end_utc`, `raw_source`, `normalization_version`, `aggregation_version`, `quality_version`, `data_as_of`, `quality_model_version`, `stale_model_version`, `session_model_version`, `calendar_version`, `eligibility_model_version`, `is_fixture`.
- **`dataset_version_hash`** = deterministischer SHA-256 über die vollständige DatasetSpec (provider, feed, instrument, timeframe, start, end, raw_source, norm_version, quality_version, aggregation_version, raw_or_derived, raw_source_hash, quality_model_version, stale_model_version, session_model_version, calendar_version, eligibility_model_version).
- Gleiche Spec → identischer Hash; andere Version → anderer Hash. **Hash-Identität** (kryptografisch) und **Auditierbarkeit** (menschenlesbare Versionen als Run-Metadaten) sind getrennt zu betrachten.
---
## 3. Dukascopy-Befunde
- Nur EURUSD, nur Dukascopy, nur Historical-V2-Stack.
- Bid+Ask-OHLC, H4 = HOUR_4 nativ.
- Range > ~5000 → 0 (Datenlücke).
- Historical-Allowance zählt Datenpunkte wöchentlich (~10k).
---
## 4. Session / Quality / Eligibility
- `historical_bar` trägt pro Bar: quality_status, quality_flags, session_state, session_phase, eligibility, exclusion_reason, technical_quality, market_quality.
- `dataset_version` trägt die Modell-Versionen (quality_model_version, session_model_version, calendar_version, eligibility_model_version, stale_model_version).
- **Aktuell (Schritt 1):** Diese Felder werden von der Repository-Schicht **noch NICHT** an M12/M13 propagiert (nur OHLCV + Dataset-Metadaten). → Phase-2-Requirement R5.
---
## 5. Fixture-Trennung
- `is_fixture`-Marker auf `dataset_version`-Ebene (Migration 06).
- Repository-V2-Query filtert hart `AND dv.is_fixture = FALSE`.
- **Lücke:** Kein explizites Config-Gate `ALLOW_FIXTURE_DATA` (Default `false`). → Phase-2-Requirement R4.
---
## 6. Daily Quality
- Daily-Quality-Report-Pipeline vorhanden (Foundation-Suite).
- Quality-/Coverage-Status wird pro Bar erfasst, aber noch nicht bis zum Backtest propagiert.
---
## 7. Shared Repository (M12/M13 Schritt 1)
- **Befund:** `historical_repository.py` existiert als **zwei physisch getrennte Kopien** (M12 + M13, identischer Hash `bc64638b…`). Kein gemeinsames Paket/Volume.
- **Drift-Risiko:** Kein Mechanismus erzwingt Identität → künftige Änderungen können auseinanderlaufen.
- **Zielstruktur (Phase-2-Requirement R1):** Gemeinsames `shared/historical`-Paket als EINE Quelle, beide Module importieren daraus. Keine neue Kopierlösung.
- Interface `load_candles(symbol, timeframe, start_date, end_date, provider, asset_class)` unverändert; M12 `data_hash()` erhalten.
---
## 8. Legacy/V2 Gate
- `HISTORICAL_DATA_SOURCE` (env), **Default = `legacy`** (liest `ohlcv` aus trading-DB, Modul-01).
- `historical_v2` nur explizit aktivierbar. Kein stiller Wechsel.
- FAIL-CLOSED: unbekannte Quelle → Fehler, kein stiller Fallback.
---
## 9. M13 Hash
- `compute_run_hash` erweitert um `dataset_version_id`, `dataset_version_hash`, `provider`, `feed_type` (nur bei V2).
- Bei Legacy (Default) → unverändert, keine Cache-Invalidierung bestehender Runs.
- **Hash-Audit:** `dataset_version_hash` deckt kryptografisch alle Versionen ab (bewiesen über Code + Tests). Entscheidung: **A** — Hash reicht für Identität, Versionen zusätzlich als Run-Metadaten (Phase-2-Requirement R3).
---
## 10. Aktuelle Netzwerkgrenze
- historical-db (10.0.8.2) und M12/M13 (10.0.13.x) in verschiedenen Docker-Netzwerken.
- Produktiv-Container erreichen historical-db NICHT (timeout, verifiziert).
- **Empfohlene Service Boundary (Phase-2-Requirement R2):** B — M12/M13 → Historical-Service API → historical-db. Dedizierter Bulk-Bars-Endpoint mit Dataset-Version + Quality/Eligibility-Metadaten. Kein direkter DB-Zugriff aus M12/M13.
---
## 11. Bekannte offene Punkte
- Shared-Repository als EINE Quelle (R1) — noch 2 Kopien.
- Service-Boundary B (R2) — noch direkte DB-Logik.
- Run-Metadaten-Persistenz (R3) — noch nicht.
- Fixture-Safety-Gate (R4) — noch nicht.
- Quality/Coverage-Propagation (R5) — noch nicht.
- Bid/Ask-Fill, Spread, Slippage, Kosten — Phase 2.
---
## 12. Phase-2-Plan
Phase 2 wird getrennt behandeln (NICHT implementiert):
| ID | Thema |
|----|-------|
| A | Run-Metadaten-Persistenz |
| B | echte Bid/Ask-Bar-Verarbeitung |
| C | Fill-Modell |
| D | variable reale Spreads |
| E | Slippage-Modell |
| F | Broker-/Trading-Kosten |
| G | Intrabar-Ambiguität M1 |
| H | Feed-Type BROKER vs REFERENCE |
| I | Fixture-Safety |
| J | Quality/Coverage-Safety |
| K | M13-Reproduzierbarkeit |
| L | Legacy-Kompatibilität |
**Reihenfolge-Vorschlag:** I → J → A → B/C/D/E/F → G → H → K → L.
---
## 13. Status / Freigaben
- **M12/M13 Schritt 1:** ✅ fachlich abgeschlossen + verifiziert (Tests AJ grün, M12 12/12 grün, Foundation-Suite 21/21 zweimal).
- **Deploy:** Code-Identität lokal = VPS = Container (sha256 identisch), Container-Restart, Smoke-Tests grün.
- **Phase 2:** ⛔ NICHT begonnen (explizite Freigabe erforderlich).
- **Grenzen:** nur EURUSD, nur Dukascopy, nur Historical-V2-Stack; keine Produktivmodule M03M19; keine IG-Calls/Orders; kein Jahresbackfill; M20M25 nicht beginnen.
---
## Geändert
```
Geändert von: Rain Ocampo
Datum: 22.08.2026
Grund: Meilenstein-Doku Historical Data Foundation V2 + M12/M13 Shared Repository Schritt 1 angelegt (Architecture-Closeout).
```