Im Zuge der Coronkrise erfuhr ich zum ersten Mal vom LKW-Maut-Fahrleistungsindex. Es ist der erste offizielle Konjunkturindikator des deutschen Bundesamtes (Destatis), der auf die kommende Wirtschaftskrise hindeutete.
Der Vorteil des Index ist die Aktualität. Er berechnet sich aus den zurückgelegten Entfernungen von LKWs über 7,5 Tonnen Gesamtgewicht auf den deutschen Autobahnen. Da diese Mautdaten automatisch erfasst werden, ist der Index viel früher verfügbar als manch andere Konjunkturindikatoren (hier die Liste der weiteren Indikatoren). Speziell in der jetzigen Zeit - in welcher oft über eine aufkommende Wirtschaftskrise geredet wird - kann der Index so eine datenbasierte Perspektive aufzeigen.
Von der Seite des stat. Bundesamtes heruntergeladen erhalten wir den Index in vier verschiedenen Variablen. Diese sehen für 2020 wiefolgt aus:
Der Rückgang des Indexes ist ersichtlich:
- die unbereinigten Daten zeigen die Echtdaten. Die Wochenzyklen sind gut erkennbar mit den Einbrüchen am Wochenende und einem erkennbaren Rückgang im Mai.
- der Kalender- und Saisonbereinigte Index ist leichter zu lesen. Er vergleicht die aktuellen mit älteren Daten. Dies erklärt die Ausreisser an den Wochenenden. Bestanden vor der Krise Fahrverbote, so ist gibt es nun dank Ausnahmeregel gefahrene Kilometer auch an Sonntagen.
- Der 7-Tages-Durchschnittswert lässt den Trend besser erkennen. Hier ist der Rückgang im März gut sichtbar.
- Der Wert des KSB gegenüber Vortag zeigt die tägliche Veränderung. Eine zunehmende Volatilität ist erkennbar.
Die tägliche Basis des Indikators ermöglicht es, die einzelnen Tage zu charakterisieren:
Wir sehen, dass sich der Verkehr bis Mittwoch steigert und übers Wochenende abflaut. Zudem können wir eine Abnahme von 2019 zu 2020 erkennen.
Und wie sieht der Index über einen größeren Zeitraum aus? Der Index ist für den Zeitraum seit 2008 verfügbar; die Entwicklung sieht wiefolgt aus:
Für den 7Tages-Durchschnit habe ich noch eine geglätte Linie zugefügt, um die langfristige Entwicklung zu erkennen. Gut ist der Einbruch bis 2010 erkennbar - mit den damaligen Finanz-, Wirtschafts- und Euro-Krisen.
Und wie ist der Zusammenhang zu weiteren Kennzahlen zur wirtschaftlichen Lage? Anbei der Index im Schaubild zusammen mit der Entwicklung des DAX - mit einer signifikanten, positiven Korrelation der beiden Verläufe.
Selbst zum amerikanischen Aktienindex lässt sich eine signifikante und positive Korrelation feststellen - die Globalisierung macht sich auch hier bemerkbar.
Und hier noch der Code in RStudio
library(ggplot2)
library(dplyr)
library(quantmod)
library(gridExtra)
# Data Prep
data <- read.csv("~/Documents/Blog/12_LKW-Mautindex/Daten-Table 1.csv", header=TRUE, stringsAsFactors=FALSE)
names(data) <- data[5,]
data <- data[-c(1:5),c(1:7)]
data <- data %>%
mutate(Datum = as.Date(data$Datum, "%d.%m.%Y")) %>%
mutate(Kalenderwoche= as.numeric(Kalenderwoche)) %>%
mutate(unbereinigt = as.numeric(unbereinigt)) %>%
mutate(`Kalender- und saisonbereinigt (KSB)` = as.numeric(`Kalender- und saisonbereinigt (KSB)`)) %>%
mutate(`gleitender 7-Tage-Durchschnitt KSB` = as.numeric(`gleitender 7-Tage-Durchschnitt KSB`)) %>%
mutate(`Veränderung KSB gegenüber Vortag in Prozent` = as.numeric(`Veränderung KSB gegenüber Vortag in Prozent`)) %>%
`colnames<-`(c("Datum", "Kalenderwoche", "Wochentag", "unbereinigt", "KSB", "KSB_7Tage", "KSB_ggVortag"))
data$Wochentag <- gsub(" ", "", data$Wochentag, fixed = TRUE)
# Plot 1 - die verschiedenen Typen an Indizes
data %>%
filter(Datum > "2020-01-15") %>%
ggplot(aes(x=Datum)) +
geom_line(aes(y=unbereinigt, colour="unbereinigt"), size=0.5) +
geom_line(aes(y=KSB, colour="Kalender-& Saisonbereinigt"), size=1.1) +
geom_line(aes(y=KSB_7Tage, colour = "KSB 7Tage Durchschnitt"), size=1.1) +
geom_line(aes(y=KSB_ggVortag, colour="KSB ggüber Vortag"), size=1.1) +
scale_colour_manual("",
breaks = c("unbereinigt", "Kalender-& Saisonbereinigt", "KSB 7Tage Durchschnitt", "KSB ggüber Vortag"),
values = c("grey", "#00CCCC", "#0066CC", "#004C99")) +
theme_minimal()+
labs(
title = paste("der Mautindex"),
subtitle = "die verschiedenen Subindikatoren",
caption = "Plot 1")
# Plot 2 - die Wochentage im Mai
plot1 <- data %>%
filter(Datum > "2019-01-01") %>%
filter(Datum < "2020-01-01") %>%
ggplot(aes(x=Wochentag, y=unbereinigt, fill=Wochentag)) +
geom_boxplot(outlier.shape=8) +
ylim(0,180) +
scale_fill_brewer(palette="Blues") +
theme(legend.position="none") +
labs(
x=NULL, y=NULL,
title = paste("Der Index per Wochentag"),
subtitle = "die unbereinigten Werte 2019") +
scale_x_discrete(limits=c("Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag"))
plot2 <- data %>%
filter(Datum > "2020-01-01") %>%
ggplot(aes(x=Wochentag, y=unbereinigt, fill=Wochentag)) +
geom_boxplot(outlier.shape=8) +
ylim(0,180) +
scale_fill_brewer(palette="Blues") +
theme(legend.position="none") +
labs(
x="Wochentag", y=NULL,
subtitle = "die unbereinigten Werte 2020",
caption = "Plot 2") +
scale_x_discrete(limits=c("Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag"))
grid.arrange(plot1, plot2, nrow=2, ncol=1)
# Plot 3 - der gesamte Zeitraum
data %>%
ggplot(aes(x=Datum)) +
geom_line(aes(y=KSB, colour="Kalender-& Saisonbereinigt"), size=0.2) +
geom_line(aes(y=KSB_7Tage, colour = "KSB 7Tage Durchschnitt"), size=0.2) +
geom_smooth(aes(y=KSB_7Tage, colour="KSB 7Tage Durchschnitt"), span=1, se=FALSE, size=1) +
scale_colour_manual("",
breaks = c("unbereinigt", "Kalender-& Saisonbereinigt", "KSB 7Tage Durchschnitt", "KSB ggüber Vortag"),
values = c("grey", "#00CCCC", "#0066CC", "#004C99")) +
theme_minimal()+
labs(
title = paste("der gesamte Zeitraum"),
subtitle = "mit geglätter Linie für den 7Tages-Durchschnitt",
caption = "Plot 3")
# Zusammenhang zum Dax
start_date = "2008-01-01"
l<- c("^GDAXI")
getSymbols(l,src="yahoo", from=start_date)
l[1] <- "GDAXI"
GDAXI <- data.frame(date=index(GDAXI), coredata(GDAXI))
#l<- c("^GDAXIP") #DAX Performance Index
#getSymbols(l,src="yahoo", from=start_date)
#l[1] <- "GDAXIP"
#GDAXIP <- data.frame(date=index(GDAXIP), coredata(GDAXIP))
l<- c("^GSPC") #DAX Performance Index
getSymbols(l,src="yahoo", from=start_date)
l[1] <- "GSPC"
GSPC <- data.frame(date=index(GSPC), coredata(GSPC))
joined_data <- left_join(data, GDAXI, by=c("Datum" = "date")) %>%
#left_join(., GDAXIP, by=c("Datum" = "date")) %>%
left_join(., GSPC, by=c("Datum" = "date")) %>%
filter(complete.cases(.)) %>%
select(Datum, Wochentag, KSB, KSB_7Tage, GDAXI.Close, GSPC.Close)
#res <- cor(as.matrix(joined_data[3:ncol(joined_data)]))
#Positive correlations in blue, negative in red Color
#intensity & size of circle proportional to correlation coefficients
#corrplot(res, type = "upper", tl.col = "black", tl.srt = 45, title="Plot 2 - Korrelationen")
# PLOT 4
Korr <- cor.test(joined_data$KSB, joined_data$GDAXI.Close, use="complete.obs") # Korrelation
ylim.primary <- c(0, ceiling(max(joined_data$KSB)))
ylim.secondary <- c(0, ceiling(max(joined_data$GDAXI.Close)))
b <- diff(ylim.primary)/diff(ylim.secondary)
a <- b*(ylim.primary[1] - ylim.secondary[1])
ggplot(joined_data, aes(x = Datum, y = KSB)) +
geom_line(color="#3399FF", size=0.2) +
geom_smooth(span=0.01, se=FALSE, size=0.8)+
geom_line(aes(y = a + GDAXI.Close*b), color = "#404040", size=0.2) +
geom_smooth(aes(y = a + GDAXI.Close*b), span=0.01, se=FALSE, color = "#404040")+
scale_y_continuous("Mautindex", sec.axis = sec_axis(~ (. - a)/b, name = "DAX-Kurs")) +
theme_classic()+
theme(axis.line.y.right = element_line(color = "#404040"),
axis.ticks.y.right = element_line(color = "#404040"),
axis.text.y.right = element_text(color = "#404040"),
axis.title.y.right = element_text(color = "#404040")) +
theme(axis.line.y.left = element_line(color = "#0080FF"),
axis.ticks.y.left = element_line(color = "#0080FF"),
axis.text.y.left = element_text(color = "#0080FF"),
axis.title.y.left = element_text(color = "#0080FF")) +
labs(
title = paste("Mautindex & DAX-Kurs"),
subtitle = paste("Korrelation:", round(Korr$estimate,4), " & p-Value:", format.pval(Korr$p.value, digits = 4, nsmall = 3, eps = 0.001)),
caption = "Plot 4")
# PLOT 4
Korr <- cor.test(joined_data$KSB, joined_data$GSPC.Close, use="complete.obs") # Korrelation
ylim.primary <- c(0, ceiling(max(joined_data$KSB)))
ylim.secondary <- c(0, ceiling(max(joined_data$GSPC.Close)))
b <- diff(ylim.primary)/diff(ylim.secondary)
a <- b*(ylim.primary[1] - ylim.secondary[1])
ggplot(joined_data, aes(x = Datum, y = KSB)) +
geom_line(color="#3399FF", size=0.2) +
geom_smooth(span=0.01, se=TRUE, size=0.8)+
geom_line(aes(y = a + GSPC.Close*b), color = "#404040", size=0.2) +
geom_smooth(aes(y = a + GSPC.Close*b), span=0.01, se=TRUE, color = "#404040")+
scale_y_continuous("Mautindex", sec.axis = sec_axis(~ (. - a)/b, name = "S&P 500")) +
theme_classic()+
theme(axis.line.y.right = element_line(color = "#404040"),
axis.ticks.y.right = element_line(color = "#404040"),
axis.text.y.right = element_text(color = "#404040"),
axis.title.y.right = element_text(color = "#404040")) +
theme(axis.line.y.left = element_line(color = "#0080FF"),
axis.ticks.y.left = element_line(color = "#0080FF"),
axis.text.y.left = element_text(color = "#0080FF"),
axis.title.y.left = element_text(color = "#0080FF")) +
labs(
title = paste("Mautindex & S&P 500-Kurs"),
subtitle = paste("Korrelation:", round(Korr$estimate,4), " & p-Value:", format.pval(Korr$p.value, digits = 4, nsmall = 3, eps = 0.001)),
caption = "Plot 5")
Foto von Pixabay von Pexels