Google Sheets hat eine Funktion integriert, die es uns erlaubt, Daten von anderen Finanzwebseiten wie z.B. von Yahoo! Finance direkt per Web Scraping in unser Spreadsheet zu importieren. Diese Funktion nennt sich IMPORTXML und ist von der Syntax her so einfach aufgebaut, dass ich diesen Weg, um Finanzdaten zu ziehen einfach hier bei DIY Investor vorstellen muss.
In diesem Artikel erläutere ich also kurz die Funktionsweise der IMPORTXML Funktion und gebe euch ein Beispiel, was ihr damit so alles machen könnt.
Was du in diesem Artikel lernst
- Welche Finanzdaten sich mit der GOOGLEFINANCE Funktion direkt von Google Finanzen importieren lassen
- Wie wir die IMPORTXML Funktion für den Import weitergehender Daten von anderen Services nutzen können
Mehr über die verschiedenen Optionen zum Import von Finanzdaten nach Excel bzw. Google Sheets erfahren
Die GOOGLEFINANCE Funktion
Bevor ich in die Details des Web Scrapings per IMPORTXML einsteige, vielleicht nochmal ein kleiner Umweg und ein paar Worte zu Google Sheets und der bereits integrierten GOOGLEFINANCE Funktion.
Google Sheets, die Google-Alternative zu Microsoft Excel hat ja bereits eine Funktion integriert, mit der wir uns Aktienkurse etc. direkt nach Google Sheets importieren können. Diese Funktion nennt sich GOOGLEFINANCE und ich nutze sie z.B. für mein Portfolioanalyse Tool, um die Performance meines Portfolios zu tracken.
Allerdings erlaubt die GOOGLEFINANCE Funktion nur den Import von wenigen ausgewählten Daten wie Aktienkurs, EPS und KGV (P/E). Daten zur Dividendenrendite oder auch zur Kapitalrendite (ROE, ROA) fehlen zum Beispiel in Google Finance komplett, sind aber vielleicht wichtig zum Screenen unseres Aktienuniversums.
Aufgrund der für den Import per IMPORTXML erforderlichen Rechenleistung solltet ihr die GOOGLEFINANCE Funktion aber soweit wie möglich nutzen.
Folgende Attribute stellt die Funktion für individuelle Aktien zur Verfügung (mehr findet ihr auch direkt bei Google):
- “price” – Kurs in Echtzeit, allerdings mit bis zu 20 Min Verzögerung
- “priceopen” – Eröffnungspreis
- “high” – Tageshoch
- “low” – Tagestief
- “volume” – Aktuelles Handelsvolumen
- “marketcap” – Marktkapitalisierung
- “tradetime” – Zeit des letzten Trades
- “datadelay” – Info zur zeitlichen Verzögerung der Realtime-Daten
- “volumeavg” – Durchschnittliches tägliches Handelsvolumen
- “pe” – KGV bzw. P/E Ratio
- “eps” – Gewinn je Aktie
- “high52” – 52-Wochen-Hoch
- “low52” – 52-Wochen-Tief
- “change” – Preisänderung seit dem letzten Schlusskurs
- “beta” – Beta Faktor
- “changepct” – Prozentuale Preisänderung seit dem letzten Schlusskurs
- “closeyest” – Schlusskurs des Vortages
- “shares” – Anzahl umlaufender Aktien
- “currency” – Währung der Aktie
Die IMPORTXML Funktion
Für den Import von zusätzlichen Daten, die es ja auf anderen Finanzwebseiten (Yahoo! Finance, Onvista etc.) durchaus gibt, können wir die Funktion IMPORTXML nutzen.
Die Funktion ist vom Aufbau bzw. der Syntax her ganz simpel und folgendermaßen definiert:
IMPORTXML(url, xpath_query)
mit den folgenden Variablen:
- url – Die URL bzw. Webadresse der Seite, die wir mithilfe der IMPORTXML Funktion untersuchen möchten, also z.B. https://finance.yahoo.com/quote/HBH.DE (die URL zur Zusammenfassung der wesentlichen Finanzdaten der Hornbach Holding KGaA). Die Adresse muss dabei innerhalb der Funktion entweder in Anführungszeichen gesetzt werden oder aber auf eine andere Zelle in Google Sheets referenzieren, die die URL in Textform enthält
- xpath_query – Der genaue Pfad zu den gewünschten Daten, z.B. für die Dividende: “//*[@id=’quote-summary’]/div[2]/table/tbody/tr[6]/td[2]”. Ich werde gleich noch erläutern, wie dieser so genannte xpath zustande kommt, weitere Infos zu Syntax etc. von xpath könnt ihr aber schonmal bei W3Schools nachlesen.
In Google Sheets würde die Funktion, um die Dividende für die Hornbach Holding zu importieren also folgendermaßen aussehen:
=IMPORTXML(“https://finance.yahoo.com/quote/HBH.DE“,”//*[@id=’quote-summary’]/div[2]/table/tbody/tr[6]/td[2]”)
Den richtigen XPATH für die IMPORTXML Funktion finden
Den richtigen XPATH finden wir, indem wir uns den Code der Webseite einmal im Detail ansehen. Dies können wir tun, indem wir mit der rechten Maustaste auf den für uns interessanten Kennwert (in diesem Fall die Dividende) klicken und dann im sich öffnenden Dialogfenster den Punkt “Untersuchen” auswählen:
Bei anderen Browsern (ich nutze hier Google Chrome) kann die Anzeige des Codes etwas anders funktionieren. Wie ihr vielleicht bemerkt, funktioniert das Ganze ganz analog zu dem Vorgehen, welches ich in meinem Artikel zum Thema Web Scraping mit VBA beschrieben hatte.
Wenn ihr auf “Untersuchen” geklickt habt, öffnet sich das folgende Fenster:
Hier solltet ihr bereits einige Elemente aus unserer IMPORTXML Funktion von oben wiederfinden. Vereinfacht gesprochen funktioniert das mit dem XPATH so:
Wir steigen in den Code ein, indem wir die nächstgelegene ID (oder auch Klasse) definieren. In diesem Fall wäre das //*[@id=’quote-summary’].
Anschließend sagen wir der Funktion, wo genau in dieser Verästelung der Webseite sie nach der Zahl für die Dividende suchen soll. Genauer gesagt befindet sich die richtige Stelle im zweiten DIV (div[2]), im Hauptteil der ersten Tabelle (table/tbody) in Zeile 6 (tr[6]) in der zweiten Zelle (td[2]). Als XPATH formuliert sieht dieser Teil dann so aus:
/div[2]/table/tbody/tr[6]/td[2]
Ich hoffe das kommt auch aus der Grafik so einigermaßen heraus.
Und schon sind wir fertig. Mit der Funktion / Formel sollten wir nun die Dividende für die Hornbach Holding KGaA entsprechend in unser Google Sheets Tabellenblatt importieren können.
Die Funktion automatisieren
Wie üblich lässt sich die IMPORTXML Funktion auch leicht automatisieren. Wenn wir z.B. die Dividende für verschiedene Ticker gleichzeitig herunterladen möchten, dann können wir die URL in Abhängigkeit vom Ticker über die Funktion CONCATENATE definieren.
Aus https://finance.yahoo.com/quote/HBH.DE wird dann CONCATENATE(“https://finance.yahoo.com/quote/”,A2) wie aus dem folgenden Screenshot ersichtlich wird:
Wie ihr sehen könnt, könnt ihr auch den XPATH in einer anderen Zelle definieren und in der Formel einfach darauf verweisen. Allerdings müsst ihr dann auf die Ausgestaltung der Anführungszeichen achten (einfache versus doppelte).
Außerdem zu beachten: Bei zu vielen XML-Abfragen kann Google Sheets auch schonmal streiken. In diesem Fall werden die Zahlen dann nur sehr stark verzögert gezogen.
Fazit
Google Sheets ist Google’s Alternative zu Microsoft Excel. In vielen Punkten reicht Google Sheets zwar nicht an Excel heran, im Bereich des Imports von Finanzdaten bietet es aber einige Vorteile.
Zum einen gibt es die integrierte GOOGLFINANCE Funktion, mit der wesentliche Finanzdaten wie Aktienkurse, 52-Wochen-Hochs und -Tiefs etc. direkt ins Tabellenblatt integriert werden können.
Zum anderen ist es recht einfach, weitere Finanzdaten mithilfe der IMPORTXML Funktion von anderen Webseiten bzw. Finanzportalen zu importieren. Die IMPORTXML Funktion benötigt nämlich neben der URL auf der die gewünschte Information bzw. Kennzahl zu finden ist, nur den so genannten XPATH, in dem die genaue Position der Kennzahl auf der Webseite definiert wird.
Kleiner Nachteil des Imports von Finanzdaten mithilfe der IMPORTXML Funktion: Google Sheets kann nicht zu viele Aktionen gleichzeitig bewältigen. Nach meiner Erfahrung funktioniert aber der Download für einen Index mit 30-40 Einzelwerten und zwei Variablen aber noch recht problemlos.
17 Kommentare zu „Finanzdaten von Yahoo! Finance nach Google Sheets importieren: Web Scraping mit IMPORTXML“
Vielen Dank für diesen sehr guten Beitrag. Er hat mir sehr geholfen.
Was ist deine Erfahrung, wie man am besten an das ROE für GoogleSheets kommt?
Danke dir! Den ROE kannst du von Yahoo! Finance importieren, wenn ich mich recht erinnere.
Viele Grüße,
Axel
=importxml(CONCATENATE(“https://finance.yahoo.com/quote/”,A2,”/key-statistics?p=”,A2,””),”//*[@id=’Col1-0-KeyStatistics-Proxy’]/section/div[2]/div[1]/div[2]/div[3]/table/tbody/tr[2]/td[2]”)
Habe ich versucht. Ich komme leider nicht darauf, was hier falsch ist. Eine Idee?
Bei mir funktioniert das hier:
//*[@class=”Mb(10px) Pend(20px) smartphone_Pend(0px)”]/div[3]/table/tbody/tr[2]/td[2]
Viele Grüße
Hallo, ich krieg das mit den Werten von z.B. Apple auf der yahoo summary site gut hin,
z.B. Marktkapitalisierung: =IMPORTXML(“https://finance.yahoo.com/quote/AAPL”;”//*[@id=’quote-summary’]/div[2]/table/tbody/tr[1]/td[2]”)
Was aber nicht klappt ist z.B. die Enterprise Value unter Statistics:
=IMPORTXML(“https://finance.yahoo.com/quote/AAPL/key-statistics?p=AAPL”;”//*[@id=’quote-summary’]/div[2]/table/tbody/tr[1]/td[2]”)
Hat da jemand eine Idee?
Hallo, vielleicht hat jemand eine Idee dazu:
Von der Yahoo Finance Seite im Reiter Summary krieg ich z.B: die Market Cap raus:
=IMPORTXML(“https://finance.yahoo.com/quote/AMI.AX?p=AMI.AX”;”//*[@id=’quote-summary’]/div[2]/table/tbody/tr[1]/td[2]”)
Vom Reiter Statistics krieg ich mit der selben Formel die EV nicht raus:
=IMPORTXML(“https://finance.yahoo.com/quote/AMI.AX/key-statistics?p=AMI.AX”;”//*[@id=’Col1-0-KeyStatistics-Proxy’]/section/div[2]/div[1]/div[1]/div/table/tbody/tr[2]/td[2]”)
Vielleicht hat jemand eine Lösung dafür.
Danke, Tommy
Ich suche eine Möglichkeit die Portfolio-Summe von einem Yahoo-Portfolio zu scrapen, hat da evtl. jemand eine Idee?
Danke erstmal für diese Informationen. Ich hatte dennoch Probleme, die Daten aus der Yahoo Statistik auszulesen, weil sich die Webseite anscheinend mit der Zeit ändert. Habe etwas recherchiert. Und bin dann auf die folgende Lösung gekommen:
1. Check, dass das Sheet auf Englisch gestellt ist, wegen der Punktuationen. Sonst kommt es zu Parsing Problemen.
2. =MTRANS(IMPORTXML(VERKETTEN(“https://finance.yahoo.com/quote/”,A3,”/key-statistics?p=”,A3,””””),”//tr”))
Damit lassen sich alle Yahoo Statistik Datei in einer Zeile für die Aktie im Feld A3, z.B. A3 = AAPL schreiben. Am Besten ein blankes Sheet, wo man diese Dateien für alle Aktien schreiben kann. Von da aus kann man dann ja leicht weiter machen.
Ein tolles Tool. Da mir Yahoo aber zu schwach ist, würde ich gerne Daten von anderen Webseiten holen. Ich bekomme aber immer die Rückmeldung “imported contend is empty”. Hast du evt. eine Lösung?
https://quickfs.net/company/AAPL
//*[@id=”ovr-table”]/tbody/tr[2]/td[2]
=IMPORTXML(E20,E21) –>#N/A
oder
http://financials.morningstar.com/ratios/r.html?t=0P000001BW&culture=en&platform=sal
//*[@id=”financials”]/table/tbody/tr[2]/td[1]
=IMPORTXML(I13,I14) –>#N/A
Super Beitrag!
Gibt es eine Möglichkeit auch Zertifikatekurse (wikifolios) automatisiert herunterzuladen?
Bei mir hat die Vorgehensweise zunächst nicht funktioniert.
Habe dann aber die drei Fehler gefunden:
1) Bei IMPORTXML muss die Trennung zwischen url und xpath_query mit einem “;” und nicht mit einem “,” erfolgen.
2) Den Befehl CONCATENATE gibt es offenbar nicht mehr. Der Befehl lautet jetzt CONCAT.
3) Auch bei CONCAT muss die Trennung der Argumente mit einem “;” und nicht mit einem “,” erfolgen.
Gibt es eine Möglichkeit en Prozentwert von dem absoluten zu trennen?
Hallo,
leider bin ich noch blutiger Anfänger beim Web Scraping. Wie komme ich bei folgendem Code zum “Current” von 1,1%? Habe mir jetzt stundenlang einen abgebrochen 🙁
Danke für die Hilfe
Overview
As of 11/19/2020
SharePriceNAVPremium/Discount
Current$33.05$32.691.10%
52 Wk Avg$32.94$32.371.79%
52 Wk High$40.20$39.0512.76%
52 Wk Low$19.45$21.91-14.60%
Natürlich nicht berücksichtigt, dass das gleich in HTML umgesetzt wird 🙁
<!
Overview
As of 11/19/2020
SharePriceNAVPremium/Discount
Current$33.05$32.691.10%
52 Wk Avg$32.94$32.371.79%
52 Wk High$40.20$39.0512.76%
52 Wk Low$19.45$21.91-14.60%
–>
Hallo DIY-Investor,
erst einmal vielen Dank für Deine Anleitungen zu Googlesheets.
Nach langer Suche bin ich auf Deine Seite gestoßen, die eine der ganz ganz wenigen ist, die die Dinge wirklich gut erklärt.
Jetzt habe ich aber ein Problem bzgl. IMPORTXML:
Normalerweise hat doch die Variable xpath_query einen Verweis, der mit //*[@id= beginnt.
Auf der Seite https://www.finanzen.net/aktien/adidas-aktie möchte ich nun das KGV auslesen (4. Zeile unter “Marktkapitalisierung in Mrd. EUR”). Der XPATH sieht dort aber wie folgt aus: /html/body/div[2]/div[1]/div[2]/div[20]/div[2]/div[7]/div/div[2]/div[1]/table/tbody/tr[5]/td[2]
Wenn ich das als xpath_query Variable benutzte, erhalte ich in Googlesheets kein Ergebnis.
Anmerkung: Wie komme ich zu diesem XPATH (vielleicht auch hier zur Ergänzung interessant)?
Mein Browser ist Vivaldi (Chrome-Basis). Dort macht man einen Rechtsklick auf dem gesuchten Wert und dann Entwicklerwerkzeuge – Untersuchen. Es erscheint der Seitencode, bei dem die entspr. Stelle markiert ist. Darauf mach man nun Rechtsklick – Kopieren – XPath kopieren. Mit //*[@id= funktioniert das einwandfrei, aber eben nicht mit /html/body…
Ich habe es auch mit der von Dir beschriebenen Methode versucht. Dabei ergäbe sich (wenn ich keinen Fehler gemacht habe) “//*[@id=’m_mrec’]/div[3]/div[2]/div[5]/div/div[2]/div/table/tbody/tr[5]/td[2]”. Das resultiert dann in Googlesheets aber nur in “#NV”.
Kannst Du mir sagen, wie ich hier das KGV auslesen kann?
P.S.:
Noch eine Anmerkung zu Deiner Beschreibung:
Du trennst die Variablen URL und xpath_query mit einem Komma. Offenbar hat sich da in der Syntax etwas verändert, denn das resultiert bei mir in einer Fehlermeldung. Wenn man die Variablen mit einem Strichpunkt trennt, funktioniert es.
Hallo DIY-Investor,
erst einmal vielen Dank für Deine Anleitungen zu Googlesheets.
Nach langer Suche bin ich auf Deine Seite gestoßen, die eine der ganz ganz wenigen ist, die die Dinge wirklich gut erklärt.
Jetzt habe ich aber ein Problem bzgl. IMPORTXML:
Normalerweise hat doch die Variable xpath_query einen Verweis, der mit //*[@id= beginnt.
Auf der Seite https://www.finanzen.net/aktien/adidas-aktie möchte ich nun das KGV auslesen (4. Zeile unter “Marktkapitalisierung in Mrd. EUR”). Der XPATH sieht dort aber wie folgt aus (ermittelt mit der von Dir beschriebenen “Untersuchen”-Möglichkeit im Chrome-Browser): /html/body/div[2]/div[1]/div[2]/div[20]/div[2]/div[7]/div/div[2]/div[1]/table/tbody/tr[5]/td[2]
Wenn ich das als xpath_query Variable benutzte, erhalte ich in Googlesheets kein Ergebnis (genauer: es kommt nur “LOADING”, auch nach Stunden).
Ich habe es auch mit der von Dir beschriebenen Methode des “Zählens” versucht.. Dabei ergäbe sich (wenn ich keinen Fehler gemacht habe) “//*[@id=’m_mrec’]/div[3]/div[2]/div[5]/div/div[2]/div/table/tbody/tr[5]/td[2]”. Das resultiert dann in Googlesheets aber nur in “#NV”.
Kannst Du mir sagen, wie ich hier das KGV auslesen kann?
Hallo Hans,
ich nutze inzwischen TIKR und Finbox als Tools für meine Finanzdaten und habe mich daher in letzter Zeit nicht mehr intensiv mit neuen Optionen beschäftigt. Es scheint allerdings so zu sein, dass keine dieser VBA-basierten Optionen für lange und nachhaltig funktioniert leider.
VG, Axel