Skip to content
Learni
Voir tous les tutoriels
Finance Technique

Comment calculer le WACC avec Python en 2026

Read in English

Introduction

Le WACC (Weighted Average Cost of Capital) représente le coût moyen pondéré du capital d'une entreprise, essentiel pour les valorisations DCF, les décisions d'investissement et l'analyse financière. Il combine le coût de l'équité (via CAPM) et le coût de la dette, pondérés par leur proportion dans le bilan.

Pourquoi l'automatiser en Python ? Les tableurs comme Excel sont limités pour les données en temps réel (beta, taux sans risque). Avec yfinance pour fetcher les données boursières et Streamlit pour une interface web, vous obtenez un outil scalable, précis et partageable. Ce tutoriel intermédiaire vous guide pas à pas : de la formule théorique au déploiement d'une app complète. À la fin, vous calculerez le WACC de n'importe quelle action cotée en 30 secondes. Gain de temps : jusqu'à 80% vs manuel. (128 mots)

Prérequis

  • Python 3.10+
  • pip install streamlit yfinance pandas numpy
  • Connaissances de base en finance (CAPM, bilan)
  • Compte gratuit Yahoo Finance (optionnel pour API)
  • VS Code ou PyCharm pour éditer

Installation des dépendances

terminal
pip install streamlit yfinance pandas numpy

streamlit hello

Installez les bibliothèques essentielles : Streamlit pour l'interface, yfinance pour les données boursières, Pandas/Numpy pour les calculs. Testez avec streamlit hello pour vérifier l'installation. Évitez les conflits en utilisant un virtualenv.

La formule WACC décortiquée

