Apple Microsoft NVIDIA ASML JPMorgan HSBC LVMH TSMC Tencent Lilly Reliance Tesla

TradFi Tracker — Le Momentum des Marchés Mondiaux

NLP + PRICE MOMENTUM · ACTIONS US + EUROPE + ASIE + ÉMERGENTS · HISTORIQUE 15 ANS · BENCHMARK SPY 33 ANS · LIVE DATA
secteurs
actions mondiales
13 places boursières
Live · Yahoo Finance (13 places boursières)
MAJ

Live data Prix : Yahoo Finance (toutes places boursières) Now UTC · Donnée UTC

Marchés

Tableau de bord — Live

Indicateurs clés actualisés depuis le cache RSS (10 sources) et CoinGecko.

Classement complet — thèmes sectoriels mondiaux

👇 Juste en-dessous : 12 boutons régions cliquables. Par défaut toutes actives (score global). Clique sur une région pour la désactiver (la chip devient pâle) — le score momentum de chaque thème est recalculé en temps réel sur le sous-ensemble d’actions restant. Exemple : décoche US pour voir quels secteurs surperforment le S&P 500 hors actions américaines. Les boutons “tout/aucun” à droite permettent un reset rapide. Clique sur un chip ticker pour ouvrir TradingView.

Régions · toutes

Lecture

Un secteur en tête du classement signale une rotation active du capital vers ce thème sectoriel. L’approche momentum privilégie une exposition aux 3-5 meilleurs secteurs, à condition que le filtre tendance S&P 500 soit favorable (S&P 500 au-dessus de sa MA200). Clique sur Historique sur n’importe quelle carte pour zoomer (7j/30j/90j/6M/1A/2A/max). Les actions affichées (triées par market cap décroissante) sont les constituants du secteur.

Momentum des secteurs dans le temps

4 manières de lire la rotation sectorielle : Lignes — superposition classique (survole une légende pour isoler une courbe) · Heatmap — chaleur par période, secteurs triés par momentum relatif vs S&P 500 ↓ · Top 3 — leadership hebdomadaire (qui était sur le podium à chaque fenêtre) · Grille — un mini-graphe par secteur, échelle partagée. Mesure : momentum glissant 30j ou 90j, ou performance cumulée base 100. Historique jusqu’à 15 ans via Yahoo Finance (mcap-pondéré time-varying sur tous les tickers du panier).

Rotation des secteurs — Approche momentum

4 vues complémentaires · indice mcap-pondéré sur tous les tickers
Vue
Mesure
Plage

Lignes — superposition classique

Toutes les courbes sectorielles superposées, base 100 ou momentum glissant. Survole une légende pour isoler une courbe (les autres se grisent). Top 6 affichés par défaut, les autres masqués (clique légende pour révéler).

Heatmap — chaleur par période

Une cellule = la perf d’un secteur sur une période donnée. Vert intense = surperforme · Rouge intense = sous-performe. Slider d’intensité pour ajuster l’échelle. Survole une cellule pour la valeur exacte + le rang.

Top 3 — podium hebdo

À chaque fenêtre temporelle, qui était dans le top 3 ? Visualise l’évolution du leadership (rotation entre secteurs) et la durée du règne d’un secteur en haut. Idéal pour repérer les transitions de cycle.

Grille — small multiples

Un mini-graphe par secteur, échelle partagée pour comparaison directe. Avantage : on voit chaque secteur sans encombrement, et on identifie d’un coup les retournements de tendance sectoriels.

Comment l’utiliser

Détecter une rotation : regarde Top 3 — si le podium change rapidement (3 secteurs différents en 4 semaines), tu es en phase de transition. Confirmer un trend : passe en Lignes ou Grille — un secteur en hausse continue 3+ mois indique un thème durable. Comparer ampleur : Heatmap + slider d’intensité — quels secteurs sont vraiment dominants vs marginaux. Toujours croiser avec le score composite (onglet Classement) pour valider.

Classement complet — thèmes · score composite momentum

Tri par score décroissant. Scoring Alpha ZEN adapté TradFi (v2) : 3 sous-scores normalisés en percentiles (0-100). Momentum relatif vs S&P 500 90j (55%) — mesure si le secteur surperforme réellement le marché actions ; Breadth 30j (22.5%) — confirme un mouvement large sur les actions du secteur ; Momentum court terme 7j+30j (22.5%) — réactivité / timing. Le poids news (anciennement 10%) a été retiré : signal RSS trop fragile (baseline vide → accel plafonné).

Régions · toutes

Score composite par secteur

Décomposition empilée : vs S&P 500 (55%) / breadth (22.5%) / prix court (22.5%) · tri par rang

Tableau détaillé — Signal & métriques momentum

Signal LONG/FLAT · Durée du régime · Momentum relatif vs S&P 500 · Breadth · Perf 30j
# Secteur Score Signal Durée vs S&P 500 90j Breadth Perf 30j Mcap (B$)

Comment lire ce classement

Cible principale : secteurs avec signal LONG ET rel-S&P 500 90j positif ET breadth ≥ 60% — les 3 conditions réunies = vrai secteur en tendance, pas un rebond isolé. La Durée indique depuis combien de jours le secteur est dans son régime actuel : ≤ 15j = cycle jeune (entrée anticipée possible), 15-60j = cycle mature (momentum confirmé), ≥ 90j = cycle vieillissant (surveiller le retournement). Secteur FLAT = index sous MA50 ou breadth dégradée → ne pas y être exposé même si le score reste correct par inertie.

Matrice Sector × Region — où va l’argent ?

Chaque ligne = un secteur, chaque colonne = une région. La cellule affiche la perf 30j mcap-pondérée des actions du secteur dans cette région. Régions triées de la plus chaude (gauche) à la plus froide (droite). Secteurs triés par momentum global. Lecture : la cellule en haut-gauche = l’intersection optimale. = top 5 cellules · ·1 = une seule action dans la cellule (faible robustesse statistique). Une cellule vide en gris foncé = aucune action du secteur dans cette région ; une cellule colorée affiche toujours sa perf (l’intensité de la couleur reflète l’ampleur).

