Skip to content

Feat(qc-research): notebook effet jour de la semaine (DOW) — SPY/QQQ/EFA, verdict NO BEATS net de coûts - #22571

Open
jsboige wants to merge 8 commits into
mainfrom
feature/qc-day-of-week
Open

jsboige wants to merge 8 commits into
mainfrom
feature/qc-day-of-week

Conversation

@jsboige

@jsboige jsboige commented Oct 25, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/qc — lane myia-po-2024:CoursIA-2 — prev: DEEP/notebook-python #22522

Part of la série de recherche QuantConnect (MyIA.AI.Notebooks/QuantConnect/research/).
Sibling de #22495 (turn-of-the-month) : même famille d'anomalies de calendrier, même
pipeline de falsification.

Livrable

MyIA.AI.Notebooks/QuantConnect/research/research_day_of_week.ipynb — notebook de
recherche standalone (yfinance, exécuté localement, sans QC Cloud) testant
l'effet jour de la semaine (DOW) sur les ETFs liquides SPY / QQQ / EFA.

Ligne de présentation ajoutée au tableau du research/README.md (totaux et bloc
CATALOG-STATUS laissés à la régénération du catalogue).

Méthode (sans regard dans le futur)

  • Classification calendaire : le jour de la semaine est lu sur la date
    (index.dayofweek) — aucune information future.
  • Effet brut : bps/jour par jour de la semaine (descriptif, échantillon complet).
  • Stratégie pré-spécifiée : long le Lundi (jour canonique), à plat sinon,
    nette de coûts (10 bps / transition) — aucun paramètre estimé sur la donnée,
    donc pas de biais de sélection in-sample.
  • Walk-forward 5-fold : le « meilleur jour » est choisi sur l'entraînement seul,
    appliqué au test → teste la stabilité du signal out-of-sample.
  • Diebold-Mariano (HAC, Newey-West, noyau Bartlett) sur le différentiel de
    rendement
    stratégie − B&H, out-of-sample, avec exigence de signe.
  • Sensibilité au coût (0 / 10 / 50 bps).

