In Anknüpfung an meinen letzten Post zum Thema Portfolio Überschneidungen möchte ich diesmal in meinem ETF-Portfolio etwas genauer untersuchen, welchen Anteil die Länder im Portfolio haben.
Man hört und liest ja immer wieder vom MSCI World als Schummelindex, hauptsächlich weil der USA-Anteil so groß ist und – anders als der Name suggerieren würde – die Schwellenländer fehlen. Die Kritik an der Bezeichnung lässt sich sicherlich in Teilen nachvollziehen, dennoch haben wir als Anleger ja sehr einfache Möglichkeiten, ETFs auf den MSCI World mit weiteren ETFs zu kombinieren, z.B. einem ETF auf den MSCI Emerging Markets, um die Schwellenländer mit zu berücksichtigen.
Hierbei stellt sich natürlich die Frage nach der “richtigen” Gewichtung der Indizes und im Folgenden möchte ich Euch zeigen, wie man mögliche Szenarien dafür durchspielen kann. Wir nutzen dafür wieder die Programmiersprache R, da diese für derartige Berechnungen sehr einfach verwendet werden kann. Die Beispiele kannst Du am besten in RStudio nachvollziehen und selbst testen.
Vorab noch als Hinweis: im Code vermische ich deutsche und englische Begriffe vor allem aus dem Grund, da ich die deutschen iShares-Daten z.B. mit den englischen Daten der Weltbank vergleichen will.
Kurzer Exkurs: Optimiertes Sampling
Ich untersuche im Folgenden die tatsächlichen Gewichtungen der jeweiligen iShares-ETFs, da diese Daten einfach zur Verfügung stehen. Da nahezu alle großen, physisch replizierenden ETFs optimiertes Sampling betreiben, enthalten diese unter Umständen nicht alle Aktien aus dem jeweiligen Index.
Unser Beispiel-ETF auf den MSCI World enthält aktuell 1.585 Positionen (Stand vom 18.2.2021), der MSCI World Index laut MSCI-Website 1.787 (Stand vom 1.12.2020), d.h. im iShares-ETF gibt es eine geringfügige Abweichung in den Positionen von ca. 11,3%.
Anders sieht es bei unserem Beispiel-ETF auf den MSCI Emerging Markets aus: 903 Positionen im iShares-ETF vs. 1.405 Positionen im entsprechenden MSCI Index, d.h. dies entspricht einer deutlich höheren Abweichung von ca. 35,7%. Dies hat vermutlich den Hintergrund, dass in den Schwellenländern die Liquidität von einzelnen Positionen eingeschränkt sein kann oder mit höheren Kosten verbunden ist.
Let the coding begin..
Beginnen wir wieder mit dem Laden der benötigten Libraries sowie der Definition einer Hilfsfunktion. Der Code ist dabei sehr ähnlich wie beim letzten Mal. Falls Du den letzten Artikel zu den Portfolio-Überschneidungen noch nicht gelesen hast, würde ich Dir diesen als Einführung empfehlen.
library(tidyverse)
importEtfHoldingCountries <- function(url, indexName) {
return (read_csv(url, skip = 2) %>%
dplyr::rename("Weight" = "Gewichtung (%)") %>%
mutate(Weight = as.double(sub(",", ".", Weight, fixed = TRUE))) %>%
add_column(Index = indexName))
}
Als nächstes holen wir uns mit dieser Hilfsfunktion wieder die öffentlich verfügbaren Daten verschiedener ETFs von der iShares Website und bauen unser Beispiel-Portfolio:
msci_world <- importEtfHoldingCountries("https://www.ishares.com/de/privatanleger/de/produkte/251882/ishares-msci-world-ucits-etf-acc-fund/1478358465952.ajax?fileType=csv&fileName=EUNL_holdings&dataType=fund", "MSCI World")
msci_emerging_markets <- importEtfHoldingCountries("https://www.ishares.com/de/privatanleger/de/produkte/251858/ishares-msci-emerging-markets-ucits-etf-acc-fund/1478358465952.ajax?fileType=csv&fileName=EUNM_holdings&dataType=fund", "MSCI EM")
portfolio <- bind_rows(
msci_world %>% mutate(Weight = 0.7*Weight),
msci_emerging_markets %>% mutate(Weight = 0.3*Weight)
)
Um jetzt die Anteile der einzelnen Länder in unserem Portfolio zu berechnen, müssen wir die Daten lediglich gruppieren und summieren. Außerdem speichern wir die Werte für die spätere Verwendung:
weights_by_country <- portfolio %>%
select(Standort, `Weight`) %>%
group_by(Standort) %>%
dplyr::summarise(EEM = sum(`Weight`, na.rm = TRUE)) %>%
dplyr::rename(country_name_de = Standort) %>%
filter(EEM > 0) %>%
filter(country_name_de != "-") %>%
arrange(desc(EEM))
weights_by_country
Die Ausgabe sieht für unser Beispiel-Portfolio folgendermaßen aus:
# A tibble: 51 x 2
country_name_de EEM
<chr> <dbl>
1 Vereinigte Staaten 46.8
2 China 10.7
3 Japan 5.52
4 Taiwan 4.02
5 Korea 3.80
6 Vereinigtes Königreich 3.06
7 Indien 2.72
8 Frankreich 2.32
9 Irland 2.28
10 Deutschland 2.26
# … with 41 more rows
Zum Vergleich die Gewichtung innerhalb des MSCI World Index:
msci_world %>%
select(Standort, `Weight`) %>%
group_by(Standort) %>%
dplyr::summarise(EEM = sum(`Weight`, na.rm = TRUE)) %>%
dplyr::rename(country_name_de = Standort) %>%
filter(EEM > 0) %>%
filter(country_name_de != "-") %>%
arrange(desc(EEM))
mit folgendem Ergebnis:
# A tibble: 24 x 2
country_name_de EEM
<chr> <dbl>
1 Vereinigte Staaten 66.3
2 Japan 7.89
3 Vereinigtes Königreich 4.37
4 Frankreich 3.31
5 Kanada 3.1
6 Schweiz 2.81
7 Deutschland 2.79
8 Australien 2.2
9 Niederlande 1.25
10 Schweden 1.05
# … with 14 more rows
Man sieht sehr deutlich, dass durch die Beimischung des MSCI Emerging Markets ETF zum einen viel mehr Länder abgebildet sind (51 vs. 24) und zum anderen der Anteil der USA deutlich gefallen ist (66% vs. 47%).
Wie bereits geschrieben gewichten beide Indizes – MSCI World und Emerging Markets – die Aktien nach der jeweiligen Marktkapitalisierung. Alternativ, aber schwerer zu ermitteln, kann auch eine Aufteilung nach Brutto-Inlandsprodukt (BIP) Sinn machen, wie sie beispielsweise im ARERO-Fonds vorgenommen wird.
Im Folgenden wollen wir uns daher anschauen, wie eine Aufteilung unseres Portfolios nach BIP-Gewichtung aussehen müsste. Wir nutzen dafür die öffentlich verfügbaren Daten der Weltbank, genauer gesagt das Gross Domestic Product (GDP). Die Werte sind ziemlich groß, da diese in aktuellem US-Dollar gemessen wurden, aber da wir sowieso nur relative Zahlen benötigen, ist das kein Problem.
Wie oben bereits geschrieben, enthalten die iShares CSV-Dateien deutsche Bezeichnungen und leider keine Länder-Codes, d.h. der erste Schritt ist das Hinzufügen von eindeutigen Alpha3 Länderabkürzungen nach ISO 3166.
Dies können wir glücklicherweise über Daten auf Github relativ einfach mappen:
countries_de <- read_csv("https://raw.githubusercontent.com/stefangabos/world_countries/master/data/de/world.csv") %>%
dplyr::rename(country_name_de = name)
Anschließend laden wir die CSV-Datei von der Website der Weltbank herunter, filtern auf die GDP-Daten aus 2019 und berechnen den jeweiligen prozentualen Anteil am Gesamt-GDP:
world_bank_data <- read_csv("data/API_NY.GDP.MKTP.CD_DS2_en_csv_v2_2055594.csv", skip=4) %>%
select(`Country Name`, `Country Code`, `2019`) %>%
dplyr::mutate(
country_name_en = `Country Name`,
total_gdp = `2019`,
alpha3 = tolower(`Country Code`),
gdp_percent = total_gdp / (world_bank_data %>% filter(`Country Code` == "WLD"))$total_gdp * 100
)
Damit können wir die Gewichtungen aus den iShares-Daten mit den GDP-Daten der Weltbank über den “Umweg” der Alpha3-Codes verknüpfen und mit den Gewichtungen in unserem Portfolio vergleichen:
join(weights_by_country, countries_de, by="country_name_de", type="left") %>%
join(world_bank_data, by="alpha3", type="left") %>%
group_by(country_name_de) %>%
dplyr::summarise(EEM = sum(EEM), gdp_percent = sum(gdp_percent)) %>%
arrange(desc(EEM))
Das Endresultat sieht für unser Portfolio folgendermaßen aus:
# A tibble: 51 x 3
country_name_de EEM gdp_percent
<chr> <dbl> <dbl>
1 Vereinigte Staaten 46.8 24.4
2 China 10.7 16.3
3 Japan 5.52 5.79
4 Taiwan 4.02 NA
5 Korea 3.80 1.88
6 Vereinigtes Königreich 3.06 3.22
7 Indien 2.72 3.27
8 Frankreich 2.32 3.09
9 Irland 2.28 0.443
10 Deutschland 2.26 4.40
# … with 41 more rows
Man sieht zum Beispiel, dass die Gewichtung der USA in unserem Beispiel-Portfolio aktuell fast 47% ist, das Land aber “nur” einen Anteil von 24% am globalen Bruttosozialprodukt (GDP) besitzt. Umgekehrt verhält es sich mit China, die in unserem Portfolio einen Anteil von fast 11% haben und damit gegenüber ihrem Anteil am weltweiten GDP von 16% in unserem Portfolio deutlich unterrepräsentiert sind.
Ich finde es immer wieder spannend, dass man auf diese Weise sehr einfach mit R-Code sein Portfolio näher analysieren kann. Vor allem ist es klasse, dass so viele öffentlich verfügbare Daten für die Berechnungen verwendet werden können.
Schreibt gerne unten in die Kommentare, wenn ihr weitere Analysen sehen wollt.
Hi, danke für dieses Beispiel. stellst du den Code auch zur Verfügung, ich würde damit gerne mein Portfolio analysieren.
Pingback: 70-30 Portfolio und MSCI ACWI ETF im Vergleich | Finanzen für Techies | /dev/investor