Indices - indices

Data - Investing

Examples

Principaux indices

Source : investing.com, octobre 07, 2026. [stock_indices]

The Economist

Code
ig_b("asset-pricing", "2021-11-06-the-economist")

indices_var

All

Code
indices_var |>
  select(country, symbol, full_name) |>
  print_table_conditional()

Total Return

Code
indices_var |>
  select(country, symbol, full_name, currency) |>
  filter(grepl("Total Return", full_name)) |>
  print_table_conditional()

Selection

Code
indices |>
  group_by(symbol) |>
  summarise(Nobs = n()) |>
  left_join(indices_var |>
              select(country, symbol, full_name, currency), by = "symbol") |>
  arrange(country) |>
  print_table_conditional()

Nobs

All

Code
indices |>
  left_join(indices_var, by = "symbol") |>
  group_by(symbol, full_name) |>
  summarise(Nobs = n()) |>
  print_table_conditional()

France VS U.S.

1986-

Code
indices |>
  filter(symbol %in% c("FCHI", "PX1GR", "SPXTR", "SPX")) |>
  left_join(indices_var, by = "symbol") |>
  group_by(symbol) |>
  mutate(Close = Close / Close[1]) |>
  ggplot() + geom_line(aes(x = Date, y = Close, color = paste(symbol, "-", name))) + 
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(0, 20, 1)) +
  scale_color_manual(values = viridis(5)[1:4]) +
  theme(legend.position = c(0.2, 0.85),
        legend.title = element_blank())

2000-

Code
indices |>
  filter(symbol %in% c("FCHI", "PX1GR", "SPXTR", "SPX")) |>
  left_join(indices_var, by = "symbol") |>
  filter(Date >= as.Date("2000-01-01")) |>
  group_by(symbol) |>
  mutate(Close = Close / Close[1]) |>
  ggplot() + geom_line(aes(x = Date, y = Close, color = paste(symbol, "-", name))) + 
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = seq(1960, 2100, 5) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(0, 20, 1)) +
  scale_color_manual(values = viridis(5)[1:4]) +
  theme(legend.position = c(0.2, 0.85),
        legend.title = element_blank())

2010-

Code
indices |>
  filter(symbol %in% c("FCHI", "PX1GR", "SPXTR", "SPX")) |>
  left_join(indices_var, by = "symbol") |>
  filter(Date >= as.Date("2010-01-01")) |>
  group_by(symbol) |>
  mutate(Close = Close / Close[1]) |>
  ggplot() + geom_line(aes(x = Date, y = Close, color = paste(symbol, "-", name))) + 
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(0, 20, 1)) +
  scale_color_manual(values = viridis(5)[1:4]) +
  theme(legend.position = c(0.2, 0.85),
        legend.title = element_blank())

Indices

1998-

Code
indices |>
  filter(symbol %in% c("PX1GR", "SPXTR")) |>
  left_join(indices_var, by = "symbol") |>
  group_by(symbol) |>
  filter(Date >= as.Date("1998-01-01")) |>
  mutate(Close = 100*Close / Close[Date == as.Date("2003-09-04")],
         name = gsub("Gross TR", "Total Return", name)) |>
  arrange(desc(Date)) |>
  ggplot() + geom_line(aes(x = Date, y = Close, color = paste(symbol, "-", name))) + 
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(100, 20000, 100)) +
  scale_color_manual(values = viridis(3)[1:2]) +
  theme(legend.position = c(0.2, 0.85),
        legend.title = element_blank())

July, 23 2001

Code
indices |>
  filter(symbol %in% c("PX1GR", "SPXTR")) |>
  left_join(indices_var, by = "symbol") |>
  group_by(symbol) |>
  filter(Date >= as.Date("2001-08-13")) |>
  mutate(Close = 100*Close / Close[Date == as.Date("2003-09-04")],
         name = gsub("Gross TR", "Total Return", name)) |>
  arrange(desc(Date)) |>
  ggplot() + geom_line(aes(x = Date, y = Close, color = paste(symbol, "-", name))) + 
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(100, 20000, 100)) +
  scale_color_manual(values = viridis(3)[1:2]) +
  theme(legend.position = c(0.2, 0.85),
        legend.title = element_blank())

Equity premium

