Hoe bereken je de 'Expected Shortfall' van je trading portfolio?

Portret van Alex de Vries, Quantitatief Analist & Algo-Trading Expert
Alex de Vries
Quantitatief Analist & Algo-Trading Expert
Risicomanagement & Portfolio Protectie · 2026-02-15 · 7 min leestijd

Je portfolio ziet er op het eerste gezicht prima uit, maar wat als de markt morgen keihard onderuit gaat?

Je wilt niet voor verrassingsuitjes komen te staan. Daarom bereken je de Expected Shortfall, oftewel de gemiddelde verliezen als het echt misgaat. In plaats van alleen te kijken naar wat er maximaal kan gebeuren (Value at Risk), kijk je naar de gemiddelde pijn.

Dat geeft je een realistisch beeld van je risico. We gaan dit stap voor stap berekenen met Python, je broker API en een backtesting omgeving. Geen zorgen, je hoeft geen wiskundig genie te zijn.

Wat je nodig hebt voordat je begint

Om te starten, zorg je dat je de juiste tools bij de hand hebt.

Je hebt een Python omgeving nodig, bijvoorbeeld via Anaconda of een virtuele omgeving. Gebruik libraries zoals Pandas, NumPy en voor de visualisatie Matplotlib. Deze installeren is simpel: pip install pandas numpy matplotlib. Als je een backtesting framework gebruikt, zoals Backtrader of een eigen script, zorg dat die draait.

Je broker API is cruciaal voor actuele data. Bij Interactive Brokers (IBKR) gebruik je de TWS API of de Client Portal API.

Bij andere brokers zoals Degiro of Plus500 is de API-toegang beperkter; check hun documentatie.

Voor dit voorbeeld gaan we uit van IBKR, omdat die stabiel is voor algoritmische trading bots. Je API-sleutel moet correct zijn en je verbinding getest. Verder heb je historische data nodig, minimaal 1 jaar voor een redelijke schatting.

Voor een portfolio van 5-10 posities, denk aan aandelen of ETF's. Je startkapitaal is bijvoorbeeld €10.000.

Tijd die je nodig hebt: ongeveer 1-2 uur om alles op te zetten, plus extra tijd voor testen. Veelgemaakte fout: vergeten om je API-credentials te valideren, wat leidt tot connection errors.

Stap 1: Verzamel en prepareer je data

  1. Download je historische data via de API. Gebruik de IBKR API om prijzen op te halen voor elk instrument in je portfolio. Voor een portfolio van 5 aandelen, vraag dagelijkse sluitingsprijzen over de laatste 52 weken. Script voorbeeld: from ib_insync import IB, Stock; ib = IB(); ib.connect('127.0.0.1', 7497, clientId=1). Haal data op per ticker, bv. AAPL, TSLA. Tijd: 10-15 minuten.
  2. Maak een dataframe met je portfolio-waarden. Bereken de dagelijkse waarde van je portfolio door het aantal aandelen te vermenigvuldigen met de sluitingskoers. Voeg cash toe voor het totaal. Gebruik Pandas: df['portfolio_value'] = df['AAPL'] * shares_aapl + df['TSLA'] * shares_tsla + cash. Voor €10.000 start, verdeel gelijk over 5 posities (€2.000 per stuk). Tijd: 15 minuten. Fout: vergeten om transactiekosten mee te nemen, wat je returns vertekent.
  3. Bereken de dagelijkse returns. Verdeel de huidige waarde door de vorige en trek er 1 af: df['return'] = df['portfolio_value'].pct_change(). Verwijder de eerste NaN-regel. Dit geeft je een reeks van ongeveer 250 data punten voor een jaar. Tijd: 5 minuten. Fout: returns in procenten verwarren met decimalen, hou het consistent in decimalen (bv. 0.01 voor 1%).

Als je dit hebt, heb je een solide basis. Je portfolio is nu als tijdreeks in beeld, klaar voor analyse.

Test even of de data klopt door een plot te maken: df['portfolio_value'].plot().

Zie je een stijgende lijn? Mooi. Een dalende? Dan is je risico hoog en is ES berekenen extra belangrijk.

Stap 2: Bereken de Value at Risk (VaR) als basis

Expected Shortfold bouwt op VaR, dus die berekenen we eerst. Zodra je weet wat je risico is, pas je de Kelly Criterion toe voor optimale positiegrootte. VaR geeft het verliesniveau dat je met een bepaalde kans niet overschrijdt.

  1. Sorteer je returns oplopend. Gebruik Pandas: sorted_returns = df['return'].sort_values(). Dit geeft een lijst van laagste naar hoogste returns. Voor 250 punten, neem de 5% slechtste (12.5ste plek, rond de 13e). Tijd: 5 minuten. Fout: vergeten om de returns te sorteren, wat leidt tot verkeerde percentielen.
  2. Vind de cutoff voor 95%. Bereken het 5e percentiel: var_95 = sorted_returns[int(0.05 * len(sorted_returns))]. Bijvoorbeeld, als je returns variëren van -0.05 tot +0.03, is VaR -0.02 (2% verlies). Voor je €10.000 portfolio betekent dat een max verlies van €200 in 95% van de gevallen. Tijd: 5 minuten. Fout: een verkeerd confidence level kiezen, zoals 99% zonder reden, wat te conservatief is voor dagelijks trading.
  3. Test je VaR op een backtest. Gebruik je backtesting script om te simuleren: draai je bot over de historische data en tel hoe vaak je verlies de VaR overschrijdt. Als het klopt, moet het in 5% van de dagen gebeuren. Tijd: 20-30 minuten. Fout: niet rekening houden met outliers, zoals een crash in 2020, wat je VaR vertekent.

