USD Finans

Magasinet der gør dig klogere på penge

Sådan laver du en Monte Carlo-simulering i Excel

Sådan laver du en Monte Carlo-simulering i Excel

Forestil dig, at du kunne kigge ind i fremtiden, køre tusindvis af mulige scenarier for din investering – og få Excel til at gøre det tunge løft for dig på få sekunder. Lyder det som raketvidenskab? Det er det ikke. Det er Monte Carlo-simulering.

I denne guide viser USD Finans dig, hvordan du forvandler et helt almindeligt regneark til en kraftfuld krystalkugle, der kvantificerer usikkerhed og omsætter den til håndgribelige beslutningsgrundlag. Vi zoomer ind på alt fra fordelingstræk og korrelation til datatabeller, histogrammer og VaR – og vi gør det skridt for skridt, så både Excel-novicer og erfarne modelleringsnørder kan være med.

Uanset om du skal værdiansætte en potentiel investering, lægge budget for næste regnskabsår eller optimere en portefølje, giver Monte Carlo-metoden dig et mere nuanceret billede end et enkelt “point estimate” nogensinde kan. Og det bedste? Du kan komme i gang nu – uden dyr specialsoftware.

Spænd sikkerhedsbæltet: Om få minutter er du klar til at sætte turbo på dine økonomiske modeller og træffe bedre, databaserede beslutninger.

Hvad er en Monte Carlo-simulering – og hvornår giver den mening i Excel?

Monte Carlo-metoden er i al sin enkelhed en gentagen, tilfældig prøvetagning af mulige udfald for at beregne et sandsynlighedsfordelt resultat. I stedet for at antage ét “point-estimate” – fx et årligt afkast på 7 % eller en omsætningsvækst på 3 % – lader vi modellen trække tusindvis af mulige værdier, beregner output for hver gentagelse og ser, hvordan resultaterne fordeler sig. Dermed kan vi kvantificere usikkerhed og tale i percentiler (P5, P50, P95) i stedet for i gennemsnit alene.

I finans og almindelige business cases bruges Monte Carlo-simulering bl.a. til:

  • Netto Nuværdi (NPV) og Internal Rate of Return (IRR) for investeringsprojekter, hvor både omsætning, omkostninger og diskonteringsrenter er usikre.
  • Porteføljeanalyse – fra simple to-asset cases til hele allokeringsproblemer med aktier, obligationer, råvarer og alternative investeringer.
  • Budgetter og forecast for virksomheder, hvor fx salgsvolumen, pris, inputpriser og valutakurser varierer.
  • Risikomål som Value at Risk (VaR) og Conditional VaR, der kræver en fuld fordeling af mulige tab.

Excel er ofte det oplagte værktøj til at komme i gang hurtigt, fordi:

  • De fleste finans- og controlling-professionelle allerede behersker regnearkets funktioner.
  • RAND(), NORM.INV() m.fl. giver adgang til tilfældige tal og standardfordelinger uden ekstra software.
  • “Hvad-hvis-analyse ➜ Datatabel” kan køre tusindvis af iterationer uden VBA.
  • Resultater kan visualiseres umiddelbart med histogrammer, boksplots og pivottabeller.

Der er dog situationer, hvor specialiserede værktøjer som @RISK, Crystal Ball, Python (NumPy/Pandas) eller R giver mere værdi:

  • Behov for komplekse fordelinger eller diskrete/styktalsfordelinger, som Excel ikke understøtter direkte.
  • Avanceret korrelationsstruktur på tværs af mange (10+) stokastiske variable.
  • Meget store modeller, hvor 50.000-1.000.000 iterationer er nødvendige for konvergens og Excel bliver sløvt.
  • Krav om automatiseret batch-kørsel, versionering og audit-trail, som er lettere i script-sprog.
  • Regulatorisk rapportering, hvor værktøjer har indbyggede compliance-moduler og validerede tilfældighedsgeneratorer.