Prime de risque = rendement annualisé (CAGR) de l’indice Total Return \(-\) niveau moyen du taux sans risque sur la même période (taux bonds.parquet, moyenne quotidienne). Tout est nominal, en devise locale (la Chine, l’Italie, le Qatar et la Corée sont exclus : indice en USD, historique trop court ou pas de taux court).

Taux court, échantillon complet

Bon de référence : pour chaque pays, taux 3 mois (à défaut 6 mois, 1 mois, 1 an, 2 ans) selon l’historique disponible.

Code
show_erp(specs[[1]])
Pays Indice Convention Taux Début Années Rendement actions (%) Taux sans risque moyen (%) Equity premium (pp)
Taiwan TTRI non précisée 2Y 2003-01-03 23.8 14.49 0.91 13.58
Denmark OMXCGI Gross 3M 2001-12-18 24.8 10.25 1.31 8.94
India NIFTRI non précisée 3M 2002-01-24 24.7 14.62 6.37 8.25
U.S. SPXTR Gross 3M 2001-08-13 25.1 9.80 1.76 8.04
Switzerland SSHI non précisée 3M 1990-03-14 36.6 8.20 1.41 6.79
Netherlands AEXNR Net 1M 2001-12-24 24.8 6.41 0.43 5.98
Germany GDAXI non précisée 2Y 1988-01-05 38.8 8.72 2.75 5.97
Belgium BFXI Gross 3M 1994-03-09 32.6 7.68 1.77 5.91
Spain IBEXTR Gross 3M 1992-01-16 34.7 9.89 5.14 4.76
Canada TRGSPTSE non précisée 2Y 1986-01-02 40.8 9.23 4.54 4.69
Australia AXNT Net 1Y 2001-04-12 25.5 8.03 3.44 4.59
New Zealand NZ50 Gross 3M 2001-01-03 25.8 8.50 3.93 4.57
Japan TOPXDVNET Net 6M 1994-01-05 32.8 4.78 0.21 4.56
U.K. TFTAS non précisée 3M 1994-01-04 32.8 7.43 3.12 4.31
France PX1GR Gross 3M 1989-01-04 37.8 7.60 3.76 3.84
Portugal TRPSI20 non précisée 3M 1994-05-05 32.4 5.78 2.70 3.09
Hong Kong HSIDV Gross 1Y 1997-07-11 29.2 5.14 2.29 2.85

Taux 10 ans, échantillon complet

Code
show_erp(specs[[3]])
Pays Indice Convention Taux Début Années Rendement actions (%) Taux sans risque moyen (%) Equity premium (pp)
Taiwan TTRI non précisée 10Y 2003-01-03 23.8 14.49 1.46 13.03
Denmark OMXCGI Gross 10Y 2001-12-18 24.8 10.25 2.26 7.99
U.S. SPXTR Gross 10Y 2001-08-13 25.1 9.80 3.20 6.60
Japan TOPXDVNET Net 10Y 2006-02-07 20.7 6.39 0.79 5.60
Switzerland SSHI non précisée 10Y 1994-02-02 32.7 7.22 1.76 5.47
India NIFTRI non précisée 10Y 1999-06-30 27.3 12.89 7.54 5.36
Germany GDAXI non précisée 10Y 1988-01-05 38.8 8.72 3.59 5.13
Spain IBEXTR Gross 10Y 1994-02-02 32.7 9.00 4.10 4.90
France PX1GR Gross 10Y 1988-01-04 38.8 8.83 4.25 4.58
Canada TRGSPTSE non précisée 10Y 1986-01-02 40.8 9.23 4.90 4.33
Belgium BFXI Gross 10Y 1994-03-09 32.6 7.68 3.39 4.28
Hong Kong HSIDV Gross 10Y 1998-01-12 28.7 7.50 3.36 4.14
New Zealand NZ50 Gross 10Y 2001-01-03 25.8 8.50 4.38 4.12
Netherlands AEXNR Net 10Y 2001-12-24 24.8 6.41 2.34 4.07
Australia AXNT Net 10Y 2001-04-12 25.5 8.03 4.06 3.97
U.K. TFTAS non précisée 10Y 1994-01-04 32.8 7.43 3.86 3.58
Portugal TRPSI20 non précisée 10Y 1994-05-05 32.4 5.78 4.64 1.14

Même période (2003-)

