Skip to content

feat(qc,#19825): DynamicVIXSpyRegime mesuré NO BEATS, VIX lu avec un jour de décalage - #19838

Merged
myia-ai-01 merged 2 commits into
mainfrom
feature/19825-dynvix-mesure
Oct 8, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
feature/19825-dynvix-mesure

Conversation

@jsboige

@jsboige jsboige commented Oct 8, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/qc -- lane myia-po-2024:CoursIA-3 -- prev: DEEP/qc #19780

Closes #19825. See #19709. Fait partie de #19821.

Ce que la PR livre

Mesure préinscrite de projects/DynamicVIXSpyRegime-QC (protocole et règle de verdict fixés dans #19825 avant tout calcul), et correction d'une lecture du futur mise au jour par cette mesure.

Empreintes sha256 du main.py (fins de ligne LF) : mesuré 252e491b1d2c (tous les runs, mode passé en paramètre) ; livré 84aa849c02e9. Seuls le défaut de mode (base → lag) et le commentaire d'en-tête diffèrent.

Constat : le VIX était lu le jour même

La classe CBOE datait chaque ligne du CSV à son jour de bourse sans heure de fin. Lean livre une donnée personnalisée à son heure de début : la clôture du VIX de D était visible dès D 00:00, et CheckSignal (D 10:00) décidait sur elle. Le mode lag date chaque ligne du lendemain (Time = jour de bourse + 1 jour) ; une colonne tradeday garde le jour de bourse pour les compteurs.

Compteur base lag
Décisions dont la dernière ligne VIX lue est du jour même 2894 / 2894 0 / 2894
Entraînements mensuels dont le VIX finit après SPY 139 / 139 2 / 139

Les 2 entraînements résiduels sous lag ne sont pas expliqués (hypothèse non vérifiée : jours où le CSV porte une ligne et SPY aucune barre).

Résultats (2015-01-02 → 2026-07-08, 2893 séances)

Sharpe à taux sans risque nul sur la valeur à chaque clôture (série shadow).

Run Sharpe CAGR Pire baisse Rotation / an Frais / an (part du portefeuille) Sharpe QC Ordres
lag 0,7986 10,07 % −30,86 % 30,7 0,24 % 0,463 3830
base 0,7728 9,62 % −30,24 % 30,7 0,25 % 0,436 3927
spy 0,8193 13,69 % −33,65 % 0,09 0,00 % 0,544 2
sixty40 0,8723 8,83 % −21,17 % 0,28 0,01 % 0,459 223
orig (base, 2015-01-01 → 2024-12-31, hors verdict) 0,6987 8,52 % −30,24 % 30,0 0,26 % 0,394 3386

Verdicts (bootstrap circulaire par blocs de 21 séances, 10 000 tirages, graine 18921, Holm sur 2 références) :

Candidate Réf. Écart de Sharpe IC 95 % p brute p Holm Sous-périodes 2015-18 / 2019-22 / 2023-26
lag spy −0,0207 [−0,2989 ; +0,3112] 0,5294 1,00 +0,198 / −0,255 / +0,181
lag sixty40 −0,0737 [−0,3186 ; +0,2220] 0,6571 1,00 +0,083 / −0,245 / +0,137
base spy −0,0464 [−0,3148 ; +0,2619] 0,5994 1,00 +0,247 / −0,218 / −0,022
base sixty40 −0,0995 [−0,3471 ; +0,1898] 0,7225 1,00 +0,132 / −0,209 / −0,067
  • base : NO BEATS (les deux différences négatives, aucune significative).
  • lag : NO BEATS (idem). C'est ce verdict qui porte le registre.
  • Frais doublés et grille : non lancés, la règle ne les prévoyait que pour une candidate significative.
  • base − lag (descriptif, hors Holm) : −0,0258 [−0,1572 ; +0,1004], p 0,665 ; sous-périodes +0,049 / +0,036 / −0,203. La lecture du jour même n'apportait aucun avantage mesurable.
  • Corrélations hebdomadaires : lag 0,86 avec spy, 0,89 avec sixty40 ; base 0,98 avec lag.

orig contre les chiffres du README. Sur la fenêtre du code, main.py ne reproduit ni le 0,97 / 23,83 % / −22,09 % de research.ipynb, ni la revendication de la bibliothèque. Le notebook mesure une autre règle : VIX déjà décalé d'un jour (vix_c[i-1], cellule 7), exposition brute 1,5 (cellule 7), Sharpe avec un taux sans risque de 4 % (calculate_metrics(..., risk_free=0.04), cellule 5). Le notebook n'est pas modifié : seule la prose du README qui le présentait comme la référence de main.py est corrigée.

Autres sources de données personnalisées datées au jour de la ligne, sans heure de fin

Relevées comme le prévoyait #19825, non corrigées par cette PR :

Vérification

  • python -m py_compile main.py OK ; compilation QC OK pour le code mesuré.
  • Essais courts (2015-01-01 → 2015-06-30) base et lag lancés avant les runs longs : instrumentation et compteur vérifiés.
  • Résultats lus seulement à completed: true pour les 7 backtests.
  • check_prose_quantitative_claims.py --diff : aucun compteur quantitatif en prose.

Traces

  • Projet QC de mesure : 37502473. Backtests : probe-base e0ef6b98, probe-lag e6c9895a, base 7513020b, lag defc7716, spy 1b7a8384, sixty40 62c84a51, orig 88bedf9b.
  • Statistiques, graphiques, journaux d'ordres et résultats d'analyse hors dépôt : G:\Mon Drive\MyIA\IA\QC-traces\19825-dynamicvix\ (results_base.json, results_lag.json, code de métriques à la tête eadde577e459).

🤖 Generated with Claude Code

…with a one-day lag

Pre-registered measure (#19825), QC Cloud 2015-01-02 -> 2026-07-08:
- the CBOE custom data class had no end time, so the VIX close of day D was
  delivered at D 00:00 and read by CheckSignal at 10:00 (2894/2894 decisions,
  139/139 trainings); new mode `lag` dates each row on the next day;
- verdict NO BEATS for both `base` and `lag` against SPY held and 60/40
  (Holm p 1.00); base - lag Sharpe -0.026 [-0.157; +0.100], descriptive;
- default mode becomes `lag`, as the protocol provided;
- README (FR + EN) and registry line updated; research.ipynb figures are
  documented as a different rule (lagged VIX, gross 1.5, rf 4 %).

Measured code sha256 (LF) 252e491b1d2c, delivered 84aa849c02e9 (default
mode and header comment only).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 8, 2026
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19838 (feat(qc,#19825): DynamicVIXSpyRegime mesuré NO BEATS, VIX lu avec un jour de décalage) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

…mesure

# Conflicts:
#	docs/qc/qc-strategies-status.md
@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19838
head: 7be50dd
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 10c396037ccbcf638e13afa27d7a5c9740463a02e1cd69e5f6cd743612d8fca0
diff-files: 4
diff-additions: 247
diff-deletions: 41
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19838
organ-rc: 0
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19838
head: 7be50dd
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 7dbaebce129005b11a4d2cf114ea10eb43719a525f50f873e136a8a9ae2a9ffe
diff-files: 4
diff-additions: 247
diff-deletions: 41
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19838
organ-rc: 0
[/ADJOINT PREFLIGHT]

@myia-ai-01

myia-ai-01 commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

[DEEP DEROGATION] lane myia-ai-01:CoursIA — merge d'une PR Grain: DEEP sur le dossier du secrétariat, tête 7be50dd7.

Motif : le dossier de domaine de l'adjoint (myia-po-2025:CoursIA-2) ne peut pas être posé, car le dossier du secrétariat occupe déjà le gate et l'outil de dépôt réserve le re-stamp à la lane qui l'a posé. Or le geste de merge exige ce dossier de domaine pour un DEEP. Le correctif d'outillage est suivi par #19922.

Le jugement de domaine est fait. L'adjoint a vérifié de première main à cette tête : 38/38 jambes vertes, B.0 rc=0, tableau §G complet (Sharpe, CAGR, pire baisse), verdict NO BEATS honnête, empreintes sha256 de la mesure et du livrable citées. La tête est inchangée depuis cette vérification. La dérivation live du gate rend READY.

@myia-ai-01
myia-ai-01 merged commit 048ccef into main Oct 8, 2026
38 of 43 checks passed
myia-ai-01 pushed a commit that referenced this pull request Oct 8, 2026
…e pour un DEEP sur READY secretariat (#19964)

La garde merge refuse un DEEP dossiere par le secretariat (#19612) et
l'anti-double-stamp refusait le dossier de domaine de l'adjoint qui
devait le remplacer : le DEEP sur dossier secretariat etait impostable
(mesure sur #19801 et #19838). Le rc 0 admet desormais le re-stamp d'une
lane qualifiee quand la PR porte Grain: DEEP, le dossier intact tient du
secretariat, et la refutation est explicite (supersedes + supersedes-why)
-- le gate juge la refutation comme pour le rc 3 (#19420, #18934).

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[QC] DynamicVIXSpyRegime-QC : mesurer main.py contre SPY et 60/40, VIX lu le jour même ?

2 participants