Während wir im letzten Artikel das ultrastabile Portfolio von Dr. Andreas Beck analysiert haben, schauen wir uns jetzt die Indikatoren für eine Krise nach Andreas Beck genauer an, die zu einer Veränderung des investierten Kapitals führen.
Wie im aktuellen Whitepaper zur Beschreibung des ultrastabilen Portfolios dargestellt, werden 3 verschiedene Zustände des Systems unterschieden (sog. “Regimes”) 1, die zu unterschiedlichen Gewichtungen des investierten Kapitals führen.
Dabei erfolgt die Steuerung, in welchem Regime sich das Portfolio aktuell befindet, über folgende Krisen-Indikatoren:
- Aktienmarktverlust zum 3-Jahreshoch
- Volatilität am Aktienmarkt
- Risikoprämien bei Unternehmensanleihen
Mein Ziel ist jetzt, diese 3 Key Performance Indicators (KPIs) des ultrastabilen Portfolios in R
abzubilden, um so in Zukunft selbst schnell und einfach feststellen zu können, in welchem Regime wir uns befinden.
Am Ende des Posts zeige ich auch noch eine Möglichkeit, die Krisen-Indikatoren des Portfolios ganz ohne Programmierkenntnisse in der grandiosen App Portfolio Performance etwas vereinfacht umzusetzen.
Krisen-Indikatoren des Portfolios in R
abbilden
Für den Code verwenden wir diesmal eine RMarkdown-Datei. Damit ist es sehr einfach möglich, alle 3 Indikatoren übersichtlich auf einer Seite abzubilden, ggfs. noch erklärenden Text zu ergänzen und diesen dann z.B. als PDF oder HTML-Datei zu exportieren.
Als Vorbereitung laden wir noch ein paar benötigte Libraries:
library(tidyverse)
library(tidyquant)
library(plotly)
Indikator #1: Aktienmarktverlust zum 3-Jahreshoch
Für diesen Indikator verwenden wir den MSCI All Country World Index (ACWI), der alle Mid Caps und Large Caps der Welt inkl. der Schwellenländer enthält und somit einen guten Gradmesser für den gesamten Aktienmarkt darstellt.
Hierzu laden wir als erstes die historischen Kurse der letzten 3 Jahre. Als Kurslieferant verwenden wir diesmal Ariva, da diese sehr weit zurückreichende historische Daten zur Verfügung stellen.
min_time <- "1.3.2018"
max_time <- "1.3.2021"
tbl_timeseries <- read_csv2(paste("https://www.ariva.de/quote/historic/historic.csv?secu=105686722&boerse_id=8&clean_split=1&clean_payout=1&clean_bezug=1¤cy=EUR&min_time=", min_time, "&max_time=", max_time, "&trenner=%3B&go=Download", sep="")) %>%
select("Datum", "Schlusskurs") %>%
arrange(Datum)
Der Krisen-Indikator besagt, dass für den Übergang in das Krisen-Regime “Eigenkapitalknappheit” (Regime A -> B) der Aktienmarktverlust im Vergleich zum 3-Jahreshoch mehr als 20% betragen muss. Berechnen wir also das Maximum in diesen 3 Jahren:
all_time_high <- max(tbl_timeseries$Schlusskurs)
Als nächstes müssen wir diese historischen Kursdaten nur noch in eine Form überführen, so dass wir sie schön grafisch darstellen können:
p <- tbl_timeseries %>%
ggplot(aes(x = Datum, y = Schlusskurs)) +
geom_line() +
labs(x = "", y = "Price") +
theme_tq() +
scale_color_tq() +
scale_x_date(date_labels = "%Y-%m-%d") +
theme(legend.position = "none")
ggplotly(p +
geom_hline(yintercept=all_time_high, color = "red") +
geom_hline(yintercept=0.8*all_time_high, color = "green"))
Und so stellt sich das Ergebnis unseres ersten Krisen-Indikators Aktienmarktverlust am 1.3.2021 dar:
Die rote bzw. grüne horizontale Linie markiert jeweils den Höchststand bzw. 20% Verlust davon, d.h. das Signal, dass dieser Indikator erfüllt ist.
Indikator #2: Volatilität am Aktienmarkt
Auch die Volatilität stellen wir wieder anhand der täglichen Schwankungen des MSCI ACWI dar. Hierzu berechnen wir mit der Funktion periodReturn
die Renditen auf Tagesbasis:
p2 <- tbl_timeseries %>%
tq_transmute(select = Schlusskurs, mutate_fun = periodReturn, period = "daily") %>%
ggplot(aes(x = Datum, y = daily.returns)) +
geom_bar(stat = "identity", aes(fill = (abs(daily.returns) > 0.05))) +
scale_fill_manual(guide = FALSE, breaks = c(TRUE, FALSE), values=c(palette_light()[["red"]], "#EFEFEF")) +
labs(x = "", y = "Daily Returns") +
theme_tq() +
scale_color_tq() +
scale_y_continuous(labels = scales::percent) +
scale_x_date(date_labels = "%Y-%m-%d") +
theme(legend.position = "none")
ggplotly(p2)
Der Krisen-Indikator verlangt eine sprunghafte Erhöhung der Volatilität am Aktienmarkt. Im Ergebnis habe ich daher die täglichen Ausschläge über 5% rot markiert:
Indikator #3: Risikoprämien bei Unternehmensanleihen
Dies ist sicherlich der komplizierteste Krisen-Indikator im Vergleich zu den anderen beiden.
Im Folgenden schaue ich mir für diesen Indikator den Spread zwischen globalen Unternehmensanleihen mit Rating “Investment Grade” (IG) im Vergleich zu High Yield Unternehmensanleihen an, d.h. Hoch-Risiko-Anleihen. Für den Vergleich verwende ich 2 ETFs von iShares auf entsprechende Indizes, weil sich diese Daten gut auswerten lassen.
Hierfür laden wir als erstes die Kurse der beiden iShares-ETF mit den WKNs A0RGEP und A1C3NE wieder von der Ariva-Website:
tbl_timeseries_ig <- read_csv2(paste("https://www.ariva.de/quote/historic/historic.csv?secu=101756953&boerse_id=8&clean_split=1&clean_payout=1&clean_bezug=1¤cy=EUR&min_time=", min_time, "&max_time=", max_time, "&trenner=%3B&go=Download", sep="")) %>%
select("Datum", "Schlusskurs") %>%
arrange(Datum)
tbl_timeseries_high_yield <- read_csv2(paste("https://www.ariva.de/quote/historic/historic.csv?secu=103419256&boerse_id=8&clean_split=1&clean_payout=1&clean_bezug=1¤cy=EUR&min_time=", min_time, "&max_time=", max_time, "&trenner=%3B&go=Download", sep="")) %>%
select("Datum", "Schlusskurs") %>%
arrange(Datum)
Als nächstes berechnen wir die Kursdifferenz der beiden ETFs und stellen diese grafisch dar:
p <- left_join(tbl_timeseries_ig, tbl_timeseries_high_yield, by="Datum") %>%
mutate(Schlusskurs = Schlusskurs.x - Schlusskurs.y) %>%
ggplot(aes(x = Datum, y = Schlusskurs)) +
geom_line() +
labs(x = "", y = "Spread") +
theme_tq() +
scale_color_tq() +
scale_x_date(date_labels = "%Y-%m-%d") +
theme(legend.position = "none")
ggplotly(p)
Der Indikator verlangt laut dem Whitepaper eine Ausweitung der Risikoprämien, wie sich in unserer generierten Grafik zeigt:
Zeitliche Abfolge am Beispiel des Corona-Crashes
Insbesondere bei den Indikatoren #2 und #3 besteht natürlich eine gewisse Flexibilität zur Bestimmung des exakten Zeitpunkts für den Wechsel von Regime “Normal” zu “Eigenkapitalknappheit”. Während sich der erste Indikator Aktienmarktverlust größer 20% sehr genau bestimmen lässt und knüpft Andreas Beck die Volatilität und den Spread in seinem veröffentlichten Whitepaper nicht an harte Zahlen.
Schauen wir uns daher abschließend am Beispiel des Spreads noch kurz die zeitliche Abfolge an und vergleichen diese mit unseren generierten Grafiken.
Als erstes schlägt der Volatilitäts-Indikator an: ab 9.3.2020 ist hier ein sprunghafter Anstieg zu sehen – erkennbar an den roten Balken im Graphen. Am selben Tag greift auch der erste Indikator, weil der Aktienmarktverlust gegenüber dem Dreijahreshoch vom 19.2.2020 mehr als 20% beträgt, wie der Schnittpunkt der grünen Linie im Diagramm deutlich zeigt.
Trotzdem wurde der Wechsel von Regime A nach B noch nicht vollzogen, da der dritte Indikator, die Anleihe-Spreads, noch nicht auffällig war (siehe Whitepaper Seite 31). In unserem interaktiven Plot zu den Spreads (Indikator #3) in RStudio kann man sehr schön ablesen, dass der Spread am 9.3.2020 mit 38,41 nur leicht über dem Durchschnitt lag. Laut dem Whitepaper wurde dann einige Tage später am 15.3. auch dieser Indikator gerissen, so dass der Regime-Wechsel im Portfolio am 20.3.2020 vollzogen wurde.
Krisen-Indikatoren in Portfolio Performance abbilden
Für alle, die nicht programmieren möchten oder noch etwas Respekt vor dem R-Code haben, zeige ich hier einfachere Möglichkeit, die Krisenindikatoren abzubilden. Dafür verwende ich die kostenlose App Portfolio Performance und erstelle ein neues Performance-Dashboard.
Im Wesentlichen verwende ich für das Dashboard vier Elemente:
- jeweils 1 Diagramm für jeden Krisenindikator
- mindestens 1 Limit auf den breiten Aktienmarkt, z.B. einen ETF auf den MSCI ACWI
Für den ersten Krisenindikator – Abweichung von mind. 20% zum 3-Jahres All-Time-High des breiten Aktienmarkts – verwende ich den ETF von iShares IE00B6R52259 auf den MSCI ACWI. Natürlich kann hier aber auch der MSCI ACWI direkt verwendet werden, wenn ihr entsprechend gute Kursdaten dazu findet.
Eine Möglichkeit ist es, die Chartentwicklung des ETF darzustellen und zusätzlich ein Limit auf das aktuelle All-Time-High des ETF/Index zu setzen. Das All-Time-High der letzten 3 Jahre muss man dabei manuell z.B. über das Chart in Portfolio Performance herausfinden, da die Limit-Funktion nur mit statischen Werten arbeiten kann.
Anschließend füge ich die entsprechenden Widgets „Wertpapiere: Limit überschritten“ und „Performance-Diagramm“ ein und sehe so sehr schnell, wie weit vom letzten All-Time der ETF oder Index aktuell entfernt ist. Dazu ist es zudem noch wichtig, in der Konfiguration des Limit-Attributs in Portfolio Performance die Option „Relativen Abstand anzeigen“ zu aktivieren.
Eine zweite und bessere Alternative ist das neue All-Time-High (ATH) Widget in Portfolio Performance, das ich zur Entwicklung beigesteuert habe. Dieses findet sich unter Neues Widget > Allgemein > Wertpapier: Abstand vom ATH. Anschließend kann einfach der oben genannte iShares ACWI-ETF als Datenreihe ausgewählt werden und das Widget zeigt den prozentualen Abstand zum ATH an. Der Nachteil hierbei ist natürlich, dass es nur eine Momentaufnahme ist und keinen historischen Verlauf zeigt.
Für den zweiten Krisenindikator füge ich den CBOE Volatility Index (VIX) als neues Wertpapier hinzu und erstelle das Benchmark-Diagramm. Die Kursdaten des ^VIX
können zum Beispiel über Yahoo bezogen werden.
Den dritten Krisenindikator – der Spread bei den Corporate Bonds – habe ich zusammen mit dem VIX-Index (rote Linie) in einem Diagramm kombiniert. Hierzu nutze ich – wie von Andreas Beck schon in mehreren Youtube-Videos gezeigt – die Kursdaten des CSI BBB Index (orange Linie) , der den Renditeaufschlag von Unternehmensanleihen mit BBB-Rating (gerade noch so Investment Grade) gegenüber sicheren US-Staatsanleihen nachbildet. Die absoluten Werte sind mir in diesem Fall egal, da es ja nur darum geht, zu erkennen, ob ein sprunghafter Anstieg erfolgt. Die CSV-Daten lassen sich momentan leider nur manuell in Portfolio Performance importieren.
Das Ergebnis in Portfolio Performance sieht dann Stand 8.8.2023 z.B. folgendermaßen aus. Ich denke, man sieht auf diesem Dashboard in der Portfolio Performance App sehr schnell auf einen Blick wie der Markt aktuell einzuschätzen ist und ob wir uns nach der Definition von Andreas Beck in einer Krise befinden oder nicht:
Wenn Du auf der Suche nach weiteren, interessanten Reports in Portfolio Performance bist, schau Dir gerne meine anderen Blog-Posts an.
Ergebnis
Im Ergebnis sieht man sehr schön, dass für die letzten 3 Jahre die Corona-Krise im März 2020 eine Krise im Sinne des Regimes “Eigenkapitalknappheit” (Regime A -> B) des ultrastabilen Portfolios von Dr. Andreas Beck ist.
Dies zeigen alle 3 Krisen-Indikatoren in den grafischen Auswertungen sehr deutlich. Mit dieser Anleitung lassen sich die Indikatoren sehr gut in R
nachvollziehen und für zukünftige Krisen nutzen.
- siehe PDF-Whitepaper “Erfolgreich wissenschaftlich investieren” von Dr. Andreas Beck, Seite 27.
Krisen-Indikatoren in Portfolio Performance abbilden geht jetzt noch einfacher. Seit Version 0.59.1 vom 22. August 2022 kann auch direkt „Abstand vom ATH“ als Element am Dashboard hinzugefügt werden. Konfigurieren lässt sich dann noch der Zeitraum, also z.B. All-time-high der letzten drei Jahre.
Quelle
https://forum.portfolio-performance.info/t/wertpapierperformance-entwicklung-seit-letztem-kurs-hochstwert/22938
Hi Sebastian,
danke für Deinen Hinweis!
Richtig, das Feature habe ich zu Portfolio Performance beigesteuert 🙂
Ich werde den Blog-Post mal dahingehend noch aktualisieren.
Viele Grüße,
Chris
Hallo,
Mir ist heute aufgefallen, dass die API von Ariva verändert wurde und mit der o.a. Query nun keine Daten mehr zurückkommen.
Es liegt an dem Parameter „&boerse_id=8“. Laut meinem Test kann dieser Parameter komplett entfernt werden und die Query funktioniert wieder und liefert die gleichen Ergebnisse wie vorher. Falls jemand die korrekte boerse_id findet, gerne updaten.
Liebe Grüße und Danke für deine Arbeit!
https://r-dashboard.treyla.de/invest/
Servus Lars,
super, danke für die Info!
Ich erinnere mich, dass es im Portfolio Performance Forum auch einen entsprechenden Hinweis gab.
Ich werde das mal testen und im Artikel anpassen.
Viele Grüße,
Chris
PS: Sehr cooles R-Dashboard!
Hallo,
vielen Dank für das R Script. Wenn ich die Max Time auf den 21.06.2022 stelle, generiert mir das Script eine Tabelle und Graphik, die am 17.06.2022 endet. Ich finde den Fehler nicht. Grüße
Pablo
Hi Chris,
wie hast Du denn die 3. Datenreihe (die orangenen Linie) von der Seite der FRED in PP eingebunden bekommen?
wäre dankbar für einen Tipp
Gruß Jörg
Servus Jörg,
hier habe ich mir die Sache einfach gemacht und die CSV-Daten importiert, die man auf der verlinkten FRED-Seite herunterladen kann.
Bei Gelegenheit wollte ich mir das nochmal genauer anschauen und ggfs. einen CSV-Importer für PP schreiben, damit man die Daten live ziehen kann.
Viele Grüße,
Chris
Hi Chris,
besten Dank, jetzt wirds mir klar. Hab das jetzt auch per csv importiert und sieht ähnlich wie deines aus.
Scheint als ob jetzt der 3. Indikator aktuell auch jetzt anschlägt, richtig?
lg Jörg
Ja, von den 2020er-Werten sind wir aber noch etwas entfernt.
Andreas Beck hat das auch in diesem aktuellen Video ganz gut erklärt, dass er im GPO noch keine Veränderung vorgenommen hat.
Viele Grüße,
Chris
Hallo Chris,
vielen Dank für den guten Artikel, habe mir das jetzt in PP nachgebastelt. Gibt es schon Neuigkeiten bzgl. Import von Live-Daten von der FRED Seite?
Danke, Grüße
Konrad
Hi Konrad,
leider nein, ich behelfe mir momentan immer noch mit dem regelmäßigen, manuellen Import der CSV-Daten.
Dies funktioniert für mich relativ gut und ist kein großer Aufwand.
Mit der Implementierung des CSV-Importers hatte ich mal gestartet, allerdings ist es relativ viel Arbeit und große Pull Requests bekommt man bei Portfolio Performance nur schwierig in die nächste Version gemerged, da Andreas wenig Zeit hat. Alternative wäre natürlich ein separater Fork, aber ist natürlich auch nicht so toll.
Ich guck mal, was ich in Zukunft daraus mache.
Benötigst Du das Feature dringend?
Viele Grüße,
Chris
Hey danke für die schnelle Antwort, dann werde ich das jetzt auch so machen erst mal- nein, ist nicht dringend, wäre nur ein nice to have.
Super Arbeit,
liebe Grüße
Konrad
Pingback: Analyse des ultrastabilen Portfolio von Andreas Beck | Finanzen für Techies | /dev/investor
Hi, sehr guter Artikel, danke dafür.
Deine Ermittlung für die Volatilität ist natürlich sehr viel genauer, aber einfacher geht es mit dem VIX index auf den S&P 500. Nach Marktkapitalisierung ist dies eh der "größte" Markt.
Den Indikator für B zu C habe ich allerdings anders, bzw. weniger komplex verstanden nachdem ich die Fußnote durchgelesen habe, Zitat: "Ausgehend vom Dreijahreshoch befindet sich das Aktienportfolio somit nach den Regimewechseln A->B und B->C zu 40% im Verlust(0,80×0,75=0,60).
Somit würde ein das Dreijahreshoch * 0,6 mit dem aktuellen Wert des ACWI oder FTSE All-World (Symbol VGWL.DE) vergleichen (hat eine etwas größere Abdeckung). Hier mal ein Beispiel in Python, allerdings ohne Plot. Benutze das lediglich um mich via Telegram zu alarmieren:
Servus Andre,
wow, vielen Dank für Deinen Kommentar und das Script!
Werde ich auf jeden Fall mal testen.
Du hast Recht, ich würde auch sagen, das ist eine valide Vereinfachung mit dem VIX.
Viele Grüße,
Chris
Sehr guter Artikel!
Natürlich ist perfektes Timing unmöglich. Es wäre aber dennoch interessant zu untersuchen, wann genau man kaufen sollte, d.h. sollte man kaufen wenn der Spread maximal ist, oder wenn er sich wieder verringert hat? Gibt es hierzu Erfahrungswerte?
Grüsse,
Dirk
Hi Dirk,
vielen Dank für Dein Feedback! Freut mich sehr, dass Dir der Artikel gefällt.
Andreas Beck spricht in seinem Whitepaper (https://globalportfolio-one.com/ ) von einer "Ausweitung der Risikoprämien" (siehe Seite 27) und konkretisiert dies dann später in der zeitlichen Abfolge noch. D.h. ich verstehe es so, dass der Spread möglichst maximal sein sollte.
Ich habe im Blog-Post noch einen Abschnitt ergänzt, der die zeitliche Abfolge genauer beschreibt und mit meinen generierten Plots aus R vergleicht. Ich hoffe, es wird so auch nochmal verständlicher.
Viele Grüße,
Chris
Hi Chris,
ja, ich denke auch, dass der Spread maximal sein sollte. D.h. man weiss natürlich nicht, wann das Maximum erreicht sein wird. Daher sollte man den Spread eine Zeit lang beobachten. Ich werde so verfahren: Wenn der Spread nach seinem sprunghaften Anstieg 7 Tage in Folge wieder gefallen ist, so werde ich kaufen. Ich hoffe und bete dann, dass das bisher beobachtete Maximum wirklich das absolute Maxiumum war und es nicht noch zu einem weiteren Anstieg des Spreads kommt. Eine Garantie gibts natürlich nicht.
Grüsse,
Dirk
Herzlichen Dank für diese nützlichen Werkzeuge, finde ich großartig. Leider kenne ich mich mit diesem "R" überhaupt nicht aus und habe etwas Zeit benötigt, um diese Code-Zeilen zum Leben zu erwecken. Letzten Endes ist es gelungen und ich konnte die hier abgebildeten Plots dann erzeugen. Ich musste dafür allerdings an zwei Stellen Änderungen vornehmen: Beim Indikator "Aktienmarktverlust" habe ich in der Zeile
labs(, x = "", y = "Price") +
das Komma hinter der öffnenden Klammer entfernt. Im letzten Code-Block für den Indikator Risikoprämien habe ich "tbl_timeseries_aaa" durch "tbl_timeseries_ig" ersetzt.
Nochmals vielen Dank jedenfalls, finde es super, dass du dir die Mühe machst und das hier veröffentlichst.
Hi cs,
vielen herzlichen Dank für Deinen Input!
Du hast absolut Recht, da haben sich tatsächlich 2 kleine Fehler eingeschlichen (so ist das, wenn man nachträglich noch optimiert ;-).
Ich habe beide Stellen korrigiert.
Viele Grüße & schöne Ostertage,
Chris
Hallo – Super Beitrag, bin ebenfalls großer Fan vom A Beck ! Ich habe es in Excel 2017 Nachgebaut!
Ich habe für secu=105686722 / ACWI / A1JMDF am
2/12/2020 eine Kurs von 56,6032
Hi,
vielen Dank für Deinen Kommentar!
Magst Du Dein Excel vielleicht zur Verfügung stellen, damit wir die Ergebnisse vergleichen können?
Viele Grüße,
Chris