Heatmap momentum — secteurs × 13 régions

Vert = surperformance · Rouge = sous-performance · Survole cellule = sparkline 7/30/90j · Clic cellule = liste des stocks (triés par contribution à la perf) · Clic drapeau région = détails de toute la colonne · Clic nom secteur = détails toutes régions · Shift+clic drapeau = isoler la colonne

Matrice de corrélation — diversification réelle vs illusoire

Coefficient de corrélation de Pearson entre les rendements quotidiens. Bleu foncé = bougent ensemble (diversification illusoire) · Rouge foncé = anti-corrélés (vrai hedge naturel) · Gris ≈ décorrélés. Le mode Excess vs S&P 500 (par défaut) soustrait la performance du marché à chaque retour quotidien — il révèle les vrais clusters sectoriels indépendants du facteur “marché”, vs le mode Returns bruts qui mesure surtout le bêta-marché commun (tout monte ensemble en bull → corrélations gonflées).

Filtrer Tri Taille

Heatmap corrélation — secteurs (-1 = anti-corrélé · +1 = identique)

Survole une cellule = crosshair sur ligne + colonne · Clic sur un nom = verrouille la croix et zoome sur ce secteur · Labels collants pendant le scroll

🔗 Top corrélations positives — diversification illusoire

Paires avec corrélation > 0.75 = quasi-équivalentes : les détenir ensemble = pari concentré déguisé.

🛡️ Top anti-corrélations — vrai hedge naturel

Paires avec corrélation < 0 = se compensent dans les drawdowns. Diversification authentique.

Distribution des corrélations dans le temps

Streamgraph montrant combien de paires se trouvent dans chaque tranche de corrélation. Bande bleu foncé qui gonfle = marché qui converge (stress, tout bouge ensemble) · Bande orange/jaune qui domine = régime de rotation, vraie diversification disponible · Bande rouge en bas = paires anti-corrélées (vrais hedges naturels).

Fenêtre

Lecture de la matrice

Une cellule bleu foncé (≥ 0.85) = les deux indices répliquent quasiment le même mouvement. Détenir les deux = surexposition. Une cellule rouge (≤ -0.15) signale un comportement opposé — utile pour hedger un risque concentré.

Pic de corrélation = stress

Quand la corrélation moyenne dépasse 0.7, le marché est en mode risk-off : tout descend ensemble (mars 2020, oct 2022, avril 2025). Les hedges normalement décorrélés cessent de marcher. À surveiller comme indicateur de panique.

Application pratique

Pour bâtir un panier diversifié : viser des paires avec corrélation < 0.5. Combiner secteurs cycliques + défensifs, ou régions hors cycle US. Si la matrice ne montre plus de paires < 0.5 → marché en convergence, alléger les paris dérivés.

Corrélation moyenne par régime — ALPHA vs ZEN

Comparaison des corrélations en mode bull (S&P 500 > MA200) vs bear (S&P 500 < MA200) sur l’historique embarqué. Une corrélation plus haute en ZEN confirme que la diversification s’effondre dans les drawdowns.

Méthode de calcul (transparence)

Secteurs : on utilise l’indice mcap-pondéré déjà calculé par fetch_tradfi.py pour chaque thème (top-1 proxy par market cap). Rendements = log-returns sur dates communes. Régions : on construit en live un indice mcap-pondéré pour chaque zone à partir des actions du panier (toutes histoires embarquées dans tradfi_cache.json, ~15 ans avec downsampling tiered : daily 0-2A, hebdo 2-10A, tri-hebdo 10-15A). Les actions sans historique ou avec < 20 points sont exclues. Rolling : moyenne des n×(n-1)/2 paires calculée sur fenêtre glissante (30/60/90/180j) à pas hebdomadaire — la valeur affichée à la date t utilise la fenêtre [t-w, t].

Méthodologie — L’approche momentum expliquée

Comment le Tracker identifie les secteurs et zones géographiques qui surperforment vraiment le marché, dans quel sens les suivre, et quand en sortir. Aucune API payante, tout est gratuit (Yahoo Finance + RSS), local et transparent.

Pourquoi un tracker à deux axes ?

Les marchés actions fonctionnent par rotations à deux niveaux. Niveau 1 — les rotations sectorielles : en 2023 c’était l’IA et les Mag 7, en 2024 les banques européennes et l’énergie, en 2025 le lithium, les REITs et les mineurs d’or, en 2026 le nucléaire & SMR, les semi-conducteurs IA et la robotique. Niveau 2 — les rotations géographiques : le S&P 500 a dominé 2023-2024, le Nikkei 225 a rattrapé début 2025, le Hang Seng a bounce fin 2025, le Nifty 50 monte structurellement depuis 2023. Chaque cycle dure 1 à 6 mois, puis le capital migre. L’enjeu n’est pas de “choisir le bon stock”, c’est d’être dans le bon secteur ET la bonne géographie au bon moment. Cet outil s’inspire de l’approche Alpha ZEN de Thami Kabaj, adaptée au TradFi : rester positionné mécaniquement sur ce qui surperforme le S&P 500, sortir dès que le momentum relatif casse, ne jamais deviner — suivre le signal.

Rigueur méthodologique. 801 tickers · 13 places boursières · 24 devises mappées · FX par jour historique (jamais d’anchor unique) · normalisation GBp London · dédup ADR/local · indices mcap-weighted dynamiques avec shares historiques · clip ±30%/barre vs erreurs de données · 33 ans d’historique SPY embarqués pour le benchmark relatif. Tous les choix sont auditables ci-dessous.

Architecture — 1 axe (thèmes) + filtre régions dynamique

Un seul axe logique : les thèmes sectoriels (AI & Semi, Défense, Nucléaire, Luxe…). Chaque action porte son attribut région (US, Europe, UK, Japon, Chine, Corée·Taïwan, Inde, Australie, ASEAN, Moyen-Orient, LatAm, Canada, Afrique). Un filtre régions en haut du classement permet de garder un sous-ensemble d’actions ; le score momentum est recalculé en temps réel côté navigateur sur le sous-ensemble. Plus d’index géographiques figés type “Nikkei 225 core” : l’utilisateur compose lui-même sa vue régionale.

