Sovereign yields - sovereign_yields

Data - Investing

Instantané quotidien de https://www.investing.com/rates-bonds/world-government-bonds : taux souverain « live » par pays et par maturité. symbol (ex. France 10Y) correspond au symbol de bonds.parquet (historique).

Code
maturity_years <- function(m) {
  n <- readr::parse_number(m)
  dplyr::case_when(m == "Overnight" ~ 1 / 365,
                   grepl("W$", m)   ~ n / 52,
                   grepl("M$", m)   ~ n / 12,
                   grepl("Y$", m)   ~ n,
                   TRUE ~ NA_real_)
}
last_day <- max(sovereign_yields$scraped_date)

Dernier instantané

Code
sovereign_yields |>
  filter(scraped_date == last_day) |>
  transmute(Pays = country, Maturité = maturity, `Taux` = yield,
            `Var.` = chg, `Var. %` = chg_pct, Heure = quote_time) |>
  arrange(Pays, maturity_years(Maturité)) |>
  print_table_conditional()

Source : investing.com, instantané du 05 novembre 2026.

Courbe des taux

Courbe des taux souverains

Code
sy <- read_parquet("sovereign_yields.parquet")
maturity_years <- function(m) {
  n <- readr::parse_number(m)
  dplyr::case_when(m == "Overnight" ~ 1 / 365, grepl("W$", m) ~ n / 52,
                   grepl("M$", m) ~ n / 12, grepl("Y$", m) ~ n, TRUE ~ NA_real_)
}
pays <- c("France", "Germany", "Italy", "Spain", "U.S.", "U.K.")
sy |>
  filter(scraped_date == max(scraped_date), country %in% pays) |>
  mutate(t = maturity_years(maturity)) |>
  filter(!is.na(t), t <= 30) |>
  ggplot(aes(x = t, y = yield, color = country)) +
  geom_line() + geom_point(size = 1) +
  theme_minimal() + xlab("Maturité (années)") + ylab("Taux (%)") +
  scale_x_log10(breaks = c(0.08, 0.25, 0.5, 1, 2, 5, 10, 20, 30)) +
  scale_color_flag(pays) +
  theme(legend.position =c(0.3, 0.9),
        legend.title = element_blank(),
        legend.direction = "horizontal")

Courbe des taux souverains (pays en français)

Code
pays_fr <- c("France" = "France", "Germany" = "Allemagne", "Italy" = "Italie",
             "Spain" = "Espagne", "U.S." = "États-Unis", "U.K." = "Royaume-Uni")
d <- sy |>
  filter(scraped_date == max(scraped_date), country %in% names(pays_fr)) |>
  mutate(t = maturity_years(maturity),
         country = factor(pays_fr[country], levels = pays_fr)) |>
  filter(!is.na(t), t <= 30)
d |>
  ggplot(aes(x = t, y = yield, color = country)) +
  geom_line() + geom_point(size = 1) +
  ggrepel::geom_text_repel(data = d |> slice_max(t, by = country),
                           aes(label = country), nudge_x = 0.2, hjust = 0,
                           direction = "y", segment.size = 0.3, min.segment.length = 0,
                           arrow = arrow(length = unit(0.015, "npc"), ends = "last"),
                           size = 3.5, show.legend = FALSE) +
  theme_minimal() + xlab("Maturité") + ylab("Taux souverain") +
  scale_x_log10(breaks = c(0.08, 0.25, 0.5, 1, 2, 5, 10, 20, 30),
                labels = c("1 mois", "3 mois", "6 mois", "1 an", "2 ans", "5 ans",
                           "10 ans", "20 ans", "30 ans"),
                expand = expansion(mult = c(0.02, 0.14))) +
  scale_y_continuous(breaks = seq(-10, 30, .5),
                     labels = scales::label_number(accuracy = .1, decimal.mark = ",", suffix = " %")) +
  scale_color_flag(pays_fr) +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1))

France vs. PIGS

Code
maturity_years <- function(m) {
  n <- readr::parse_number(m)
  dplyr::case_when(m == "Overnight" ~ 1 / 365, grepl("W$", m) ~ n / 52,
                   grepl("M$", m) ~ n / 12, grepl("Y$", m) ~ n, TRUE ~ NA_real_)
}
pays <- c("France", "Portugal", "Italy", "Spain", "Greece")
sy |>
  filter(scraped_date == max(scraped_date), country %in% pays) |>
  mutate(t = maturity_years(maturity)) |>
  filter(!is.na(t), t <= 30) |>
  ggplot(aes(x = t, y = yield, color = country)) +
  geom_line() + geom_point(size = 1) +
  theme_minimal() + xlab("Maturité (années)") + ylab("Taux (%)") +
  scale_x_log10(breaks = c(0.08, 0.25, 0.5, 1, 2, 5, 10, 20, 30)) +
  scale_color_flag(pays) +
  theme(legend.position =c(0.35, 0.9),
        legend.title = element_blank(),
        legend.direction = "horizontal")

Exemple

Code
sel <- c("France", "Germany", "Italy", "Spain", "U.S.", "U.K.")

sovereign_yields |>
  filter(scraped_date == last_day, country %in% sel) |>
  mutate(t = maturity_years(maturity)) |>
  filter(!is.na(t), t <= 30) |>
  ggplot(aes(x = t, y = yield, color = country)) +
  geom_line() + geom_point(size = 1) +
  theme_minimal() + xlab("Maturité (années)") + ylab("Taux (%)") +
  scale_x_log10(breaks = c(0.25, 0.5, 1, 2, 5, 10, 20, 30)) +
  scale_color_viridis_d() +
  theme(legend.position = "bottom", legend.title = element_blank())

Évolution du taux 10 ans

Code
sel <- c("France 10Y", "Germany 10Y", "Italy 10Y", "Spain 10Y",
         "U.S. 10Y", "U.K. 10Y", "Japan 10Y")
d <- sovereign_yields |> filter(symbol %in% sel)

if (n_distinct(d$scraped_date) < 2) {
  knitr::asis_output(paste0(
    "_Série trop courte (", n_distinct(d$scraped_date),
    " relevé) — voir `bonds.parquet` pour l'historique complet._"))
} else {
  d |>
    ggplot() + geom_line(aes(x = scraped_date, y = yield, color = symbol)) +
    theme_minimal() + xlab("") + ylab("Taux 10 ans (%)") +
    scale_color_viridis_d() +
    theme(legend.position = "bottom", legend.title = element_blank())
}