Dies ist eher eine kleine Programmierübung gewesen, auch weil ich wissen wollte, wie sich das eigentlich so entwickelt hat mit der steigenden Anzahl von Projekten, die in Einholung gegangen sind.

Die Daten dafür kann man relativ einfach auf der Website runterladen, sie müssen allerdings transformiert werden. Das Problem hier ist, dass die Daten pro Projekt vorhanden sind und wir für das Stacked Area Chart die Daten so transformieren müssen, dass sie pro Monat vorliegen.
library(tidyverse)
library(lubridate)
today <- Sys.Date()
# Zeitfenster vorbereiten
base <- portfolio %>%
transmute(
Loan Code,
start_date = as.Date(Date Funded),
end_date = if_else(is.na(Repaid Date), today, as.Date(Repaid Date)),
maturity_date = as.Date(Maturity Date),
invested = Invested amount,
status_raw = Status,
days_late = Days late
)
# Eintritt des Verzugs berechnen
base2 <- base %>%
mutate(
# geschätztes Startdatum des Verzugs
late_since_raw = if_else(!is.na(days_late), today - days(days_late), as.Date(NA)),
# Collection kann nie vor Maturity beginnen
late_since_adj = case_when(
is.na(late_since_raw) ~ as.Date(NA),
is.na(maturity_date) ~ late_since_raw,
TRUE ~ pmax(late_since_raw, maturity_date)
),
# clamp zwischen Funding und Ende
late_since = pmin(
pmax(floor_date(late_since_adj, "month"),
floor_date(start_date, "month")),
floor_date(end_date, "month")
),
has_collection = !is.na(late_since_adj) & (late_since <= floor_date(end_date, "month"))
)
# Monatsreihe erzeugen
timeline <- base2 %>%
rowwise() %>%
mutate(month = list(seq(floor_date(start_date, "month"),
floor_date(end_date, "month"),
by = "1 month"))) %>%
unnest(month) %>%
ungroup()
# Monatsstatus bestimmen
timeline_status <- timeline %>%
mutate(
status = case_when(
has_collection & month >= late_since ~ "Collection",
TRUE ~ "On time"
)
)
# Aggregation
monthly_sum <- timeline_status %>%
group_by(month, status) %>%
summarise(total_invested = sum(invested, na.rm = TRUE), .groups = "drop") %>%
arrange(month, status)
# Plot
ggplot(monthly_sum, aes(x = month, y = total_invested, fill = status)) +
geom_area(color = "white", size = 0.2) +
scale_fill_manual(values = c("On time" = "darkgreen", "Collection" = "red")) +
labs(
title = "Invested Capital by Loan Status Over Time",
x = "Month", y = "Total Invested Capital (€)", fill = "Status"
) +
theme_minimal(base_size = 13)
Wie man im Plot schön sehen kann, begannen die Projekte Ende 2022/Anfang 2023 aus dem Ruder zu laufen, das im vorigen Artikel erwähnte 2.500€-Projekt war im Januar 2023 überfällig. Seitdem hat sich die Summe des in Einholung befindlichen Betrags immer weiter erhöht. Gleichzeitig sieht man, dass ich immer wieder Geld von estateguru abgezogen habe, wenn es mal die Möglichkeit gab (jedes Abheben kostet eine Gebühr, so dass ich warte, bis ein bestimmter Betrag zustande gekommen ist).