Code
show_erp(specs[[2]])
Pays Indice Convention Taux Début Années Rendement actions (%) Taux sans risque moyen (%) Equity premium (pp)
Taiwan TTRI non précisée 2Y 2003-01-06 23.7 14.43 0.91 13.52
Denmark OMXCGI Gross 3M 2003-01-06 23.7 11.40 1.22 10.18
U.S. SPXTR Gross 3M 2003-01-06 23.7 11.47 1.76 9.71
India NIFTRI non précisée 3M 2003-01-06 23.7 15.16 6.39 8.77
Japan TOPXDVNET Net 6M 2003-01-06 23.7 8.78 0.09 8.69
Spain IBEXTR Gross 3M 2003-01-07 23.7 9.32 0.76 8.56
Canada TRGSPTSE non précisée 3M 2003-01-06 23.7 10.21 1.85 8.36
Germany GDAXI non précisée 3M 2003-01-06 23.7 9.19 0.87 8.32
Netherlands AEXNR Net 1M 2003-01-06 23.7 8.33 0.43 7.90
Switzerland SSHI non précisée 3M 2003-01-06 23.7 7.61 0.18 7.42
Belgium BFXI Gross 3M 2003-01-06 23.7 8.00 1.04 6.96
Hong Kong HSIDV Gross 3M 2003-01-06 23.8 7.67 1.27 6.40
France PX1GR Gross 3M 2003-01-06 23.7 7.36 1.08 6.28
U.K. TFTAS non précisée 3M 2003-01-06 23.7 8.45 2.20 6.26
Australia AXNT Net 1Y 2003-01-06 23.8 8.68 3.35 5.33
Portugal TRPSI20 non précisée 3M 2003-01-06 23.7 5.94 0.70 5.23
New Zealand NZ50 Gross 3M 2003-01-06 23.8 8.48 3.79 4.69
Code
show_erp(specs[[4]])
Pays Indice Convention Taux Début Années Rendement actions (%) Taux sans risque moyen (%) Equity premium (pp)
Taiwan TTRI non précisée 10Y 2003-01-06 23.7 14.43 1.46 12.97
Denmark OMXCGI Gross 10Y 2003-01-06 23.7 11.40 2.14 9.26
U.S. SPXTR Gross 10Y 2003-01-06 23.7 11.47 3.11 8.36
India NIFTRI non précisée 10Y 2003-01-06 23.7 15.16 7.23 7.93
Canada TRGSPTSE non précisée 10Y 2003-01-06 23.7 10.21 2.83 7.38
Germany GDAXI non précisée 10Y 2003-01-06 23.7 9.19 2.03 7.15
Switzerland SSHI non précisée 10Y 2003-01-06 23.7 7.61 1.02 6.58
Spain IBEXTR Gross 10Y 2003-01-07 23.7 9.32 3.08 6.23
Netherlands AEXNR Net 10Y 2003-01-06 23.7 8.33 2.22 6.10
Belgium BFXI Gross 10Y 2003-01-06 23.7 8.00 2.51 5.49
U.K. TFTAS non précisée 10Y 2003-01-06 23.7 8.45 2.99 5.47
Hong Kong HSIDV Gross 10Y 2003-01-06 23.8 7.67 2.61 5.05
France PX1GR Gross 10Y 2003-01-06 23.7 7.36 2.41 4.95
Australia AXNT Net 10Y 2003-01-06 23.8 8.68 3.94 4.74
New Zealand NZ50 Gross 10Y 2003-01-06 23.8 8.48 4.21 4.27
Portugal TRPSI20 non précisée 10Y 2003-01-06 23.7 5.94 3.84 2.10

Corrélation : niveau moyen des taux sans risque vs. equity premium

Corrélation entre pays (une observation par pays). Si l’equity premium ne dépendait pas du niveau des taux, la corrélation avec la prime serait nulle ; celle avec le rendement brut des actions est mécaniquement positive (inflation, croissance nominale).

Code
imap(specs, \(d, nm) tibble(
  Spécification = nm, `N pays` = nrow(d),
  `Corr. taux ~ premium (Pearson)`  = round(cor(d$rf_mean, d$erp), 2),
  `Corr. taux ~ premium (Spearman)` = round(cor(d$rf_mean, d$erp, method = "spearman"), 2),
  `Corr. taux ~ rendement actions`  = round(cor(d$rf_mean, d$eq_return), 2),
  `Pente (pp premium / pp taux)`    = round(coef(lm(erp ~ rf_mean, d))[2], 2),
  `Pente hors Taiwan`               = round(coef(lm(erp ~ rf_mean, filter(d, country != "Taiwan")))[2], 2),
  `Corr. hors Taiwan`               = round(cor(filter(d, country != "Taiwan") |> pull(rf_mean),
                                                filter(d, country != "Taiwan") |> pull(erp)), 2))) |>
  list_rbind() |> print_table_conditional()
