Forestil dig, at du trykker Run, og skærmen fyldes med en jævnt stigende equity-kurve, der ender i en svimlende høj afkastprocent. Det føles næsten magisk – som om du netop har fundet den hellige gral blandt handelsstrategier. Men pas på! Bag den perfekte graf kan der gemme sig et minefelt af skjulte fejl, forenklinger og bias, der først afsløres, når rigtige penge kommer i spil.
Backtesting er et uundværligt værktøj for enhver investor eller kvant, men det er også et af de mest forræderiske. Små antagelser kan forvride resultaterne, og ét overset datapunkt kan vende en lovende strategi til et dyrt mareridt. Hos FCE Invest ser vi gang på gang, hvordan ny- som garvede investorer falder i de samme fælder – ofte fordi de ikke kender dem, eller fordi de undervurderer deres betydning.
I denne artikel afdækker vi de 10 mest udbredte faldgruber ved backtesting – fra kurvetilpasning og look-ahead bias til regimeskift og undervurderede drawdowns. Du får konkrete eksempler, praktiske tjeklister og værktøjer til at styrke dine tests, så du kan skille ægte alfa fra ren tilfældighed. Er du klar til at se, hvor robust dine modeller i virkeligheden er? Så læs med – det kan være forskellen på konsistente gevinster og kostbare fejltrin.
Kurvetilpasning: når modellen lærer fortiden for godt
Overfitting – eller på dansk kurvetilpasning – opstår, når en strategi lærer de tilfældige udsving i et historisk datasæt lige så godt som de underliggende lovmæssigheder. Resultatet er en model, der ser imponerende ud på papir, men som kollapser i det øjeblik den møder nye markedsforhold.
Sådan sniger kurvetilpasning sig ind
- Agressiv parameteroptimering
Jo flere glidende gennemsnit, filtre og stop-loss-intervaller du afprøver, desto større er chancen for, at du finder den ene kombination, som tilfældigvis passede perfekt til fortiden. - Komplekse regelværk
“Hvis RSI < 30 og MACD krydser opad og pris er over VWAP, så køb …” – hver ekstra betingelse reducerer antallet af historiske observationer, som skal passe, og øger risikoen for at modellere støj. - Inkonsistent dataperiode
Strategier, der først opstår efter utallige backtests, har ofte absorberet særprægene i netop den tidsperiode, hvor de blev “opdaget”.
Alarmklokker: Symptomer på overfitting
- Nær-perfekt equity-kurve uden synlige drawdowns eller sidelæns perioder.
- Ekstrem følsomhed – flyt én parameter fra 20 til 19, og Sharpe-raten halveres.
- Urealistisk hit-rate (fx 80-90 %), som pludselig falder til under 50 % i live-handel.
Værktøjskasse: Sådan tæmmer du kurvetilpasning
| Metode | Praktisk anvendelse |
|---|---|
| Out-of-sample validering | Split datasættet i træning og test. Justér modellen på træningsdelen, rør ikke testdelen før allersidst. |
| Walk-forward optimering | Rul en tidsvindue frem (fx 3 år optimering, 6 mdr. test) og gentag. Efterligner reel re-kalibrering. |
| Regel- og parameterpenalisering | Brug informationskriterier (AIC/BIC) eller simple heuristikker som “en regel koster 0,5 Sharpe-point”. |
| Ensemble- eller bagging-strategier | Kombinér flere, svagt korrelerede modeller frem for én perfekt tilpasset. |
| Randomisering (Monte Carlo) | Permuter afkastrækkefølgen eller stikprøve parametre for at måle robusthed. |
| Simplere modeller | Foretræk færre regler og parametre; “alt hvad der kan skæres væk, skal skæres væk”. |
Ved konsekvent at anvende ovenstående disciplinerer du udviklingsprocessen og øger chancen for, at strategien også leverer i fremtiden – ikke kun i et velpoleret backtest-diagram.
Look-ahead bias og datalækage
Look-ahead bias – eller datalækage – opstår, når din backtest på én eller anden måde får adgang til information, som i virkeligheden først bliver tilgængelig efter det tidspunkt, hvor beslutningen burde være truffet. Resultatet er en kunstigt høj performance, fordi strategien “snyder” ved at kende fremtiden. Nedenfor gennemgår vi de mest almindelige faldgruber og giver en praktisk tjekliste, som kan hjælpe dig med at holde fremtidig information ude af dine backtests.
Typiske kilder til look-ahead bias
- Brug af slutkurs (Close) til signaler, der eksekveres samme dag
Mange skriver regler som “Køb, når glidende gennemsnit bryder op gennem kursen.” Hvis signalet beregnes på dagensCloseog ordren eksekveres til samme kurs, indsniger der sig allerede et halvt døgns fremtidig information, fordi du i real-tiden først kender lukkeprisen efter markedet er lukket. - Rebalancerings- eller indekslister dateret frem i tiden
Dataleverandører publicerer typisk den fremtidige sammensætning af fx MSCI World et par dage før den træder i kraft. Hvis din test bruger den liste på annonceringsdagen, har du bedre information end en real-time investor, som først kan handle når ændringen implementeres. - Fundamentale nøgletal, der revideres bagudrettet
Regnskabsdata opdateres, når virksomheder indsender korrigerede tal eller GAAP-justeringer. Backtester du på et “clean” databaseudtræk, der allerede inkluderer revisionerne, kan dine modeller træffe beslutninger på tal, som ikke eksisterede på analyse-tidspunktet. - Corporate actions og prisjusteringer
Splits og udbyttejusteringer bliver ofte implementeret som om de gjaldt historisk (back-adjustment). Hvis du f.eks. bruger et ATR-baseret stop-loss, der er beregnet på en prismatric, som er retroaktivt justeret, kan ATR’en være anderledes end den var i real-tid. - Punkt-i-tid manglende data
Manglende observationer (NA’s) udfyldes måske først senere med faktiske tal. Et simpeltfill-forwardkan uforvarende bruge senere information til at udfylde huller i fortiden.
Symptomer på, at du allerede har datalækage
- Næsten perfekte equity-kurver uden drawdowns.
- Eksekveringspris identisk med dagens lukkepris, selv på højt turnover.
- Markant højere performance i backtest end live-handel med samme kode.
Tjekliste: Sådan undgår du look-ahead bias
| Kontrolpunkt | Hvad du skal gøre |
|---|---|
| Signal-tid vs. handels-tid | Sørg for mindst én bar latency: Beregn signalet på t-1 og eksekvér på t (ofte næste dags åbning). |
| Punkt-i-tid databaser | Anvend “as-reported” datasæt (Compustat, CRSP, Refinitiv) med filing-dates, ikke blot “period-end”. |
| Indeks- og rebalanceringslister | Forskyd effektive datoer med offentliggørelses-lag (typisk 1-5 handelsdage). |
| Corporate actions | Gem både rå og justerede priser. Brug rå priser til beslutninger, men justerede til performance, eller modeller selve udbyttebetalingen. |
| Datapipelines | Log tidsstempel for hver feature. Skriv unit-tests, der fejler, hvis en feature har timestamp efter handels-tidspunktet. |
| Visuel sanity-check | Marker handles på prisgrafen. Hvis ordren ligger på samme bar som signalet og fill-prisen er dagens Close, er noget galt. |
| Uafhængig kode-gennemgang | Lad en kollega (eller dig selv efter en pause) gennemgå pipelines med fokus på tidsstempler og datakæde. |
Ved konsekvent at implementere ovenstående kontrolpunkter fjerner du langt de fleste kilder til look-ahead bias. Resultatet er backtests, der langt bedre afspejler, hvad du realistisk kan forvente, når strategien rulles ud i den virkelige verden.
Survivorship bias i datasættet
Forestil dig, at du i 2024 downloader listen over S&P 500-selskaber fra dit foretrukne dataabonnement og backtester en køb-og-behold-strategi tilbage til 2004. Resultatet ser fantastisk ud: strategien slår markedet med flere procentpoint om året, drawdown er lav, og Sharpe-ratioen er misundelsesværdig. Men du har – uden at vide det – snydt.
Problemet hedder survivorship bias. Når du kun medtager de selskaber, der stadig findes (og som typisk tilhører de stærkeste og mest profitable), får du et historisk kursforløb, hvor de værste konkurskandidater er fjernet fra ligningen. Du sammenligner derfor apple-tærter med æbleskrog og overvurderer både afkast og risikojusteret performance.
Hvorfor overlevende aktier forvrænger billedet
- Udvælgelseseffekten: Selskaber, der bliver i et indeks, gør det netop fordi de har haft bedre vækst, højere markedsværdi og lavere finansiel stress. De er statistisk ikke repræsentative for det oprindelige univers.
- Klassisk ”dead-company discount”: Konkursramte eller delistede aktier går ofte mod
0; fjerner man dem, fordufter disse negative afkast fra backtesten. - Rebalancering bagud i tid: Hvis man i 2024’s konstituentliste backtester 2008, antager man, at porteføljen dengang bestod af fremtidens vindere – hvilket åbenlyst er umuligt for en investor i 2008.
Et hurtigt regneeksempel
| Datasæt (2004-2023) | Årligt geometrisk afkast | Maks. drawdown |
|---|---|---|
| S&P 500 (2024-listen, survivorship bias) | 10,8 % | -36 % |
| S&P 500 (historiske konstituenter, inkl. delistede) | 8,9 % | -50 % |
En forskel på næsten 2 %-point om året og en markant undervurderet drawdown kan forvandle en ”gylden” strategi til lunken realitet.
Sådan skaffer du et bias-frit univers
- Historiske konstituentlister: Køb eller abonnér på datasæt fra f.eks. CRSP, Compustat, Siblis Research eller FactSet, der opbevarer dag-for-dag-medlemskab af indeks.
- Delistede værdipapirer: Sørg for, at både aktier, der er fusioneret, opkøbt, likvideret eller erklæret konkurs, er med. Mange professionelle dataleverandører har delisting return files.
- Tidsstemplede corporate actions: Splits, symbolskift, ticker-recycling og udbytter skal ind i databasen på korrekte datoer for at bevare realismen.
Kontrolspørgsmål før du trykker “run”
- Indeholder mit univers selskaber, der ikke eksisterede på starttidspunktet? (Hvis ja, fix det!)
- Er alle delistede/konkursramte aktier repræsenteret med deres sidste retur og dato?
- Er rebalancering implementeret med forward-filtrering (ingen fremtidsinfo)?
Hvis du kan svare ja til disse tre punkter, er du godt på vej til et mere realistisk og pålideligt backtest-grundlag – og dine læsere, investorer eller kunder vil takke dig for det senere.
Datakvalitet: fejl, revisioner og corporate actions
De fleste private og mange professionelle investorer antager, at historiske kurser og nøgletal er korrekte. Men selv små unøjagtigheder kan forvride en backtest markant, fordi fejlene multipliceres over hundreder af handler og lange testperioder. Derfor bør datakvalitet vurderes mindst lige så kritisk som selve strategilogikken.
- Spike-outliers: En enkelt dags-lukkekurs på 10.000 kr. i stedet for 100 kr. kan få et glidende gennemsnit eller en momentumberegning til at flippe signal, hvorefter strategien “rider” på et fantomafkast.
- Forsinkede eller dublerede handler: Datafeeds, der konsoliderer flere børser, kan inkludere overlappende ticks, hvilket skaber falske volumenbølger.
- Fejl i høj/lav-kurser: Mange handelsalgoritmer bruger ATR eller range-baserede stop-loss. Et enkelt forkert intradag-lav kan udløse et stop, der aldrig ville være blevet ramt i virkeligheden.
2. Manglende justering for udbytter, splits og andre corporate actions
Når et selskab udbetaler udbytte eller laver en aktiesplit, falder den ukorrigerede pris med samme beløb/procent. Hvis backtesten ikke anvender total-return-serier (kurs justeret bagudrettet for udbytte og splits), kan det give:
- Underestimeret afkast: Udbyttebaserede strategier ser pludselig uattraktive ud, fordi de “mister” kontantudbetalingen.
- Falske stop-loss: Et kurstab på 40 % på splitdagen kan ligne et kollaps og stoppe positionen ud.
- Fejl i position sizing: Split justerer antallet af aktier, men kapitalallokeringen beregnes på den gamle kurs, hvilket fordobler eller halverer eksponeringen.
3. Revisionsspor i fundamentaldata
Nøgletal som EPS, EBITDA og gældsgrad bliver ofte revideret måneder efter første offentliggørelse. Uden point-in-time data træner du en model på viden, som investoren ikke havde på det tidspunkt – en snigende form for look-ahead bias.
- Brug leverandører, der tilbyder “as-reported” tidsstempler eller lag-gearede datasæt.
- Gem versioner, så du kan genskabe en backtest senere og dokumentere, hvilke revisioner der var kendt.
Konkrete konsekvenser i backtests
| Anomali | Typisk effekt | Skjult risiko |
|---|---|---|
| Pris-spike | Overdrevet gevinst eller drawdown | Misvisende Sharpe, forkert stop-niveau |
| Ujusteret udbytte | Lavere CAGR | Strategi forkastes, selv om den virker i praksis |
| Fejl i split-håndtering | Dobbelt position | For stor gearing > margin call |
| Fundamental revision | For høj hit-rate | Urealistisk out-of-sample performance |
Sådan renses og dokumenteres dine data
- Etabler en pipeline med automatiske sanity-checks:
range-check (pris >0, pris < 10× foregående dags pris), volume-spikes, og kontrol af corporate action-datoer mod pris-gaps. - Cross-validate med minimum to uafhængige datakilder. Uenighed ⇒ flag til manuel inspektion.
- Log alle korrigeringer i et revisionssystem (Git, DVC el.lign.), så du kan spole tilbage og dokumentere dataversionen for en given backtest.
- Brug total-return serier eller tilpas selv:
justér historiske priser medAdjustmentFactor = (Close + CumDiv) / Closeog inkludér scriptable håndtering af splits/reverse-splits. - Sørg for point-in-time fundamentals. Hvis leverandøren ikke har det, så fasthold egne snapshots kvartalsvis.
- Dokumentér datakilden i alle rapporter: leverandør, udtræksdato, rensningsregler og versions-hash.
Ved at bruge tid på datakvalitet slipper du for at “optimere” på støj og kan i stedet fokusere på det, der virkelig giver alfa: en robust og gennemtænkt investeringsproces.
Omkostninger og friktion: kurtage, spreads, slippage og finansiering
En backtest uden omkostninger er som en turboudgave af din strategi – hurtig, glat og helt urealistisk. I den virkelige verden spiser handelsfriktion store lunser af det nominelle afkast, og jo højere handelsfrekvens, desto større bid forsvinder. Derfor skal alle relevante omkostninger indregnes fra første linje kode.
Hvilke friktioner findes der?
- Kurtage/kommission – den faste eller variable pris du betaler til mægleren pr. handel.
- Bid-ask-spread – forskellen mellem købs- og salgskurs, som du implicit betaler, hver gang du går ind og ud.
- Slippage – afvigelsen mellem den teoretiske pris i backtesten og den pris du reelt kan få, typisk pga. ordrebogsdynamik eller latency.
- Finansieringsrenter – udrulningsomkostninger på futures, lånegebyrer for short-positioner eller margin-rente på gear.
- Eventuelle skatter & afgifter – stempelafgifter, transaktionsskatter eller valutaombytningsgebyrer.
Eksempel: Hvor dyrt er det i praksis?
| Strategi | Handelsfrekvens | Rå CAGR | Omk. (bps pr. handel) | Nettopræstation |
|---|---|---|---|---|
| Positionel (månedlig) | 12 handler/år | 12 % | 5 | 11,3 % |
| Swing (ugentlig) | 52 handler/år | 18 % | 10 | 13,5 % |
| Intraday | 2000 handler/år | 40 % | 12 | 15,8 % |
Selv relativt beskedne 12 bps (0,12 %) per trade kan halvere en intraday-strategis CAGR. Tabellen medtager hverken slippage eller finansieringsrenter – i praksis bliver netto endnu lavere.
Sådan modellerer du omkostningerne korrekt
- Bid-ask-spread
- Har du tick-data, kan du simulere handel til den ene side af spreadet: køb på
ask, sælg påbid. - Har du kun OHLC-data, kan du anslå et gennemsnitligt spread i basispoint (bps) og trække det fra hver handel:
pris ± spread/2.
- Har du tick-data, kan du simulere handel til den ene side af spreadet: køb på
- Slippage
- Lav en regressionsmodel mellem tidligere handler og volumen for at estimere prisimpact:
slippage = α + β · (size/ADV). - Sæt et minimumsgulv (f.eks. 1 bps) for at fange latency-risiko selv på små ordrer.
- Lav en regressionsmodel mellem tidligere handler og volumen for at estimere prisimpact:
- Fast kurtage
- Indsæt realtidspriser fra din broker (0,03 %, 5 kr. pr. handel etc.) direkte i backtesten.
- Skil mellem køb og salg hvis taksterne varierer.
- Short-gebyrer & finansiering
- Download historiske borrow-rates eller brug en konservativ fast sats (f.eks. 2-3 % p.a.) på short-eksponering.
- For futures eller CFD: indregn
roll-cost = spot - futureover levetiden, plus overnight-finansiering.
Tip til kode-implementering
- Opbyg en cost-engine, hvor alle tal samles ét sted; det gør det nemt at skrue på antagelserne.
- Lad omkostningerne være stikprøvefordelte (f.eks. normalfordelt slippage) for at skabe mere realistisk spredning på afkastene.
- Kør en følsomhedsanalyse: Hvor lavt kan omkostningerne gå, før strategien bliver urentabel? Det afslører latent skrøbelighed.
Pas især på ved højfrekvente strategier
Ved intradagshandel kan omkostningerne overstige edge’en med en faktor 2-3, hvis du ikke er aggressiv på infrastruktur, colo-latency og smart order routing. Hvis du ikke selv kan dokumentere en netto Sharpe på backtesten efter realistiske spreads og slippage, er strategien højst sandsynligt død ved fødslen.
Take-away
Backtester du uden at betale kurtage, spread og glidning, svarer det til at prøve bilens topfart i medvind ned ad bakke. Det giver et flot tal, men intet som helst beslutningsgrundlag. Modelér omkostningerne konservativt, og gør det til en fast del af test-pipeline – så slipper du for dyre lærepenge, når strategien møder virkeligheden.
Urealistisk eksekvering: likviditet, market impact og latency
Mange backtests antager, at alle ordrer eksekveres til næste bars åbningskurs eller – endnu bedre – til den teoretiske mid price mellem bud og udbud. Det ser pænt ud på en equity-kurve, men virkeligheden er sjældent så gnidningsfri. Urealistiske eksekveringsantagelser kan forvandle en tilsyneladende profitabel strategi til et tabsgivende foretagende, når den møder rigtig markedslikviditet, market impact og teknisk latency.
Typiske antagelser, der slår fejl
- Fuld udførelse på næste bar – du køber eller sælger hele din ønskede volumen uden prisændring.
- Ingen bid-ask-spreads – modellen bruger lukkekursen eller en midpoint.
- Nul market impact – selv store ordrer flytter ikke kursen.
- Ingen latency – signal, ordreafgivelse og udførelse sker i samme millisekund.
Konsekvenser i den virkelige verden
| Faktor | Hvordan det rammer strategien |
|---|---|
| Bid-ask-spread | Hver handel koster mindst halvdelen af spreadet i ekstra «friktion». Ved høj handelsfrekvens kan hele gevinsten blive opslugt. |
| Market impact | Store ordrer presser prisen imod dig. Effekten vokser uforholdsmæssigt med ordre-/dagsvolumen-ratio. |
| Partial fills | Når kun en del af ordren udføres, afviger positionen fra det modellerede; efterfølgende signaler kan blive invalide. |
| Latency | Selv 100 ms kan forskyde prisen mærkbart i hurtige markeder (makro-nyt, high frequency spikes). |
Sådan modellerer du mere realistisk eksekvering
- Anvend handels-bars i stedet for quote-bars
Brug bid-/ ask-historik, eller træk minst ét tick for at simulere, at du rammer den «dårlige» side af spreadet. - Volume-baserede begrænsninger
- Indfør et loft: fx max 10 % af gennemsnitligt minutvolumen.
- Del store ordrer op i blokke og fordel dem over flere bars.
- Impact-formler
Simple lineære modeller (Impact = k * (OrderVol / ADV)) eller mere sofistikerede (Almgren-Chriss, square-root) kan justere eksekveringspris med et glidende tillæg. - Slippage-modeller
Tilføj en randomiseret afvigelse fra teoretisk pris, kalibreret på historiske handelsdata. Det afslører, om strategien er robust mod «gennemsnitlig uheld». - Latency-simulering
Indlæg et forsinkelsesvindue (fx 1-5 sekunder) mellem signal og ordre. Brug den faktiske pris efter vinduet som udførelseskurs. - Stresstest for likviditetstørring
Fjern fx top 50 % af volumen på dage med markedspanik for at se, om strategien kan overleve «tørre» forhold.
Praktisk eksempel
Signal: Køb 20.000 aktier i XYZ ved lukGennemsnitlig dagsvolumen (ADV): 200.000Vores loft: 10 % af ADV per dag → max 20.000Spread (historisk): 0,20 kr.Impact-model: 0,5 × OrderVol/ADV × prisEksekveringspris: Lukkepris : 100,00+ Halvt spread : 0,10+ Impact (0,5×10%) : 0,50------------------------------ Simuleret pris : 100,60Slippage vs luk : 0,60 %
Backtesten bruger dermed 100,60 kr. i stedet for 100,00 kr. En strategi med gennemsnitlig gevinst på 0,4 % per handel vil nu være tabsgivende.
Tjekliste før du trykker “deploy”
- Har du indregnet bid-ask, commission og slippage i hver eneste handel?
- Er din ordrevolumen realistisk i forhold til gennemsnitlig volumen for alle papirer – også under stress?
- Har du impact-model eller i det mindste konservative spread-multipler?
- Er there latency-buffers indbygget, specielt ved intradag-strategier?
- Har du testet partial fills og scenarier hvor ordrer aflyses pga. limit-pris?
- Monitorerer du live-slippage og sammenligner med simuleret for løbende kalibrering?
Kort sagt: Hvis din backtest ikke får sved på panden af likviditet, vil din live-strategi gøre det. En ærlig modellering af eksekveringsfriktion er langt mindre dyr end virkelige tab.
Multiple testing og parameterjagt (p-hacking)
Mange private og professionelle kvant-investorer kører hundredvis – nogle gange tusindvis – af backtests i jagten på den næste «edge». Hver gang du ændrer et glidende gennemsnit, en stop-loss-procent eller udvider universet, gennemfører du i praksis et nyt statistisk eksperiment. Jo flere eksperimenter, desto større er sandsynligheden for, at én af dem ser lovende ud af ren tilfældighed.
Hvorfor er multiple testing et problem?
- Antag, at du tester 20 uafhængige strategier med et signifikansniveau på 5 %.
Sandsynligheden for mindst ét falsk positivt fund er 1 − (1 − 0,05)20 ≈ 64 %. - Backtests er sjældent uafhængige – parametervariationer overlapper ofte de samme handler, hvilket gør effekten endnu sværere at få øje på.
- Når en strategi først er valgt, er der en tendens til ubevidst at «glemme» alle de mislykkede tests. Det forvrænger den subjektive sandsynlighed for, at fundet er reelt.
Hold styr på eksperimenterne
- Præ-registrér hypoteser: Notér, før du trykker “Run”, hvad du forventer at se, hvilke parameterrum du vil afsøge, og hvilke stop-kriterier du bruger.
- Versions- og logbog: Brug Git, Jupyter-notebooks eller dedikeret backtest-software med indbygget historik, så du kan rekonstruere alle forsøg – også dem, du helst ville glemme.
- Automatisk genererede rapporter: Lad kode gemme performance-tal til en database i stedet for blot at vise dem på skærmen. Så bliver «survivorship» blandt dine egne tests synligt.
Hold-out data og hierarkisk validering
| Data-blok | Formål |
|---|---|
| Træningssæt | Optimer parametre og vælg regler. |
| Valideringssæt | Stop optimeringen, hvis performance flader ud (early stopping). Bruges også til model-selektion. |
| Test-/hold-out-sæt | Først når alle valg er låst, må du kigge her. Én gang! Bruges til det endelige “fast-freeze” af strategien. |
En simpel 70-15-15 split er bedre end ingenting, men endnu mere robust er walk-forward-analyse, hvor du gentagne gange ruller vinduet frem, optimerer og tester i en frisk periode.
Statistiske korrektioner mod p-hacking
- Bonferroni-korrektion: Del din p-værdi-grænse (f.eks. 0,05) med antallet af tests m. Simpelt, men konservativt – især ved mange korrelerede tests.
- Holm-Bonferroni: Trinvist mindre konservativ end den klassiske Bonferroni, men med samme kontrol af den familie-vise fejlrate.
- FDR / Benjamini-Hochberg: Tillader, at en kontrolleret andel af dine fund er falske, hvilket ofte er mere realistisk i et investerings-setup med mange hypoteser.
- White’s Reality Check og SPA-test: Bootstrappede metoder designet til netop portefølje- og tradingstrategier med overlappende handler.
Praktiske tommelfingerregler
- Test én central idé ad gangen. Hvis du ikke kan formulere hypotesen på to linjer, er den for uklar.
- Brug brede, men veldefinerede parameterrum – og lås dem efter den første analyse.
- Rapportér total antal tests, også de dårlige. Transparens øger troværdigheden, ikke omvendt.
- Kombinér altid statistisk korrektion med out-of-sample performance – ingen metode kan fuldstændigt fjerne risikoen for p-hacking.
Konsekvensen af at ignorere multiple testing er ikke bare et par basispunkts overvurdering; det kan betyde, at hele strategien hviler på støj. Brug derfor både disciplineret eksperimentstyring og formelle korrektioner, før du sætter rigtige penge i spil.
Manglende robusthedstests: out-of-sample, walk-forward og stresstest
Når en strategi ser lovende ud i in-sample data, er det fristende straks at trykke på ”deploy”. Men uden systematiske robusthedstests har du i praksis kun vist, at modellen kan forklare fortiden. Nedenfor gennemgår vi tre nøgle-discipliner, der kan afsløre skjult overfitting, og sikre at strategien tåler det uforudsigelige virkelige marked.
1. Out-of-sample validering
- Split & hold-out: Del datasættet kronologisk, f.eks. 70 % træning og 30 % test. Ingen parametertuning må ske på test-delen. Behandl den som ”fremtiden”.
- Performance-kriterier: En tommelfingerregel er, at out-of-sample Sharpe, CAGR og max drawdown højst må forværres ≈20 % i forhold til in-sample. Ellers er strategien sandsynligvis overfitted.
- Blind data-lock: Gem test-perioden fysisk adskilt (zip-fil med password), så du ikke utilsigtet kigger. Først når modellen er endeligt fastlåst, låses filen op og resultatet evalueres.
2. Walk-forward optimering
Finansielle tidsserier er ikke stationære. En statisk parameter, der virkede i 2010, er måske ubrugelig i 2024. Walk-forward-metoden simulerer, at du løbende genkalibrerer modellen efterhånden som nye data kommer ind.
| Trin | Beskrivelse |
|---|---|
| 1. Rul vindue | Vælg f.eks. 3 års træningsvindue og 6 måneders testvindue. |
| 2. Optimer | Tun parametre på træningsperioden alene. |
| 3. Test | Kør den optimerede strategi på det efterfølgende testvindue. Log resultatet. |
| 4. Skift frem | Ryk begge vinduer frem (f.eks. 6 måneder) og gentag indtil nutid. |
| 5. Sammensæt | Kombinér alle test-vinduer til én fortløbende equity-kurve – det er din ”realistiske” historik. |
Fordele: Metoden udnytter alle data både til læring og test, men aldrig samtidigt. Den giver også indblik i, hvor ofte strategien skal genbalanceres for at bevare sin edge.
3. Stresstest og støj-robusthed
- Randomisering af signaler: Tilføj ±1-3 bars tilfældig forsinkelse til entry/exit. Overlever strategien stadig?
- Bootstrap & permuterede afkast: Ombyt rækkefølgen af afkast i blokke (block-bootstrap) for at bevare autokorrelationer, men ændre regimes. Identificér hvor følsom P&L er.
- Parameter-perturbation: Varier hver nøgleparameter ±10-20 %. En robust strategi giver kontinuerlige, ikke kaotiske, ændringer i performance.
- Ekstreme markedsperioder: Test separat på dot-com-krakket, finanskrisen 2008-09, Covid-19-chokket, perioder med inflations- eller rentekurekrig. Høj volatilitet blottlægger skjulte risici.
- Monte Carlo equity-simulering: Tilføj realistisk slippage, spreads og drawdowns, og lav 1 000 stokastiske simulationer. Undersøg worst-case og 95 % konfidensbånd.
Praktiske tommelfingerregler
- Rapportér altid både in-sample og out-of-sample nøgletal side om side.
- Hvis performance kollapser, forkast strategien eller simplificér den – lad være med at ”tune dig ud” af problemet.
- Gem alle forsøg i et versionskontrol-system (Git, MLflow). Det forhindrer ubevidst p-hacking.
- Træn organisationen i at stille spørgsmålet: ”Er resultatet reproducerbart på helt nye data?” – ikke kun ”Ser grafen flot ud?”.
Ved at integrere disse robusthedstests i workflowet kan du med langt større sikkerhed differentiere mellem ægte edge og en luftspejling skabt af overfitting. Din kapital – og dine nerver – vil takke dig senere.
Regimeskift og ikke-stationaritet
Finansielle markeder er ikke-stationære: sammenhænge, som så stærke ud i går, kan forsvinde i morgen, fordi regler, teknologi, likviditet, pengepolitik eller investoradfærd ændrer sig. Et backtest, der strækker sig over flere årtier, blander derfor ofte perioder med vidt forskellige dynamikker – og dermed dur resultaterne kun så længe det underliggende “regime” består.
Hvorfor bryder historiske relationer sammen?
- Strukturelle ændringer: F.eks. decimalisering af aktiekurser, indførsel af højfrekvent handel eller nye ESG-krav.
- Makroøkonomi og pengepolitik: Renteniveauer, inflationsregimer og centralbankinterventioner skifter.
- Adfærds- og konkurrenceeffekter: Når alfar jagtes væk af flere aktører, komprimeres risikopræmierne.
- Regulatoriske skift: Short-salgsforbud, ændringer i marginkrav eller skat.
Tegn på regimeskift i dit backtest
- Pludselige hop i Sharpe ratio eller drawdowns, som ikke kan forklares af markedsvolatilitet.
- Rullende 12M-afkast driver fra +20 % til -5 % uden tilsvarende ændring i handelsomkostninger.
- Korrelationsmønstre (f.eks. value vs. growth) inverteres i bestemte perioder.
Regimefiltre – Eksempler og implementering
| Proxy | Indikation af regime | Typisk strategi-handling |
|---|---|---|
| Volatilitet (f.eks. VIX > 25) | Stress / “risk-off” | Nedskalér positioner eller skift til defensive aktiver |
| Pris vs. 200-dages gl. snit | Trend op eller ned | Kør kun momentum, når pris > glidende snit |
| Yield-kurvens hældning | Recession vs. ekspansion | Overvægt/undervægt cykliske aktier |
| Makro-score (PMI, arbejdsløshed) | Økonomisk vækst | Aktiver faktorer, som historisk virker i vækstregimer |
Adaptiv kalibrering
- Rullende re-fit: Genberegn parametre hver måned/kvartal på de seneste N år i stedet for hele historikken.
- Walk-forward: Optimer på en træningsblok → test på næste blok → rul frem og gentag. Giver et mere realistisk billede af præstation under skiftende forhold.
- Bayesiansk eller online-learning: Opdater vægte løbende, efterhånden som ny data indkommer.
Monitorering af performance-drift
Selv med filtre kan en strategi bløde langsomt. Indfør derfor løbende kontrol:
- Rullende vinduer: Følg Sharpe, hit-rate og max-drawdown over 3-6M vinduer.
- Control charts: Alarm, når nøgletal krydser statistiske grænser.
- Benchmark-spredning: Sammenlign mod passive alternativer; stiger alfa stadig?
Praktisk tjekliste
- Definér klare, kvantificerbare regime-proxies før du ser på data.
- Sørg for, at skift mellem regimer kun kan ske på baggrund af information, der var kendt på beslutningstidspunktet.
- Undgå at over-optimere grænseværdier; brug robuste bånd eller “terciler” i stedet for én perfekt tærskel.
- Dokumentér, hvor ofte parametre re-kalibreres, og hvilken dataperiode de trækker på.
- Etabler automatiske performance-alarmer, der kan sætte strategien på pause, hvis den afviger kraftigt.
Ved at erkende, at markederne skifter gear, og bygge mekanismer til at opdage og tilpasse dig disse skift, rykker du din backtest et afgørende skridt tættere på virkeligheden – og øger chancen for, at strategien også leverer i morgen.
Risikostyring, gearing og undervurdering af drawdowns
Mange private (og professionelle!) systemudviklere fokuserer næsten udelukkende på den geometriske årlige vækstrate (CAGR), når de kalibrerer deres strategi. En flot, stigende equity-kurve kan dog skjule risikoen for ét enkelt knock-out-år, som udligner årtiers fremskridt. Uden en systematisk risikostyring kan gearingseffekt, korrelationsskift eller lave frekvenser af ekstreme tab (tail-risici) få selv den mest lovende backtest til at kollapse i virkeligheden.
1. Fra afkast-fetichisme til risiko-justeret tænkning
- Drawdown først: Begynd med at definere, hvor stort et maksimum drawdown (MDD) du som investor kan leve med. Sæt derefter position sizing og gearing, så strategien historisk ikke overskrider dette niveau.
- Variabilitet betyder noget: To strategier med samme CAGR, men med hhv. 5 % og 25 % annualiseret volatilitet, er ikke lige gode; den stabile strategi kræver mindre psykologisk og finansiel kapitalkræft.
- Risiko skalerer ikke lineært: Gearede ETF’er eller CFD’er multiplicerer ikke blot afkastet-de multiplicerer også gabet mellem høj og lav, kurtosis og sandsynligheden for ‘ruin’.
2. Centrale risiko-nøgletal
| Nøglemetrik | Hvad måler den? | Typisk faldgrube |
|---|---|---|
| Max drawdown (MDD) | Største kumulerede tab fra top til bund. | Ignorerer varighed; et kort, dybt fald kan være mindre smertefuldt end et sejt, langstrakt drawdown. |
| Sharpe-ratio | Afkast minus risikofri rente divideret med volatilitet. | Antager normalfordelte afkast; følsom over for outliers og gearing (kan kunstigt boostes af periodisk mean-reversion). |
| Sortino-ratio | Ligner Sharpe, men bruger kun downside-volatilitet. | Kan stadig overse sjældne ekstreme tab; kræver mange observationer for robust estimat. |
| Value at Risk (VaR) / Expected Shortfall | Tab ved f.eks. 95 % konfidens / gennemsnitstab ud over VaR. | Historisk VaR ignorerer regimeskift; modellering kræver antagelser om fordeling og serial korrelation. |
3. Position sizing og gearing-disciplin
- Kelly-fraktion vs. halv-Kelly: Kelly-kriteriet maksimerer log-utility, men selv små estimationsfejl kan fordoble drawdown. Mange proffer kører ½-Kelly eller mindre.
- Volatilitetsskalering: Justér positionsstørrelse så porteføljevola holdes fx på 10 % p.a. Det glatter equity-kurven og reducerer risiko for ‘volatility drag’ i gearede produkter.
- Caps på enkeltpositioner: Begræns eksponering til f.eks. 10 % af kapital pr. trade eller 20 % pr. sektor for at undgå idiosynkratiske chok.
4. Korrelationer og skjult koncentration
Selv en portefølje med 50 værdipapirer kan være mere koncentreret end den ser ud, hvis aktiverne korrelerer stærkt under stress. Brug korrelation- og betamatricer fra kriseperioder (2008, 2020) for at teste sand diversifikation.
5. Stresstest din drawdown
- Monte Carlo-permute dine afkast for at generere tusinder af alternative equity-kurver. Hvor ofte overskrider drawdown 30 %?
- Kør worst-case refill: antag at hvert trade udføres på den dårligst mulige pris inden for baren.
- Indlæg regimeskift-scenarier: stigende renter, volatilitetsspikes, flash crashes.
6. Praktiske tjekpunkter før live-drift
- Hæv MDD fra backtesten med et buffer-tillæg (f.eks. +25 %), da historisk drawdown sjældent er det værste, du vil se.
- Definér hard stops i handelsmotoren (f.eks. luk alle positioner hvis porteføljen falder 15 % intradag).
- Sæt daglig VAR-trigger: reducer gearing, hvis VaR overstiger et bestemt procentniveau af kapitalen.
- Overvåg realized vs. backtest-risiko: Når live-volatilitet afviger markant, genkalibrér eller sæt strategien på pause.
Ved konsekvent at sætte risikomål på lige fod med afkastmål, og indbygge procedurer til at måle, reagere og skalere, opnår du en strategi, der ikke kun ser godt ud i Excel, men også har en reel chance for at overleve den næste markedskrise.