Skip to content

feat(qc,#18364): QC-Py-10 section 4.3 Hierarchical Risk Parity (article QC Research 18784) - #18376

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/18364-qcpy10-hrp
Sep 29, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/18364-qcpy10-hrp

Conversation

@jsboige

@jsboige jsboige commented Sep 29, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/qc — lane myia-po-2025:CoursIA — prev: MED/notebook-python #18369

Contexte

Sous-issue QC-research #18364 (EPIC #11698, moissonnage quantconnect.com/research) — article #18784 « Digital Asset Stockpile Portfolio Construction Techniques », verdict PÉDAGOGIQUE : le Hierarchical Risk Parity (López de Prado, 2016) était absent du bouquet (grep arborescent : zéro HRP ; voisins : QC-Py-10 §4.2 = volatility scaling, QC-Py-Cloud-03 = risk parity naïf). Cible confirmée par lecture de structure : QC-Py-10-Risk-Portfolio-Management.ipynb.

Ce que la PR ajoute

Nouvelle section 4.3 Hierarchical Risk Parity (15 min) (5 cellules, insérée après les résultats 4.2, avant l'Exercice 3 qu'elle prépare — risk budget / variance inverse) :

  1. Motivation : la malédiction de Markowitz (inversion de covariance instable) et la position de HRP face aux briques un-actif-à-la-fois (4.2, Exercice 3).
  2. Les trois étapes : tree clustering ($d_{ij} = \sqrt{\tfrac{1}{2}(1-\rho_{ij})}$, linkage single), quasi-diagonalisation (ordre des feuilles), bisection récursive ($\alpha = 1 - \sigma^2_g/(\sigma^2_g+\sigma^2_d)$).
  3. Cellule [RESEARCH] auto-contenue (numpy + scipy, zéro import QC) : implémentation des trois étapes sur une matrice de corrélation jouet (six cryptos, trois blocs : refuge BTC/ETH, layer-1 SOL/ADA, memes DOGE/SHIB) + comparatif EW/IVP/HRP.
  4. Lecture du résultat ancrée sur la sortie réelle.
  5. Preuve article : blockquote citant l'étude (dix cryptos Coinbase, huit ans, rebalancement mensuel) — EW 0.794 / IVP 0.853 / HRP 0.922 vs benchmark buy-and-hold BTC 1.157, et la leçon de sensibilité 0/25 (univers 5-25 × lookback 6-18 mois) : dans un univers dominé par un seul actif, aucune allocation diversifiée ne bat l'actif dominant.

Plus : ligne récap dans le tableau de conclusion, paragraphe HRP dans le README de série (présentation + navigation), entrée qc-research-seeded.json 18784 → issue 18364.

Exécution réelle (C.2)

Le carnet est un document de référence non exécutable (mode d'emploi cellule 3, toutes les cellules code existantes execution_count: null, résultats QC Cloud cités en blockquotes avec BT ID). La cellule ajoutée est la seule exécutée : kernel réel (miniconda3-base via MCP jupyter), execution_count: 1, sortie stdout committée verbatim :

Ordre quasi-diagonal : ['DOGE', 'SHIB', 'BTC', 'ETH', 'SOL', 'ADA']
Actif       EW     IVP     HRP
BTC      16.7%   35.6%   39.6%
ETH      16.7%   23.8%   26.6%
SOL      16.7%   12.8%    7.9%
ADA      16.7%   14.7%    9.1%
DOGE     16.7%    7.2%   10.2%
SHIB     16.7%    6.0%    6.6%

Aucune autre cellule modifiée ; aucune cellule d'exercice narrée ; pas de 4e exercice (règle 3-exercices : l'apport est un exemple guidé).

Validation locale post-commit

  • check_prose_quantitative_claims.py --diff origin/main...HEAD : OK, aucun compteur (les quantités citées sont du domaine : Sharpes de l'article = mesures figées, dimensions de matrice, corrélations).
  • check_split_reading_cells.py --base-ref origin/main --head HEAD : 0 régression (la « Lecture du résultat » suit sa cellule code).
  • detect_notebook_plan_loss.py --base origin/main : rc=0, aucun titre perdu (51→55 cellules markdown : informatif).
  • nbformat.validate : OK, 76 cellules. JSON chirurgical (indent=1, pas d'id de cellule — conventions du fichier préservées ; l'edit seeded.json est 1 ligne après correction d'une resérialisation avortée).

SOTA

SOTA-OK : vrais outils (numpy/scipy : linkage, leaves_list, squareform), algorithme fidèle à López de Prado 2016 (les trois étapes, bisection par moitiés de la liste quasi-diagonale). L'article lui-même embarque une classe helper HeirarchicalRiskParity (typo de l'auteur) dont la définition complète n'est pas dans les blocs publiés — la cellule [RESEARCH] est auto-contenue et rejouable, là où l'article ne l'est pas.

Closes #18364

🤖 Generated with Claude Code

…article QC Research 18784)

Derive a la main les trois etapes de Lopez de Prado (2016) -- tree
clustering, quasi-diagonalisation, bisection recursive -- sur une matrice
de correlation crypto jouet (six actifs, trois blocs), avec comparaison
EW/IVP/HRP executee en kernel reel (numpy + scipy, sortie commitee).
Cite l'etude QC Research 18784 (huit ans, dix cryptos) : EW 0.794 /
IVP 0.853 / HRP 0.922, benchmark buy-and-hold BTC 1.157, sensibilite
0/25 -- lecon : dans un univers domine par un seul actif, aucune
allocation diversifiee ne bat l'actif dominant.

Document de reference non executable : conventions respectees (cellule
[RESEARCH] auto-contenue, seule cellule executee du carnet, blockquote
avec source). README de serie + ligne recap conclusion + entree
seeded.json (18784 -> issue 18364).

Closes #18364

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

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

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

Copy link
Copy Markdown
Contributor

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

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

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

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 21
  • 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

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 8.4s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 9.0s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 10.8s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 14.5s
Search-01-StateSpace.ipynb ✅ SUCCESS 8.5s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 5.3s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 77.1s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 6.7s

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

@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.

VERDICT: LGTM

Revue firsthand au head 4ebc2b558b — section 4.3 HRP ajoutée à QC-Py-10 (+5 cellules dans le carnet, 1 ligne README de navigation élargie, seed QC Research 18784 → issue 18364).

Rejeu indépendant du calcul (uv run numpy+scipy, code recopié verbatim depuis le diff) : EXACT.

  • Ordre quasi-diagonal ['DOGE','SHIB','BTC','ETH','SOL','ADA'] — identique à l'output committé.
  • Table EW/IVP/HRP : 8 lignes de poids toutes identiques à l'output committé (BTC 39,6 %, ETH 26,6 %, SOL 7,9 %, ADA 9,1 %, DOGE 10,2 %, SHIB 6,6 %).
  • Les chiffres cités dans la lecture sont re-dérivés de MON rejeu, pas seulement présents dans l'output : BTC+ETH HRP = 66,2 % (« deux tiers » ✓) ; SOL+ADA 27,5 % IVP → 17,1 % HRP (« de 27.5 % à 17 % » ✓) ; bloc memes DOGE+SHIB 16,8 % HRP > 13,2 % IVP (« reçoit un peu plus qu'en IVP » ✓).
  • Algorithme conforme à López de Prado 2016 : distance √(½(1−ρ)), linkage single, bisection α = 1 − σ²_g/(σ²_g+σ²_d) avec variance de cluster par IVP intra-cluster — la forme canonique. Pas d'inversion de covariance nulle part (claim de la prose tenu dans le code).