1
41 thèmes sectoriels mondiaux — un ticker = un thème canonique
Chaque thème est un panier de 10 à 80 leaders mondiaux du secteur, toutes places boursières confondues (NYSE, NASDAQ, LSE, Euronext, XETRA, Tokyo, Hong Kong, Taipei, Seoul, NSE Mumbai, São Paulo, Tadawul Riyad, ASX Sydney…). Tout est converti en USD via les taux FX du jour. Règle clé : un ticker appartient à un seul thème canonique (TSMC → AI & Semi; Toyota → Auto & EV; Moutai → Luxe mondial) pour éviter la dilution du signal.

Couverture actuelle~820 tickers définis sur 39 thèmes (les anciens « Banques US / Europe / Asie » sont désormais un seul secteur Banques — la géographie est portée par l’axe Région). Les paniers les plus denses : Banques (65), AI & Semi-conducteurs (42), Pharma mondial (41), Industriels (38), Auto & EV (31), Conso défensive (30), Pétrole & Gaz (28), Assurance (27), Cloud & SaaS (22), Asset Managers & Bourses (21).

2
Attribut région — 12 zones mappées par ticker
Chaque action porte un champ region déterminé par (1) son suffixe Yahoo Finance quand il existe (.T → Japon, .HK/.SS/.SZ → Chine, .AX → Australie, etc.), ou (2) un override manuel pour les ADR US-listed dont l’exposition économique est ailleurs (BABA = Chine, TSM = Corée·Taïwan, PBR = LatAm, NVO = Europe, BHP = Australie, etc.).

13 régions disponiblesUS · Europe continentale · China incl. HK+Shanghai+Shenzhen · Japan · UK · Korea·Taïwan · India · Canada · Australia · LatAm · ASEAN — Singapour/Indonésie/Malaisie/Thaïlande/Philippines · Middle_East — Arabie Saoudite/EAU · Afrique — Afrique du Sud (AngloGold, Gold Fields…).

Cas limites gérés manuellementLes ADR et dual-listings sont assignés à leur pays d’exposition économique, pas à leur place de cotation. Shell (SHEL NYSE) → UK · Alibaba (BABA NYSE) → China · Petrobras (PBR NYSE) → LatAm · Novo Nordisk (NVO NYSE) → Europe · BHP (NYSE ADR + .AX) → Australia. Sans cette règle, tous les ADRs pollueraient la région US.

3
Filtre régions dynamique — recalcul Alpha ZEN complet côté navigateur
C’est la vraie valeur ajoutée du modèle. Au-dessus du classement, 13 chips US · Europe · UK · Japon · Chine · Corée·Taïwan · Inde · Australie · ASEAN · Moyen-Orient · LatAm · Canada · Afrique. Par défaut toutes actives (score = valeurs serveur global). Dès qu’on décoche une région : Pour chaque thème : 1. Filtrer tokens → garder uniquement ceux dans régions actives 2. Recalculer perf_7d / perf_30d mcap-weighted sur le sous-ensemble 3. Recalculer breadth_30d = % tokens filtrés avec perf_30d > 0 4. Rebuilder l’index secteur mcap-weighted (histoires 15 ans embarquées, downsamplées) 5. Calculer perf_90d de cet index filtré - perf_90d(SPY) = rel_mom_90d 6. Rank-normalize [rel, breadth, price] sur les 39 thèmes 7. Score = 0.55×rel + 0.225×breadth + 0.225×price (news désactivé en v2)

Exemple concretJe décoche tout sauf Europe + UK. Pour le thème AI & Semi (32 tickers), seuls restent : ASML, Infineon, STM, ARM. Le recalcul donne un rel_mom_90d très différent de la version globale (l’Europe a peu de leaders IA). Le thème perd son top rank. À l’inverse, Pharma mondial filtré Europe+UK remonte dans le top (Roche, Novartis, Novo Nordisk, AZN, GSK, Sanofi pèsent lourd et sont en tendance).

Pourquoi embarquer toutes les histoires 15 ans dans le JSONPour pouvoir recalculer l’index mcap-weighted d’un sous-ensemble arbitraire sans refetch, il faut que le navigateur dispose des séries prix de chaque ticker. Le JSON tradfi_cache.json contient un bloc histories = {ticker → [(ts, price_USD), …]} avec downsampling tiered (~450 points / ticker : daily 0-2A, hebdo 2-10A, tri-hebdo 10-15A). Le SPY benchmark est lui embarqué sur ~33 ans (spy_longhist) pour le graphe régimes ZEN/ALPHA. Chargé une fois, cache navigateur.

4
Cas d’usage — lire la rotation sur deux dimensions simultanément

Rotation sectorielle pure : toutes régions actives → le classement montre quels secteurs dominent globalement (vue Alpha ZEN standard).

Rotation régionale via un secteur : filtre Asie uniquement → le top montre quels thèmes surperforment le S&P 500 parmi les actions asiatiques (utile pour détecter la rotation vers l’Asie avec granularité sectorielle).

Chasser une idée précise : filtre LatAm + décoche tout le reste → je vois immédiatement que Pétrole & Gaz (Petrobras) domine et Métaux & Mines (Vale) aussi, pendant que Banques (Itaú, Bradesco) est neutre. Cela valide/invalide ma thèse d’allocation LatAm en quelques clics.

Protection via l’inverse : décocher une région en souffrance (ex: Chine durant une vague de sanctions tech) pour voir le vrai momentum hors cette zone, sans bruit.

Principe
Suivre le momentum, pas le prédire
Signal-roi
Surperformance vs S&P 500 90j
Horizon
Rebalance hebdomadaire
Protection
Mode ZEN si S&P 500 < MA200
Le pipeline en un coup d’œil

Les données brutes passent par 7 étapes pour devenir un classement actionnable. Chaque étape est explicitée plus bas.