Spécification N pays Corr. taux ~ premium (Pearson) Corr. taux ~ premium (Spearman) Corr. taux ~ rendement actions Pente (pp premium / pp taux) Pente hors Taiwan Corr. hors Taiwan
Taux court, échantillon complet 17 -0.26 -0.26 0.37 -0.40 -0.09 -0.09
Taux court, depuis 2003 17 -0.18 -0.17 0.49 -0.24 -0.13 -0.13
10 ans, échantillon complet 17 -0.45 -0.52 0.20 -0.71 -0.31 -0.32
10 ans, depuis 2003 16 -0.24 -0.41 0.33 -0.42 -0.08 -0.07
Code
plot_erp <- function(d, title)
  ggplot(d, aes(x = rf_mean, y = erp)) +
  geom_smooth(method = "lm", se = FALSE, color = "grey60", linewidth = 0.6) +
  geom_point(color = viridis(3)[1]) +
  ggrepel::geom_text_repel(aes(label = country), size = 3, max.overlaps = 30) +
  theme_minimal() + labs(x = "Taux sans risque moyen (%)", y = "Equity premium (pp)", title = title)
plot_erp(specs[[1]], "Taux court, échantillon complet")

Code
plot_erp(specs[[3]], "Taux 10 ans, échantillon complet")

Taux risqué vs. taux sans risque

Version mécanique : on régresse, entre pays, le rendement des actions sur le taux sans risque moyen, \(r^{actions}_i = a + b \, r^{f}_i + \varepsilon_i\). Si la prime de risque était constante, \(b = 1\) (le taux risqué suit le taux sans risque point pour point) et \(a\) serait la prime ; \(b < 1\) signifie que la prime baisse quand les taux montent (la pente de la prime sur le taux est \(b - 1\)).

Code
slope_tab <- function(d, nm) {
  m <- lm(eq_return ~ rf_mean, d); s <- summary(m)$coefficients
  tibble(Spécification = nm, `N pays` = nrow(d),
         `Constante a (pp)` = round(s[1, 1], 2),
         `Pente b` = round(s[2, 1], 2), `Ecart-type de b` = round(s[2, 2], 2),
         `t (b = 1)` = round((s[2, 1] - 1) / s[2, 2], 2),
         `R²` = round(summary(m)$r.squared, 2),
         `b hors Taiwan` = round(coef(lm(eq_return ~ rf_mean, filter(d, country != "Taiwan")))[2], 2))
}
imap(specs, \(d, nm) slope_tab(d, nm)) |> list_rbind() |> print_table_conditional()
Spécification N pays Constante a (pp) Pente b Ecart-type de b t (b = 1) R² b hors Taiwan
Taux court, échantillon complet 17 7.01 0.60 0.39 -1.04 0.14 0.91
Taux court, depuis 2003 17 8.20 0.76 0.35 -0.70 0.24 0.87
10 ans, échantillon complet 17 7.70 0.29 0.36 -1.96 0.04 0.69
10 ans, depuis 2003 16 7.76 0.58 0.45 -0.94 0.11 0.92
Code
ggplot(specs[[1]], aes(x = rf_mean, y = eq_return)) +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "grey50") +
  geom_smooth(method = "lm", se = FALSE, color = "grey60", linewidth = 0.6) +
  geom_point(color = viridis(3)[1]) +
  ggrepel::geom_text_repel(aes(label = country), size = 3, max.overlaps = 30) +
  theme_minimal() +
  labs(x = "Taux sans risque moyen (%)", y = "Rendement des actions (%)",
       title = "Taux court, échantillon complet (pointillés : b = 1, prime nulle)")

Gross vs. Net : quelle convention ?

Les indices Net déduisent la retenue à la source sur dividendes (pour un investisseur étranger type) ; les Gross non. L’écart, donc le biais sur l’equity premium selon la convention choisie, se mesure là où les deux existent sur le même marché.

