From 1d615a785157f3343af82c111e1ee6cc09ed7c6c Mon Sep 17 00:00:00 2001 From: Rain Ocampo Date: Sun, 23 Aug 2026 09:11:03 +0000 Subject: [PATCH] Phase 10b: semantische Korrektur REFERENCE_BID_ASK -> BID_ASK_INTRINSIC (Doku) --- ...Foundation-V2-M12-M13-Shared-Reposit.patch | 171 ++++++++++++++++++ .../phase10b_semantic_correction.md | 82 +++++++++ vps.md | 6 + 3 files changed, 259 insertions(+) create mode 100644 backup_patches/0001-Historical-Data-Foundation-V2-M12-M13-Shared-Reposit.patch create mode 100644 notes/trading/system-docs/phase10b_semantic_correction.md create mode 100644 vps.md diff --git a/backup_patches/0001-Historical-Data-Foundation-V2-M12-M13-Shared-Reposit.patch b/backup_patches/0001-Historical-Data-Foundation-V2-M12-M13-Shared-Reposit.patch new file mode 100644 index 0000000..daff12e --- /dev/null +++ b/backup_patches/0001-Historical-Data-Foundation-V2-M12-M13-Shared-Reposit.patch @@ -0,0 +1,171 @@ +From a207fa8847a49a5b055656027a7c4a29d20ab6c1 Mon Sep 17 00:00:00 2001 +From: Rain Ocampo +Date: Sat, 22 Aug 2026 18:11:44 +0000 +Subject: [PATCH] =?UTF-8?q?Historical=20Data=20Foundation=20V2=20+=20M12/M?= + =?UTF-8?q?13=20Shared=20Repository=20Schritt=201:=20Meilenstein-Doku=20(A?= + =?UTF-8?q?rchitecture-Closeout)=20-=20Ge=C3=A4ndert=20von=20Rain=20Ocampo?= + =?UTF-8?q?,=2022.08.2026?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +--- + .../historical-v2-foundation-milestone.md | 146 ++++++++++++++++++ + 1 file changed, 146 insertions(+) + create mode 100644 notes/trading/system-docs/historical-v2-foundation-milestone.md + +diff --git a/notes/trading/system-docs/historical-v2-foundation-milestone.md b/notes/trading/system-docs/historical-v2-foundation-milestone.md +new file mode 100644 +index 0000000..ed2aac1 +--- /dev/null ++++ b/notes/trading/system-docs/historical-v2-foundation-milestone.md +@@ -0,0 +1,146 @@ ++--- ++type: Trading-Modul-System ++_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 A–J 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 M03–M19; keine IG-Calls/Orders; kein Jahresbackfill; M20–M25 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). ++``` +-- +2.43.0 + diff --git a/notes/trading/system-docs/phase10b_semantic_correction.md b/notes/trading/system-docs/phase10b_semantic_correction.md new file mode 100644 index 0000000..bfed340 --- /dev/null +++ b/notes/trading/system-docs/phase10b_semantic_correction.md @@ -0,0 +1,82 @@ +--- +type: Note +_organized: true +--- + +# Phase 10b — Semantische Korrektur REFERENCE_BID_ASK → BID_ASK_INTRINSIC + +**Geändert von:** Rain Ocampo (Hermes) +**Datum:** 23.08.2026 +**Grund:** Semantische Korrektur des Spread-Modells für den REFERENCE_BID_ASK-Ausführungspfad + vollständiger Beweis + kontrollierter Minimal-Deploy. + +## Zusammenfassung + +Phase 10b schließt die semantische Korrektur des Spread-Modells ab: Für den Ausführungspfad `REFERENCE_BID_ASK` ist der Spread **intrinsisch** (ergibt sich aus Entry-/Exit-Seite, KEIN Zusatz-Aufschlag). Deshalb gilt dort standardmäßig `spread_model = BID_ASK_INTRINSIC`, sofern nicht explizit ein anderes Spread-Modell übergeben wird. Legacy (`LEGACY_SINGLE_PRICE`) bleibt unverändert `NONE`. + +Damit zeigen **ExecutionContext, Audit und run_hash dieselbe Wahrheit** — es gibt keine Sonderbehandlung nur im Audit. + +## Semantische Korrektur (Option 1, User-Entscheidung) + +- **REFERENCE_BID_ASK** (Default) → `spread_model = BID_ASK_INTRINSIC` (explizit übersteuerbar) +- **LEGACY_SINGLE_PRICE** → `spread_model = NONE` (unverändert) +- **V2-run_hash DARF sich ändern** (ist gewollt) +- Keine Sonderbehandlung nur im Audit — Context/Audit/Hash konsistent + +## Slippage-Wording + +Phase 10b verwendet **noch kein Slippage-Modell** (nicht „ignoriert grundsätzlich"). `slippage_model = NONE` im Audit. + +## Fail-Closed (11 Fälle) + +- fehlendes/unvollständiges Bid/Ask → `BID_ASK_REQUIRED` +- `price_basis != bid_ask` → blockiert +- `REFERENCE_BID_ASK` + Single-Price → blockiert +- `BROKER_APPROXIMATION` / `BROKER_REPLAY` / `TICK_REPLAY` → blockiert +- unbekanntes `execution_model` → blockiert +- **kein Legacy-Fallback** + +## Beweis (Tests) + +| Suite | Ergebnis | +|---|---| +| Phase10a (execution_context) | **15/15** grün | +| Phase10bFills | **5/5** grün | +| Phase10bEngineFills | **8/8** grün | +| Phase10bFixtureE2E | **4/4** grün | +| M13Compat | **5/5** grün | +| Gesamtsuite (Runner) | **2× alle 11 Suiten grün** | + +### Beweis-Kernpunkte (Phase10a) +- A) REFERENCE_BID_ASK Default → `spread_model = BID_ASK_INTRINSIC` +- B) explizites NONE-Override → NONE +- C) LEGACY → NONE +- D) NONE vs intrinsic → **verschiedene** V2-run_hash +- E) gleiche Konfig 2× → **identischer** V2-run_hash +- F) Legacy unberührt + +### Fixture-E2E (4/4) +- LONG + SHORT COMPLETED +- Audit: `execution_model=REFERENCE_BID_ASK`, `spread_model=BID_ASK_INTRINSIC`, `slippage_model=NONE`, `is_fixture=true` +- ohne `ALLOW_FIXTURE_DATA` → `FIXTURE_DATA_BLOCKED` +- Reset-Beweis (Flag an→COMPLETED, Flag aus→BLOCKED, ENV wiederhergestellt) +- kein Doppelspread + +## Deployment (kontrollierter Minimal-Deploy, Backup + Rollback) + +- **Backup:** `/opt/data/backup_phase10b_deploy_20260823_090949/` (m12 + m13, md5-verifiziert) +- **M12** (`Modul-12-Backtesting`): `/app/core/engine.py`, `/app/core/service.py`, `/app/core/pricing.py` (NEU), `/app/shared/historical/execution_context.py`, `/app/shared/historical/repository.py` +- **M13** (`Modul-13-Optimization`): `/app/shared/historical/execution_context.py`, `/app/shared/historical/repository.py` +- **Verifikation:** py_compile OK in beiden Containern; Restart; `/health`=200, `/health/ready`=`{"status":"ready","db":"ok"}` (M12), `/health`=200 (M13) +- **KEINE Phase 10c, keine anderen Module, keine IG-Calls/Orders** + +## Legacy-Produktions-Smoke (nach Deploy) + +- **run_hash: `bc6e25533d22ee102b6921eeeccd8f7b7dff4ec74a3316e381007ec56b0e1b37`** (deterministisch, 2 Runs identisch) +- **data_hash: `d76a75496453d9c05d5690237f4621534f954f9f3e87b67eee4ae9327c5c6bb9`** (identisch Phase 8) +- **RESULT: PASS** — Legacy bleibt nach 10b-Deploy byte-identisch +- **Hinweis:** Die frühere Diskrepanz `b3c2553…` vs `bc6e2553…` ist geklärt — der echte Hash aus der Run-Wahrheit ist `bc6e2553…` (`b3c2553…` war ein Tippfehler im Zwischenbericht). + +## Produktions-Gate + +- M12 + M13: `HISTORICAL_DATA_SOURCE=UNSET`, `ALLOW_FIXTURE_DATA=UNSET` +- Produktion bleibt auf echtem Datensatz, **nie auf Fixture** diff --git a/vps.md b/vps.md new file mode 100644 index 0000000..bbe2bef --- /dev/null +++ b/vps.md @@ -0,0 +1,6 @@ +--- +type: Type +_sort: title:asc +--- + +# VPS