Prix liveYahoo · 13 places · 23 devises
FXconversion USD par jour
Histoiresjusqu’à 15 ans, daily
Momentumrel-SP500 · breadth
SignalLONG / FLAT
Filtre S&P 500ALPHA / ZEN
Étape par étape
1
Price momentum court terme — pondéré par market cap
Ce qu’on fait : pour chaque secteur, on récupère les prix des actions constitutives via Yahoo Finance, toutes places boursières confondues (NYSE, NASDAQ, LSE, Euronext Paris, XETRA Frankfurt, SIX Swiss, Tokyo, Hong Kong, NSE India, Amsterdam, Madrid, Milan, Copenhagen). Tout est converti en USD via les taux FX du jour pour que les secteurs multi-devises restent comparables. On calcule une moyenne pondérée par market cap des performances 7j et 30j. price_mom = 0.5 × perf_7d_mcapW + 0.5 × perf_30d_mcapW

Pourquoi mcap-weightedÉvite qu’une small cap qui fait +40% fausse le score d’un secteur dominé par des méga-caps. Pour “Big Tech & Électronique”, on veut que NVDA, AAPL, MSFT pèsent le plus — pas qu’un éventuel retail-trading-day fasse dévier le signal.

2
Momentum RELATIF vs S&P 500 (90j) — le signal-roi
Ce qu’on fait : pour chaque secteur, on récupère jusqu’à 15 ans d’historique daily (Yahoo Finance, avec fallback Stooq), on construit un index returns-based mcap-weighted (type S&P 500, avec clip ±30% par barre pour absorber les erreurs de données / splits mal détectés). On calcule la performance 90j de cet index, puis on soustrait la perf 90j du S&P 500 (ticker SPY, dividend-adjusted). C’est le vrai signal d’alpha. rel_mom_90d = perf_90d(sector_index) − perf_90d(S&P 500)

Pourquoi vs S&P 500 ?Un secteur à +10% sur 90j pendant que le S&P 500 fait +15% n’est pas en momentum — il underperforme. S’y positionner = perdre face au benchmark passif (SPY, VOO). Seul le relatif compte pour générer de l’alpha. C’est le cœur de la philosophie Kabaj : ne pas confondre “ça monte” avec “ça surperforme”.

Différence avec l’onglet CryptoDans le Narrative Tracker crypto, le benchmark est Bitcoin (la crypto de référence). Ici, c’est le S&P 500 (l’indice actions de référence). La philosophie est identique, seul le benchmark change — normal, puisque chaque écosystème a son indice “roi” contre lequel mesurer l’alpha.

3
Breadth — est-ce que le mouvement est large ?
Ce qu’on fait : pour chaque secteur, on compte le pourcentage d’actions dont la perf 30j est positive. C’est un indicateur de santé interne du panier. breadth_30d = (nb actions avec perf_30d > 0) / (nb actions total) × 100

Pourquoi c’est crucialUn secteur où 1 action fait +60% et 9 actions font -8% aura un price momentum mcap-weighted flatteur… mais c’est une concentration, pas une rotation sectorielle. Un vrai secteur en momentum a ≥ 60% de ses actions dans le vert (idéalement proche de 100% comme on le voit actuellement pour Métaux & Mines ou Fintech).

4
Score composite — pondération Alpha ZEN (v2) adaptée TradFi
Ce qu’on fait : chaque sous-métrique est convertie en percentile-rank sur 0-100 (les valeurs brutes ne sont pas comparables entre secteurs — rel_mom en %, breadth en fraction). Le rank normalise tout sur la même échelle. Agrégation finale : score = 0.55 × rank(rel_mom_90d) ← momentum relatif vs S&P 500 (cœur du signal) + 0.225 × rank(breadth_30d) ← largeur du mouvement (confirmation) + 0.225 × rank(price_mom_short) ← momentum 7j+30j (réactivité / timing)

Évolution du scoringv1 (initial) : 60% prix court / 30% news / 10% volume — court-termiste, sans force relative. v2 (actuel, Alpha ZEN) : 55% rel-S&P 500 90j + 22.5% breadth + 22.5% price_mom. L’axe news a été retiré (voir plus bas).

Pourquoi on a retiré le signal news Le tracker se basait jadis sur 10 flux RSS finance (Bloomberg, Reuters, FT, CNBC, Les Echos, Le Monde Éco, BFM, BCE, Fed, FMI) pour mesurer l’attention médiatique via le compteur mention_accel = (mentions 7j / moyenne 30j) − 1 clippé [−1, +3].

Trois problèmes rendaient ce signal inexploitable :
(1) Le cache RSS ne contient que ~100 articles macro récents → la majorité des secteurs ont 0 mention (aucune discrimination possible pour eux).
(2) Les 14 secteurs avec des articles ont quasi-tous accel = +3 (la valeur plafond) car passer de 0 à 1 article donne une acceleration infinie, clippée. Résultat : même valeur pour tous, signal nul.
(3) Les médias financiers réagissent après les mouvements de prix (les articles “Banques montent” suivent la hausse, ne l’annoncent pas) → double-comptage avec le price_mom si on gardait un poids non nul.

La philosophie Alpha ZEN pure est 100% prix/force-relative, donc retirer les news renforce la cohérence de l’approche sans perdre de signal exploitable.

5
Signal LONG / FLAT par secteur & suivi cyclique
Ce qu’on fait : au-delà du score continu, chaque secteur reçoit un signal binaire d’exposition — LONG (on y va) ou FLAT (on reste dehors). Le signal est activé si deux conditions sont réunies : signal = LONG SI index_secteur > MA50(index_secteur) ET breadth_30d > 50% signal = FLAT SINON On affiche aussi trend_age_days = depuis combien de jours le secteur est dans son régime actuel. Clé pour suivre les cycles sectoriels :

Lecture cyclique < 15 jours LONG : rotation fraîche, entrée anticipée possible, conviction à confirmer.
15-60 jours LONG : momentum mature, zone de confort, c’est ici qu’on capture la majorité de la perf sectorielle.
60-90 jours LONG : cycle bien installé, commencer à surveiller les signes de retournement.
≥ 90 jours LONG : cycle vieillissant, la bascule FLAT peut arriver à tout moment — stop-loss serré, prêt à pivoter.

