416 lines
17 KiB
Markdown
416 lines
17 KiB
Markdown
# MALE5-ML — MULTIVARIATE MALE5 CLASSIFIER RESEARCH PROTOCOL (DESIGN)
| |||
| |||
**Research family:** `MALE5-ML`
| |||
**Protocol version:** `male5-ml-v0.1.0-frozen`
| |||
**Status:** **DESIGN FROZEN — EXECUTION NOT AUTHORIZED.**
| |||
**Project:** `ARIMA_SAX_Hybrid_Forecaster`
| |||
**Project workspace (authoritative):**
| |||
`D:\TradingTerminal\MetaTrader 5\MQL5\Shared Projects\ARIMA_SAX_Hybrid_Forecaster`
| |||
**Project remote:**
| |||
`https://forge.mql5.io/chiki2bum2/ARIMA_SAX_Hybrid_Forecaster.git`
| |||
| |||
> This document is a **design artifact only** for the new, independent
| |||
> `MALE5-ML` research family. It finalizes the research protocol design and
| |||
> records every reproducibility field. It does **not** execute any model,
| |||
> produce any prediction/experiment artifact, run a backtest, perform an OOS
| |||
> evaluation, or tune any parameter.
| |||
>
| |||
> R1-R (CLOSED / IMMUTABLE) and R2-H (EXECUTED / NULL) are **not** reopened,
| |||
> re-analysed, or amended. R1-R and R2-H origin/protocol/manifest artifacts are
| |||
> referenced only as immutable inputs, never modified or regenerated.
| |||
| |||
---
| |||
| |||
## 1. Governance status
| |||
| |||
- Dependency finalization: **COMPLETE** (see
| |||
`MALE5_v3.2.0_CANONICAL_DEPENDENCY_FINALIZATION.md`).
| |||
- This session: **final protocol design only**.
| |||
- The required next governance gate is **FORMAL DESIGN FREEZE** (owner
| |||
authorized), followed by a **separate EXECUTION AUTHORIZATION** gate before
| |||
any execution.
| |||
- Git rule: the agent does **not** auto-commit or push. Design freeze/commit is
| |||
a separate owner instruction.
| |||
| |||
---
| |||
| |||
## 2. Exact dependency identity (frozen input)
| |||
| |||
| field | value |
| |||
|---|---|
| |||
| upstream URL | `https://github.com/MegaJoctan/MALE5` |
| |||
| canonical tag | `v3.2.0` |
| |||
| exact commit | `d6fb0695a7c2fbeaa03de379557a8b5447915384` |
| |||
| archive SHA-256 | `ad161d75ae0b54ee54a1fd3b0d48c315cf776eebc97077a4b1ae7a629f0c0d4d` |
| |||
| canonical local path | `D:\TradingTerminal\MetaTrader 5\MQL5\Include\MALE5` |
| |||
| compile smoke | 0 errors / 0 warnings (build 6140, AVX512) |
| |||
| `predict_proba` | **UNSUPPORTED** (confirmed absent in all v3.2.0 `.mqh`) |
| |||
| |||
Policy:
| |||
- Use **ONLY** MALE5 v3.2.0 at the frozen commit.
| |||
- Do **not** use v3.5.0. Do **not** use current MALE5 HEAD. Do **not** mix
| |||
versions. Do **not** patch MALE5.
| |||
- Because `predict_proba` is unsupported, MALE5-ML v0.1 is **binary
| |||
classification only**.
| |||
| |||
---
| |||
| |||
## 3. Research question (final)
| |||
| |||
> Can a fixed nonlinear multivariate MALE5 classifier extract out-of-sample
| |||
> directional information from XAUUSD (M1) that is **not** captured by Naive
| |||
> and Drift?
| |||
| |||
Scope notes:
| |||
- Single fixed classifier (`CRandomForestClassifier`, frozen params).
| |||
- No model comparison, no model search, no parameter search.
| |||
- This is the first member (`v0.1`) of the independent `MALE5-ML` family.
| |||
- Do **not** reopen R1-R or R2-H.
| |||
| |||
---
| |||
| |||
## 4. Primary horizon
| |||
| |||
- **H60** = 60 elapsed minutes (elapsed-time horizon, not bar count).
| |||
- OOS origins: **reuse frozen** `results/R2-H/origins_H060.csv`.
| |||
- Do **not** regenerate, do **not** modify.
| |||
- Frozen provenance (R2-H screen): 3,169 origins; SHA-256
| |||
`e7b5132c321f5350ec1e231d49d68dbc29468cdf9ee6a5014a2764aaf36eb9af`.
| |||
| |||
---
| |||
| |||
## 5. Data provenance
| |||
| |||
- Source: `results/R1_real_data/XAUUSDc_M1_raw.json`
| |||
- M1, broker symbol `XAUUSDc` (Gold Spot Cent), 397,558 bars,
| |||
2025-06-02 01:00 → 2026-08-24 15:19 (server trade time).
| |||
- Source SHA-256 (fresh R2-H provenance, reused as frozen input identity):
| |||
`5472357e67f70f7d1bfef8f9de67fcce91ee6f26208072d7a6766b06c158ee6e`.
| |||
- Source CSV (derived, M1): `results/R1_real_data/XAUUSDc_M1.csv`.
| |||
- Tick data: `D:\TradingTerminal\MetaTrader 5\MQL5\Files\XAUUSD_mt5_ticks.csv`
| |||
— **NOT used** for any feature in MALE5-ML v0.1 (no tick features).
| |||
- At execution, the dataset and origin hashes must be **re-verified**: any
| |||
mismatch = HARD STOP.
| |||
| |||
---
| |||
| |||
## 6. Target definition (frozen)
| |||
| |||
```
| |||
y(o) = 1 if Close[t_end] > Close[o]
| |||
0 if Close[t_end] <= Close[o]
| |||
| |||
t_end = first valid M1 bar at or after timestamp(o) + 60 minutes
| |||
P(x) = close price of M1 bar x
| |||
```
| |||
| |||
- `y(o)` is the **binary up/down label** over the 60-minute elapsed horizon.
| |||
- Strict inequality (>): a zero move (`Close[t_end] == Close[o]`) is class 0.
| |||
- Boundary endpoint rule and gap rule mirror the frozen R2-H H60 origin rule
| |||
(tolerance 5 minutes; any inter-bar delta > 5 min within `(o, t_end]`
| |||
excludes the origin).
| |||
| |||
---
| |||
| |||
## 7. Feature set (frozen) — M1 only, close-based, causal, deterministic
| |||
| |||
No scaler. No global normalization. No full-dataset preprocessing. All features
| |||
are computed using only bars ≤ origin (causal) and are deterministic functions
| |||
of the M1 close series and bar timestamps. **No tick features.**
| |||
| |||
Notation: `C[i]` = close of M1 bar `i`; `ATR20(i)` = close-only deterministic
| |||
ATR proxy = rolling mean of `|C[k] − C[k−1]|` over the trailing 20 M1 bars
| |||
(matching the R2-H / `src/forecasting/target.py` `rolling_atr` definition with
| |||
high/low absent — **NOT** a Wilder ATR). `SMA20(i)` = mean of `C[i−19..i]`.
| |||
| |||
| feat | name | definition |
| |||
|---|---|---|
| |||
| F1 | short momentum | `(C[o] − C[o−5]) / C[o−5]` (5-bar return) |
| |||
| F2 | medium momentum | `(C[o] − C[o−15]) / C[o−15]` (15-bar return) |
| |||
| F3 | trend slope | OLS slope of `log(C)` over trailing 30 M1 bars, scaled `slope × 30 / ATR20(o)` (dimensionless, ATR units) |
| |||
| F4 | distance from SMA20 | `C[o] / SMA20(o) − 1` |
| |||
| F5 | recent range | `(max10(o) − min10(o)) / ATR20(o)`, `max10/min10` over trailing 10 closes |
| |||
| F6 | normalized volatility | `ATR20(o) / C[o]` |
| |||
| F7 | session phase | `hour_of_day(o) / 24.0` (from the M1 bar timestamp; deterministic, causal) |
| |||
| |||
Max feature lookback = 30 bars (F3) / 20 bars (F4, F6) / 10 bars (F5) / 15
| |||
bars (F2). A single deterministic **feature warmup** `W = 40` M1 bars covers
| |||
all lookbacks plus an ATR buffer. Any origin with fewer than `W` prior M1 bars
| |||
has its features treated as unavailable.
| |||
| |||
---
| |||
| |||
## 8. Model and exact parameters (frozen candidate)
| |||
| |||
- Class: `CRandomForestClassifier` — MALE5 v3.2.0, `MALE5\Ensemble\Random Forest.mqh`.
| |||
- API (confirmed v3.2.0): constructor
| |||
`CRandomForestClassifier(uint n_trees=100, uint minsplit=NULL, uint max_depth=NULL, int random_state=-1)`;
| |||
only `fit(...)` and `predict(...)` (hard labels). No `predict_proba`.
| |||
- **Frozen parameter set (one, fixed before execution):**
| |||
| |||
| param | value |
| |||
|---|---|
| |||
| `n_trees` | 100 |
| |||
| `minsplit` | 2 |
| |||
| `max_depth` | 10 |
| |||
| `random_state` | 42 |
| |||
| |||
- Unsupportable / prohibited: `min_samples_leaf`, `criterion`, `predict_proba`,
| |||
`n_jobs`, any non-v3.2.0 parameter.
| |||
- Do **not** tune. These are frozen unless a formal revision is authorized.
| |||
| |||
---
| |||
| |||
## 9. Training window — deterministic causal dense-M1 construction (frozen rule)
| |||
| |||
No fixed arbitrary `N_train`. For **every** OOS origin `o`, the training sample
| |||
`T(o)` is constructed deterministically and causally as follows.
| |||
| |||
A training (origin) bar `t` is a **valid training example** for origin `o` iff
| |||
**all** of the following hold:
| |||
| |||
1. `t >= W` (feature warmup `W = 40` M1 bars — all F1–F7 available at `t`).
| |||
2. `t ∉ L` (`L` = the frozen OOS origin list; the OOS origins are reserved
| |||
**exclusively** for evaluation and are never used as training inputs).
| |||
3. Target endpoint `t_end(t)` resolves: there exists a first M1 bar with
| |||
`timestamp >= timestamp(t) + 60 min`, **and** no inter-bar gap `> 5 min`
| |||
within `(t, t_end(t)]` (frozen gap rule).
| |||
4. `t_end(t) < o` (strictly: the training label resolves before `timestamp(o)`),
| |||
so **no training label ever crosses into the OOS evaluation period** and no
| |||
future information leaks. Equivalently `t + 60 min < timestamp(o)`.
| |||
| |||
Then:
| |||
| |||
- Feature matrix `X(o)` = rows `[F1..F7]` evaluated at each valid `t`.
| |||
- Label vector `y(o)` = `y(t)` for each valid `t` (binary up/down over the
| |||
resolved 60-min window).
| |||
- All feature information is `≤ t`; all label information is within `(t, t+60]`
| |||
and strictly `< o`.
| |||
- The classifier is **refit from scratch at each OOS origin `o`** on `T(o)`
| |||
(pure deterministic causal expanding-window walk forward). No incremental
| |||
tree reuse, no persistence across origins, no cross-origin state.
| |||
- No shuffle, no random split, no future preprocessing.
| |||
| |||
Implementation note (execution-time, **not** a design change): per-origin refit
| |||
over a growing dense sample is computationally heavy (≈3,169 fits with up to
| |||
≈400 k training rows × 100 trees). This does not alter the frozen design; if a
| |||
future execution becomes infeasible, that is a **new owner decision**, not an
| |||
improvised design change.
| |||
| |||
---
| |||
| |||
## 10. Preprocessing (frozen)
| |||
| |||
- **SCALER = OFF.**
| |||
- No global normalization, no full-dataset preprocessing, no feature scaling.
| |||
- No unnecessary preprocessing degrees of freedom (tree models are
| |||
scale-invariant for thresholds; F-values are already dimensionless or
| |||
price-relative).
| |||
| |||
---
| |||
| |||
## 11. Baselines (frozen)
| |||
| |||
1. **Majority baseline (per-origin):**
| |||
- Majority label = modal class of the **training labels `y(o)`** of that
| |||
origin's own causal training window `T(o)`.
| |||
- Tie-break (deterministic): if the counts of class 0 and class 1 are equal,
| |||
predict class `0` (Down). Documented, frozen.
| |||
2. **Drift baseline (causal, fixed):**
| |||
- Existing `DriftBaseline` (`src/baselines.py`): linear slope over the last
| |||
40 closes projected `H` bars ahead.
| |||
- Binary direction label: `1` if projected drift `> 0`, else `0`. Causal,
| |||
uses only bars ≤ origin.
| |||
3. **Naive baseline:** zero-return forecast — used only as the classification
| |||
reference and to frame the research question; Naive is not a competing
| |||
binary classifier for the paired-error decision (predicts no change).
| |||
| |||
---
| |||
| |||
## 12. Metrics (frozen)
| |||
| |||
**Primary** (because `predict_proba` is unavailable — no Brier, no log-loss, no
| |||
calibration, no synthetic probabilities):
| |||
| |||
1. **Balanced accuracy** = mean of sensitivity (class-1 recall) and specificity
| |||
(class-0 recall) over OOS origins. Reported with MBB 95% CI.
| |||
2. **Directional accuracy** = fraction of OOS origins where MALE5 label equals
| |||
the realized label. Reported with MBB 95% CI.
| |||
3. **Paired classification error vs Majority:**
| |||
`d_maj(o) = err_majority(o) − err_male5(o)` per origin (`err = 1 − correct`).
| |||
Reported with MBB 95% CI; lower bound `> 0` ⇒ MALE5 better than Majority.
| |||
4. **Paired classification error vs Drift:**
| |||
`d_drift(o) = err_drift(o) − err_male5(o)` per origin. Reported with MBB 95%
| |||
CI; lower bound `> 0` ⇒ MALE5 better than Drift.
| |||
| |||
**Secondary (descriptive):**
| |||
| |||
- gross return/trade (sign-matched realized `tau_H`, ATR units);
| |||
- net return/trade (`= gross − cost_atr`), ATR units;
| |||
- gross/cost ratio;
| |||
- cost/range ratio;
| |||
- trade coverage (`= n_traded / n_origins`; 1.0 because the binary model always
| |||
emits a direction);
| |||
- time-normalized economics (per 60-min holding period);
| |||
- EARLY / MIDDLE / LATE chronological descriptive results.
| |||
| |||
Gross and net are **always reported separately**.
| |||
| |||
---
| |||
| |||
## 13. Statistical inference (frozen)
| |||
| |||
- Method: **Moving Block Bootstrap (MBB)** over the chronological OOS origin
| |||
series.
| |||
- Block length: **B = 60 OOS origins** (block unit = OOS evaluation points,
| |||
each a distinct M1 elapsed origin).
| |||
- Repetitions: **10,000**.
| |||
- Confidence: **95%** percentile CI `[2.5%, 97.5%]`.
| |||
- **Seed: 20260827** (independent seed for the MALE5-ML family).
| |||
- Effective sample size: `n_eff = floor(n_usable / B)`; with `n_usable ≈ 3,169`
| |||
OOS origins, `n_eff ≈ 52`. This is consistent with the R2-H H60 power profile
| |||
(moderate effective sample). Low-power limitations are reported, never
| |||
hidden.
| |||
- Applied to: balanced accuracy, directional accuracy, and the two paired
| |||
error differences, and (secondary) gross/net return per trade.
| |||
- Coherence check (design): the paired error differences are defined per OOS
| |||
origin on a common chronological series, so block resampling of the origin
| |||
series with block length 60 is internally coherent and preserves
| |||
chronological dependence. `B`, repetitions, and seed are **fixed**; they may
| |||
not be modified after observing results.
| |||
- No empirical tuning; no post-result changes.
| |||
| |||
---
| |||
| |||
## 14. Economic design (frozen)
| |||
| |||
- Frozen project round-trip cost: **7.57 bps** (median tick spread ≈ 1.57 bps
| |||
+ commission 6.00 bps; pre-registered global constant).
| |||
- `cost_atr(o) = (7.57 / 10000) × close(o) / ATR20(o)`.
| |||
- Gross and net must remain **separate**.
| |||
- Economic viability requires **statistical predictive support (success
| |||
criteria 1–4) PLUS positive net** under the frozen cost.
| |||
- Predictive but negative net ⇒ **PREDICTIVE BUT NOT ECONOMICALLY VIABLE**.
| |||
- Sensitivity at 0.5× and 2× cost may be reported **descriptively only**; it
| |||
cannot alter the primary decision.
| |||
| |||
---
| |||
| |||
## 15. Success criteria (frozen) — MALE5 primary success requires ALL
| |||
| |||
1. **Better than Majority:** MBB 95% CI lower bound of `d_maj` (valid,
| |||
majority-classified origins) `> 0`.
| |||
2. **Better than Drift:** MBB 95% CI lower bound of `d_drift` `> 0`.
| |||
3. **Dependence-aware statistical support:** the paired-error CIs in (1)–(2)
| |||
are significant, and balanced accuracy / directional accuracy CIs are
| |||
reported so the improvement is not an artifact of class imbalance or trend
| |||
timing.
| |||
4. **No material reversal across EARLY / MIDDLE / LATE:** in every
| |||
chronological third, the point estimate of the advantage over **both**
| |||
baselines is `≥ 0` (MALE5 never worse than the worse baseline in any
| |||
segment, point estimate).
| |||
5. **Positive gross for any trading claim:** if an economic claim is made, MBB
| |||
95% CI lower bound of gross return/trade `> 0`.
| |||
6. **Positive net for economic viability:** MBB 95% CI lower bound of net
| |||
return/trade (gross − `cost_atr`) `> 0`.
| |||
| |||
Do **not** use `accuracy > 50%` alone. All success conditions are frozen.
| |||
| |||
---
| |||
| |||
## 16. Hard-stop conditions (frozen)
| |||
| |||
STOP (no further design/execution) if any of the following:
| |||
| |||
- MALE5 dependency identity cannot be confirmed (version/commit/SHA mismatch).
| |||
- `predict_proba` or any non-v3.2.0 API is required.
| |||
- Random Forest constructor parameters not supported by the frozen v3.2.0 API.
| |||
- Frozen origin list (`origins_H060.csv`) is modified, regenerated, or its
| |||
hash no longer verifies.
| |||
- Source dataset hash no longer verifies.
| |||
- No-lookahead failure (mutation testing on training/target construction; any
| |||
feature or label uses future info relative to its origin).
| |||
- Any attempt to tune model parameters, MBB parameters, seed, or cost from
| |||
results.
| |||
- Protocol contradiction or unresolved specification.
| |||
- Any attempt to execute / backtest / forecast / tune before a separate
| |||
**EXECUTION AUTHORIZATION** gate.
| |||
- Accidental modification of R1-R or R2-H artifacts.
| |||
| |||
An unresolved scientific ambiguity is returned to the owner — it is **not**
| |||
resolved by improvisation.
| |||
| |||
---
| |||
| |||
## 17. No-lookahead / forensic gates (frozen, to be run at execution)
| |||
| |||
| gate | item | classification |
| |||
|---|---|---|
| |||
| F1 | feature construction (F1–F7 causal) | OBSERVED / DECISION |
| |||
| F2 | target construction (`y(o)`) | OBSERVED / DECISION |
| |||
| F3 | ATR20 construction (close-only) | OBSERVED / DECISION |
| |||
| F4 | SMA20 / range / slope windows | OBSERVED / DECISION |
| |||
| F5 | training data boundary (`t_end(t) < o`, `t ∉ L`) | OBSERVED / DECISION |
| |||
| F6 | normalization / scaler (OFF) | OBSERVED / DECISION |
| |||
| F7 | horizon endpoint determination | OBSERVED / DECISION |
| |||
| F8 | cost information (7.57 bps) | OBSERVED / DECISION |
| |||
| F9 | tick-derived information (none used) | OBSERVED / DECISION |
| |||
| |||
- Mutation testing: perturbing a future bar must not alter predictions at any
| |||
tested OOS origin. Minimum spot checks: ≥ 3 origins.
| |||
- Any no-lookahead failure = **INVALID / HARD STOP**.
| |||
| |||
---
| |||
| |||
## 18. Reproducibility manifest
| |||
| |||
The companion `MALE5_ML_MANIFEST.json` records (identically to §2–§17):
| |||
| |||
- project identity/path; MALE5 upstream URL; tag; commit; archive SHA-256;
| |||
canonical local path;
| |||
- relevant source hashes (RF dependency closure per the canonical report);
| |||
- source dataset + hash; OOS origin list + hash;
| |||
- target; feature definitions; model + parameters; training-window rule;
| |||
preprocessing; baselines; metrics; statistical method; seed; cost; success
| |||
criteria; hard-stop conditions.
| |||
| |||
---
| |||
| |||
## 19. Required outputs and exclusions (this session)
| |||
| |||
- Create **only**:
| |||
- `results/MALE5-ML/MALE5_ML_PROTOCOL.md`
| |||
- `results/MALE5-ML/MALE5_ML_MANIFEST.json`
| |||
- These are **design artifacts only**.
| |||
- Do **not** create prediction, backtest, OOS, tuning, or experiment artifacts.
| |||
| |||
---
| |||
| |||
## 20. Outcome matrix (adopted, MALE5-ML)
| |||
| |||
| outcome | definition |
| |||
|---|---|
| |||
| **SUCCESS** | all 6 success criteria satisfied (predictive AND economically viable) |
| |||
| **PREDICTIVE BUT NOT ECONOMICALLY VIABLE** | criteria 1–4 hold but net CI lower bound ≤ 0 |
| |||
| **NULL** | no better-than-baseline signal (fails 1 and/or 2) |
| |||
| **INCONCLUSIVE** | underpowered OOS sample prevents decision; or ambiguous specification |
| |||
| **INVALID** | no-lookahead / provenance / protocol violation → HARD STOP |
| |||
| |||
---
| |||
| |||
## 21. Version / freeze metadata
| |||
| |||
| field | value |
| |||
|---|---|
| |||
| protocol id | `male5-ml-v0.1.0-frozen` |
| |||
| status | DESIGN FROZEN — EXECUTION NOT AUTHORIZED |
| |||
| design session date | 2026-08-26 |
| |||
| freeze date | 2026-08-27 |
| |||
| branch | main |
| |||
| required next gate | EXECUTION AUTHORIZATION (separate gate) |
| |||
| |||
---
| |||
| |||
**DESIGN FROZEN — EXECUTION NOT AUTHORIZED.**
| |||
| |||
_End of MALE5-ML protocol design._
|