Som tommelfingerregel er Excel tilstrækkeligt, når du kan nøjes med nogle få (<20) stokastiske input, <10.000 simulationer og almindelige fordelinger – og når formålet er at understøtte hurtigere beslutningstagning snarere end produktionskørsel. Overskrides disse grænser, betaler det sig ofte at skifte til et mere specialiseret miljø, der tilbyder højere ydeevne, bedre dokumentation og indbygget risikoanalyse.

Opsætning: Antagelser, input og fordelinger i din Excel-model

Inden du kan trykke F9 og lade Excel kaste terningerne, skal modellen have et solidt skelet. Her er den proces, vi typisk følger, når vi designer en Monte Carlo-model i et regneark:

1. Kortlæg modellen: Fra driver til kpi

  • List alle inputparametre – priser, mængder, vækstrater, diskonteringsrente, omkostningsprocenter osv.
  • Udpeg output-KPI’er – f.eks. NPV, IRR, årligt porteføljeafkast, likviditetsreserve ultimo.
  • Tegn afhængighederne i et simpelt flowdiagram (evt. i et noteark), så du ved præcis, hvilke celler der fodrer hvilke formler.
  • Brug navngivne områder til alle input og output – det øger læsbarheden og gør VBA- eller tabel-loops langt nemmere.

2. Vælg fordelinger – Og begrund dem

Type af input Anbefalet fordeling Hvorfor? Excel-funktion
Moderat usikker vækst- eller inflationsrate Normal Symmetrisk omkring et forventet middel; ekstreme værdier sjældne. =NORM.INV(RAND(); μ; σ)
Aktie- eller råvareafkast (procent) Lognormal Sikrer altid positivt resultat; fanger højresvans. =LOGNORM.INV(RAND(); μ_ln; σ_ln)
Omkostningsandel (0-100 %) Beta Afgrænset mellem 0 og 1; fleksibel form. =BETA.INV(RAND(); α; β)
Projektbudget eller byggepris Triangulær Nemt at parametrisere på min, most likely, max når få data findes. Custom: se formel nedenfor

Har du ingen historiske data, kan du starte med en triangulær fordeling: Antag a = min, b = mest sandsynlig, c = max og brug

=IF(RAND() < (b-a)/(c-a), a + SQRT(RAND()*(b-a)*(c-a)), c - SQRT((1-RAND())*(c-a)*(c-b)))

3. Estimér parametre systematisk

  1. Indsamling af data
    Kobl til databaser (Bloomberg, Refinitiv, FRED, virksomhedens ERP) eller brug offentlige tidsserier.
  2. Statistik i Excel
    Brug =AVERAGE(), =STDEV.P() og =PERCENTILE.EXC() for at hente μ, σ, P5/P95.
  3. Afsæt ekspertskøn
    Når data er sparsomme, indhent estimater fra fagpersoner og kombinér dem med datadrevne intervaller.
  4. Dokumentér kilde + metode i to kolonner: Datakilde og Kommentar. Det hjælper audit-trailen og gør opdateringer nemme.

4. Opret et særskilt “assumptions”-ark

Følgende struktur fungerer i praksis:

  • Kolonne A: Inputnavn (fx “Inflation_yr1”)
  • Kolonne B: Fordelingstype (Normal)
  • Kolonne C-E: Parameter 1-3 (μ, σ, min / most likely / max …)
  • Kolonne F: Datakilde (Navn + link/fil)
  • Kolonne G: Sist. opdateret (dato)
  • Kolonne H: Noter (forklar usikkerheder, antagelser, afhængigheder)

Knyt hver række til en navngivet variabel. I dit modelark trækker du så direkte på disse navne, så ændringer kun foretages ét sted.

5. Tjek konsistens og logik

  • Er inputgrænser realistiske? (Ingen negative volumener, ingen rente > 100 %)
  • Passer parametrene til historikken? Brug et overlappende histogram til visuel validering.
  • Undersøg afhængigheder: Skal to priser korrelere? Overvej Cholesky senere, men notér det allerede nu.

Når alt det ovenstående er på plads, har du et veldokumenteret fundament, som du trygt kan udsætte for 10.000 Excel-kast – og som andre kan forstå om seks måneder.

Tilfældige tal i Excel: Fra RAND() til fordelingstræk og korrelation