6
Filtre tendance S&P 500 — le bouclier ZEN
Ce qu’on fait : toute la mécanique précédente ne sert à rien si le S&P 500 s’effondre (en bear market actions, tous les secteurs cycliques saignent ensemble). Le filtre global : SI S&P 500 > MA200j ET perf_30d > -3% → mode ALPHA (déployé sur top secteurs LONG) SI S&P 500 > MA200j ET perf_30d ≤ -3% → mode CAUTION (prudence, exposition réduite) SINON → mode ZEN (100% cash / bons du Trésor)

PhilosophieEn mode ZEN, peu importe quel secteur caracole en tête du classement — on reste en cash (ou en T-bills / money market). C’est l’anti-FOMO structurel : ne pas exposer le capital au risque actions quand la marée macro est baissière, même si un sous-secteur brille temporairement.

Construction des indices sectoriels — audit complet (v4)

Tout le pipeline est open et reproductible. Code source dans fetch_tradfi.py, caches dans ~/Library/Caches/site_crypto_finance/. Les choix méthodologiques ci-dessous reflètent l’état actuel après 4 itérations majeures (la v4 du 28 avril 2026 a corrigé 3 biais devises critiques détectés en audit : GBp London 100×, double-counting ADR/local, échec FX silencieux).

v4-1
Hygiène devises — 24 monnaies × 13 places, FX par jour, sans biais
La comparaison mcap-weighted entre secteurs n’a aucun sens tant que les prix de toutes les places ne sont pas exprimés dans la même unité (USD). Trois pièges classiques étaient présents et ont été corrigés.

① Bug GBp London (pence vs livre). Yahoo Finance quote la quasi-totalité des actions London Stock Exchange (LSE) en GBp (pence = 1/100 GBP), pas en GBP. Sans normalisation, HSBA.L à 880 pence (= £8.80) était reporté comme £880 → converti en $1118 USD au lieu de $11.85. Toutes les UK étaient 100× trop hautes. if symbol.endswith(‘.L’): price_local = price_local / 100 # GBp → GBP return apply_fx(price_local, ‘GBP’, date) Impact corrigé : Banques Europe, Pétrole & Gaz, Mines, Pharma, Luxe, Conso défensive — tous contenaient des UK leaders (HSBC, Shell, BP, AZN, Glencore, Diageo, Unilever, Reckitt, Burberry…) avec mcap totalement faussées.

② Double-counting ADR / listing local. Une entreprise comme TSMC a deux tickers cotés : TSM (ADR à NYSE) et 2330.TW (action ordinaire Taipei). Si les deux figurent dans le même panier, sa mcap pèse 2× — le panier “AI & Semi” gonflait artificiellement de +$2.1T (mcap réelle TSMC). Une table de dédup interne traite 20 paires connues : TSM, NTES, JD, BABA, BIDU, HMC, TM, SONY, NVO, NVS, AZN, SHEL, BP, UL, GSK, BHP, RIO, PBR, CNI, TCEHY → l’ADR US-listed est silencieusement écarté quand le listing local est aussi présent dans le même thème.

Vérification empiriqueLe total mcap “AI & Semi-conducteurs” est passé de $22.5T à $20.4T après ce fix — soit exactement la mcap TSMC qui était comptée deux fois. Idem dans Auto & EV (Honda HMC + 7267.T), Pharma (NVO×2), Média (NTES + 9999.HK), E-commerce (JD + 9618.HK).


③ Échec FX silencieux corrompant les prix. L’ancien code, en cas de rate-limit Yahoo sur une paire FX (ex: KRWUSD=X), retournait silencieusement le prix en devise locale en le labellant “USD”. Samsung à 222000 KRW apparaissait alors comme “$222 000 USD”. Les nouveaux protections : 1. fetch_fx_rates : 23 devises non-USD batch 2. Per-currency retry 3× avec backoff (8s / 20s / 32s) 3. Fallback cache persistant fx_rates_cache.json (4.5 MB) 4. Hard fail explicite si une devise reste manquante → run abandonné, ancien cache préservé → prévient toute corruption silencieuse

Devises couvertes (24)USD (282 stocks, ref) · EUR (Paris/XETRA/Amsterdam/Madrid/Milan/Helsinki/Bruxelles/Lisbonne/Dublin) · GBP-via-GBp (Londres) · CHF (SIX) · JPY (Tokyo) · CAD (Toronto) · AUD (ASX) · KRW (Seoul) · CNY (Shanghai/Shenzhen) · HKD (Hong Kong) · TWD (Taipei) · INR (NSE/BSE) · SGD (Singapour) · BRL (São Paulo) · MXN (Mexico) · NOK (Oslo) · SEK (Stockholm) · DKK (Copenhague) · AED (Abu Dhabi/Dubaï) · SAR (Tadawul) · MYR (Bursa) · THB (Bangkok) · IDR (Jakarta) · PHP (Manille).

A
Pondération time-varying (mcap dynamique)
Avant (bug v1) : chaque action portait son mcap actuelle comme poids fixe sur toute l’histoire. NVDA → 35% du basket “AI & Semi” en 2014 alors qu’elle ne pesait que 1% à l’époque.

Maintenant : à chaque date t, le poids du stock est weight(t) = price(t) × shares(t). Le panier s’auto-rebalance dynamiquement comme un vrai indice mcap-weighted (S&P 500 style). weight(stock, t) = price(t) × shares_outstanding(t) return_pondéré(t→t+1) = Σ ( weight_i × return_i ) / Σ weight_i index_level(t+1) = index_level(t) × (1 + return_pondéré)

EffetEn 2011, le panier “Big Tech & Électronique” reflète la réalité de l’époque : IBM 12%, MSFT 15%, AAPL 14%, ORCL 8%, INTC 10%, CSCO 5%, NVDA 0.9%. En 2026, il reflète la nouvelle réalité : NVDA 18%, AAPL 15%, GOOGL 15%, MSFT 11%, AMZN 9%.

B
Shares outstanding historiques + détection de splits
Pourquoi : sans donnée historique, shares = current_mcap / current_price est constant — ce qui sous-estime AAPL 2011 de ~40% (rachats) et sur-estime TSLA 2014 (dilutions).