Code
gn_pairs <- tribble(
  ~country,       ~Gross,    ~Net,
  "France",       "PX1GR",   "PX1NR",
  "France (SBF 120)", "PX4GR", "PX4NR",
  "Belgium",      "BFXI",    "BFXP",
  "Spain",        "IBEXTR",  "IBEXNR",
  "Netherlands",  "AEXGR",   "AEXNR",
  "Hong Kong",    "HSIDV",   "HSIDVN",
  "U.S.",         "SPXTR",   "SPXNTR",
  "Japan",        "N225TR",  "N225NTR")
gn_start <- gn_pairs |> rowwise() |>
  mutate(start = max(min(indices$Date[indices$symbol == Gross]),
                     min(indices$Date[indices$symbol == Net]))) |> ungroup()
gn <- gn_start |> rowwise() |> mutate(
  g = list(erp_one(sub(" \\(.*", "", country), Gross, short, start, FALSE)),
  n = list(erp_one(sub(" \\(.*", "", country), Net, short, start, FALSE))) |> ungroup()
gn |> transmute(Pays = country, Début = start,
                `Gross (%)` = map_dbl(g, "eq_return") |> round(2),
                `Net (%)`   = map_dbl(n, "eq_return") |> round(2),
                `Ecart (pp/an)` = round(map_dbl(g, "eq_return") - map_dbl(n, "eq_return"), 2),
                `Premium Gross` = map_dbl(g, "erp") |> round(2),
                `Premium Net`   = map_dbl(n, "erp") |> round(2)) |>
  print_table_conditional()
Pays Début Gross (%) Net (%) Ecart (pp/an) Premium Gross Premium Net
France 1988-01-04 7.60 6.75 0.85 3.84 2.99
France (SBF 120) 2008-08-12 6.79 5.94 0.86 6.24 5.38
Belgium 1994-03-09 7.68 6.71 0.96 5.91 4.94
Spain 2001-05-03 7.12 6.52 0.60 6.36 5.77
Netherlands 2009-03-24 10.99 10.58 0.40 10.54 10.14
Hong Kong 2013-04-09 4.46 4.28 0.18 3.16 2.98
U.S. 2015-02-10 14.04 13.45 0.59 11.89 11.30
Japan 2012-12-26 17.26 16.83 0.44 17.24 16.81

Les trois façons de choisir la convention :

Code
# même fenêtre pour les pays ayant les deux conventions
w0 <- as.Date("2015-02-10")
pn <- gn_pairs |> filter(country != "France (SBF 120)") |>
  mutate(g = map2(country, Gross, \(c, s) erp_one(c, s, short, w0, FALSE)),
         n = map2(country, Net,   \(c, s) erp_one(c, s, short, w0, FALSE)))
pg <- list_rbind(pn$g); pnn <- list_rbind(pn$n)
tibble(
  Convention = c("Gross", "Net"),
  `N pays` = c(nrow(pg), nrow(pnn)),
  `Premium moyen (pp)` = round(c(mean(pg$erp), mean(pnn$erp)), 2),
  `Corr. taux ~ premium` = round(c(cor(pg$rf_mean, pg$erp), cor(pnn$rf_mean, pnn$erp)), 2),
  `Pente` = round(c(coef(lm(erp ~ rf_mean, pg))[2], coef(lm(erp ~ rf_mean, pnn))[2]), 2)) |>
  print_table_conditional()
Convention N pays Premium moyen (pp) Corr. taux ~ premium Pente
Gross 7 8.92 -0.30 -1.71
Net 7 8.31 -0.28 -1.61

Lecture :

  1. Série native de chaque pays (tableaux ci-dessus, colonne Convention) : maximise le nombre de pays et la profondeur historique, mais mélange Gross et Net (et des séries « non précisées »). Le biais est de l’ordre de la retenue à la source sur les dividendes, soit 0,2 à 1 point par an selon le pays (voir l’écart ci-dessus).
  2. Gross partout : la mesure standard pour l’investisseur sans friction fiscale ; compare mieux entre pays mais exige de ne garder que les pays où un Gross existe (ou de corriger les séries Net de l’écart estimé).
  3. Net partout : proche d’un rendement réellement perçu par un investisseur étranger ; dépend du régime fiscal supposé par le fournisseur d’indice, donc moins homogène entre pays.

Limites : nominal et non réel (corrélation avec l’inflation) ; échantillons de durées différentes (d’où la spécification « depuis 2003 ») ; le taux court « moyen » varie selon l’historique disponible (3M, 6M, 1 an ou 2 ans) ; Taiwan (TTRI) tire fortement les résultats.