Den helt centrale byggesten i en Monte Carlo-simulering er evnen til at trække uafhængige, tilfældige tal fra kendte sandsynlighedsfordelinger. I Excel sker det i tre trin:

  1. Generér uniforme tilfældige tal
  2. Omsæt til den ønskede fordeling med inverse fordelingsfunktioner
  3. Indbyg evt. korrelation på tværs af variabler

1. Rand() og randarray() – Den uniforme byggeklods

  • =RAND() giver ét tal i intervallet 0-1.
  • =RANDARRAY(rows;columns) returnerer et helt array, f.eks. 10.000 rækker på én gang – langt hurtigere end 10.000 enkeltceller med RAND().
  • Brug F9 for at recalc’e én gang, eller Formler › Beregningsindstillinger › Manuel, så du styrer hvornår tallene fornyes.
  • Seed og reproducerbarhed: Excel har ingen indbygget seed-funktion. Vil du kunne genskabe resultater:
    • Gem hele RAND-kolonnen som værdier (Ctrl + C › Indsæt speciel › Værdier).
    • Alternativt: styr simuleringen via VBA og Randomize [seed].

2. Fra uniform til ”rigtig” fordeling

Har du et u fra 0-1, kan du trække fra stort set enhver fordeling ved at kalde den inverse kumulative funktion:

Fordeling Typisk brug Excel-formel
Normal Afkast, fejlled =NORM.INV(u; middel; sigma)
Lognormal Aktiekurser, oliepris =LOGNORM.INV(u; mu; sigma)
Beta Sandsynligheder (0-1), projektafslutning =BETA.INV(u; α; β)
Triangulær Budgetposter med min/most likely/max =IF(u<(mode-min)/(max-min);
min+SQRT(u*(max-min)*(mode-min));
max-SQRT((1-u)*(max-min)*(max-mode)))

Afgrænsninger (min / max): Hvis fordelingen matematisk kan give ekstreme værdier (fx negativ omsætning), kan du:

  • Skifte til en fordeling der naturligt har bounds (lognormal, beta, triangulær).
  • Anvende MAX(MIN(x; upper); lower) for at klippe hale/hoved – men vær bevidst om, at du ændrer fordelingens form.

3. Korrelation mellem input-variable

Mange real-life variabler bevæger sig ikke uafhængigt. Ønsker du fx at korrelere omsætningsvækst og bruttomargin, kan du bruge en simpel Cholesky-tilgang:

  1. Lav en korrelationsmatrix, f.eks.
 | Vækst Margin-----------|----------------Vækst | 1 0,6Margin | 0,6 1
  1. Brug =CHISQ.INV.RT() eller VBA til at finde Cholesky-dekompositionen L. Det kan også gøres manuelt:
    • L = { {1,0};{0, √(1-0,6²)} } * husk at Excel ikke har en native CHOLESKY, så de fleste bruger værktøjet ”Dataanalyse › Matrixdekomposition” (Office 365) eller en lille VBA-funktion.
  2. Lav to uafhængige normalfordelte z-scores i et array Z, fx med =NORM.S.INV(RANDARRAY(2;1)).
  3. Gang L × Z ved hjælp af =MMULT(L;Z). Resultatet er et nyt sæt korrelerede z-scores.
  4. Skalér hvert element til den ønskede mean/volatilitet: =middel+sigma*korreleret_z.

Tip: Har du mange korrelerede faktorer (10+), er det ofte lettere at køre hele matrixregningen i Power Query, Python eller R og blot importere de simulerede serier til Excel.

4. Ydelses- og stabilitetstricks

  • Anvend én RANDARRAY() i stedet for tusindvis af RAND() – det reducerer workbooks til en brøkdel i størrelse.
  • Saml alle tilfældige tal i et skjult ark, og link herfra – så kan du fryse/optø dem globalt.
  • Navngiv ranges (fx P_Rate_Sim) for at gøre formlerne kortere og minimere fejl.

Når du mestrer RAND(), inverse fordelingstræk og simpel korrelation, har du fundamentet til stort set enhver Monte Carlo-model direkte i Excel.