WACC = (E/V) × Re + (D/V) × Rd × (1 - Tc)

  • E : Valeur de l'équité (market cap)
  • D : Dette nette (à saisir manuellement)
  • V : E + D
  • Re : Coût de l'équité = Rf + β × (Rm - Rf) (CAPM)
  • Rd : Coût de la dette (taux d'intérêt)
  • Tc : Taux d'imposition effectif
Analogie : comme un panier d'œufs où chaque ingrédient est pondéré. Nous fetcherons β, Rf (10Y Treasury), Rm (S&P500 historique ~10%).

Fonction CAPM pour coût de l'équité

capm.py
import yfinance as yf
import numpy as np

def capm_cost_equity(ticker, risk_free_rate=0.043, market_premium=0.06):
    stock = yf.Ticker(ticker)
    beta = stock.info.get('beta', 1.0)
    re = risk_free_rate + beta * market_premium
    return re, beta

# Exemple
re, beta = capm_cost_equity('AAPL')
print(f"Beta: {beta:.2f}, Re: {re:.2%}")

Cette fonction fetch le beta via yfinance et calcule Re avec Rf=4.3% (US 10Y 2026) et prime de risque=6%. Piège : beta absent → fallback à 1.0. Testez avec AAPL pour valider (beta ~1.2, Re ~11%).

Fonctions coût dette et WACC

wacc_functions.py
def cost_debt(rating='BBB'):
    rates = {'AAA': 0.035, 'AA': 0.038, 'A': 0.042, 'BBB': 0.048}
    return rates.get(rating, 0.05)

def calculate_wacc(equity_value, debt_value, re, rd, tax_rate=0.21):
    total_value = equity_value + debt_value
    weight_equity = equity_value / total_value
    weight_debt = debt_value / total_value
    wacc = (weight_equity * re) + (weight_debt * rd * (1 - tax_rate))
    return wacc

# Exemple statique
re = 0.11
rd = cost_debt('A')
wacc = calculate_wacc(1000, 400, re, rd)
print(f"WACC: {wacc:.2%}")

Cost_debt utilise un lookup par rating (source Moody's approx 2026). WACC pondère précisément. Piège : dette=0 → div/0 évitée implicitement, mais validez V>0. Exemple : E=1000B$, D=400B$ → WACC ~8.5%.

Intégration des données yfinance

Combinez CAPM avec market cap. Dette : saisissez depuis 10-K (pas toujours en API). Rf dynamique via '^TNX' (10Y Treasury), Rm-Rf fixe ou historique.

Script principal avec fetch market cap

fetch_wacc.py
import yfinance as yf

from capm import capm_cost_equity  # Import des fonctions précédentes
from wacc_functions import cost_debt, calculate_wacc

def full_wacc(ticker, debt_value, rating='BBB', tax_rate=0.21):
    stock = yf.Ticker(ticker)
    equity_value = stock.info.get('marketCap', 0) / 1e9  # En milliards
    rf = yf.download('^TNX', period='1d')['Close'].iloc[-1] / 100
    re, beta = capm_cost_equity(ticker, rf)
    rd = cost_debt(rating)
    wacc = calculate_wacc(equity_value, debt_value, re, rd, tax_rate)
    return {
        'ticker': ticker,
        'equity': equity_value,
        'debt': debt_value,
        're': re,
        'rd': rd,
        'wacc': wacc
    }

# Usage
result = full_wacc('MSFT', debt_value=800)
print(result)

Script complet : fetch marketCap, Rf live, calcule tout. Piège : marketCap en USD, divisez par 1e9 pour milliards ; handle NaN avec .get(). Exemple MSFT : equity ~3T$, debt~800B$, WACC ~7-9%.

App Streamlit complète

app.py
import streamlit as st
import yfinance as yf
import numpy as np
from capm import capm_cost_equity
from wacc_functions import cost_debt, calculate_wacc

def full_wacc(ticker, debt_value, rating, tax_rate):
    stock = yf.Ticker(ticker)
    equity_value = stock.info.get('marketCap', 0) / 1e9
    rf = yf.download('^TNX', period='1d')['Close'].iloc[-1] / 100
    re, beta = capm_cost_equity(ticker, rf)
    rd = cost_debt(rating)
    wacc = calculate_wacc(equity_value, debt_value, re, rd, tax_rate)
    return {
        'Equity (B$)': equity_value,
        'Debt (B$)': debt_value,
        'Beta': beta,
        'Re (%)': re * 100,
        'Rd (%)': rd * 100,
        'Tax Rate (%)': tax_rate * 100,
        'WACC (%)': wacc * 100
    }

st.title('Calculateur WACC 2026')

col1, col2 = st.columns(2)
with col1:
    ticker = st.text_input('Ticker (ex: AAPL)', 'AAPL')
    debt = st.number_input('Dette nette (B$)', min_value=0.0, value=500.0)
with col2:
    rating = st.selectbox('Rating dette', ['AAA', 'AA', 'A', 'BBB'])
    tax = st.number_input('Taux impôt (%)', min_value=0.0, max_value=0.5, value=0.21)

if st.button('Calculer WACC'):
    with st.spinner('Fetch données...'):
        result = full_wacc(ticker, debt, rating, tax)
    st.success('WACC calculé !')
    st.metric('WACC', f"{result['WACC (%)']:.2f}%")
    st.table(result)

st.caption('Données live via yfinance. Mise à jour 2026.')

App Streamlit full-stack : inputs interactifs, fetch live, table résultats, metric visuelle. Lancez avec streamlit run app.py. Piège : timeout yfinance → ajoutez try/except en prod ; localtunnel pour share.

Bonnes pratiques

  • Validez les données : Toujours checker beta/marketCap manuellement vs Yahoo (écarts ~5%).
  • Paramétrez Rf dynamique : Utilisez '^TNX' ou ECB pour Europe.
  • Sensibilité : Ajoutez sliders Monte Carlo pour ±1% beta.
  • Cachez les appels API : @st.cache_data sur full_wacc pour perf.
  • Déployez sur Streamlit Cloud : Gratuit, HTTPS auto.

Erreurs courantes à éviter

  • Dette ignorée : Sans D, WACC=Re (surévalue). Toujours estimer via bilans.
  • Rf statique : Ignore inflation 2026 (~3%) → sous-estime Re.
  • Beta non ajusté : Brute Yahoo ; levez pour levered/unlevered.
  • Unités incohérentes : MarketCap en shares*price, dette en absolu → milliards unis.

Pour aller plus loin

Intégrez Black-Scholes pour options warrants ou DCF complet. Ressources :

Découvrez nos formations Learni sur la finance quantitative.