Zum Inhalt springen
Melde dich an, um diesem Inhalt zu folgen  
yannickh

Fehler in meinen Backtests

Empfohlene Beiträge

yannickh

Ich habe mir über die letzten Monate ein eigenes Backtest-System für regelbasierte Aktienstrategien gebaut. Die erste Version lieferte Zahlen, über die ich mich sehr gefreut habe. Inzwischen sind sie deutlich niedriger, und ich traue ihnen jetzt halbwegs. Mehrere der Fehler sind so banal, dass sie vermutlich in vielen selbstgebauten Backtests vorkommen, egal ob in Excel oder Python. Deshalb schreibe ich sie hier auf.

 

Die Verlierer fehlen

 

Meine Aufräum-Routine hat delistete Aktien aus meiner Datenbank entfernt. Was ich nicht bedacht hatte: Per Kaskade ging dabei die komplette Kennzahlen-Historie des Titels mit. Er war damit rückwirkend aus jeder Periode verschwunden, als hätte es ihn nie gegeben. Damit hatte ich mir den Survivorship Bias selbst eingebaut. Seitdem werden Delistings nur noch markiert, die Historie bleibt, und die Position wird zum letzten echten Handelskurs abgerechnet. Gibt es gar keinen Kurs mehr, setze ich 70 % des letzten bewerteten Kurses an statt 100 %. Den Abschlag hat Shumway für fehlende Delisting-Renditen geschätzt. Für Übernahmen ist er zu pessimistisch, für Pleiten zu optimistisch, in Summe wahrscheinlich eher konservativ.

 

Derselbe Fehler steckte eine Ebene höher noch einmal drin. Ich rechne auf einem selbst rekonstruierten Industrieländer-Universum (da ich mir die historische Zusammensetzung des MSCI World o.ä. nicht leisten will): je Land die größten Firmen, bis 85 % der Marktkapitalisierung erreicht sind, angelehnt an die MSCI-Systematik. Die Zugehörigkeit hatte ich aber erst ab Ende August aufgezeichnet und für alle früheren Quartale einfach die Liste von heute genommen. Wer in den zehn Jahren abgestiegen, übernommen oder pleite gegangen ist, war damit nie Kandidat. Die Strategie konnte in diese Firmen gar nicht hineinlaufen.

 

Seit Ende September baue ich die Zugehörigkeit Quartal für Quartal aus den damaligen Marktkapitalisierungen nach, zurück bis Mitte 2015. Die beiden besten Strategien in meiner Vergleichstabelle, zwei reine Bilanzqualitäts-Screens, lagen vorher bei 39 und 37 % p.a., danach bei 13 und 9. Der Index liegt bei 13. Dazu muss ich fairerweise sagen, dass ich in denselben zwei Wochen auch mehrere echte Datenfehler gefunden und behoben habe und das Zeitfenster um zwei Quartale gewandert ist. Sauber auf eine Ursache verteilen kann ich den Rückgang also nicht. Er trifft aber genau die Strategien, denen ich vorher schon nicht getraut hatte, und das ist für mich das stärkste Indiz.

 

Ganz weg ist das Problem nicht. Kandidat kann nur werden, was je in meiner Datenbank gelandet ist. Firmen, die schon vor Beginn meiner Datensammlung komplett verschwunden waren, fehlen weiter.

 

Fehlende Kurse

 

Für die Rückrechnung hatte ich anfangs keine vollständige Kurshistorie, aber Fundamentaldaten. Also habe ich den Kurs rekonstruiert, als KGV mal Gewinn je Aktie. Rechnerisch stimmt das eigentlich. Aber ein Unternehmen in Schieflage macht Verlust, der Gewinn wird negativ, das KGV sagt nichts mehr, und mein Kurs war nicht mehr berechenbar. Der Absturz, also das Wichtigste an dieser Position, kam in den Zahlen nie vor. Inzwischen rechne ich nur noch mit echten Periodenschlusskursen. Gibt es keinen, wird die Position gar nicht erst gekauft.

 

Ähnlich lief es mit fehlenden Kursen im laufenden Depot. Lag für eine Position kein aktueller Kurs vor, habe ich den letzten bekannten fortgeschrieben, und zwar zeitlich unbegrenzt. Eine Aktie, die in die Insolvenz läuft und deren Kursversorgung deshalb abreißt, wurde so am Ende zum Kurs von vor dem Absturz "verkauft", der Verlust tauchte nie auf. Heute wird ein Kurs höchstens eine Periode fortgeschrieben, danach fliegt die Position raus.

 