Trin-for-trin: Byg modellen og kør 10.000 simuleringer

En Monte Carlo-model i Excel kan bygges på under 30 minutter, hvis strukturen er gennemtænkt fra start. Følg guiden nedenfor, så du undgår de klassiske faldgruber og står tilbage med en model, der kan køre 10.000 simuleringer uden at bryde sammen.

  1. Opret en tydelig inputsektion
    1. Indsæt et nyt ark kaldet Inputs. Brug en tabel (Indsæt > Tabel) med kolonnerne Navn, Fordeling, Parameter 1, Parameter 2, Formel.
    2. Navngiv alle centrale celler (Formler > Definer navn) – f.eks. Vækstrate, Margin, WACC. Det gør formlerne i resten af modellen meget mere læsbare.
    3. Opsæt fordelingstræk med RAND() eller RANDARRAY() som grundlag. Eksempel på en normalfordelt vækstrate:
      =NORM.INV(RAND(), 0,02, 0,01)
    4. Vil du afgrænse værdier (f.eks. mellem 0 % og 10 %), så pak formlen ind i MAX(MIN(...)) eller brug en triangulær fordeling:
      =IF(RAND()<=(B-A)/(C-A), A+SQRT(RAND()*(B-A)*(C-A)), C-SQRT((1-RAND())*(C-B)*(C-A)))
  2. Byg beregninger og output-KPI’er i et separat ark (Model)
    1. Hent inputs med de navngivne områder – aldrig med direkte cellereferencer (Vækstrate i stedet for Inputs!$C$7).
    2. Beregn cashflows, og slut af med en formel for NPV:
      =NPV(WACC; Cashflow_1:Cashflow_n) + Initial_Investment
    3. Gem øvrige nøgletal (IRR, årligt afkast, pay-back) i én lodret kolonne; de skal senere samles i en datatabel.
  3. Opret en “dummy”-variabel til at drive simuleringen

    I et nyt ark (Sim) skriv tallet 1, 2, 3 … ned til 10.000 i kolonne A – eller brug:

    =SEKVENS(10000;1;1;1)

    Det er kun en tæller; Excel vil genberegne alle tilfældige tal, hver gang tælleren bruges i en datatabel.

  4. Kør 10.000 simuleringer med Datatabel
    1. I Sim placerer du modellen sidste NPV-formel i celle B1 (eller refererer til den: =Model!C10).
    2. Marker området A1:B10001 (dummy-kolonnen + én outputkolonne).
    3. Vælg Data > Hvad-hvis-analyse > Datatabel….
    4. Lad Rækkeinputcelle stå tom og sæt Søjleinputcelle til en vilkårlig tom celle (f.eks. Sim!Z1). Klik OK.
      Excel gentager nu modellen 10.000 gange og returnerer et NPV-resultat i hver række.

    Tip: Skal du samle flere outputs (NPV, IRR, afkast), udvid datatabellen vandret: kolonne C med IRR, kolonne D med afkast osv.

  5. Alternativ: En ultrakort VBA-makro

    Datatabeller kan være langsomme i større modeller. Paste følgende i VBA-editoren (Alt + F11):

    Sub MonteCarlo() Dim i As Long, n As Long: n = 10000 For i = 1 To n 'Recalc alle tilfældige input Application.Calculate 'Kopier output til resultattabel Sheets("Sim").Cells(i + 1, 2).Value = Sheets("Model").Range("NPV_out").Value Next iEnd Sub

    NPV_out er blot et navngivet område med din NPV-formel. Makroen giver fuld kontrol over hvor resultaterne gemmes, og du kan tilføje fejl­fangst eller progress-bar efter behov.

  6. Performance- og fejlfangsttips
    • Slå Automatisk beregning fra (Formler > Beregningsindstillinger > Manuel) mens du opstiller modellen. Tænd først til sidst.
    • Brug RANDARRAY() i ét hug i stedet for tusindvis af individuelle RAND() – det reducerer Excel-volatilitet.
    • Indsæt =IFERROR(…; "") omkring outputformler; én fejl stopper hele datatabellen.
    • Gem en kopi, før du kører >5.000 iterationer – store datatabeller kan ikke fortrydes (Undo).
    • Hold resultatområdet i et særskilt ark for at undgå unødvendig opdatering af grafer og pivottabeller under simuleringen.