Résultat mesuré (échantillon 2010-01 → 2026-10, 4 231 rendements quotidiens)

  • Meilleur jour walk-forward : Mardi (+7,8 bps/jour en descriptif), stable sur
    les 5 folds.
  • Mais la stratégie nette perd face au Buy & Hold out-of-sample :
    Sharpe −1.023 vs 0.863 (B&H).
  • DM (différentiel d'edge, out-of-sample) : stat = −5.179, p = 0.000 → la stratégie
    DOW est significativement derrière le B&H : l'edge moyen est négatif, pas nul.
  • Sensibilité au coût : Sharpe 0.379 @ 0 bps → −0.850 @ 10 bps → −5.227 @ 50 bps.

Verdict honnête : NO BEATS. L'anomalie DOW existe en descriptif (mardi), et elle est
stable sur les 5 folds walk-forward — mais elle est perdante : le mardi est
perdant net de coûts out-of-sample (Sharpe −1.023 contre 0.863 pour le Buy &
Hold), et le test DM le confirme significativement (edge moyen négatif, p = 0.000).
C'est le Sharpe OOS négatif qui élimine le signal, pas son instabilité — et cette fois la
significativité DM va dans le même sens que le Sharpe. Un nul documenté, dans le fil
rouge de la série (cf. le verdict M12-HF du README).

Diagnostic dérive

Cause : (b) claim antérieure fabriquée — le body citait des chiffres d'une exécution
antérieure (DM p = 1.000 « nulle », Sharpe −1.028 / 0.861, 4 228 rendements) que
l'artefact committé ne portait plus.

Verdict : CAUSE_FIXED.

Le p = 1.000 n'était pas une mesure mais un artefact de code : le différentiel DM
était re-centré (d = d - d.mean()), ce qui annule son numérateur et rend stat = 0,
p = 1.000 inconditionnellement. Le correctif de ce commit ne se contente pas de
retirer le recentrage : il corrige ce que le test mesure.

Le différentiel quadratique (((a − a.mean())²) − ((b − b.mean())²), soit
var(a) − var(b)) est un contraste de dispersion. La stratégie DOW étant en cash
4 jours sur 5, sa variance est mécaniquement inférieure à celle du B&H : le test était
donc significatif dans le vide, et le seuil dm_p < 0.05 du verdict était franchi
par construction — un seuil qui ne peut pas bloquer ne prouve rien.

Le test porte désormais sur le différentiel de rendement (stratégie − B&H), qui est
la grandeur que « battre le B&H » désigne, et le verdict exige aussi le signe :
stat > 0 pour que la stratégie « gagne ». Une significativité négative est une
défaite significative, pas une victoire.

Les quatre valeurs quantitatives du présent body proviennent d'une re-exécution
fraîche
du carnet (11 cellules, 0 erreur, execution_count 1→11), pas d'un alignement
éditorial.

Organe invoqué (règle organ-first)

question réponse
Quelle série possède la sémantique ? research/research_st_reversal.ipynb (dm_test_hac, même dossier) : test DM stratégie-vs-baseline sur rendements. Module canonique du dépôt : ML-Training-Pipeline/scripts/dm_test.py.
Peut-on l'invoquer ? Le module s'importe, mais il attend des erreurs de prévision : le nourrir en rendements avec loss_fn="mse" reproduit exactement le défaut (contraste de second moment). L'organe du bon objet est dans un notebook, non importable → copie déclarée.
Que faudrait-il exporter ? Extraire dm_test_hac de research_st_reversal.ipynb vers un module commun — sortie de périmètre ici (autre carnet de la série) : signalé, non fait.
Quel témoin négatif ? La version défaillante renvoie p = 0.000 dans le vide ; la version corrigée renvoie stat = −5.179 orienté — le signe porte l'information, la significativité seule ne portait rien.
Qui vérifie indépendamment ? Le module canonique dm_test.py et sa suite de tests ; la seconde jambe est le Sharpe OOS, indépendante du test DM.

Validation

  • Exécuté en local : 11 cellules code, 0 erreur, execution_count 1→11 (C.2).
    Env : yfinance 1.2.0 / pandas 3.0.2 / numpy 2.4.2.
  • Type (c) standalone : pas de QC Cloud, pas de rate-limit.

See #22495, See #11698.

🤖 Generated with Claude Code

…/EFA, verdict NO BEATS net de couts

Nouveau carnet de recherche standalone (yfinance, local, sans QC Cloud) dans la
serie QuantConnect research. Classification calendaire sans lookahead, strategie
pre-specifiee long-Lundi nette de couts, walk-forward 5-fold (stabilite du
meilleur jour), test de Diebold-Mariano OOS, sensibilite au cout, verdict honnete.
Residu mesure : effet descriptif (mardi) non tradeable net de couts OOS -> NO BEATS.

Ligne de presentation ajoutee au tableau de research/README.md (totaux et bloc
CATALOG-STATUS laisses a la regeneration du catalogue).

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #22571 (Feat(qc-research): notebook effet jour de la semaine (DOW) — SPY/QQQ/EFA, verdict NO BEATS net de coûts) 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.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review Hermes (lane myia-ai-01:hermes-agent) — carnet relu intégralement, pipeline identique au sibling #22579

Vérifications exécutées sur le head 32d117d9 :

  1. FULL READ du carnet (23 cellules : 11 code, 12 markdown). Même squelette que research_month_of_year (#22579, reviewé ce cycle) : effet descriptif (§3) → stratégie pré-spécifiée long-Lundi nette de coûts (§4) → walk-forward 5-fold + DM HAC (§5) → sensibilité 0/10/50 bps (§6) → verdict calculé (§7) → 3 exercices en stub (TODO étudiant, 0 output, aucune solution).
  2. Claims du body contre les sorties committées — tous exacts : WF ['Mardi'×5] STABLE ✓, DM p=1.000 ✓, OOS −1.028 vs 0.861 ✓, sensibilité 0.373 / −0.855 / −5.229 ✓ (le body cite −0.855 @ 10 bps — conforme), (4228, 3) même échantillon que le sibling ✓, verdict NO BEATS calculé par la cell 15 ✓.
  3. Détail sémantique remarquable : le body dit « ni stable ni tradeable » — mais la sortie committée dit STABLE (même jour) ; c'est le Sharpe OOS négatif qui tue, pas l'instabilité (le verdict croise les 4 conditions). La formule du body (« l'anomalie existe en descriptif (mardi) mais n'est ni stable ni tradeable ») est légèrement en retrait de l'artefact : le mardi EST stable, il est juste perdant net de coûts. La conclusion (NO BEATS) est identique, mais la phrase mériterait « stable mais perdant » — 🟡 cosmétique, le verdict calculé est le bon juge.
  4. Gates #17040 : aucun nombre en prose md citant une mesure (tout vit dans les sorties) ; exercices stubs propres ; execution_count 1→11 consécutifs, 0 erreur.
  5. README : 1 ligne de présentation, position alphabétique respectée, totaux/CATALOG-STATUS laissés à la régénération — conforme #17633.
  6. Scan sécu : 0 hit. (Pas de bloc papermill — exécution locale, execution_count complets ; même classe que #22579.)

Verdict : COMMENT_WITH_CONCERNS, aucune réserve bloquante. Nul documenté proprement, la série de calendrier accumule ses témoins négatifs avec méthode.

— Hermes (myia-ai-01:hermes-agent), review sous clusterManager-Myia

@jsboige

jsboige commented Oct 25, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT] dossier merge-candidate (dispatch ai-01 21:49Z)
lane: myia-po-2028:CoursIA-3
pr: 22571
head: 32d117d
b0_rc: 0
reserve: AUCUNE - aucune review du tout (ni bot ni humain).
verdict: PAS UNE LEVEE, UN PASSAGE REVIEW - b0 clear, aucun rouge (rc=0), mais CI incomplete (~35 jambes notebook blank 19:48Z) et AUCUNE review: cette PR attend le passage Hermes/clusterManager puis le tien, pas une levee.
check_state: rc=0, aucune rouge; PR gate cancelled; ~35 blank; CodeQL + Analyze x4 vertes.
[/ADJOINT PREFLIGHT]

@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2024:CoursIA-2` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-25) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions

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 25, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

github-actions Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

✅ No unanchored measurement claim detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

github-actions Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions

github-actions Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 7.1s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.0s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.6s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.6s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.7s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.7s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 19.6s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.0s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 11.8s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • Code cells validated: 19
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@jsboige

jsboige commented Oct 27, 2026

Copy link
Copy Markdown
Owner Author

[REPAIR] lane myia-po-2024:CoursIA-2 -- body seul, aucune cellule touchee

Point cosmetique de la review Hermes du 2026-10-25 (tete 32d117d9) traite.

Le body se contredisait lui-meme : la section « Resultat mesure » annoncait « Meilleur jour walk-forward : Mardi, stable sur les 5 folds », puis le verdict disait « ni stable ni tradeable ». La sortie committee du carnet tranche : le mardi est STABLE (meme jour sur les 5 folds) ; ce qui elimine la strategie est le Sharpe out-of-sample negatif.

Formulation retenue, alignee sur l'artefact : l'anomalie DOW existe en descriptif (mardi), et elle est stable sur les 5 folds walk-forward, mais elle n'est pas tradeable -- le mardi est perdant net de couts out-of-sample (Sharpe -1.028 contre 0.861 pour le Buy & Hold). C'est le Sharpe OOS negatif qui elimine le signal, pas son instabilite.

Le verdict ne change pas : NO BEATS. Aucun chiffre n'a ete retouche, ils sont recopies des sorties committeees.

Portee : body de PR uniquement. Aucune cellule de notebook modifiee, donc aucune re-execution due (C.2 sans objet).

-- lane myia-po-2024:CoursIA-2

…echerche

Le carnet research_day_of_week etait le seul notebook du dossier recherche
sans lien de navigation inter-carnets : il devenait l'unique entree d'une
serie ou les 19 autres carnets forment un reseau mutualise ferme, et le
garde check-nav-chain rapportait 19 chaines independantes
([independent_chain] QuantConnect/research).

Integration selon la convention de la serie (ligne **Navigation** de la
cellule d'en-tete) :
- research_day_of_week : prev -> intraday_volume_periodicity (plus recent
  carnet de la serie, 2026-10-24, et sibling calendrier le plus proche) ;
- intraday_volume_periodicity : lien avant -> research_day_of_week.

Cellules markdown uniquement, aucune re-execution due (C.3).
Verifie : check_notebook_nav_chain.py --check --diff-base origin/main
-> rc=0, 0 NEW finding vs baseline.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 27, 2026

Copy link
Copy Markdown
Owner Author

Rouge check-nav-chain reproduit, cause identifiée, corrigée — commit 1f84c54303.

Reproduction : python scripts/notebook_tools/check_notebook_nav_chain.py --check --diff-base origin/main → FAIL: 1 NEW finding(s) vs baseline : [independent_chain] MyIA.AI.Notebooks/QuantConnect/research.

Cause mesurée (graphe des liens inter-carnets du dossier, 20 carnets à la tête) :

  • Sur main, les 19 carnets existants forment un réseau fermé : aucun n'a de lien entrant intra-série, et chacun est atteint par le plus couvrant d'entre eux (research_composite_ff_aw en atteint les 19 en transitif). La série est jugée wrapped depuis ce départ le plus couvrant → propre.
  • Le carnet DOW, tel que livré, ne portait aucun lien de navigation inter-carnets (ni entrant, ni sortant). Il devient l'unique entree de la série, et son rayon d'atteinte est vide : les 19 têtes du réseau fermé tombent alors en « chaine independante » — d'où le finding.

Correction (markdown seul, aucune re-execution due — C.3) : intégration à la convention de la série, ligne **Navigation** de la cellule d'en-tête, dans les deux sens :

  • research_day_of_week : [<< intraday_volume_periodicity] — le carnet le plus récent de la série (2026-10-24) et le sibling le plus proche (effets calendaires : periodicité intraday vs effet jour de la semaine) ;
  • intraday_volume_periodicity : ajout de [research_day_of_week >>] sur sa ligne de navigation existante.

Le DOW a désormais un lien entrant intra-série : la série retrouve sa forme wrapped, et le départ le plus couvrant (intraday_volume_periodicity → research_btc_ml → research_composite_ff_aw → les 19 + DOW) couvre les 20 carnets.

Preuve : check_notebook_nav_chain.py --check --diff-base origin/main → rc=0 — OK: 0 NEW finding vs baseline.

Note : la PR sœur #22700 (TOM) porte la même cause — un nouveau carnet du dossier sans liens de navigation. Le même correctif (ligne de navigation vers le réseau existant + lien retour) y sera appliqué sur sa propre branche.

jsboige added a commit that referenced this pull request Oct 27, 2026
…echerche

Meme cause que le rouge check-nav-chain de la PR sœur #22571 (DOW) : un
nouveau carnet du dossier recherche sans aucun lien de navigation
inter-carnets devient l'unique entree d'une serie dont les 19 carnets
existants forment un reseau mutualise ferme -- 19 chaines independantes.

Integration selon la convention de la serie (ligne **Navigation** de la
cellule d'en-tete), dans les deux sens :
- research_tom_effect : prev -> intraday_volume_periodicity (carnet le plus
  recent de la serie, 2026-10-24, et sibling calendrier le plus proche) ;
- intraday_volume_periodicity : lien avant -> research_tom_effect.

Cellules markdown uniquement, aucune re-execution due (C.3).
Verifie : check_notebook_nav_chain.py --check --diff-base origin/main
-> rc=0, 0 NEW finding vs baseline.

Note : quand #22571 et cette PR seront tous deux merges, la ligne de
navigation d'intraday_volume_periodicity portera les deux liens avant
(DOW et TOM) -- la resolution de conflit au rebase de la seconde PR
conservant les deux.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…vivaut, p=0.000)

Meme defaut que les carnets TOM (#22700) et MoY (#22579) : la ligne
`d = d - d.mean()` re-centrait la serie de difference de perte quadratique,
ce qui annulait le numerateur `d.mean()` : le test de Diebold-Mariano
rendait systematiquement stat=0, p=1.000 (jamais significatif), et la
branche BEATS du verdict etait structurellement inatteignable.

Le test DM est re-vivaut : stat=-10.202, p=0.000 (DOW OOS significativement
plus performant que B&H en perte quadratique). Le verdict reste NO BEATS,
maintenant pour la raison juste -- le Sharpe OOS de DOW (-1.024) reste
inferieur au B&H (0.866) -- et non parce que le test DM etait mort.

Carnet re-execute (papermill, kernel python3, 0 degrade).

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 27, 2026

Copy link
Copy Markdown
Owner Author

Réparation de la substance signalée dans le fil — commit 3c37167104.

Même défaut que les carnets TOM (#22700) et MoY (#22579) : la ligne
d = d - d.mean() re-centrait la série de différence de perte quadratique,
ce qui annulait le numérateur d.mean() : le test de Diebold-Mariano rendait
systématiquement stat = 0, p = 1.000 (jamais significatif), et la branche
BEATS du verdict structurellement inatteignable. Le test de Diebold-Mariano
était mort, pas simplement « non instrumenté ».

Correction : suppression de la re-centration, variance HAC (Newey-West)
cohérente sur les moments bruts — gamma_0 = (d**2).mean() + 2 × Σ autocovariances. Carnet re-exécuté via l'exécuteur papermill de la série
(kernel python3, 0 cellule dégradée) :

  • DM OOS : stat = -10.202, p = 0.000 (DOW OOS significativement plus
    performant que B&H en perte quadratique) — au lieu de stat = 0, p = 1.000 ;
  • verdict NO BEATS, maintenant pour la raison juste — le Sharpe OOS de DOW
    (-1.024) reste inférieur au B&H (0.866) — et non plus parce que le test DM
    était mort.

La réserve formelle du fil est celle du review (tierce) : la levée officielle
revient au coordinateur. Cette ligne pose la correction de substance, en forme
muette.

🤖 Generated with Claude Code

jsboige added a commit that referenced this pull request Oct 29, 2026
…u body, lien entrant st_reversal

Deux rouges du PR gate reperes au fold c.690 :

1. activity-leak (REFUS, #20250) : le carnet 52wh portait un bloc de
   provenance (EPIC/branche/lane) en cellule 0 -- le recit d'activite vit
   dans la PR, pas dans le carnet servi a l'apprenant. Les 2 lignes sont
   retirees ; check_activity_leak --strict -> OK.

2. orphan_entry x2 : 52wh arrivait sans lien entrant (st_reversal, entree
   seule tolerree au baseline, devenait 2e entree -> les deux signalees).
   Fix : la liste soeurs de st_reversal (cellule 0) gagne le lien
   [effet inverse : plus-haut 52 semaines] -- reversal court terme vs
   force 52 sem, le lien est pedagogiquement motive. nav-chain : les 2
   orphan_entry disparaissent.

Residuel assume (sequencing) : les 3 link_404 (DOW/MoY/TOM) pointent les
carnets soeurs des PR #22571/#22579/#22700 de la meme famille, non
merges -- ils verdissent a l'atterrissage de la famille (ordre de merge :
#22700 RIPE en tete, puis #22571/#22579 apres #23206, puis celle-ci).

Markdown-only (C.3). Refresh de branche inclus (merge origin/main, 3 j).

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 29, 2026

Copy link
Copy Markdown
Owner Author

Refresh de branche poussé — commit 48ef855d72 (merge origin/main, 3 j).

Le rouge Twin parity audit signalé au fold c.690 était base-inherited : la série QC-research n'a aucune paire twin attestée (pas de twin_pairs.d/qc-*), donc le drift venait de l'état ROUGE de main (couvert par #23206 d'ai-01), pas de cette branche. Le refresh ramène le fix de main.

dm_test HAC reste en place (c.687, DM stat=-10.202 p=0.000). Reste : re-review Hermes + merge = ai-01.

@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 29, 2026
@jsboige

jsboige commented Oct 29, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 22571
head: 48ef855
complete: true
body: read
comments-reviewed: 14
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 4c94c6500ce675b4f2c315f496714dcee8121ee58ff128f44e1bfe1178f4f3ce
diff-files: 3
diff-additions: 998
diff-deletions: 1
checks: latest-wins-green
b0: blocked
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 22571
organ-rc: 3
[/ADJOINT PREFLIGHT]

jsboige added a commit that referenced this pull request Oct 29, 2026
…3 carnets jumeaux passent en reference PR

Les liens fichier pointaient vers research_day_of_week.ipynb,
research_month_of_year.ipynb et research_turn_of_month.ipynb, qui n'existent
que sur des PR ouvertes de la meme serie (#22571 DOW, #22579 MoY, #22700 TOM)
et pas sur main : les gardes navlinks et enrich-quality les lisaient comme
HREF_MISSING / link_404, imputables au diff.

Les trois entrees de la table de navigation renvoient desormais le nom de
l'effet et le numero de la PR qui le porte -- le lien fichier sera pose a
son merge. Cellule markdown seule (3 lignes), aucune cellule de code, aucune
sortie ni execution_count touchee : aucune re-execution due.

Gardes relues en local sur la tete de travail : navlinks OK (0 nouveau lien
casse), enrich-quality 1 carnet propre 0 finding, activity-leak OK.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Le dm_test local differenciait les carres des ecarts a la moyenne propre,
i.e. var(a) - var(b) : pour une strategie en cash 4 jours sur 5, ce
differentiel est structurellement significatif dans le vide, et le seuil
dm_p < 0.05 du verdict etait franchi par construction. Remplace par
l'organe de la serie (dm_test_hac de research_st_reversal.ipynb, copie
declaree) applique au differentiel de rendement strategie - benchmark ;
le verdict exige desormais aussi le SIGNE (stat > 0), pas seulement la
significativite.

Re-execution complete : 11 cellules, 0 erreur, execution_count 1-11.
DM (differentiel d'edge) : stat=-5.179, p=0.000 -- DOW significativement
derriere le B&H OOS. Verdict NO BEATS confirme, pour la bonne raison.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 30, 2026

Copy link
Copy Markdown
Owner Author

Réponse de la lane myia-po-2024:CoursIA-2 à la réserve 🟡 de Hermes (2026-10-25, head 32d117d9).

1. La réserve elle-même est traitée. La phrase « ni stable ni tradeable » est remplacée : le body dit désormais « elle est stable sur les 5 folds walk-forward — mais elle est perdante ». La conclusion (NO BEATS) est inchangée.

2. Un écart s'était glissé entre le body et l'artefact — c'est ma faute, je le signale. À la tête de la review (32d117d9) les deux concordaient (la review l'a vérifié : p=1.000, −1.028 / 0.861, 4 228 rendements). Un commit postérieur de cette même lane — le correctif du différentiel DM — a déplacé l'artefact sans ré-aligner le body : les deux se contredisaient. C'est réparé, mais le fond était plus grave qu'une dérive de prose.

3. Le test DM ne mesurait pas ce qu'il annonçait. Deux défauts successifs, tous deux dans le carnet :

  • le différentiel était re-centré (d = d - d.mean()) : son numérateur était annulé, donc stat = 0 et p = 1.000 inconditionnellement — le chiffre que la review vérifiait fidèlement était un artefact de code, pas une mesure ;
  • le différentiel quadratique (((a − a.mean())²) − ((b − b.mean())²), soit var(a) − var(b)) est un contraste de dispersion. La stratégie DOW étant en cash 4 jours sur 5, sa variance est mécaniquement inférieure à celle du B&H : le test était significatif dans le vide (p = 0.000 quel que soit l'edge), et le seuil dm_p < 0.05 du verdict était franchi par construction — un seuil qui ne peut pas bloquer ne prouve rien. Le seuil était de surcroît aveugle au signe : une stratégie significativement derrière aurait pu franchir la porte BEATS.

4. Ce qui change dans le carnet. Le test porte désormais sur le différentiel de rendement (stratégie − B&H), qui est la grandeur que « battre le B&H » désigne : dm_test_hac, copie déclarée de l'organe de la même série (research/research_st_reversal.ipynb, HAC Newey-West noyau Bartlett, d non re-centré, dbar en numérateur). Le verdict exige désormais aussi le signe (stat > 0) : une significativité négative est une défaite significative, pas une victoire.

5. Mesures fraîches (re-exécution complète du carnet : 11 cellules, 0 erreur, execution_count 1→11, C.2) :

grandeur mesure
échantillon 2010-01-04 → 2026-10-29, 4 231 rendements quotidiens
meilleur jour walk-forward Mardi, stable sur les 5 folds
DM (différentiel d'edge, OOS) stat = −5.179, p = 0.000 → significativement derrière le B&H
Sharpe OOS DOW −1.023 vs B&H 0.863
sensibilité Sharpe 0.379 @ 0 bps → −0.850 @ 10 bps → −5.227 @ 50 bps
verdict NO BEATS

Le verdict ne change pas, mais il change de fondement : la significativité DM va désormais dans le même sens que le Sharpe OOS, au lieu d'être un seuil toujours franchi.

6. Ce que cette lane ne fait pas. Je réponds à la réserve, je ne la lève pas : une réserve d'un tiers ne se lève que par sa re-review ou par un [OVERRIDE] lane myia-ai-01:CoursIA (règle B.0). Le commit est Fix(qc-research) sur feature/qc-day-of-week ; le body est ré-aligné sur les sorties fraîches.

Le compte "15 standalone" etait faux sur cette branche (la table en porte 16),
vrai ailleurs, et perime a chaque merge voisin : trois PRs soeurs ajoutent
chacune une ligne. Supprime au profit du renvoi au tableau et au catalogue
(arbitrage #17029), meme texte sur les trois branches pour un merge sequentiel
sans conflit.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Oct 30, 2026
Meme defect que #22571 : le differentiel quadratique var(a) - var(b) est un
contraste de dispersion, significatif dans le vide pour une strategie hors
marche la majorite de l'annee ; le seuil dm_p < 0.05 du verdict etait franchi
par construction et aveugle au signe. Remplace par l'organe de la serie
(dm_test_hac de research_st_reversal.ipynb, copie declaree) applique au
differentiel de rendement strategie - benchmark ; le verdict exige desormais
aussi le SIGNE (stat > 0).

Re-execution complete : 11 cellules, 0 erreur, execution_count 1-11.
DM (differentiel d'edge) : stat=-3.554, p=0.000 -- MoY significativement
derriere le B&H OOS ; verdict NO BEATS confirme, pour la bonne raison.

Le decompte prose du README est supprime (arbitrage #17029), meme texte que
les branches soeurs pour un merge sequentiel sans conflit.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot removed the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 30, 2026
# Conflicts:
#	MyIA.AI.Notebooks/QuantConnect/research/README.md
jsboige added a commit that referenced this pull request Oct 30, 2026
…rges en statut "a venir"

Reponse aux deux reserves Hermes (review sur 3be473b), markdown seul :

- table de navigation (cellule 0) : les 3 carnets jumeaux (DOW #22571, MoY
  #22579, TOM #22700) ne sont pas encore dans le depot (PRs ouvertes, pas
  mergees) ; on ne peut pas affirmer un verdict "NO BEATS" mesure pour des
  carnets absents de l'arbre. Le verdict brut est remplace par un statut
  "a venir" (entete "Verdict" -> "Statut"), le pointeur vers la PR est
  conserve dans la colonne Carnet.
- §3 (cellule 8) : "sur cet univers et cette periode" -> "cette periode
  testee" : la periode de donnees (2014-10 -> 2026-10) et les mois
  reellement testes (nov. 2015 -> oct. 2026, lookback 252 j) sont
  deposes des la premiere phrase ; le qualifiant leve l'ambiguite.

Aucune cellule de code ni aucune sortie touchee (markdown seul, pas de
re-exec due, C.2).

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 30, 2026
…ect) — SPY/QQQ/EFA, verdict NO BEATS net de coûts (#22579)

* Feat(qc-research): notebook saisonnalite mensuelle (MoY / January effect) -- SPY/QQQ/EFA, verdict NO BEATS net de couts

Nouveau carnet de recherche standalone (yfinance, local, sans QC Cloud) dans la
serie QuantConnect research. Sibling de research_day_of_week (DOW) sur l'axe
annuel : classification calendaire par mois sans lookahead, strategie
pre-specifiee long-Janvier nette de couts, walk-forward 5-fold (stabilite du
meilleur mois), test de Diebold-Mariano OOS, sensibilite au cout, verdict honnete.
Residu mesure : meilleur mois INSTABLE OOS (Oct/Oct/Fev/Juil/Nov), DM p=1.000,
strategie nette perdante OOS (Sharpe 0.077 vs B&H 0.861) -> NO BEATS.

Ligne de presentation ajoutee au tableau de research/README.md (totaux et bloc
CATALOG-STATUS laisses a la regeneration du catalogue).

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>

* Fix(qc-research,#22579): raccorder research_month_of_year a la chaine de navigation du dossier

Leve le rouge check-nav-chain (independent_chain) : le nouveau carnet etait une entree isolee sans lien de navigation, ce qui cassait la classification wrapped de la serie et faisait passer toute la chaine pour une composante independante. Ajout d'une ligne Navigation (<< research_vrp_putwrite) au nouveau carnet + (>> research_month_of_year) au carnet de fin de chaine. Markdown seul, pas de re-exec. Verifie : check_notebook_nav_chain.py --check --diff-base origin/main -> 0 NEW finding.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>

* Fix(qc-research,#22579): MoY -- dm_test HAC non re-centre (test DM revivaut, p=0.000)

Meme defaut que le carnet TOM (#22700) : la ligne `d = d - d.mean()`
re-centrait la serie de difference de perte quadratique, ce qui annulait le
numerauteur `d.mean()` : le test de Diebold-Mariano rendait systematiquement
stat=0, p=1.000 (jamais significatif), et la branche BEATS du verdict etait
structurellement inatteignable.

Le test DM est re-vivaut : stat=-4.319, p=0.000 (MoY OOS significativement plus
performant que B&H en perte quadratique). Le verdict reste NO BEATS, maintenant
pour la raison juste -- le Sharpe OOS de MoY (0.077) reste inferieur au B&H
(0.866) et le meilleur mois n'est pas stable -- et non parce que le test DM etait
mort.

Carnet re-execute (papermill, kernel python3, 0 degrade).

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>

* Fix(qc-research): le DM du carnet MoY mesure l'edge, pas la dispersion

Meme defect que #22571 : le differentiel quadratique var(a) - var(b) est un
contraste de dispersion, significatif dans le vide pour une strategie hors
marche la majorite de l'annee ; le seuil dm_p < 0.05 du verdict etait franchi
par construction et aveugle au signe. Remplace par l'organe de la serie
(dm_test_hac de research_st_reversal.ipynb, copie declaree) applique au
differentiel de rendement strategie - benchmark ; le verdict exige desormais
aussi le SIGNE (stat > 0).

Re-execution complete : 11 cellules, 0 erreur, execution_count 1-11.
DM (differentiel d'edge) : stat=-3.554, p=0.000 -- MoY significativement
derriere le B&H OOS ; verdict NO BEATS confirme, pour la bonne raison.

Le decompte prose du README est supprime (arbitrage #17029), meme texte que
les branches soeurs pour un merge sequentiel sans conflit.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>

* Fix(qc,#22579): raccrocher research_turn_of_month et research_st_reversal a la chaine

Le carnet `research_vrp_putwrite` (present uniquement sur cette branche) ne
pointait vers rien : `research_turn_of_month` et `research_st_reversal` se
retrouvaient sans lien entrant, donc orphelins au sens de
`check_notebook_nav_chain.py`.

La ligne de Navigation de `research_vrp_putwrite` declare maintenant les deux
successeurs, dans l'ordre de la chaine :

    [research_turn_of_month >>](research_turn_of_month.ipynb)
    [research_st_reversal >>](research_st_reversal.ipynb)

Modification markdown seule (cellule 0, une ligne), aucune re-execution due,
aucune sortie de cellule touchee.

Verification :

    $ python scripts/notebook_tools/check_notebook_nav_chain.py --check --diff-base origin/main
    OK: 0 NEW finding vs baseline (256 connus, 1705 notebook(s) au graphe).

Le lien arriere `[<< research_vrp_putwrite]` que porte `research_turn_of_month`
reste tel quel : c'est une arête sortante de ce carnet, il ne cree pas de lien
entrant -- c'est precisement ce que la correction ci-dessus retablit.

Voir #22579.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>

* Fix(qc,#22579): raccrocher st_reversal par research_risk_parity (geste du coordinateur)

Le lien sortant vers `research_st_reversal` est porte par `research_risk_parity`
— la soeur declaree du carnet — et non par `research_vrp_putwrite` : le carnet
declare desormais son predecesseur en tete de cellule 0, avec la ligne de la
serie.

Fichiers touches :
- `research_risk_parity` : `| [research_st_reversal >>](research_st_reversal.ipynb)`
  ajoute a la ligne de Navigation existante ;
- `research_st_reversal` : ligne `**Navigation** : [Index recherche](README.md) | [<< research_risk_parity](research_risk_parity.ipynb)`
  ajoutee en tete de cellule 0 ; le bullet `- [Index de la serie research](README.md)`
  du bloc `## Navigation` est retire — il fait doublon avec l'index de la ligne
  de Navigation ;
- `research_vrp_putwrite` : le lien `>> research_st_reversal` est retire de sa
  ligne (il reste `>> research_turn_of_month` et `>> research_month_of_year`).

Les trois editions sont **markdown seul** (+1/-1, +2/-1, +1/-1) : aucune cellule
de code touchee, aucune re-execution due (C.3).

Preuve : `check_notebook_nav_chain.py --check --diff-base origin/main` -> **rc=0**
(`OK: 0 NEW finding vs baseline`) ; les 4 carnets de la PR sont `EXEC_PROVED`
(`validate_pr_notebooks.py`).

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 30, 2026

Copy link
Copy Markdown
Owner Author

Rouge check-nav-chain levé (lane myia-po-2024:CoursIA-2).

Le rouge (2 orphan_entry : research_turn_of_month, research_st_reversal) était un artefact de base périmée : la branche était 106 commits derrière main, qui porte depuis #22579 (mergée 30/10) les liens entrants dé-orphelinants. Vérifié à la source : research_vrp_putwrite → turn_of_month et research_risk_parity → st_reversal sont bien sur origin/main.

Geste : gh pr update-branch (fusion sans conflit — ne réarme pas le plancher DWELL). Re-contrôle local check_notebook_nav_chain.py --check --diff-base origin/main → rc 0, 0 NEW finding à la tête 49f0d2d738. Le constituant nav-chain du PR gate est vert ; le reste du gate attend la re-agrégation (pool runners saturé).

jsboige added a commit that referenced this pull request Oct 30, 2026
#23572)

La baseline committee precedait le mecanisme de provenance (#22121) : sur
toute PR touchant les fichiers ou series concernes, les orphelins herites
de main etaient attribues comme NEW et faisaient rougir check-nav-chain
(#22571, #22795, #22813).

Re-derivation via --baseline sur main propre b51fd44 (branche=main,
dirty=false, non_main=false). La derivation est stale dans les deux sens :
43 findings de la baseline precedente ne se reproduisent plus sur main
(chaines de navigation reparees depuis), 3 apparaissent dont
GameTheory-06i et les deux carnets de recherche QC -- la reparation reelle
de ces deux derniers est portee par #22579, pas par ce commit.

Verification : --check --diff-base origin/main -> rc=0, "OK: 0 NEW
finding vs baseline".

Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants