Zeitreihen visualisieren in R: tidyquant / Amazon-Kurse in der Pandemie

Amazon Aktienkurs während Covid-19-Pandemie

Zeitreihenanalyse ist ein Spezialthema, das in R von spezialisierten Paketen abgedeckt wurde und wird.  So entstand eine Nische, die sich weitgehend unabhängig von neueren R-Paketen zur Datenanalyse entwickelte.

tidyquant von Matt Dancho und Davis Vaughan baut eine Brücke zwischen zeitreihen-spezifischen Paketen wie quantmod, xts, zoo, PerformancAnalytics und TTR einerseits sowie dem tidyverse andererseits mit Paketen wie dplyr, tidyr, ggplot2, purrr usw.

tidyquant von Matt Dancho und Davis Vaughan: Eine Brücke zwischen zeitreihenspezifischen Paketen und dem tidyverse.
Quelle: Youtube Video, verlinkt in der Vignette Introduction to tidyquant.
Siehe help(package = „tidyquant“)

Kursentwicklung der Amazon-Aktie vor und während der Covid-19-Pandemie

Fragestellung: Wie hat sich die Amazon-Aktie vor und während der Covid-19-Pandemie entwickelt? Die erste nützliche tidyquant-Funktion tq_get() erlaubt es uns, sehr bequem mit einem simplen Einzeiler an die Aktienkurse zu kommen:

Aktienkurse bequem laden mit tidyquant::tq_get()

library(tidyverse)
library(tidyquant)

AMZN <- tq_get("AMZN", from = "2015-01-01", to = "2021-05-31")

Die Daten enden mit dem Mai 2021, wie im Video oben. Sie enthalten die folgenden Variablen:

Kursentwicklung der Amazon-Aktie; Daten von Yahoo Finance, in R importiert mittels tidyquant::tq_get()

Die kable()-Funktion dient der Ausgabe in einem Markdown-Dokument, auf dem das Video basiert (genauer: eine xaringan-Präsentation). Wir erhalten den Eröffnungs- und Schlusskurs, den Tageshöchst- und Tiefststand und einen adjustierten Kurs, der Dividendenzahlungen berücksichtigt.

Erste Visualisierungen

Nun können wir die Daten visualisieren. Der erste Versuch ist ein simples ggplot2-Diagramm:

AMZN %>%
  ggplot(aes(x = date, y = adjusted)) +
  geom_line()
Amazon Kursentwicklung: Erstes, simples ggplot2-Diagramm

Wir können es etwas verfeinern, indem wir ein anderes theme (Stil) verwenden und es besser beschriften:

theme_set(ggthemes::theme_wsj())

AMZN %>%
  ggplot(aes(x = date, y = adjusted)) +
  geom_line() +
  scale_y_continuous(
    labels = scales::label_dollar(),
    position = "right") +
  labs(title = "Amazon Stock Price",
       x = "")
Amazon Kursentwicklung: theme Wall Street Journal (wsj)

Wie entwickelte sich die Amazon-Aktie in der Pandemie?

Der Zeitraum ist relativ lang gewählt, mit einem mehr oder weniger kontinuierlichen Anstieg bis 2019, der sich dann nicht weiter fortsetzte.

Um den Pandemie-Zeitraum genauer zu betrachten, zoome ich ins Jahr 2020 und nehme die ersten fünf Monate 2021 mit dazu. Ich könnte die Daten filtern – hier tue ich das jedoch direkt im ggplot-Aufruf:

AMZN %>%
  ggplot(aes(x = date, y = adjusted)) +
  geom_line() +
  scale_y_continuous(
    labels = scales::label_dollar(),
    position = "right") +
  coord_x_date(
      xlim = c("2020-01-01", "2021-05-31"),
      ylim = c(1500, 3500)) +
  labs(title = "Amazon Stock Price",
       x = "")
Amazon Kursentwicklung während der Pandemie (1.1.2020 bis 31.5.2021)

Wir sehen einen starken Anstieg von etwa März bis Juli 2020 von unter 2.000 Dollar auf über 3.000 Dollar, anschließend die typische Volatilität von Aktienkursen.

Gleitenden Durchschnitt ergänzen: tidyquant::geom_ma()

