Les rendements en code : rendements simples ou logarithmiques, rendements cumulés, rendement et volatilité annualisés, et fenêtres glissantes
Calculez des rendements simples et logarithmiques avec pandas, composez-les correctement, annualisez rendement et volatilité, et construisez des statistiques glissantes.
Ce que vous allez apprendre
- Comment calculer des rendements simples et logarithmiques à partir d'une série de clôtures, et quand chacun est l'outil adapté.
- Pourquoi les rendements simples doivent être composés par un produit alors que les rendements logarithmiques s'additionnent simplement.
- Comment annualiser un rendement moyen journalier et un écart-type journalier, et ce que suppose la règle de la racine carrée du temps.
- Comment les fenêtres glissantes produisent des statistiques variables dans le temps, comme la volatilité sur 20 jours, et pourquoi les premières lignes sont vides.
Explication
Un rendement simple est la variation du prix en pourcentage, rt = (Pt − Pt−1) ÷ Pt−1, soit dans pandas r = df["close"].pct_change(). Un rendement logarithmique est le logarithme népérien du rapport des prix, ℓt = ln(Pt ÷ Pt−1), soit en code np.log(df["close"]).diff(). Tous deux commencent par un NaN. Pour de petits mouvements, les deux sont presque identiques ; pour de grands mouvements, ils divergent (un rendement simple de −50% correspond à un rendement logarithmique de −69.3%).
Composition. Sur plusieurs périodes, les rendements simples se multiplient : total = (1 + r1)(1 + r2)…(1 + rn) − 1. Les rendements logarithmiques s'additionnent : rendement logarithmique total = ℓ1 + ℓ2 + … + ℓn, et la reconversion donne le rendement simple total = exp(somme) − 1. Additionner des rendements simples est faux, et l'erreur croît avec la volatilité : +10% suivi de −10% donne une somme de 0% mais laisse en réalité −1%. Une série de rendements cumulés s'écrit (1 + r).cumprod() − 1 ; une courbe de capital partant de €10,000 s'écrit 10_000 * (1 + r).cumprod() ; avec des rendements logarithmiques, np.exp(lr.cumsum()).
Lequel utiliser, et quand. Les rendements logarithmiques pour agréger dans le temps et pour les statistiques ; les rendements simples dès que de l'argent change de mains ou que des actifs sont combinés, car le rendement d'un portefeuille est une somme pondérée de rendements simples. Pour communiquer avec des personnes, utilisez des pourcentages simples.
Annualiser. Par convention, on retient 252 jours de bourse par an pour les actions (le nombre réel varie légèrement selon la place boursière et l'année ; indiquez la convention que vous utilisez). Le rendement journalier moyen × 252 est le rendement annualisé arithmétique, et le CAGR (compound annual growth rate, taux de croissance annuel composé, défini dans le cours Trading systématique) vaut (final ÷ initial)1 ÷ années − 1 ; c'est lui que vous devez indiquer pour un backtest. La volatilité est l'écart-type des rendements ; elle évolue avec la racine carrée du temps, donc volatilité annuelle ≈ écart-type journalier × √252 ≈ journalier × 15.87. Pour des données mensuelles, utilisez 12 et √12 ; pour des données hebdomadaires, 52 et √52. La règle de la racine carrée suppose des rendements indépendants, ce que les séries en tendance ne respectent pas ; considérez-la comme une convention.
Fenêtres glissantes. r.rolling(20).std() * np.sqrt(252) donne la volatilité annualisée des 20 derniers jours, recalculée à chaque ligne. Les 19 premières lignes valent NaN car la fenêtre n'est pas pleine (min_periods permet d'assouplir cette règle). expanding() utilise toutes les données jusqu'à chaque ligne (le maximum courant du capital pour le drawdown de la leçon 9). Les deux ne regardent que vers le passé et sont donc, par construction, exempts de biais d'anticipation.
Exemple commenté
Exemple hypothétique : quatre clôtures d'une action, €100.00, €105.00, €100.80, €105.84 ; ni coûts, ni dividendes, ni impôts.
Rendements simples : (105 − 100) ÷ 100 = +5.00% ; (100.80 − 105) ÷ 105 = −4.00% ; (105.84 − 100.80) ÷ 100.80 = +5.00%.
Rendements logarithmiques : ln(1.05) = 0.04879 ; ln(0.96) = −0.04082 ; ln(1.05) = 0.04879. Somme = 0.05676. exp(0.05676) − 1 = 0.0584, soit +5.84%.
Vérification : 1.05 × 0.96 × 1.05 = 1.0584 → +5.84%, et 105.84 ÷ 100 − 1 = 5.84%. Additionner les rendements simples donnerait 6.00%, une surestimation de 0.16 point en trois jours : €10,000 deviennent €10,584, et non €10,600.
Code : r = c.pct_change(); total = (1 + r.dropna()).prod() - 1 renvoie 0.0584. r.rolling(3).mean() place (0.05 − 0.04 + 0.05) ÷ 3 = 2.00% sur la dernière ligne et NaN avant.
Annualisation sur un échantillon hypothétique plus long : si les rendements journaliers ont une moyenne de 0.04% et un écart-type de 1.2%, le rendement annualisé arithmétique est de 0.0004 × 252 = 10.08% et la volatilité annualisée de 0.012 × 15.87 = 19.05%.
Erreur fréquente
r.sum() comme rendement de la période. Cela ignore la composition et surestime les résultats sur des séries volatiles, de façon spectaculaire pour les produits à effet de levier. Utilisez (1 + r).prod() − 1 pour les rendements simples, ou additionnez les rendements logarithmiques puis prenez l'exponentielle.Exercice pratique
Sur papier : clôtures de €50.00, €48.00, €50.40, €49.392 (hypothétique). (a) Calculez les trois rendements simples. (b) Calculez les trois rendements logarithmiques en utilisant ln(0.96) = −0.04082, ln(1.05) = 0.04879 et ln(0.98) = −0.02020. (c) Donnez le rendement total par composition et par somme des logarithmes, et comparez avec la somme naïve des rendements simples. (d) Si une autre série affiche un écart-type journalier de 1.5%, indiquez sa volatilité annualisée sur la base de 252 jours, et expliquez pourquoi multiplier par 252 serait faux.
Afficher la solution
(a) 48 ÷ 50 − 1 = −4.00% ; 50.40 ÷ 48 − 1 = +5.00% ; 49.392 ÷ 50.40 − 1 = −2.00%.
(b) −0.04082, +0.04879, −0.02020 ; somme = −0.01223.
(c) Par composition : 0.96 × 1.05 × 0.98 = 0.98784 → −1.216%. Par les logarithmes : exp(−0.01223) − 1 = −1.216%, et 49.392 ÷ 50 − 1 = −1.216% le confirme. La somme naïve donne −4 + 5 − 2 = −1.00%, ce qui sous-estime la perte.
(d) Volatilité annualisée = 1.5% × √252 = 1.5% × 15.87 = 23.8%. Multiplier par 252 donnerait 378%, en confondant la règle d'échelle des moyennes (linéaire dans le temps) avec celle des écarts-types (racine carrée du temps).
Limites : la règle de √252 suppose des rendements journaliers indépendants ; les séries réelles présentant de l'autocorrélation ont une volatilité annuelle réelle différente.
Points clés à retenir
pct_change()donne des rendements simples,np.log(c).diff()des rendements logarithmiques ; tous deux laissent unNaNen première ligne.- Composez les rendements simples par un produit ; additionnez les rendements logarithmiques et prenez l'exponentielle ; n'additionnez jamais des rendements simples.
- Annualisez les moyennes par × 252 et les écarts-types par × √252, indiquez la convention, et présentez le CAGR pour les backtests.
- Les fenêtres glissantes et cumulatives ne regardent que vers le passé, produisent des
NaNtant qu'elles ne sont pas pleines et utilisent par défaut l'écart-type d'échantillon.
Étape suivante
La leçon 6 code les indicateurs standard sous forme de fonctions vectorisées, SMA, EMA, RSI, ATR et bandes de Bollinger, et montre comment les vérifier par rapport à une plateforme graphique.
Auto-évaluation
Répondez aux questions, puis vérifiez vos réponses. Vous pouvez recommencer autant de fois que vous le souhaitez.
Auto-évaluation automatique pour vos propres révisions. Vos réponses sont vérifiées dans votre navigateur ; nous ne les voyons pas et ne les évaluons pas. Ce n'est ni un examen ni une qualification.
Votre progression
« Terminée » signifie seulement que vous avez marqué la leçon comme lue. Ce n'est pas un test de votre compréhension. La progression et les notes sont enregistrées uniquement dans ce navigateur, sur cet appareil — pas dans un compte.