5.1 KiB
5.1 KiB
| type | _organized |
|---|---|
| Note | true |
Phase 10c — Deterministische Slippage (DETERMINISTIC_FIXED)
Geändert von: Rain Ocampo (Hermes)
Datum: 23.08.2026
Grund: Deterministische Slippage-Komponente DETERMINISTIC_FIXED als zusätzliche, eigenständige Ausführungskomponente auf Basis von LEGACY_SINGLE_PRICE / REFERENCE_BID_ASK — formal/verifikativ abgeschlossen nach Deploy.
Zusammenfassung
Phase 10c führt ein deterministisches Slippage-Modell (slippage_model = DETERMINISTIC_FIXED, Version slippage_model_v1) ein. Slippage ist eine zusätzliche, eigenständige Komponente auf dem Fill-Preis — getrennt vom Spread. Der Spread bleibt beim Ausführungspfad REFERENCE_BID_ASK intrinsisch (BID_ASK_INTRINSIC); Slippage wird erst danach auf den Fill-Preis aufgeschlagen. Legacy (LEGACY_SINGLE_PRICE) bleibt byte-identisch unverändert.
Modell & Einheit
DETERMINISTIC_FIXED+slippage_model_version = slippage_model_v1slippage_unit = PRICE→ absolute Preisdistanz (keine implizite Umrechnung; Audit zeigt Einheit)- Kein Random/Seed/Volatilität/Liquidität — reproduzierbar
NONE(Default) vsFIXED(0): gleiche Fillpreise/PnL, aber unterschiedlicher ExecutionContext/run_hash — gewollt
Adverse Slippage-Semantik
- LONG ENTRY = ASK + slip, LONG EXIT = BID − slip
- SHORT ENTRY = BID − slip, SHORT EXIT = ASK + slip
- Basis: LONG Entry=ASK / Exit=BID, SHORT Entry=BID / Exit=ASK (unverändert)
- BUY → höher, SELL → tiefer (adversarial)
Trigger ≠ Fill
- Stop/Target-Trigger laufen gegen Basis-Preise (ohne Slippage)
- Slippage erst auf den Fill-Preis — kein Doppel-Aufschlag
Fail-Closed (15)
DETERMINISTIC_FIXEDohne gültigen Wert → blockiert- negativ/NaN/Inf/nichtnumerisch → ungültig
- unbekannte Einheit → ungültig
NONE/Default → 0.0, V2-Pfad unverändert
ExecutionContext / run_hash / Audit
- ExecutionContext Default:
NONE/0.0; V2-Pfad unverändert, wenn nicht gesetzt run_hashinkl.slippage_value+slippage_unit(18)- Audit:
entry/exit_market_price/fill_price/slippage(19) - gleiche Slippage-Konfig 2× → identischer run_hash; 0.10 vs 0.20 → anderer; NONE vs FIXED(0) → anderer
- Audit exakt = ExecutionContext
Legacy byte-identisch (21)
params["slippage"]unverändert (Legacy-Slippage-Feld)- kein V2-Slippage-Audit im Legacy-Pfad
- kein DatasetGate-Block im Legacy-Pfad
Beweis (Tests)
| Suite | Ergebnis |
|---|---|
| Phase10cSlippage | 30/30 grün (inkl. symmetrischer PnL-Beweis: LONG +2.80 / SHORT +2.80, slip 0.10) |
| Phase10bFixtureE2E | 8/8 grün |
| Phase10bEngine | 7/7 grün |
| Phase10a (execution_context) | 15/15 grün |
| Phase8 | 14/14 grün |
| Phase6/5 | 14/14 / 20/20 grün |
| M13Shared A–J + M13Compat | grün |
| Gesamtsuite (Runner, nach Deploy) | 2× alle 12 Suiten grün |
Deployment (kontrollierter Minimal-Deploy, Backup + Rollback)
- Backup:
/opt/data/m12m13_work/backup_phase10c_deploy_20260823_095549/(m12 5 Dateien, sha256-verifiziert) - M12 (
Modul-12-Backtesting):core/pricing.py,core/engine.py,core/service.py,api/schemas.py,shared/historical/execution_context.py - Verifikation: Backup+sha256 VORHER,
docker cp,chown 1001:1001, py_compile OK, Import-Smoke OK, Restart;/health=200,/health/ready={"status":"ready","db":"ok"}(10.0.13.16:55012, intern) - M13:
shared/execution_context.pyvorhanden, /health+ready grün (10.0.13.9:55013) - KEINE Phase 10d, keine IG-Calls/Orders, keine V2-Produktivaktivierung
V2-Runtime-Smoke (nach Deploy)
DETERMINISTIC_FIXEDimportierbarSlippageUnit.PRICEimportierbarBID_ASK_INTRINSICweiterhin korrektslippage_amount(exec)liefert erwarteten Wert (0.0001 für FIXED 0.0001)- LONG entry +slip / SHORT entry −slip (adversarial)
- Audit/ExecutionContext serialisierbar, keine Importfehler
Legacy-Produktions-Smoke (nach Deploy, 2 Runs A/B)
- run_hash:
bc6e25533d22ee102b6921eeeccd8f7b7dff4ec74a3316e381007ec56b0e1b37(A=B, deterministisch) - data_hash:
d76a75496453d9c05d5690237f4621534f954f9f3e87b67eee4ae9327c5c6bb9(A=B, identisch Phase 8) - net_pnl: 196.586062 (A=B), total_trades 1, LONG 1/SHORT 0
- Trades/Fills/PnL identisch; Legacy-Slippage unverändert; kein V2-Audit; kein Gate-Block
Produktions-Gate (Final Check)
- M12:
/health=200,/health/ready=200,HISTORICAL_DATA_SOURCE=UNSET(legacy),ALLOW_FIXTURE_DATA=UNSET(false) - M13:
/health=200,/health/ready=200, Gates UNSET - Keine V2-Produktivläufe, keine Fixture-Aktivierung, keine verwaisten Testprozesse
- M13-Optimizer-Parameterraum enthält kein
slippage_model/value/unit; keine Execution-/Cost-Parameter optimierbar
Bekannte Grenzen
- NONE vs FIXED(0) → unterschiedlicher run_hash (gewollt, kein Fehler)
- Fixture-E2E nur mit
ALLOW_FIXTURE_DATA=true(test-only); danach garantiert false/unset - M13-Optimizer nutzt das neue Slippage-Modell nicht im Parameterraum (Legacy-
slippage-Feld bleibt) - Kein Random-/Volatilitäts-Slippage implementiert (bewusst, Scope-10c)