Am tückischsten sind Kurse, die echt aussehen und trotzdem falsch sind. Manche Börsenplätze notieren in Untereinheiten (London in Pence, Johannesburg in Cents, Tel Aviv in Agorot). Wer das übersieht, liegt um den Faktor 100 daneben, und im Backtest sieht das dann aus wie ein Jackpot. Mein größter Fund dieser Art war der OTC-Ticker von Samsung. Er sprang in meiner Kursreihe im zweiten Quartal 2018 von 0,27 auf 38,23 Dollar, ein falsch verarbeiteter 50:1-Split. Das virtuelle Depot machte in diesem einen Quartal +639 %, und das Zehnjahresergebnis stand bei 45 % p.a. statt grob 19. Ein einziger kaputter Kurs hat die Rendite also mehr als verdoppelt. (Nach allen späteren Korrekturen, vor allem des Universums, liegt dieselbe Strategie heute bei 6,7 %.) Aufgefallen ist er mir nur, weil eine Volatilität von 202 % p.a. nicht sein kann. Seitdem scanne ich jede Position auf Kurssprünge über Faktor 5 zwischen Ein- und Ausstieg. Die meisten Treffer sind echte Mehrjahres-Gewinner. Zwei waren es nicht, und die hätten Strategien geschönt.

 

Wissen aus der Zukunft

 

Von den Korrekturen, die ich sauber messen konnte, war das die teuerste. Meine Kennzahlen-Historie ist nach Geschäftsjahr abgelegt, also Eigenkapitalquote 2019, EBIT-Marge 2019 und so weiter. Der Backtest hat am Stichtag 31.12.2019 mit den Zahlen für 2019 gescort. Am 31.12.2019 kannte die aber noch niemand. Der Abschluss kommt im Februar oder März, bei manchen Firmen erst im Mai. Die Rückrechnung hat also mit Wissen gehandelt, das erst Monate später öffentlich war.

 

Jetzt zählen Bilanz- und GuV-Kennzahlen erst ab der Periode nach dem Periodenende. Reine Kursgrößen (Momentum, Marktkapitalisierung) bleiben stichtagsgenau, die waren ja bekannt. Ein reines Momentum-Profil hat sich dadurch exakt null verändert, was eine schöne Kontrolle war. Fundamentalprofile haben bis zu 25 Prozentpunkte CAGR verloren, so viel hing also an den zu früh verwendeten Abschlüssen.

 

Weniger auffällig ist dasselbe Problem bei Analystenschätzungen, Konsensmeinungen und Gewinnrevisionen. Die bekommt man leicht für den heutigen Tag und praktisch nirgends zeitpunktgenau für 2017. Setzt man den heutigen Wert in die Rückrechnung ein, testet man eine Strategie, die die Zukunft kennt. Was an Schätzungen hängt, werte ich in der Rückrechnung deshalb als nicht erfüllt. Wo es ein Pendant aus Ist-Zahlen gibt (KGV auf den letzten Gewinn statt auf die Schätzung), nehme ich das und sage es dazu. Befriedigend ist das nicht, weil ich damit Strategien teste, die nicht ganz die vom Papier sind. Ich weiß aber keine bessere Lösung, bei der ich nicht schummeln müsste.

 

Nebensachen, die das Ergebnis entscheiden

 

Systeme wie Piotroski oder Mohanram sind recht grob: hunderte Aktien mit gleichem Score/Bewertung. Welche davon ins Depot kommen, entscheidet ein Tiebreaker. Bei mir war das der Umsatz, was vernünftig klingt und sinnvoller als der reine Zufall. Nur stand der Umsatz in Berichtswährung in der Datenbank. Ein japanischer Konzern mit 150 Milliarden Yen Umsatz schlägt jeden amerikanischen mit 5 Milliarden Dollar, weil 150 größer ist als 5. Heraus kam ein Depot aus 100 % japanischen Titeln, bei einer Strategie, die mit Japan nichts zu tun hat. Ich hatte mir dazu zuerst sogar eine Geschichte zurechtgelegt ("die Strategie passt zu japanischen Firmen"), bis ich den Japan-Anteil der Kauf-Kandidaten gezählt habe: 5 bis 17 %, wie im Universum. Mit einem währungsneutralen Tiebreaker sprang die CAGR des Profils von 5,9 auf 12,6 %. 

 