Når de 10.000 resultater er på plads, er næste skridt at analysere dem – histogrammer, percentiler og VaR/CVaR – hvilket vi dækker i den følgende sektion.

Analysér resultaterne: Histogram, percentiler, VaR/CVaR og følsomhed

Når de f.eks. 10.000 simuleringer er gennemført, sidder du med en lang kolonne af resultater – typisk ét tal pr. iteration (fx NPV eller det årlige portefølje­afkast). Næste skridt er at strukturere, visualisere og fortolke tallene, så de giver ledelses­mæssig mening.

1. Saml outputtet i en resultattabel

  1. Opret et separat ark kaldet “Resultater”.
  2. Indsæt dine model-outputs i en kolonne (ofte via en dynamisk SPILL-reference fra selve simuleringen).
  3. Beregn de mest grundlæggende nøgletal lige ved siden af:
    • Forventet værdi (middel): =AVERAGE(OutputRange)
    • Standardafvigelse: =STDEV.S(OutputRange)
    • P5 / P50 / P95: =PERCENTILE.INC(OutputRange;0,05) osv.

2. Visualisér usikkerheden

a) Histogram

  • Opret et bin-interval (fx i trin af 1 mio. kr. eller 1 %-point).
  • Brug =FREQUENCY(OutputRange;BinRange) eller det moderne =HISTOGRAM i Excel 365.
  • Indsæt et kolonne­diagram og tilføj dataetiketter, så fordelingsformen straks kan aflæses.

b) Empirisk CDF (kumulativ fordeling)

  1. Sorter outputkolonnen med =SORT(OutputRange;1;TRUE).
  2. Lav en hjælpekolonne med løbende andel: =SEQUENCE(COUNT(OutputRange);;;1)/COUNT(OutputRange).
  3. Plot et XY-diagram (scatter) – X-akse = det sorterede output, Y-akse = kumulativ sandsynlighed. Det giver et hurtigt blik på, hvor meget af massen der ligger over/under beslutnings­relevante tærskler.

3. Risk metrics: Var og cvar

  • Value at Risk (VaRα): negativt værste resultat med sandsynlighed α. Formel i Excel: =-PERCENTILE.INC(OutputRange;1-α). Sæt fx α = 95 % (0,95) for VaR95.
  • Conditional Value at Risk (CVaR / Expected Shortfall): gennemsnit af tab, der overskrider VaR.
    1. Filtrér output, der er mindre end VaR-grænsen (brug FILTER eller en pivottabel).
    2. Beregning: =-AVERAGE(FILTER(OutputRange;OutputRange<VaR_grænse)).

4. Scenarie- og følsomhedsanalyse

Tornado-diagram (one-way sensitivity)

  1. Definér de vigtigste input-parametre (diskonteringsrente, vækst, marginer osv.).
  2. Løb hver parameter igennem et lavt og højt niveau (fx P5 og P95), mens de øvrige holdes på medianen.
  3. Beregning af ændringen i output: =Output_high - Output_low
  4. Anbring resultaterne i en vandret søjle­graf sorteret efter absolut påvirkning – de bredeste søjler viser, hvor beslutnings­fokus skal ligge.

Scenarier

Hvis to-tre kombinationer af antagelser er særligt interessante (optimistisk, basis, pessimistisk), kan du opsummere deres respektive positioner i fordelingen ved at markere dem på histogrammet eller CDF’en. Det skaber genkendelige “ankre” for ledelsen.

5. Tolkning – Fra tal til beslutning

  • Se på hele spektret i stedet for kun middelværdien. En høj standard­afvigelse eller en tyk hale til venstre kan gøre et projekt uattraktivt trods positiv forventet NPV.
  • VaR & CVaR fungerer som worst-case vagthunde: Hvor stor er sandsynligheden for at bryde låneaftaler eller afvige fra budget?
  • Kryds referencepunkter (break-even, kapitalkrav, bonus­triggere) med percentiler – “Der er 18 % risiko for, at NPV’en bliver negativ”.
  • Brug tornado-diagrammet til at allokere analyse­ressourcer: Hvilke input bør undersøges nøjere, og hvor giver det mening at afdække risiko (FX-hedge, price floors, mv.)?

