capital_stack <- tibble(
component = c(
"CET1 Minimum (4.5%)",
"Additional Tier 1 (1.5%)",
"Tier 2 Capital (2.0%)",
"Capital Conservation Buffer (2.5%)",
"Countercyclical Buffer (0–2.5%)",
"G-SIB Surcharge (1.0–3.5%)"
),
pct = c(4.5, 1.5, 2.0, 2.5, 1.25, 2.0),
cumulative = cumsum(c(4.5, 1.5, 2.0, 2.5, 1.25, 2.0)),
category = c("Minimum", "Minimum", "Minimum", "Buffer", "Buffer", "Surcharge")
)
capital_stack$component <- factor(capital_stack$component,
levels = rev(capital_stack$component))
ggplot(capital_stack, aes(x = 1, y = pct, fill = component)) +
geom_col(width = 0.5, color = "white", linewidth = 0.5) +
geom_text(aes(label = paste0(component, "\n(", pct, "%)")),
position = position_stack(vjust = 0.5),
color = "white", fontface = "bold", size = 3.2) +
scale_fill_manual(values = c(
"CET1 Minimum (4.5%)" = pal$navy,
"Additional Tier 1 (1.5%)" = pal$teal,
"Tier 2 Capital (2.0%)" = pal$slate,
"Capital Conservation Buffer (2.5%)" = pal$gold,
"Countercyclical Buffer (0–2.5%)" = pal$orange,
"G-SIB Surcharge (1.0–3.5%)" = pal$coral
)) +
# Total annotation
annotate("text", x = 1.35, y = 7,
label = "Total for large\nG-SIB bank:\n~13.75%",
color = pal$navy, fontface = "bold", size = 4) +
annotate("segment", x = 1.28, xend = 1.28, y = 0, yend = 13.75,
arrow = arrow(length = unit(0.2, "cm"), ends = "both"),
color = pal$navy, linewidth = 0.8) +
# Basel I comparison
annotate("segment", x = 0.6, xend = 0.6, y = 0, yend = 8,
arrow = arrow(length = unit(0.2, "cm"), ends = "both"),
color = pal$red, linewidth = 0.8) +
annotate("text", x = 0.5, y = 4,
label = "Basel I:\nOnly 8%\ntotal",
color = pal$red, fontface = "bold", size = 3.5) +
coord_flip() +
scale_y_continuous(labels = percent_format(scale = 1),
breaks = seq(0, 16, 2)) +
labs(
title = "Basel III Capital Requirements — The Full Stack",
subtitle = "Large G-SIB banks must hold ~13.75% capital vs. Basel I's 8% — a 72% increase",
x = NULL, y = "Capital as % of Risk-Weighted Assets",
caption = data_source_note
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(face = "bold", color = pal$navy),
plot.subtitle = element_text(color = pal$slate),
legend.position = "none",
axis.text.y = element_blank(),
axis.ticks.y = element_blank()
)