Documentation exhaustive des formules et calculs
Méthodologie quantitative de Kronos TVM
Ce document recense l'intégralité des formules mathématiques et financières utilisées par le moteur de calcul de Kronos TVM. Chaque formule est documentée avec ses variables, sa justification, sa source académique et l'emplacement de son implémentation dans le code source.
1. Performance & rendement
Mesurer le gain réel d'un actif ou d'un portefeuille, en tenant compte du temps et des devises.
Plus-value absolue
PV = (P_actuel − PRU) × Q
Variables
- P_actuel
- Prix de marché actuel par unité
- PRU
- Prix de revient unitaire (coût moyen pondéré d'achat)
- Q
- Quantité (parts/coins) détenue
Gain ou perte en euros sur une position. Base de tous les calculs de P&L.
Source : AMF — Guide de l'investisseur en bourse.
lib/pnl.tsPlus-value relative (%)
PV(%) = (P_actuel / PRU − 1) × 100
Variables
- P_actuel
- Prix de marché actuel
- PRU
- Prix de revient unitaire
Rendement total réalisé sur la position, indépendant de la taille.
Source : Investopedia — Total Return.
lib/pnl.tsP&L currency-aware
PV(€) = (P_actuel × FX_actuel − PRU × FX_achat) × Q
Variables
- FX_actuel
- Taux de change devise native → EUR aujourd'hui
- FX_achat
- Taux de change au moment de l'achat (PRU)
- Q
- Quantité
Décompose la performance en effet marché vs effet change. Pour un actif USD acheté quand l'EUR/USD valait 0.95 puis vendu à 0.90, le change apporte un alpha indépendant du prix.
Source : CFA Institute — Currency Management for Investors.
lib/pnl.tsCAGR (Compound Annual Growth Rate)
CAGR = (V_final / V_initial)^(1/n) − 1
Variables
- V_final
- Valeur finale du portefeuille
- V_initial
- Valeur initiale (ou capital investi)
- n
- Nombre d'années
Taux de croissance annuel équivalent. Lisse la performance multi-années pour pouvoir comparer entre périodes de longueurs différentes.
Source : Bogleheads Wiki — CAGR.
lib/backtest.tsCAGR DCA (approximation IRR)
CAGR_DCA ≈ (V_final / (Σ V_invested / 2))^(1/n) − 1
Variables
- V_final
- Valeur finale après n années de DCA
- Σ V_invested
- Somme totale investie
- n
- Années de versements
Le CAGR classique sur-estime la performance d'un DCA car il suppose tout le capital investi dès t=0. Pour des versements linéaires, le capital moyen ≈ total/2. C'est une approximation pragmatique de l'IRR.
Source : Pour la vraie IRR : Microsoft Excel XIRR / Newton-Raphson.
lib/backtest.tsRendement en dividendes
Yield = (Dividende_annuel / Prix_actuel) × 100
Variables
- Dividende_annuel
- Dividende versé par action sur 12 mois glissants
- Prix_actuel
- Cours de l'action
Seul indicateur fiable pour comparer la rémunération entre actions/ETF de prix différents.
Source : AMF — Glossaire boursier.
lib/constants.ts (TYPE_YIELD)2. Risque
Quantifier la volatilité et l'exposition aux pertes — la moitié manquante du couple rendement/risque.
Volatilité annualisée
σ_ann = σ_quotidien × √252
Variables
- σ_quotidien
- Écart-type des rendements quotidiens
- 252
- Jours de bourse moyens par an (FR + US)
Standard du marché. Permet de comparer la dispersion attendue entre actifs en base annuelle. Hypothèse : rendements iid (loi normale stationnaire) — réaliste sur horizon ≥ 1 an.
Source : Hull, J. (2018). Options, Futures and Other Derivatives, ch. 15.
lib/constants.ts (TYPE_VOL), lib/backtest.tsVolatilité de portefeuille (matrice de covariance)
σ_p = √( Σᵢ Σⱼ wᵢ wⱼ σᵢ σⱼ ρᵢⱼ )
Variables
- wᵢ, wⱼ
- Poids des positions i et j (somme = 1)
- σᵢ, σⱼ
- Volatilités individuelles annualisées
- ρᵢⱼ
- Corrélation entre les rendements de i et j
Formule de Markowitz qui prend en compte la diversification réelle. Beaucoup d'apps font la moyenne pondérée naïve (qui assume ρ=1 partout) et sur-estiment le risque de 30 à 50 %.
Source : Markowitz, H. (1952). Portfolio Selection, JoF 7(1).
lib/constants.ts → computePortfolioVol()Bêta — régression OLS log-returns
β = Cov(r_actif, r_marché) / Var(r_marché)
Variables
- r_actif
- Log-rendements hebdomadaires de l'actif
- r_marché
- Log-rendements hebdomadaires du benchmark (MSCI World par défaut)
Mesure la sensibilité de l'actif aux mouvements du marché. β=1 = même volatilité que le marché, β=2 = 2× plus volatil. Utilise les log-returns pour additivité temporelle et meilleure normalité.
Source : Sharpe, W.F. (1964). Capital Asset Prices. JoF 19(3). Fenêtre 52 semaines (standard académique).
lib/computeBeta.tsR² du bêta
R² = 1 − SSR / SST
Variables
- SSR
- Somme des résidus au carré (variance non expliquée)
- SST
- Variance totale de l'actif
Mesure la qualité de la régression β. R²>0.7 = bêta fiable (actif fortement corrélé au marché). R²<0.3 = β peu significatif (actif idiosyncratique, ex : small cap).
Source : Hayashi, F. (2000). Econometrics, ch. 1.
lib/computeBeta.ts → betaQuality()Alpha de Jensen (annualisé)
α = (r̄_actif − r_f) − β × (r̄_marché − r_f)
Variables
- r̄_actif
- Rendement moyen annualisé de l'actif
- r̄_marché
- Rendement moyen annualisé du marché
- r_f
- Taux sans risque (OAT 10 ans = 3 %)
Surperformance NON expliquée par l'exposition au marché. α > 0 = vraie compétence du gérant (rare).
Source : Jensen, M.C. (1968). The Performance of Mutual Funds.
lib/computeBeta.tsVaR 95% paramétrique
VaR₉₅ = μ − 1.645 × σ
Variables
- μ
- Rendement moyen attendu (sur l'horizon)
- σ
- Volatilité sur l'horizon
- 1.645
- Z-score du quantile 5 % (loi normale)
Perte maximum attendue dans 95 % des cas sur l'horizon choisi. Standard Bâle II/III. Limitation : suppose une loi normale (sous-estime les queues fat tail des crises).
Source : Jorion, P. (2007). Value at Risk, ch. 5.
app/(app)/portfolio/page.tsx (computeMetrics)Drawdown maximal
DD(t) = (V(t) − Peak(t)) / Peak(t), MaxDD = min_t DD(t)
Variables
- V(t)
- Valeur du portefeuille à l'instant t
- Peak(t)
- Plus haut historique atteint jusqu'à t
Pire perte traversée depuis le plus haut, exprimée en %. Mesure de risque émotionnellement parlante : peut-on tenir un -50 % sans capituler ?
Source : Magdon-Ismail & Atiya (2004). Maximum Drawdown.
lib/backtest.tsZ-score (mean-reversion)
Z = (P&L_réalisé − μ) / σ_annuelle
Variables
- P&L_réalisé
- Plus-value % depuis l'achat
- μ
- Rendement attendu de la classe d'actif
- σ_annuelle
- Volatilité annualisée de la classe
Exprime la sur/sous-valorisation en unités d'écart-type. Z < -1.5 = actif "bon marché" historiquement (oversold), Z > +1.5 = "cher" (overbought).
Source : Bouchaud, J-P. (2003). Theory of Financial Risk and Derivative Pricing.
lib/signals.ts → computeSignal()3. Allocation & optimisation
Comment répartir le capital entre actifs pour maximiser le rendement à risque donné.
Frontière efficiente (Markowitz)
min ½ wᵀ Σ w s.t. wᵀ μ = r_cible, Σw = 1, w ≥ 0
Variables
- w
- Vecteur des poids du portefeuille
- Σ
- Matrice de covariance des rendements
- μ
- Vecteur des rendements attendus
- r_cible
- Rendement visé (paramètre)
Pour chaque rendement cible, trouve le portefeuille de variance minimale. L'ensemble forme la frontière efficiente (hyperbole dans le plan risque/rendement).
Source : Markowitz, H. (1952). Portfolio Selection, JoF 7(1).
app/(app)/portfolio/optimisation/page.tsxPortefeuille tangent (max Sharpe)
argmax_w (wᵀ μ − r_f) / √(wᵀ Σ w)
Variables
- w
- Poids cherchés
- μ
- Rendements attendus
- Σ
- Covariances
- r_f
- Taux sans risque
Point de tangence entre la droite issue de r_f et la frontière efficiente. Maximise le ratio de Sharpe — c'est le portefeuille théoriquement optimal pour un investisseur rationnel.
Source : Tobin, J. (1958). Liquidity Preference. RES 25(2).
app/(app)/portfolio/optimisation/page.tsxPortefeuille à variance minimale
w_MV = Σ⁻¹ · 1 / (1ᵀ Σ⁻¹ 1)
Variables
- Σ⁻¹
- Inverse de la matrice de covariance
- 1
- Vecteur de 1
Point le plus à gauche de la frontière. Allocation qui minimise la volatilité totale sans contrainte de rendement. Bien quand on cherche juste à dormir tranquille.
Source : Merton, R.C. (1972). An Analytical Derivation of the Efficient Portfolio Frontier.
app/(app)/portfolio/optimisation/page.tsxHHI — Herfindahl-Hirschman Index (concentration)
HHI = Σᵢ wᵢ² × 10 000
Variables
- wᵢ
- Poids de la position i (en fraction, pas en %)
Mesure la concentration. HHI = 10 000 = 1 seule position (mono-actif). HHI < 1500 = portefeuille bien diversifié. Utilisé en antitrust (DOJ US) puis adopté en gestion.
Source : Hirschman, A.O. (1945). Originellement antitrust.
lib/healthScore.ts, app/(app)/page.tsxCAPM / Security Market Line
E[r_i] = r_f + β_i × (E[r_m] − r_f)
Variables
- E[r_i]
- Rendement attendu de l'actif i
- r_f
- Taux sans risque
- β_i
- Bêta de l'actif vs marché
- E[r_m]
- Rendement attendu du marché (≈ 8 % long terme)
Modèle d'équilibre : un actif au-dessus de la SML est sous-évalué (rendement > ce que justifie son risque systématique), en-dessous il est sur-évalué.
Source : Sharpe-Lintner (1964-65). CAPM.
app/(app)/portfolio/optimisation/page.tsx (onglet SML)Corrélation pairwise par classe
ρ(classe_A, classe_B) ∈ TYPE_CORR
Variables
- TYPE_CORR
- Table de corrélations empiriques 20 ans (ex : ETF–Obligation = -0.10)
Approximation par classe d'actif quand on n'a pas l'historique commun complet. Sources : BCE, Bloomberg PORT, papers académiques sur cross-asset correlations.
Source : Asness, Moskowitz, Pedersen (2013). Value and Momentum Everywhere. JoF 68(3).
lib/constants.ts → TYPE_CORR / getTypePairCorr()4. Sizing & signaux
Comment dimensionner les positions et déterminer s'il faut renforcer, alléger ou conserver.
½ Kelly (sizing optimal)
f* = ½ × (E[r] − r_f) / σ²
Variables
- E[r]
- Rendement attendu fondamental de la classe (pas le P&L réalisé)
- r_f
- Taux sans risque
- σ
- Volatilité annualisée
Taille de position qui maximise la croissance géométrique du capital long terme. Pleine Kelly = trop volatile, on prend la moitié pour réduire la variance et l'inconfort psychologique. Plafonné à 25 % par position.
Source : Kelly, J.L. (1956). A New Interpretation of Information Rate. Bell System TJ.
lib/signals.ts → computeSignal()SMA — Simple Moving Average
SMA(n) = (P_{t} + P_{t-1} + … + P_{t-n+1}) / nVariables
- P_t
- Prix de clôture à l'instant t
- n
- Période (typiquement 50 ou 200 jours)
Lisse les fluctuations courtes pour faire émerger une tendance. SMA50 vs SMA200 est LA référence pour identifier les retournements de tendance long terme.
Source : Murphy, J.J. (1999). Technical Analysis of the Financial Markets.
lib/technicalIndicators.ts → sma()EMA — Exponential Moving Average
EMA(t) = α × P_t + (1−α) × EMA(t−1), α = 2 / (n+1)
Variables
- α
- Coefficient de lissage
- n
- Période
Pondère davantage les prix récents. Plus réactive que la SMA aux retournements — utilisée comme brique de base du MACD.
Source : Appel, G. (2005). Technical Analysis: Power Tools for Active Investors.
lib/technicalIndicators.ts → ema()RSI — Relative Strength Index (Wilder 1978)
RSI = 100 − 100 / (1 + RS), RS = moyenne_hausses / moyenne_baisses (sur 14 jours)
Variables
- RS
- Relative Strength
- 14
- Période standard (Wilder)
Oscillateur borné [0–100]. >70 = suracheté (potentiel pullback), <30 = survendu (potentiel rebond). N'a de sens qu'en marché latéral.
Source : Wilder, J.W. (1978). New Concepts in Technical Trading Systems.
lib/technicalIndicators.ts → rsi()MACD — Moving Average Convergence Divergence
MACD = EMA(12) − EMA(26), Signal = EMA(9, MACD), Histogramme = MACD − Signal
Variables
- EMA(n)
- EMA sur n jours
Mesure le momentum (différence entre court et moyen terme). Histogramme positif = haussier, croisement à la hausse de la ligne signal = signal d'achat. Inversement à la baisse.
Source : Appel, G. (1979). Création originelle.
lib/technicalIndicators.ts → macd()Bandes de Bollinger
Bande_haute = SMA(20) + 2σ_20, Bande_basse = SMA(20) − 2σ_20
Variables
- SMA(20)
- Moyenne mobile 20 jours
- σ_20
- Écart-type 20 jours
Enveloppes statistiques. ~95 % des prix restent dedans (loi normale). Cours qui touche la bande haute = sur-extension (potentiel retour à la moyenne), pareil en bas.
Source : Bollinger, J. (1980). Création originelle.
lib/technicalIndicators.ts → bollinger()Golden Cross / Death Cross
Golden Cross : SMA(50) > SMA(200) ET SMA(50) précédente < SMA(200) précédente
Variables
- SMA(50)
- Moyenne mobile 50 jours (court terme)
- SMA(200)
- Moyenne mobile 200 jours (long terme)
Signal de retournement de tendance majeur. Golden Cross = passage en tendance haussière long terme (rare, ~1×/an). Death Cross = inverse, baissier.
Source : Pratique de marché — non académique mais largement suivi.
lib/technicalIndicators.ts → interpret()Score composite de recommandation
Score = 50 + Sharpe×10 + KellyGap×0.8 + Oversold(+15) + Overbought(−15), bornes [0,100]
Variables
- Sharpe
- Sharpe réalisé sur la position
- KellyGap
- Différence entre poids actuel et poids Kelly optimal
- Oversold
- Bonus si Z < −1.5
- Overbought
- Malus si Z > +1.5
Score global [0-100] qui agrège momentum (Sharpe), sizing (Kelly) et mean-reversion (Z). 9 verdicts gradués évitent les signaux brutaux ACHETER/VENDRE.
Source : Inspiré des méthodologies CGP françaises (CIF, ACPR).
lib/signals.ts, lib/recommendations.ts5. Planification patrimoniale
Projections long terme, simulateurs FIRE, immobilier, stress tests.
Intérêts composés avec apports périodiques
V(t) = V₀(1+r)^t + A × [(1+r)^t − 1]/r
Variables
- V(t)
- Valeur du capital à l'année t
- V₀
- Capital initial
- A
- Apport annuel (12 × mensualité)
- r
- Taux annuel attendu
Formule combinant capitalisation du capital initial + annuité constante. La "8e merveille du monde" selon Einstein.
Source : Mathématiques actuarielles classiques.
lib/financialCalc.ts → computeCompound()Valeur réelle (corrigée inflation)
V_réelle(t) = V_nominale(t) / (1 + i)^t
Variables
- V_nominale
- Valeur en € nominaux
- i
- Taux d'inflation annuel (défaut 2 %)
- t
- Années écoulées
Le pouvoir d'achat compte plus que le chiffre nominal. 100 k€ dans 30 ans à 2 % d'inflation = ~55 k€ d'aujourd'hui.
Source : BCE — cible 2 % HICP. INSEE — séries longues.
lib/financialCalc.tsRègle des 4 % (FIRE)
Capital_FIRE = Dépenses_annuelles / 0.04 (= 25 × dépenses)
Variables
- Dépenses_annuelles
- Train de vie annuel net souhaité
- 0.04
- Safe Withdrawal Rate (Trinity Study)
Capital qui permet de vivre des intérêts indéfiniment avec 96 % de réussite sur 30 ans (étude historique S&P 500 + bonds 1926-1995).
Source : Bengen, W.P. (1994). Trinity Study, JoFP.
lib/financialCalc.ts → computeFire()Capacité d'emprunt (norme HCSF)
Mensualité_max = 0.35 × Revenus_nets, Durée_max = 25 ans (27 si neuf)
Variables
- 0.35
- Taux d'effort maximal HCSF (déc. 2021)
- Revenus_nets
- Salaires + revenus locatifs × 70 %
Norme du Haut Conseil de Stabilité Financière, obligatoire pour les banques françaises depuis janvier 2022 (sauf 20 % de dérogation possible).
Source : HCSF — Décision n° D-HCSF-2021-7.
lib/financialCalc.ts → computeBorrowingCapacity()Mensualité d'un emprunt amortissable
M = C × t / (1 − (1+t)^(−n))
Variables
- C
- Capital emprunté
- t
- Taux mensuel = TAEG/12
- n
- Nombre de mensualités (durée × 12)
Formule d'annuité constante. Mode amortissable = capital + intérêts dégressifs. Standard en immobilier résidentiel français.
Source : Code de la consommation — Art. R314-1.
lib/financialCalc.ts → computeMortgage()Simulation DCA mensuelle
unités(t) = unités(t−1) + (A / Close(t)), Valeur(t) = unités(t) × Close(t)
Variables
- A
- Apport mensuel constant
- Close(t)
- Cours de clôture du mois t
Dollar-Cost Averaging : on achète des fractions à intervalle régulier, le PRU effectif lisse les hauts et les bas. Réduit le timing risk mais ne le supprime pas.
Source : Constantinides, G. (1979). A Note on the Suboptimality of DCA.
lib/backtest.ts → simulateDCA()Stress test historique
V_stressed = Σᵢ Vᵢ × (1 + choc_classe_i)
Variables
- Vᵢ
- Valeur actuelle de l'actif i
- choc_classe_i
- Chute observée pour cette classe (ex : actions -39 % en 2008)
Rejoue des chocs historiques (2008, COVID 2020, hausse taux 2022) sur le portefeuille actuel. Simple mais parlant — répond à "Combien je perdrais si X se reproduisait ?"
Source : EBA Stress Test methodology, simplifié.
lib/financialCalc.ts → STRESS_SCENARIOS, computeStressTest()Score de santé patrimoniale
Score = Σⱼ poidsⱼ × scoreⱼ, j ∈ { épargne, précaution, dette, diversification, allocation }Variables
- scoreⱼ
- Sous-score [0-100] sur chaque dimension
- poidsⱼ
- Poids normalisé (somme = 1)
Diagnostic global inspiré AMF "Investir en bourse" + Bogleheads. 5 dimensions : taux d'épargne (>15 %), couverture précaution (3-6 mois), ratio dette/revenus (<35 % HCSF), HHI portefeuille, cohérence allocation/horizon.
Source : AMF — Plan d'action pour l'éducation financière 2023.
lib/healthScore.ts → computeHealthScore()6. Qualité ETF & ESG
Notation des ETF (frais, encours, âge, méthode de réplication) et scoring extra-financier.
Score qualité ETF (composite 0-100)
Q = 30×Score_TER + 25×Score_AUM + 20×Score_âge + 15×Score_repl + 10×Score_tracking
Variables
- Score_TER
- 100 si TER < 0.1 %, dégradé linéaire jusqu'à 0 à TER 1 %
- Score_AUM
- 100 si AUM > 1 Mrd€, 50 si 100M-1 Mrd, 20 si < 100M (risque de fermeture)
- Score_âge
- 100 si > 5 ans, dégradé sinon
- Score_repl
- Physique=100, swap-based=70
- Score_tracking
- 100 si tracking error < 0.5 %/an
Identifie les ETF "qualité institutionnelle" : faibles frais, AUM solide, ancienneté qui garantit la liquidité. Décourage les ETF récents à faibles encours (risque de fermeture).
Source : Méthodologie inspirée de Morningstar Medalist Rating.
lib/etfQuality.ts → scoreETFQuality()Score ESG composite (Sustainalytics + SFDR)
Score_ESG = Σ w_i × ESG_i, w_i = poids de l'actif i dans le portefeuille
Variables
- ESG_i
- Risk score Sustainalytics (0 = négligeable, 40+ = sévère)
- SFDR
- Article 6 (pas d'objectif ESG), 8 (promotion ESG), 9 (objectif ESG)
Agrégation pondérée des scores ESG individuels. Permet d'évaluer l'exposition globale aux risques extra-financiers et de classifier le portefeuille selon SFDR.
Source : Sustainalytics ESG Risk Rating + Règlement SFDR (UE) 2019/2088.
lib/esgScore.ts → computePortfolioESG()7. Devises & FX
Conversion multi-devises et détection automatique de la devise native d'un ticker.
Conversion FX
Montant_EUR = Montant_devise × Taux_devise→EUR
Variables
- Taux_devise→EUR
- Taux spot Yahoo Finance (EURUSD=X, EURGBP=X, etc.)
Conversion des montants étrangers vers EUR pour totaliser un patrimoine multi-devises. Utilise les taux spot Yahoo, mis en cache 5 min.
Source : Yahoo Finance / fallback BCE Reference Rates.
lib/pnl.ts, app/api/market/fx/route.tsDétection automatique de la devise
currency = SUFFIX_MAP[ticker.suffix] ?? "USD"
Variables
- SUFFIX_MAP
- .PA→EUR, .L→GBP, .DE→EUR, .AS→EUR, .MI→EUR, .SW→CHF…
Heuristique sur le suffixe Yahoo pour deviner la devise native d'un ticker sans appel API supplémentaire. Couvre ~95 % des cas européens et US.
Source : Convention Yahoo Finance — Currency by Exchange.
lib/currencyDetect.tsAucune information de ce document ne constitue un conseil en investissement (Art. L.541-1 CMF). Données fournies à titre indicatif et pédagogique uniquement.
Aller plus loin
→ Méthodologie générale du projet (origine, décisions techniques, limites assumées)
→ Bogleheads Wiki — référence anglophone sur l\'investissement passif
→ AMF — Espace épargnants — cadre réglementaire français