Comment : on appelle yf.Ticker.get_shares_full(start, end) par ticker (rate-limited via threading × 8). On obtient ~quarterly granularité sur 5-15 ans selon le ticker. ~720/740 tickers couverts (les ~20 manquants sont essentiellement des IPOs récents ou des tickers étrangers à API limitée).

Détection des splits : yfinance retourne les shares non split-adjusted (AAPL 4.6B en 2019 → 18.4B post-split-2020). Sans correction, le produit price_split_adj × shares_brutes a un saut artificiel ×4 au split day. heuristique_split = (sh[i+1] / sh[i] >= 1.5) ET (gap_jours <= 60) La condition temporelle filtre les faux positifs (création Class C de GOOGL en 2014, M&A progressifs sur plusieurs trimestres).

Limitations résiduelles2 cas edge : GOOGL (création Class C 2014 = pseudo-split mal classé) et TSLA (multiples émissions secondaires 2014-2020) ont des shares passées légèrement off. Impact sur l’index agrégé minime car ces tickers restent < 20% de leur basket.

C
Dividendes ré-investis (auto_adjust=True)
Avant (v1) : auto_adjust=False donnait des prix split-adjusted mais pas dividend-adjusted. Conséquence : tabac (MO 7%, PM 5% div yield), REITs, Utilities, Pétrole — leur vraie performance totale était sous-estimée de 4-7%/an cumulé. Sur 15 ans, l’écart est massif.

Maintenant : auto_adjust=True. Les prix historiques deviennent total return implicite = ce qu’un détenteur ré-investissant ses dividendes aurait obtenu.

Validation empiriqueAvant le fix, “Tabac & Spiritueux” était hors top 10. Après : top 5 avec rel90 +21.9%. Idem REITs : passe de hors-classement à top 10 (+16.1% rel90). C’est leur vrai signal qui devient visible.

D
FX historique 15 ans + fallback

Avant : seuls 5 ans de taux FX étaient fetchés. Sur les périodes plus anciennes, les prix Samsung (KRW), Toyota (JPY), Vale (BRL), etc. restaient en monnaie locale → leur “mcap” en KRW dominait artificiellement les indices Asie sur 10-15 ans.

Maintenant : period=“max” sur les paires FX → ~16 ans de taux historiques. Pour les dates encore plus anciennes, fallback sur le taux le + ancien dispo (mieux que de garder la monnaie locale). apply_fx(prix_local, devise, ts) : rate = fx_rates[devise][ts] (ou nearest prior date) fallback : oldest available rate return prix_local × rate (en USD)

E
Indices régionaux : seuil de native-update
Bug détecté : les indices régionaux (Japon, ASEAN, etc.) étaient construits via union de toutes les dates de tous les tickers de la région avec forward-fill. Sur jours fériés Tokyo / typhons HK / Golden Week, certaines dates n’avaient que 1-2 tickers natifs avec mise à jour. Résultat : fake daily returns de ~0% qui diluaient massivement la corrélation Asie ↔︎ US/EU.

Fix : on n’émet un point d’index régional que sur les vrais jours de trading (≥30% des tickers OU ≥3 tickers avec mise à jour native, pas forward-filled). if native_count(ts) < max(3, 0.30 × n_tickers): skip

Effet attenduLa corrélation Japon ↔︎ US sur 15A devrait remonter de ~0.10 (artéfact) à ~0.4-0.5 (vrai signal economique : BoJ cycle indépendant, JPY safe-haven, mais corrélation matérielle à long terme).

F
Avertissement constituent overlap (cellules de corrélation)
Quelques tickers appartiennent à ≥ 2 narratifs par nature économique (et non par dual-listing) : MSFT/ORCL/IBM/CSCO dans Big Tech ET Cloud, AMZN dans Big Tech ET E-commerce, GOOGL/META dans Big Tech ET AI Software. Quand deux narratifs partagent des constituents, leur corrélation est partiellement mécanique (mêmes stocks → mêmes mouvements), pas purement économique.

Transparence : dans la matrice de corrélation, le tooltip affiche un warning orange quand deux narratifs partagent au moins 1 ticker : “N tickers partagés — corrélation partiellement mécanique”.

Note importanteL’overlap économique ci-dessus est différent du double-counting ADR/local (TSM + 2330.TW dans la même narrative) qui lui est traité séparément par la dédup automatique de la section v4-1.

G
Profondeur d’historique : 15 ans avec downsampling tiered
Avant : 5 ans daily fixes via yfinance period=“5y”.
Maintenant : period=“max” avec hard cap à 15 ans (HIST_MAX_DAYS = 15 × 365) pour limiter la taille du JSON. Downsampling intelligent par bande temporelle : Derniers 90 jours → daily (tous les points conservés) 90 jours → 2 ans → hebdomadaire (gap min 6 jours) 2 ans → 10 ans → bi-hebdomadaire (gap min 13 jours) 10 ans → 15 ans → tri-hebdomadaire (gap min 20 jours)

Couverture résultante96% des tickers couvrent 5 ans, 86% couvrent 10 ans, 79% couvrent 15 ans complets. Les IPOs récents (Coinbase 2021, ARM 2023, OKLO 2024) commencent à leur date d’introduction.

H
Limitations honnêtes (lecture obligatoire)

1. Survivorship bias non corrigé. Les paniers ne contiennent que les survivants 2026. Manquent : Lehman Brothers, Bear Stearns, Wachovia, Washington Mutual (banques 2008), Yahoo, Sun Microsystems, Nortel, BlackBerry (tech), Time Warner, Compaq. → L’index “Banques US 2008” affiche JPM/WFC en gagnants (qui ont racheté les morts), pas l’effondrement réel.

2. Anachronisme narratif. “AI & Semi 2011” est conceptuellement étrange — pas d’AI à l’époque, juste “Semiconductors”. Idem “Nucléaire & SMR”, “Quantum Computing”, “Space Economy” — narratifs récents (post-2020). Pour ces narratifs, “corrélation 15A” est un objet à lire avec recul.

3. Clip ±30%/bar. Safeguard contre erreurs de données (split mal détecté, prix corrompu) — un mouvement légitime > 30% sur une seule barre se fait clipper. Rare (Reddit-stocks type AMC) mais existe.