Um die kurzfristigen Schwankungen zu glätten und längerfristige Trends besser zu erkennen, bieten sich Glättungskurven an. Das tidyquant-Paket bietet dazu die sehr praktische ggplot-Erweiterung geom_ma(), wobei das ma für moving average, gleitender Durchschnitt steht. Wir können ohne weiteres mehrere geoms (Geometrien) im gleichen Diagramm kombinieren: die ursprünglichen Aktienkurse, einen über 30 Tage geglätteten Durchschnitt sowie einen über 90 Tage geglätteten Durchschnitt.

AMZN %>%
  ggplot(aes(x = date, y = adjusted)) +
  geom_line() +
  geom_ma(ma_fun = SMA, n = 30, size = 1.2) +
  geom_ma(ma_fun = SMA, n = 90, color = "green", size = 1.2) +
  scale_y_continuous(
    labels = scales::label_dollar(),
    position = "right") +
  coord_x_date( 
      xlim = c("2020-01-01", "2021-05-31"), 
        ylim = c(1500, 3500)) + 
  labs(title = "Amazon Stock Price",
       x = "")

Ohne das tidyquant-Paket müssten wir die gleitenden Durchschnitte in den Daten ergänzen – so geschieht die Berechnung sehr bequem im ggplot-Aufruf, ohne den Datensatz selbst verändern zu müssen.

Es stehen verschiedene Berechnungsmethoden für gleitende Durchschnitte zur Verfügung. Hier habe ich einfach SMA = Simple Moving Average verwendet. Alternativen:

  • Exponential Moving Average (EMA) – stärkere Gewichtung aktuellerer Daten
  • Weighted Moving Averages (WMA) – gewichtet
  • Double Exponential Moving Averages (DEMA)
  • Zero-lag exponential moving averages (ZLEMA)
  • Volume-weighted moving averages (VWMA)
  • Elastic, volume-weighted moving averages (EVWMA)

Für Details siehe die tidyquant-Dokumentation: ?geom_ma().

Finetuning: Benutzerdefinierte Legende

Als letzten Schritt wollen wir noch eine bessere Legende verwenden:

AMZN %>%
  ggplot(aes(x = date, y = adjusted)) +
  geom_line(aes(color = "Daily")) +
  scale_y_continuous(labels = scales::label_dollar(), position = "right") +
  coord_x_date(xlim = c("2020-01-01", "2021-05-31"),
                 ylim = c(1500, 3500)) +
  labs(title = "Amazon Stock Price", x = "",
       subtitle = "Daily Adjusted / \nSimple Moving Averages (SMA)",
       caption = "Created using R, tidyverse, \n ggthemes, and tidyquant") +
  geom_ma(ma_fun = SMA, n = 30, aes(color = "30 Day SMA")) +
  geom_ma(ma_fun = SMA, n = 90, aes(color = "90 Day SMA")) +
  scale_color_manual(name = "",
                    values = c("Daily" = "black",
                    "30 Day SMA" = "blue",
                    "90 Day SMA" = "green"))

Das finale Diagramm sieht nun so aus:

Kursentwicklung der Amazon-Aktie während der Covid-19-Pandemie von 1.1.2020 bis 31.5.2021.
Mit 30-Tage-Linie und 90-Tage-Linie (gleitender Durchschnitt / moving average).
Darstellung mit R, ggplot2, tidyquant und ggthemes

Die gleitenden Durchschnitte weisen im starken Anstieg von März 2020 bis Juli 2020 eine gewisse Verzögerung gegenüber den Originaldaten auf. Auf dem dann erreichten Plateau zwischen 3.000 und 3.500 Dollar ist die grüne 90-Tage-Linie stabiler als die blaue 30-Tage-Linie.

Fazit: tidyquant hilft bei Zeitreihendaten

Das tidyquant-Paket von Matt Dancho und Davis Vaughan kann eine wesentliche Arbeitserleichterung bei der Zeitreihenanalyse bieten. Wir haben hier die tq_get()-Funktion gesehen, um bequem Finanzdaten aus dem Netz zu laden, sowie geom_ma(), um gleitende Durchschnitte einzuzeichnen.

Viel Erfolg bei Euren Datenvisualisierungen!

Freue mich über Kommentare!