Beim Rhythmus war es ähnlich. Ich habe im August versucht, meine eigene Strategie zu verbessern, mit rund 100 Konfigurationen, sauber in Trainings- und Validierungszeitraum getrennt. Die beste Variante lag im 5-Jahres-Backtest bei 29,9 % p.a. Dann habe ich denselben Backtest mit quartalsweisem statt halbjährlichem Rebalancing wiederholt: 9,4 %. Das unveränderte Ausgangsprofil verlor durch den bloßen Rhythmuswechsel 10,7 Prozentpunkte auf 5 Jahre und gewann 6,6 auf 10 Jahre, ohne dass sich eine einzige Regel geändert hätte. Von der ganzen Parameter-Suche hat kein einziger Renditevorteil den Rhythmuswechsel überlebt.

 

Dabei ist mir noch etwas aufgefallen, auf das ich vorher nie geachtet hatte. Mehrere Spitzenwerte kamen von Depots, die zeitweise nur drei Positionen hielten und 70 % Cash. Die hohe Rendite war eine Cash-Rendite in einem schlechten Jahr und keine Leistung der Strategie. Seitdem schaue ich bei jeder Zahl zuerst auf die Besetzung.

 

Was ich nie nachgemessen hatte

 

Das hier ist mir am peinlichsten. Die Korrektur vom Anfang, Delistings zum letzten Handelskurs abzurechnen, stand monatelang im Code, und ich hielt das Thema für erledigt. Ende August habe ich dann nachgezählt. Von rund 2.400 delisteten Titeln in meiner Datenbank hatte genau null einen hinterlegten Delisting-Kurs, weil der Abgleich, der ihn holt, nie automatisch lief. Die Engine hätte den Kurs ohnehin nur genutzt, wenn die Aktie in der Exit-Periode noch eine Datenzeile hatte, und das traf auf 17 von 2.400 zu. Die Korrektur hat also praktisch nichts getan. 

 

Ähnlich gelagert war ein Problem mit der Reproduzierbarkeit. Meine Engine hat beim Verkaufen über eine Mengendifferenz von Ticker-Symbolen iteriert. Die Reihenfolge ist in Python nicht definiert und variiert zwischen Prozessen. Weil Beträge in Fließkomma aufsummiert werden, kam derselbe Backtest mit denselben Eingaben je nach Prozess auf leicht unterschiedliche Werte. Der Unterschied lag erst in der dritten Nachkommastelle, aber bis dahin hatte ich meine Läufe für reproduzierbar gehalten, ohne es je geprüft zu haben. Später kam derselbe Fehler noch einmal, diesmal als Zufalls-Tiebreaker ohne festen Seed.

 

 

Diese Punkte würde ich auch bei jedem Backtest, den ich sehe hinterfragen. Wenn das nicht sauber beantwortet werden kann, ist die Rendite sehr wahrscheinlich zu hoch. Das gilt auch für meine eigenen Zahlen. Ich nenne sie bewusst "so ehrlich, wie ich es hinbekommen habe" und nicht korrekt. Nach all den Korrekturen liegen die meisten der bekannten Strategien, die ich nachgebaut habe, auf zehn Jahre vor Kosten ungefähr auf Höhe des MSCI World oder darunter, teilweise sogar deutlich. Das ist weniger aufregend als die erste Version, aber ich glaube es eher. 

 

Backtests rechne ich trotzdem weiter, ich lese sie nur anders als am Anfang. Der Renditezahl am Ende traue ich am wenigsten. Bei mir hat sie sich mit fast jeder Korrektur verschoben, meistens nach unten, und einmal hat ein einziger Kurs sie mehr als verdoppelt. Mehr anfangen kann ich mit dem, was man unterwegs sieht: welche Titel eine Strategie tatsächlich ins Depot legt, wie einseitig das Depot dabei wird und in welchen Phasen sie schlecht aussieht. Ein besonders gutes Ergebnis ist für mich inzwischen erst einmal ein Grund, nach dem Fehler zu suchen. Als Renditeprognose würde ich keinen Backtest nehmen, auch meinen eigenen nicht.

 

Ich gehe nicht davon aus, dass meine Liste vollständig ist. Wenn jemand einen weiteren systematischen Fehler sieht, interessiert mich vor allem ein Fall, in dem er meine Ergebnisse noch deutlich verschieben könnte.

Diesen Beitrag teilen


Link zum Beitrag

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
Melde dich an, um diesem Inhalt zu folgen  

×
×
  • Neu erstellen...