4. Timezone Asie. Tokyo ferme à 7h ET, NYSE à 16h ET — la corrélation même-jour mesure du décalé. Vraie corr Japan↔︎US ≈ 0.5-0.6 sur évènements communs, observée ~0.30. Le fix native-update threshold améliore mais ne synchronise pas.

5. Régions à panier étroit. Middle East 12 tickers, LatAm 21, ASEAN 21. Plus dense qu’avant mais toujours sensible aux mouvements individuels (Aramco / Vale / Petrobras / DBS pèsent disproportionnément). C’est l’univers réel disponible via Yahoo, à tolérer.

6. Pas de calendrier de jours fériés des bourses. L’indicateur “Marchés ouverts/fermés” en haut de page utilise une règle simple lun–ven heures locales. Ne tient pas compte de Christmas Day, Thanksgiving, Golden Week JP, Lunar New Year HK/CN, Eid Saudi, etc. → faux positifs rares (le chip apparaît “OUVERT” un 25 décembre). Sans impact sur les indices car les prix utilisés viennent du dernier close réel.

7. Tickers délistés / sans data Yahoo. ~10 tickers absents du cache à un instant donné (CRH.L migré à NYSE, ATLN.SW, NCM.AX, JFC.PS, WALMEX.MX, EAND.AE, EDF.PA…) — pas de corruption, juste des trous. Le code fait passer aux runs suivants une fois Yahoo de nouveau réactif.

I
Reproductibilité — comment auditer toi-même

Pipeline complet : 1. fetch_tradfi.py (launchd, hourly) → fetch_fx_rates(period=“max”) → fetch_stock_histories(period=“max”, auto_adjust=True) → fetch_shares_history (cached 24h) → narrative_stats() pour chaque thème → compute_narrative_index() avec time-varying weights → augment_with_momentum_metrics() : rel_mom_90d, breadth, signal → compute_composite() : score 0.55×rel + 0.225×breadth + 0.225×price 2. tradfi_cache.json + tradfi_cache.js (mirror symlinks vers Desktop) 3. TradFi_Tracker.Rmd → HTML (re-knit manuel) 4. Live override : tradfi_cache.js merge dans NAR_DATA au load

Vérifier la composition d’un panier sur une date donnée : python3 -c ” import json, datetime d = json.load(open(‘~/Library/Caches/site_crypto_finance/tradfi_cache.json’)) sh = json.load(open(‘~/Library/Caches/site_crypto_finance/tradfi_shares_history_cache.json’)) # voir le poids de chaque ticker du panier ‘AI & Semi’ au 2015-01-01 # …“

Caches consultables :
  • tradfi_cache.json (~18 MB) — données complètes embarquées : narratifs dédupliqués, stats, histories prix par ticker (15 ans tiered), spy_longhist.
  • tradfi_history_cache.json (~10 MB) — histories prix bruts pré-embedding (USD-converti, GBp normalisé).
  • tradfi_shares_history_cache.json (~6 MB) — shares outstanding historiques par ticker (post split-adjustment).
  • fx_rates_cache.json (~4.5 MB) — cache FX persistant 23 devises × ~16 ans daily. Fallback critique en cas de rate-limit Yahoo : sans ce cache, un échec FX transitoire corromprait silencieusement tous les prix d’une zone.
  • tradfi.lock — fcntl flock empêchant fetches concurrents (auto-libéré à mort du process).

Logs : /tmp/tradfi.out.log et /tmp/tradfi.err.log — chaque fetch trace le nb de tickers récupérés, splits détectés, fallbacks Stooq, etc.

Build tag console : ouvre la devtools — un message [BUILD] TradFi_Tracker confirme la version chargée. La date de génération du cache est visible dans l’en-tête (badge “MAJ HH:MM”) et dans le timestamp de la barre Live data.

Comment lire une carte secteur — 3 scénarios

Trois situations typiques. Le score seul ne suffit pas — il faut croiser signal + durée + rel-S&P 500 + breadth.

Cas idéal — à privilégier

Score 88 LONG 49j +18% vs S&P Breadth 100%

Signal LONG installé depuis 49 jours → cycle mature, momentum confirmé. Le secteur surperforme le S&P 500 de +18% sur 90j → vrai alpha sectoriel, pas juste beta marché. Breadth à 100% → toutes les actions du panier participent. Conclusion : surpondérer dans l’allocation — situation type Métaux & Mines ou Fintech récemment.

Faux positif — à éviter

Score 74 LONG 5j +2% vs S&P Breadth 44%

Score élevé mais illusion : LONG depuis seulement 5 jours → signal jeune, pas confirmé. Rel-S&P 500 quasi nul → le secteur ne surperforme pas le marché. Breadth à 44% → moins de la moitié des actions participent. Conclusion : attendre confirmation — un bon score isolé n’est pas suffisant.

Cycle vieillissant — sortir

Score 66 FLAT 10j -6% vs S&P Breadth 35%

Secteur fraîchement passé FLAT (10j) après une longue période LONG. Rel-S&P 500 négatif → le secteur sous-performe l’indice. Breadth s’effrite à 35%. Même si le score reste correct par inertie, le momentum est cassé. Conclusion : sortir / ne pas entrer, même si le secteur était leader les mois précédents — la rotation vers un autre thème est enclenchée.

