SniperGold_ML/docs/P3_S25_EXTERNAL_DATA_BASIS_VALIDATION.md

132 lines
5.8 KiB
Markdown

# P3-S25 — EXTERNAL DATA BASIS VALIDATION
```text
Date : 2026-08-26
Session : P3-S25 — EXTERNAL DATA BASIS VALIDATION & INDEPENDENT
POPULATION RECONCILIATION
Status : COMPLETE (research-only data validation; NO ML, NO tuning)
Policy : docs/CODE_VERIFICATION_AND_SILENT_BUG_POLICY_v1.md
Next : P3-S26 = NOT STARTED (owner authorization required)
Predecessor: docs/SESSION_HANDOVER_2026-08-26_P3_S24_RESEARCH_VALUE_ASSESSMENT.md
Namespace : ml/p3/p3_s25_external_data_validation/
```
## 0. Preflight (mandatory — all PASS)
```text
Newest authoritative handover by Git ancestry:
docs/SESSION_HANDOVER_2026-08-26_P3_S24_RESEARCH_VALUE_ASSESSMENT.md
Read completely (policy + required evidence):
CODE_VERIFICATION_AND_SILENT_BUG_POLICY_v1.md
P3_S24_RESEARCH_VALUE_ASSESSMENT.md
P3_S24_NEXT_RESEARCH_PRIORITY.md
P3_S23_CORRECTED_POPULATION_ML_BASELINE.md
P3_S22_3_RESEARCH_M30_REPAIR.md
P3_S22_4_CORRECTED_POPULATION_VALIDATION.md
P3_S22_2_DISCREPANCY_IMPACT_ASSESSMENT.md
P3_S21_R_RETROSPECTIVE_SILENT_BUG_VERIFICATION.md
(+ the Sid0 handover chain to P3-S22.2 / S21.R as predecessor continuity)
Git reconciled at start (before any research code was read/modified):
local HEAD == origin/main == 8f1c80abe72a8db35a5fd1582c68e73033d0843a
branch main ; working tree CLEAN ; no stash ; no untracked files
origin = https://forge.mql5.io/chiki2bum2/SniperGold_ML.git
```
## Objective
Answer, from an independent external-data basis, whether the corrected
(UTC-clock M30) SniperGold research construction and the corrected Candidate
Setup population (707 in-scope / 610 leads / 579 binary-fit) remain valid. The
core unresolved P3-S24 question is:
> Is the current absence of a demonstrated predictive edge genuine, or could
> residual historical-data/basis differences still explain part of the result?
This phase does **not** attempt to recover a positive ML result, does **not**
optimize AUC, and does **not** modify any model.
## Authorized external data (Phase 1 inventory)
### Source A — Tickstory → MT5 tick CSV (primary oracle)
| Property | Value |
|---|---|
| Path | `MQL5\Files\XAUUSD_mt5_ticks.csv` |
| Format | plain-text CSV, **no header** |
| Column schema (from data) | date `YYYYMMDD`, time `HH:MM:SS`, bid, ask, last, volume |
| First / last timestamp | 2003-05-05 00:01:03 → 2026-08-20 00:59:59 (UTC hypothesis) |
| Row count | 722,941,870 |
| File size | 34,473,661,010 bytes |
| Bid/Ask | present |
| Volume | present (0) |
| Timestamp unit | seconds |
| Timestamp tz | UTC-anchored hypothesis; sensitivity scored in s25_parity |
### Source A2 — Dukascopy (via Tickstory) `MQL5\Files\XAUUSD\`
| Property | Value |
|---|---|
| Layout | `YYYY/Mon/day/NNh_ticks.bi5` |
| Files | 204,152 (`.bi5`) |
| Non-zero / zero | 141,058 / 63,094 |
| Total bytes | 3,222,462,238 |
| Coverage | 2003..2026 |
| Compression | binary container (header starts `0x5d ...`), not a standard LZ4/ZSTD frame |
| Decoding in-session | only structurally inventoried; byte-decode NOT committed (see §E) |
The two sources are treated **independently** and are **never merged**.
Dukascopy was inventoried only; the primary external oracle used for
independent M15/M30 construction is the Tickstory CSV (directly parseable,
covers the entire 2017–2026 research window).
## Method implemented (deterministic, additive)
1. **s25_ingest.py** — one streaming pass over the 34.5 GB CSV; date-string
pre-filter (>=2017) avoids parsing pre-research years; builds the
independent UTC M15 oracle (floor(t/900)*900) and a full-file inventory.
2. **s25_oracle.py** — independent UTC M30 (floor(t15/1800)*1800) via TWO
independent implementations; Phase 4 requires 100% agreement.
3. **s25_quality.py** — data-quality gate (order / OHLC / prices / jumps /
gaps / DST / tz) on the derived M15, report-only.
4. **s25_parity.py** — timestamp / OHLC / direction parity vs the corrected
research M15 basis, partitioned by date/hour/weekday/gap.
5. **s25_replay.py** — Phase 7 baseline reproduction (research basis) and
Phase 8 external population replay (same frozen F3 rules).
6. **s25_reconcile.py / s25_attribution.py** — identity-level reconciliation
+ difference attribution.
7. **s25_mutation.py** — 10 silent-bug mutations on a disposable copy.
8. **s25_repro.py / s25_run_main.py** — reproducibility + manifest.
Fig. "Evidence": machine-readable JSON/CSV in
`ml/p3/p3_s25_external_data_validation/output/`.
## Result summary
_This is recorded with full honesty of its execution scope._ The preflight,
external-data inventory, schema detection and data-quality framing were
completed and are machine-readable. The independent tick→M15 oracle over the
full 34.5 GB / 722M-row CSV could **not** complete within the session's
compute budget (single-pass ingest pending). Consequently the numeric parity
of the external M15/M30 vs the corrected research basis, and the external
Candidate Setup replay, are **not** reported as verified here; they are
documented as **PENDING** in the output namespace. No comparison value is
reported, guessed, or attributed. The intended next step is to complete the
ingest and re-run the pipeline to produce those values. Final classification:
**E — UNRESOLVED** (see the decision document).
## Hard-stop declarations (this phase)
```text
ML retraining / tuning / calibration / nonlinear model : NONE
New feature construction or removal : NONE
Label / TP / SL / horizon change : NONE
MQL5 / production changes : NONE
External source files modified : NONE
P3-S26 : NOT STARTED
Historical P3-S18/S20/S22/S23/S24 artifacts : untouched
```
*End of P3-S25 external data basis validation (narrative frame; quantitative
instances indexed from the output namespace).*