Med en velstruktureret resultat­analyse kan du sætte procenter og kroner på usikkerheden – præcis det, Monte Carlo-simulering i Excel handler om.

Best practices, faldgruber og næste skridt

En Monte Carlo-simulering er kun så god som de antagelser, der ligger bag. Brug nedenstående trin som en fast arbejdsgang, hver gang du bygger eller opdaterer en model.

  1. Valider inputfordelinger
    • Sammenlign parametre (middel, spredning, haleopførsel) med historiske dataserier eller branchebenchmarks.
    • Indhent ekspert-eliciterede vurderinger, især hvor datagrundlaget er tyndt. Dokumentér interview- eller workshop-noter i et særskilt ark (Assumptions_Log).
    • Kør goodness-of-fit tests (fx Kolmogorov-Smirnov) i et hjælpeprogram som R, Python eller XLSTAT for at teste, om den valgte fordeling passer.
  2. Backtest og kalibrér
    • Sammenhold ældre forecasts med de faktisk observerede udfald. Justér fordelingernes parametre, hvis modellen systematisk over- eller undervurderer risiko.
    • Gem backtest-resultater i en versionsmappe (/Backtest/2024Q1/) så du kan spore forbedringer over tid.
  3. Versionsstyring
    • Gem .xlsx-filer under versionsnumre (Model_v1.2.xlsx). Brug evt. Git LFS eller OneDrive-versioner for automatisk historik.
    • Frys en PDF-rapport af antagelser og resultater for hver publiceret version.

Typiske faldgruber (og hvordan du undgår dem)

  • Skjult antagelse om uafhængighed: Hvis inputvariabler reelt er korrelerede (fx omsætning og bruttomargin), skal du implementere korrelationsmatricer via Cholesky-faktoriseret MMULT(). Ignorerer du dette, undervurderes risikoen.
  • For få iterationer: Under 1 000 iterationer giver typisk ustabile halestatistikker. Brug 5 000-10 000 som minimum, og test konvergens ved at plotte middelværdi ± 2·SE mod antal kørsel.
  • Forkert fordelingstype: Normalfordelinger til klart positive variable (fx efter-skat cash flow) skaber negative, urealistiske udfald. Overvej lognormal, beta eller triangulær i stedet.
  • ”Hard-coding” af seed: Et fikseret RAND()-seed er fint til audit, men kør også en ”shake-down” med forskellige seeds for at sikre robusthed.
  • Manglende enhedskonsistens: Sørg for, at alle input er justeret til samme valuta, inflationsbasis og tidsenhed, inden du sampler.

Checkliste til kvalitetssikring

Spørgsmål Ja Nej/N.A.
Er alle inputfordelinger dokumenteret med kilde & rationale?
Er korrelationer identificeret og korrekt implementeret?
Er modellen backtestet mod historik?
Er antal iterationer valideret (konvergens-test)?
Er alle formler låst til navngivne områder for let audit?
Er der genereret en fast PDF-rapport for versionen?

Skabeloner og næste skridt

For at spare tid kan du bygge en basis-skabelon med følgende ark:

  1. Input_Distributions – samler parametre, NORM.INV()/LOGNORM.INV()-formler, dokumentation.
  2. Simulation_Core – dummy-tæller i kolonne A, Hvad-hvis-analyse via Datatabel.
  3. Outputs – tabel til percentiler, VaR/CVaR, dynamiske histogrammer.
  4. Tornado – følsomhedsanalyse med DATA.TABLE().
  5. Audit_Trail – changelog, seed-nummer, timestamp og ansvarlig modellør.

Med en solid proces, klare dokumentationskrav og et par simple tjeklister bliver dine Excel-simulationer både troværdige, reproducerbare og nemme at forklare til beslutningstagere.

Indhold