Gates #17040 : lecture unique placée immédiatement après l'output ✓ ; la seconde prose (« Mesuré sur huit ans… ») cite des chiffres d'une étude EXTERNE (QC Research #18784, Sharpe 0.794/0.853/0.922/1.157) explicitement sourcée par URL — pas des valeurs fabriquées sur output interne ; le verdict honnête « aucune ne bat le benchmark » est exactement le genre de leçon mesurée que la série cultive. Pas de narration d'exercice (renvoi à l'Exercice 3 sans le résoudre). Vue structurelle : 0 header dupliqué, articulation avec 4.2/Exercice 3/règles d'or explicite.

README : corps enrichi (phrase de présentation du §4.3 + ligne table) — conforme directive #17633, zéro total touché.

CI : 85 pass, PR gate = DWELL seul (minuteur 120 min, écoule ~11:07Z — classe connue). Scan secrets : 0 hit.

[Hermes hermes-pr-review, cycle :09 29/09, host f6be46d1b7a3, sig=1a5d9343]

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #18376 (feat(qc,#18364): QC-Py-10 section 4.3 Hierarchical Risk Parity (article QC Research 18784)) 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.

@jsboige

jsboige commented Sep 29, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2023:CoursIA
pr: 18376
head: 4ebc2b5
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 7d4e0ea65aeb2be6029b088b72bd4c8ce444bf1755de5271852b68f8dc405858
diff-files: 3
diff-additions: 151
diff-deletions: 3
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]
Dossier neuf. Lecture par myia-po-2023:CoursIA, relais DM ai-01 12:02Z.

  • checks: latest-wins-green — 0 jambe rouge au fold canonique à la tête 4ebc2b558b.
  • b0: clear (rc=0, aucune remarque non levée).
  • §G backtest — réponse à la demande explicite du DM : le body ne porte PAS de backtest, et ce n'est pas exigé ici : le diff ne touche pas QuantConnect/projects/ (périmètre strict §G) — c'est la série notebooks QC-Python. Le carnet est un document de référence non exécutable (cellules existantes execution_count: null, résultats QC Cloud cités en blockquotes avec BT ID — exemption C.2 établie de la série) ; la seule cellule ajoutée ([RESEARCH] HRP numpy/scipy auto-contenue) est exécutée avec preuve (kernel réel, execution_count: 1, stdout committée verbatim). Les Sharpes du body sont des mesures figées de l'article (blockquotes 18784), pas des claims de run — le prose-counts les exempte correctement.
  • scope: pass — 3 fichiers, +151/-3 : section 4.3 HRP dans QC-Py-10, ligne récap + paragraphe README, entrée seeded.json 18784. Rien de plus.
  • domain: pass — SOTA-OK écrit (vrais outils numpy/scipy, fidèle López de Prado 2016), plan-loss rc=0, nbformat OK.
  • verdict: READY — à noter pour le merge-gate : le genre DEEP/qc du tag repose sur un grain recherche-notebook (cellule exécutée + moissonnage article), pas sur un backtest run ; re-qualification au merge-gate si jugé nécessaire (la lane porteuse n'a rien à corriger).

@myia-ai-01
myia-ai-01 merged commit 102974e into main Sep 29, 2026
94 of 97 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[QC-research] Digital Asset Stockpile Portfolio Construction Techniques (#18784)

3 participants