Repository navigation
feat(ml-training,#14942): PatchTST vs iTransformer — head-to-head sur log-RV BTC - #14948
Merged
Merged
Conversation
…ss + tests Single generic walk_forward_logrv parameterized by build_model runs both architectures on the identical protocol (5-fold expanding walk-forward, train-only normalization, train-tail validation, best-val restore, MSE=bias^2+var, DM on centered errors). Reuses PatchTSTModel/iTransformerModel from main; does NOT add btc_itransformer.py (avoids collision with #14924). 18 pytest tests (CPU) cover model builders, decomposition identity, two-model alignment guard, walk-forward no-leakage probe, aggregation verdicts, dry-run. Co-Authored-By: Claude-Code <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Grain: MED/training — lane myia-po-2026:CoursIA-2 — prev: MED/notebook-dotnet #14933
Closes #14942 (voir See #1454, See #14081, See #14860)
Livrable
Harnais tête-à-tête PatchTST vs iTransformer sur le log-RV BTC journalier,
contre le contexte HAR débiaisé. C'est la jambe que #14081 (PatchTST, MERGED)
et #14860 (iTransformer, PR #14924) laissent toutes deux ouverte : chacune
mesure un modèle contre HAR, aucune ne mesure les deux architectures l'une
contre l'autre sur support aligné.
Pourquoi un nouveau harnais
Les deux wrappers existants (
btc_patchtst.pysurmain,btc_itransformer.pysur la branche OPEN #14924) sont structurellement identiques — seuls la classe
de modèle et le pas d'entraînement par fold diffèrent. Le harnais les dé-duplique :
un seul
walk_forward_logrv(...)générique, paramétré par unbuild_model,fait courir les deux architectures sur le même protocole. Toute différence
mesurée est donc architecturale, pas de plomberie.
make_patchtst_builder(...)->PatchTSTModel(depuistrain_patchtst.py,main)make_itransformer_builder(...)->iTransformerModel(depuistrain_itransformer.py,main)main; le harnais n'ajoute pasbtc_itransformer.py(évite la collision avec feat(ml-training): revalidate iTransformer BTC log-RV against debiased HAR (#14860) #14924).Acceptance #14942
btc_patchtst_itransformer_head2head.pyréutilisant les modules existants--dry-runsur log-RV synthétique (CPU, 1 seed, 1 horizon, modèle minuscule)18 passed)Grain:conformeProtocole (identique aux deux jambes)
Walk-forward expansif 5 folds (
har_model._make_split_indices) ;normalisation sur la fold d'entraînement seule, validation = queue des
séquences d'entraînement seule, état best-validation restauré avant inférence
test. La fold de test n'entre jamais dans le fitting, la normalisation ni la
sélection. Cible = log-RV futur moyen sur h jours ; h ∈ {1, 5, 10} ;
seeds ∈ {0, 1, 7, 42}.
Tête-à-tête : inner-join des prédictions PatchTST et iTransformer par
timestamp (garde de cohérence de cible), puis DM sur erreurs centrées
(
loss_fn="mse", différentiel de variance) et MSE = biais² + variance pourchaque modèle, var_ratio, edge.
Verdict agrégé — 0 BEATS / 0 NO BEATS / 3 INCONCLUSIVE
Deux architectures ne se départagent statistiquement sur le log-RV BTC
journalier (2278 jours RV, BTC-USD Bitstamp) : aucune n'atteint la conjonction
pr-review section C (edge ≥ 2σ cross-seed ET dm_p_median < 0.05).
Per-horizon (4 seeds chacun, 5-fold walk-forward) :
Interprétation honnête : à h=1 l'edge dépasse 2σ (+2.99% vs ±1.93) mais le
DM p reste 0.333 — l'avantage PatchTST est mince et non significatif. À h=5/h=10
l'edge est positif mais sous 2σ et le DM p (0.13 / 0.14) ne passe pas le seuil.
Le var_ratio PatchTST/iTransformer < 1 partout confirme une variance légèrement
plus faible de PatchTST, mais l'effet n'est ni robuste ni significatif. Verdict
honnête : inconclusif, pas de domination claire d'une architecture sur l'autre.
Contexte : les deux modèles restent au-dessus du HAR débiaisé (PatchTST
MSE vs HAR débiaisé : h=1 0.897 vs 0.844 · h=5 0.502 vs 0.418 · h=10 0.457 vs
0.389) — reproduit le finding de #14860 : les deux architectures profondes
échouent contre un HAR simple une fois le biais retiré, et ne diffèrent pas
significativement l'une de l'autre.
Rapport de biais par modèle (jamais corrigé sur le test)
Le biais des deux modèles est petit et d'amplitude comparable (|bias| ≲ 0.05
en log-RV) face à des MSE de l'ordre de 0.5-0.9 : l'edge de PatchTST n'est pas
porté par un biais favorable — il vient d'une variance légèrement plus faible
(var_ratio < 1), et c'est exactement la jambe de précision que le contrôle
conjonctif exige.
Tests
tests/test_btc_head2head.py— 18 tests, CPU pur :TestModelBuilders: les deux builders produisent[B, pred_len]pourn_vars=1.TestEvaluateComboDecomposition: MSE = biais² + variance (identité), edge/var_ratio signés.TestAlignTwoModels: inner-join par timestamp + gardetarget mismatch→ValueError.TestExpandingSplits/TestTrainOnlyNormalization: géométrie, normalisation train-only.TestWalkForwardLogrv: bornes de fold, compte de prédictions, sonde de fuite(muter la région de test ne bouge pas les stats de la fold 0).
TestAggregateVerdicts: BEATS / NO BEATS (dominance) / INCONCLUSIVE / groupée par horizon.TestDryRunEndToEnd:run_pipelinesur log-RV synthétique écrit un JSON valide.Notes
Le payload JSON (résultats du sweep réel) est gitignoré (
**/scripts/results/) :les chiffres du verdict vivent dans ce body, pas dans un fichier commité. Le
fichier est au chemin
MyIA.AI.Notebooks/QuantConnect/ML-Training-Pipeline/results/btc_head2head_patchtst_itransformer.json.