We gebruiken de historische methode, die makkelijk is en geen complexe formules vereist. Stel je confidence level op 95%: je wilt weten wat het ergste verlies is in 95% van de gevallen. Met VaR op zak, heb je een idee van je maximale pijn bij extreme marktbewegingen.

Maar VaR zegt niets over hoe erg het is als het misgaat. Daar komt ES in beeld.

Stap 3: Bereken de Expected Shortfall (ES)

ES is het gemiddelde van de verliezen die erger zijn dan je VaR. Dus voor 95% VaR, kijk je naar de ergste 5% van je verliezen en neem je het gemiddelde.

  1. Selecteer de ergste 5% returns. Van je gesorteerde lijst, neem de eerste 5%: worst_5_percent = sorted_returns[:int(0.05 * len(sorted_returns))]. Voor 250 punten zijn dit de 12 laagste returns. Tijd: 5 minuten. Fout: te veel of te weinig punten selecteren, bijv. als je dataset kleiner is door missing data.
  2. Bereken het gemiddelde van die returns. ES = es_95 = worst_5_percent.mean(). Bijvoorbeeld, als de ergste verliezen zijn -0.03, -0.04, -0.02, etc., is ES misschien -0.035. Voor je €10.000 portfolio betekent dit een gemiddeld verlies van €350 als het misgaat. Tijd: 5 minuten. Fout: de returns positief maken (bv. absolute waarden), waardoor je de pijn onderschat.
  3. Zet ES om naar euro's. Vermenigvuldig met je huidige portfolio waarde: es_euro = es_95 * current_portfolio_value. Als je portfolio nu €12.000 is, is ES €420. Tijd: 2 minuten. Fout: vergeten om de huidige waarde te gebruiken in plaats van de historische, wat je risico overschat.
  4. Visualiseer voor begrip. Plot een histogram van je returns en markeer VaR en ES met een verticale lijn. Gebruik Matplotlib: plt.axvline(x=es_95, color='red', label='ES'). Dit toont direct de 'staart' van je verliesverdeling. Tijd: 10 minuten. Fout: geen labels gebruiken, waardoor de plot onduidelijk wordt.

Dit is super relevant voor algoritmische bots, omdat die snelle markten kunnen triggeren.

We blijven bij de historische methode voor eenvoud. ES is nu berekend. Voor een portfolio met volatiele aandelen zoals tech-stocks, kan ES hoger zijn dan voor stabiele ETF's. Als je bot dagelijks trade, pas ES elke week aan na nieuwe data.

Stap 4: Integreer ES in je risicomanagement

Nu je ES kent, pas je het toe om je portfolio te beschermen. Stel een limiet in: als ES boven €500 uitkomt voor je €10.000 portfolio, pas dan de juiste position sizing toe of voeg een stop-loss toe.

Voor algoritmische bots, programmeer een alert in je Python script: als ES > threshold, stop de bot tijdelijk.

Test dit in een backtest met je broker API. Simuleer een crash, zoals maart 2020, en kijk of je ES de schade beperkt. Gebruik IBKR paper trading voor risicoloos testen.

Tijd voor integratie: 30-45 minuten. Fout: ES negeren en doortrade, wat leidt tot grote verliezen bij een black swan event.

Voor portfoliobescherming, combineer ES met diversificatie. Als je 5 aandelen hebt, zorg dat ze niet allemaal in dezelfde sector zitten. Voeg een bond-ETF toe voor stabiliteit. Prijs van een ETF zoals iShares Core MSCI World: rond €80 per stuk, voor €2.000 investering.

Verificatie-checklist

  • Data klopt: historische prijzen opgehaald via IBKR API, portfolio-waarden berekend zonder fouten.
  • Returns correct: dagelijkse pct_change in decimalen, zonder NaN's.
  • VaR berekend: 95% confidence level, getest op backtest, klopt met 5% overschrijdingen.
  • ES berekend: gemiddelde van ergste 5%, omgezet naar euro's, gevisualiseerd met histogram.
  • Risicomanagement: ES-limiet ingesteld in bot, getest met paper trading, portfolio gediversifieerd.
  • Totaal tijd onder 2 uur, geen API-fouten meer.

Als dit allemaal klopt, ben je klaar. Je portfolio is nu beter beschermd, en je handelt met meer vertrouwen. Hou ES bij elke marktverandering in de gaten.

Portret van Alex de Vries, Quantitatief Analist & Algo-Trading Expert
Over Alex de Vries

Alex is een ervaren quantitatief analist en Python-ontwikkelaar die complexe trading concepten vertaalt naar begrijpelijke, praktische handleidingen voor zowel beginners als gevorderden.