Glossaire des concepts clés
Momentum
Propriété empirique : ce qui monte tend à continuer de monter (et inversement). Anomalie statistique documentée depuis Jegadeesh & Titman (1993). Pas une prédiction magique — un fait observé.
Momentum relatif
Performance d’un actif moins performance du benchmark (ici S&P 500). Isole l’alpha de la beta. +10% absolu pendant que le S&P fait +15% = relatif -5%, sous-performance.
MA50 / MA200
Moyenne mobile sur 50 (ou 200) jours. Un prix au-dessus de sa MA50 = tendance haussière court-moyen terme. Au-dessus de MA200 = tendance longue intacte. Sous les deux = bear market confirmé.
Breadth
Largeur du mouvement : % d’actions d’un panier avec perf positive. Distingue un vrai trend sectoriel (breadth élevée) d’une concentration (breadth basse, 1-2 stocks porteurs).
Mcap-weighted
Pondération par capitalisation boursière. Les grandes entreprises comptent davantage. Empêche qu’une small cap qui fait ×2 fausse le score d’un secteur dominé par des méga-caps.
Percentile-rank
Convertit n’importe quelle valeur en position sur une échelle 0-100 par rapport aux autres. Le secteur #1 reçoit 100, le dernier reçoit 0. Neutralise les unités et les outliers.
Bouclier ZEN
Filtre global sur S&P 500 qui force le passage en 100% cash / bons du Trésor quand l’indice passe sous sa MA200. Évite de jouer du momentum sectoriel en bear market actions.
Trend age
Durée (en jours) du régime LONG ou FLAT actuel d’un secteur. Permet d’évaluer la maturité du cycle sectoriel : frais, mature, ou vieillissant.
Questions fréquentes
Pourquoi le benchmark est le S&P 500 et pas le MSCI World ou le Russell ?

Le S&P 500 est l’indice actions le plus liquide, le plus corrélé aux rotations sectorielles globales, et celui que la plupart des pros utilisent comme référence par défaut. Le MSCI World dilue avec l’Europe/Asie qui ont leurs propres cycles. Le Russell 2000 biaise vers les small caps. Pour comparer avec l’onglet Crypto (où BTC est la référence), le S&P 500 est l’équivalent structurel. On utilise concrètement le ticker SPY (ETF répliquant l’indice, plus liquide que ^GSPC).

Pourquoi 24 secteurs et pas les 11 secteurs GICS standards ?

Les 11 secteurs GICS (Tech, Financials, Energy…) sont trop larges — ils écrasent les rotations intra-secteur (AI vs Software legacy, Banques vs Assurance, Énergie fossile vs propre). Une taxonomie fine permet de capter ces distinctions tout en restant lisible. On a aussi ajouté des thèmes transversaux (Big Tech, Robotique, Cybersécurité) qui ne rentrent pas dans le cadre GICS mais représentent de vrais flux de capitaux.

Pourquoi 90 jours pour le momentum relatif et pas 30 ou 180 ?

La littérature académique (Jegadeesh-Titman, Carhart) utilise classiquement 3-12 mois. 30j est trop court (earnings + bruit macro). 180j est trop lent — les rotations sectorielles durent 2-6 mois, un lookback 180j manquerait les retournements. 90j est le sweet spot : assez long pour filtrer le bruit macro (FOMC, CPI prints), assez court pour capturer les rotations thématiques.

Le score 88 est meilleur que 75, donc j’allocate plus dans le #1 ?

Non, pas directement. Le score est une agrégation utile pour le classement mais ne remplace pas la lecture des 4 sous-composantes. Un score à 88 avec LONG 5j et breadth 45% est moins fiable qu’un 78 avec LONG 45j et breadth 80%. Toujours croiser signal + durée + rel-S&P 500 + breadth avant d’allouer.

Comment sont gérées les actions cotées hors USD (Paris, Londres, Tokyo…) ?

Chaque action est convertie en USD au taux du jour via les FX rates (fetchés en début de pipeline). C’est indispensable car un secteur comme “Luxe” ou “Banques Europe” mélange des cotations EUR/GBP/CHF/USD — sans normalisation FX, les retours ne seraient pas comparables entre eux et le secteur aurait une perf parasitée par les mouvements de devise.

Pourquoi la rebalance est hebdomadaire et pas quotidienne ?

Les rotations sectorielles actions persistent typiquement plusieurs semaines. Une rebalance quotidienne produirait énormément de churn (frais, spread, slippage intraday) sans améliorer l’alpha — les signaux de momentum sectoriel ont une persistence de 3-8 semaines. Hebdo = équilibre entre réactivité (on capte les rotations en quelques jours) et coûts de transaction.

Que se passe-t-il quand un secteur bascule FLAT ?

Le signal FLAT se déclenche quand l’index du secteur passe sous sa MA50 OU que la breadth tombe sous 50%. Règle d’exécution : on sort (ou on n’entre pas), même si le score composite reste élevé par inertie. Le FLAT est l’exit rule mécanique, pas une suggestion. L’objectif est d’éviter d’accompagner un secteur dans son retournement de cycle sectoriel.

Et si je veux un signal encore plus conservateur ?

Durcis les conditions du LONG : au lieu de breadth > 50%, exige breadth ≥ 70% ET rel_mom_90d > 0 ET trend_age ≥ 15j. Le nombre de secteurs LONG baissera (typiquement 4-7 au lieu de 10-15), mais la fiabilité des signaux augmentera mécaniquement. Classique arbitrage recall vs précision.

Paramètres clés
Fréquence snapshot
Hebdo
Rebalance hebdomadaire, cohérente avec les rotations sectorielles observables sur 3-8 semaines (Cloud↔︎AI, Value↔︎Growth, Défensif↔︎Cyclique).
Unité d’allocation
Secteur
Allocation sur secteurs (baskets d’actions), pas sur actions individuelles. Évite le risque idiosyncratique (earnings miss isolé) tout en capturant le thème.
Pondération score
55/22.5/22.5
55% rel-S&P 500 90j · 22.5% breadth · 22.5% prix court. News désactivé (v2). Cœur du signal = surperformance sur S&P 500, pas performance brute.
Trend filter global
S&P 500 / MA200
Sous MA200, bascule ZEN (100% cash / T-bills). Anti-FOMO structurel : pas d’exposition actions en bear market macro.
Profondeur historique
15 ans
Histories Yahoo Finance (USD-adjusted), fallback Stooq. Downsampling tiered : daily 0-2A, hebdo 2-10A, tri-hebdo 10-15A. SPY benchmark sur 33 ans pour les régimes ZEN/ALPHA.
Univers géographique
Global
NYSE, NASDAQ, LSE, Euronext Paris, XETRA, SIX Swiss, Tokyo, Hong Kong, NSE India, Amsterdam, Madrid, Milan, Copenhagen — normalisé USD.
Survolez pour les détails · Échap ou clic extérieur pour fermer