Zum Inhalt springen
Startseite » Meine kostenlosen ETF-Tools » Krisen-Indikatoren des ultrastabilen Portfolios

Krisen-Indikatoren des ultrastabilen Portfolios

  • 22 Kommentare
  • Lesezeit 9 Min.
Avatar-Foto
Chris

Dipl.-Ing., Developer, #Buy-and-Hold #ETF #Investor, Freelancer

Auto Tacho

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:

  1. Aktienmarktverlust zum 3-Jahreshoch
  2. Volatilität am Aktienmarkt
  3. 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&currency=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&currency=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&currency=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.

Portfolio Performance All Time High Widget

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:

Portfolio Performance Dashboard: Krisenindikatoren

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.


  1. siehe PDF-Whitepaper “Erfolgreich wissenschaftlich investieren” von Dr. Andreas Beck, Seite 27.

Weitere interessante Artikel

Disclaimer: Meine kostenlosen und freien Recherchen stellen meine persönliche Meinung dar und sind in keinster Weise eine Anlageempfehlung. Sie werden mit größtmöglicher Sorgfalt erstellt, aber sie können trotzdem ganz oder teilweise falsch sein. Daher übernehme ich keinerlei Haftung für Anlageentscheidungen, die auf Basis der hier vermittelten Informationen getroffen werden. Des Weiteren erhebt diese Website keinen Anspruch auf Vollständigkeit, Richtigkeit und Aktualität.

22 Gedanken zu „Krisen-Indikatoren des ultrastabilen Portfolios“

  1. Avatar-Foto

    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

    1
    1. Avatar-Foto

      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

  2. Avatar-Foto

    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/

    1
  3. Avatar-Foto

    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

    1
    1. Avatar-Foto

      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

      1. Avatar-Foto

        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

      2. Avatar-Foto

        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

        1. Avatar-Foto

          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

          1. Avatar-Foto

            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

  4. Pingback: Analyse des ultrastabilen Portfolio von Andreas Beck | Finanzen für Techies | /dev/investor

  5. Avatar-Foto

    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:

    import time
    import pandas as pd
    import datetime
    import yahoo_fin.stock_info as si
    import requests
    
    today = datetime.datetime.today()-datetime.timedelta(days=1096)
    
    # dd/mm/YY
    d1 = today.strftime("%d/%m/%Y")
    
    def telegram_bot_sendtext(bot_message):
        
        bot_token = ''
        bot_chatID = ''
        send_text = 'https://api.telegram.org/bot ' + bot_token + '/sendMessage?chat_id=' + bot_chatID + '&parse_mode=Markdown&text=' + bot_message
        response = requests.get(send_text)
        return response.json()
    
    
    def executeSomething():
        vix = si.get_live_price('^vix')
        vgwl = si.get_live_price('VGWL.DE')
        if vix < 40:
          print("--- calc VIX ---")
          d = si.get_data("VGWL.DE" , start_date = d1 , interval = "1d")
          df = pd.DataFrame(d,columns=['high'])
          highs = df['high'].max()
          if vgwl <= highs*0.8:
            print("--- VGWL value ---")
            message = "ALERT VGWL at 80% of 3 year high:" + str(vgwl)
            telegram_bot_sendtext(message)
            print(message)
            elif vgwl <= highs*0.8:
              print("--- VGWL value ---")
              message = "ALERT VGWL at 60% of 3 year high:" + str(vgwl)
              telegram_bot_sendtext(message)
              print(message)
    
    
    while True:
        executeSomething()
        time.sleep(60)
    1
    2
    1. Avatar-Foto

      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

  6. Avatar-Foto

    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

    1. Avatar-Foto

      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

      1. Avatar-Foto

        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

  7. Avatar-Foto

    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.

    1
    1. Avatar-Foto

      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

  8. Avatar-Foto

    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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert