Visualisierung von Kreditportfoliomodell-Ergebnissen mit R und ggplot2

Eigenmittelquote im Zeitablauf

Eigenmittelquote im Zeitablauf


Neben der verlässlichen Berechnung von Risikowerten kommt der Visualisierung der Ergebnisse eine entscheidende Bedeutung zu, wenn die richtigen Steuerungsimpulse gesetzt werden sollen. Hierzu bietet R eine Unzahl von Möglichkeiten. Ich bin vor einigen Tagen hier auf einen Artikel zu ggplot2 gestoßen und musste das direkt selbst ausprobieren (bitte tapfer durchhalten, der Graph kommt ganz unten…):

# Package ggplot2 laden
require(ggplot2)

# Mittelwert und Standardabweichung setzen
my.mean  <- 0.10
vola.1m  <- 0.0015

#Schwellwerte definieren
my.red    <- 0.08
my.yellow <- 0.09


# Zeitraueme definieren
my.hist   <- 24
my.future <- 24

# Zeitreihe aufstellen
my.dates <- seq(as.Date("2010-01-01"), 
                length.out=my.hist+my.future, 
                by="1 month")

#Reproduzierbarkeit sicherstellen
set.seed(12345)

# Eigenmittelquoten des simulieren, hier vereinfacht als 
# Normalverteilt angenommen 
my.emquote <- c(rnorm(n=my.hist,
                      mean=my.mean,
                      sd=vola.1m),
                rep(NA,times=my.future))

# Den letzten Wert der Simulation als Ausgangsbasis nehmen,
# sieht in der Grafik hinterher einfach netter aus...
my.new.mean <- my.emquote[my.hist]

# Aus der Normalverteilung das 99%-Quantil ableiten,
# Standardabweichung wird ueber Wurzel-t-Funktion ermittelt.
my.emquote.99 <- c(rep(NA,times=my.hist-1),
                   my.new.mean,
                   sapply(1:my.future,
                          function(x) {qnorm(p=0.99,
                                         mean=my.new.mean,
                                         sd=vola.1m*(x/1)^0.5)}))
# Dito 1%-Quantil...
my.emquote.01 <- c(rep(NA,times=my.hist-1),
                   my.new.mean,
                   sapply(1:my.future,
                          function(x) {qnorm(p=0.01,
                                         mean=my.new.mean,
                                         sd=vola.1m*(x/1)^0.5)}))
# ...und 75%-Quantil...
my.emquote.75 <- c(rep(NA,times=my.hist-1),
                   my.new.mean,
                   sapply(1:my.future,
                          function(x) {qnorm(p=0.75,
                                         mean=my.new.mean,
                                         sd=vola.1m*(x/1)^0.5)}))
# ...und 25%-Quantil...
my.emquote.25 <- c(rep(NA,times=my.hist-1),
                   my.new.mean,
                   sapply(1:my.future,
                          function(x) {qnorm(p=0.25,mean=my.new.mean,
                                             sd=vola.1m*(x/1)^0.5)}))

# Alle Vektoren huebsch in einen Data-Frame packen.
my.data<-data.frame(dates=my.dates, 
                    quoten=my.emquote,
                    quoten.01=my.emquote.01,
                    quoten.99=my.emquote.99,
                    quoten.25=my.emquote.25,
                    quoten.75=my.emquote.75,
                    grenze.rot=my.red,
                    grenze.gelb=my.yellow)

# Dann den Plot definieren:
my.plot<-ggplot(
         # Data-Frame als Grundlage
         my.data,
         
         # x-Achse  ist die Zeitreihe
         aes(x=my.dates)) +
  
         # Titel fuer die Grafik       
         labs(title = "Simulation Eigenmittelquote") +
  
         # y-Achse formatieren
         scale_y_continuous(breaks = seq(0.07, 0.12, by =0.01 ),
                            limits = c(0.07,0.12), 
                            labels = seq(7,12, by =1)) +
  
         # Grafikparameter fuer die Zukunft
         scale_fill_manual("Konfidenz", 
                        breaks = c("98% Konfidenz", 
                                   "50% Konfidenz",
                                   "Gruene Zone",
                                   "Gelbe Zone",
                                   "Rote Zone"), 
                        values = c('98% Konfidenz' = "grey", 
                                   '50% Konfidenz' = "darkgrey",
                                   'Gruene Zone' = "green",
                                   'Gelbe Zone' = "yellow",
                                   'Rote Zone' = "red")) +
  
         # Grenze gruen
         geom_ribbon(aes(ymax=0.12,
                         ymin=grenze.gelb,
                         fill="Gruene Zone"),
                     alpha=0.1) +
        
         #Grenze gelb
         geom_ribbon(aes(ymax=grenze.gelb,
                         ymin=grenze.rot,
                         fill="Gelbe Zone"),
                     alpha=0.1) +
  
         #Grenze gelb
         geom_ribbon(aes(ymax=grenze.rot,
                         ymin=0.07,
                         fill="Rote Zone"),
                     alpha=0.1) +
  
         # Linie fuer die histrische Eigenmittelquote
         geom_line(aes(y = my.emquote), 
                   size = 1, linetype = 1, alpha = 1, 
                   colour="darkgrey") +
         
         #Flaeche fuer 98%-Konfidenz
         geom_ribbon(aes(ymax = my.emquote.99, 
                         ymin = my.emquote.01, 
                         fill = "98% Konfidenz"), 
                     colour = "grey", 
                     linetype = 3, 
                     alpha = 0.4) +
  
        #Flaeche fuer 50%-Konfidenz 
        geom_ribbon(aes(ymax = my.emquote.75, 
                         ymin = my.emquote.25, 
                         fill = "50% Konfidenz"), 
                     colour = "darkgrey", 
                     linetype = 3, 
                     alpha = 0.4) +  
  
         # Beschriftung der y-Achse
         ylab(paste("Eigenmittelquote in %", sep = "")) +
  
         #Beschriftung der x-Achse
         xlab(paste("Zeit"))

my.plot

Und schon ist die Grafik da. Man sieht (meiner Meinung nach deutlich) die drei Zonen: grün für die unkritischen Werte, gelb als Warnzone, rot als inakzeptablen Bereich. Die historischen Ist-Werte für die Eigenmittelqoute ist als graue Linie dargestellt, die unsicheren zukünftigen Werte werden als graue Bereiche dargestellt:

Eigenmittelquote im Zeitablauf

Eigenmittelquote im Zeitablauf

Schreibe einen Kommentar

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