本站曾介绍过,通过代码添加雅虎财经的股票走势图到自己网站的方法(添加美国股市 ,添加沪深股市 ),调用的是一张图片。今天在德馨 网站,看到了从雅虎财经频道获取股票数据的API(Yahoo! Finance stock API),觉得 API 使用更广泛,作个转引。
1、通过API获取实时数据
请求地址
/d/quotes.csv?s=<股票名称>&f=<数据列选项>
参数
s – 表示股票名称,多个股票之间使用英文加号分隔,如”XOM+BBDb.TO+JNJ+MSFT”,罗列了四个公司的股票:XOM, BBDb.TO, JNJ, MSFT。f – 表示返回数据列,如”snd1l1yr”。更详细的参见雅虎股票 API f 参数对照表 。
2、通过API获取历史数据
请求地址
/table.csv?s=<string>&a=<int>&b=<int>&c=<int>&d=<int>&e=<int>&f=<int>&g=d&ignore=.csv
参数
s – 股票名称a – 起始时间,月b – 起始时间,日c – 起始时间,年d – 结束时间,月e – 结束时间,日f – 结束时间,年g – 时间周期。Example: g=w, 表示周期是’周’。d->’日’(day), w->’周’(week),m->’月’(mouth),v->’dividends only’
一定注意月份参数,其值比真实数据-1。如需要9月数据,则写为08。
3、通过API获取深沪股票数据
雅虎的API是国际性的,支持查询国内沪深股市的数据,但代码稍微变动一下,如浦发银行的代号是:600000.SS。规则是:上海市场末尾加.ss,深圳市场末尾加.sz。
Yahoo! Finance API
Trackback URLModerne Broker-Portale bieten einem Investor die Möglichkeit, Kurse seiner Aktien bzw. Optionen abzurufen. Dort findet er in der Regel auch Kurs-Charts und Chart-Analyse-Kurven zu den unterschiedlichsten Zeiträumen. Dem ein oder anderen privaten Investor sind diese Analysen vielleicht nicht ausreichend genug. Es mag unter ihnen Informatiker und Hobby-Programmierer geben, die den Wunsch äußern, mit Kursdaten mathematische Analysen durchzuführen, um Indikatoren selbst zu berechnen. Nur wie gelangt ein Programmierer an die aktuellen und historischen Zahlen einzelner Aktienkurse? Dieser Beitrag soll die Möglichkeiten der Yahoo!Finance-Schnittstelle näher bringen.
Für das Ermitteln unterschiedlicher Kursdaten bietet Yahoo!Finance (auch für Deutschland ) verschiedene CSV-Export-Services an. CSV steht für “Comma Separated Values” und bedeutet hier nichts anderes, als dass die ganzen Kennzahlen (wie z.B. Schluss-Kurs oder Volumen) in reiner Textform mit Kommas und Zeilenumbrüchen getrennt ausgeliefert werden. Daten in solch einem Format kann ein Computerprogramm für Analysezwecke leicht verarbeiten. Im Folgenden werden die bekannten Schnittstellen genauer erläutert und dazu passende Beispiele und PHP-Scripte präsentiert. Da mir keine offizielle API von Yahoo!Finance bekannt ist und ich die hier beschriebene Schnittstelle durch Ausprobieren und Studium ermittelt habe, kann ich für eine Vollständigkeit des aufgezeigten Funktionsumfanges nicht garantieren. Für Hinweise bin ich daher sehr dankbar. Verwendet ein Entwickler die Services von Yahoo!Finance, so sollte er sich vorher die Nutzungsbedingungen (siehe auch ) genau durchlesen.
Aktuelle Kursdaten ermitteln
Ganz ehrlich, “aktuell” bedeutet bei der kostenlosen Yahoo!Finance-Schnittstelle leider eine Verzögerung von 15 Minuten für NASDAQ Werte, bis hin zu 60 Minuten für andere Börsenplätze (näheres auf Yahoo!Finance ). Doch für die meisten Verwendungszwecken bzw. westlichen Börsenkurse dürfte diese Verzögerung kein Problem darstellen. Yahoo! bietet Kurse aus den unterschiedlichsten Börsenplätzen an. Die Selektion des entsprechenden Handelsplatzes findet in der URL selbst, sowie in einem Anhang (Suffix) an der Symbolangabe statt. Im Kapitel “Länderunterschiede” werden die Unterschiede aufgelistet. Zum besseren Verständnis zeige ich hier nur die Basis-URL, welche vor allem für die US-Börsenkurse gültig ist. Das Ergebnis ist eine Werteliste, die durch Kommas getrennt präsentiert wird. Die Serviceadressen für aktuelle Kursinformationen lautet/d/quotes.csv?
und nimmt die folgenden drei bekannten Parameter entgegen:
Das folgende Beispiel ermittelt von Apple und Microsoft das Symbol, den Firmen-Namen, den aktuellen Anfrage-Kurs und die dazu gehörige Zeit ab. Dabei sind Zeit und Kurswert immer länderspezifisch zu verstehen (US-Zeit und Dollar). Wenn Sie diese URL in den Browser eingeben, können Sie das Ergebnis abspeichern. Danach können Sie die Rohdaten in einem Texteditor öffnen und betrachten (nicht mit Excel öffnen, da hier die Formatierung nicht ersichtlich wird).
/d/quotes.csv?s=AAPL+MSFT&f=snat1 --- "AAPL","APPLE INC",151.47,"3:31pm" "MSFT","MICROSOFT CP",29.09,"3:31pm"
Ein Programm kann nun diese Daten in einem mehrdimensionalen Array ablegen. Dabei enthalten die Spalten die Inhalte der Werte, welche durch die Format-Codes angefordert wurden. Die Zeilen bilden jeweils das Zahlentupel eines Wertpapiers ab. Eine PHP-Funktion zur Ermittlung der Kursdaten könnte somit folgendermaßen aussehen:
<?php/* * Getting current quotes: * Reading multible lines of values into an array depending on the given symbols and function tags. * Each line holds the values of one symbol. In the argument, symbols are separated by "+". * * (c) Matthias Brusdeylins, * License: CC-GNU GPL (/licenses/GPL/2.0/) */ define ("QUOTES_URL", "/d/quotes.csv?");function loadYahooQuotes ($symbol, $tags){$lineCount = 0;$stocks = array(); // load the stock quotes: we are opening it for reading// /d/quotes.csv?s= STOCK SYMBOLS &f= FORMAT TAGS$URL = QUOTES_URL."s=$symbol&f=$tags&e=.csv";$fileHandle = fopen ($URL,"r"); if ($fileHandle) { // use the fgetcsv function to store quote values into an array $lineValues // one symbol in one line do { $stockValues = fgetcsv ($fileHandle, 999999, ","); if ($stockValues) { $lineCount++; $stocks[$lineCount] = $stockValues; } } while ($stockValues); fclose ($fileHandle);} else { // ERROR-Message in the array $stocks[0][0] = "ERROR"; $stocks[0][1] = "No data found.";} return $stocks;} ?>
Devisen
Sie können nicht nur einzelne Aktienkurse erfragen, sondern auch Devisenkurse. Dazu müssen Sie an der oben vorgestellten Adresse als Symbol-Parameter ein spezielles Konstrukt der FormAB=X
übermitteln. Hier steht der BuchstabeA
für die erste zu vergleichende Währung und der BuchstabeB
dann natürlich für die zweite Währung.X
steht wohl für Exchange und wird nicht ersetzt. Wollen Sie mehrere Währungen abfragen, können mehrere Konstrukte mittels dem Pluszeichen “+
” aneinander gehängt werden. Folgendes Beispiel soll dies verdeutlichen:
/d/quotes.csv?s=USDCAD=X+JPYUSD=X&f=nl1d1t1 --- "USD to CAD",1.0088,"4/4/","5:02pm" "JPY to USD",0.0098,"4/4/","5:26pm"
Die Kürzel der Währungen bestehen aus drei Buchstaben und werden hier aufgelistet:
Die Format-Codes
Für den Parameter der Formate-Codes (”f”) stehen eine ganze Reihe akzeptierter Format-Tags zur Verfügung. Viele sind dabei wohl redundant und werden hier einfach zusammengefasst (z.B. “a” und “b2″ für Anfrage-Kurs). Die folgende Tabelle listet alle bekannten Codes auf.
Achtung:In einigen Fällen liefert Yahoo!Finance mehrstellige Werte zurück, die ebenfalls mit Kommas getrennt dargestellt werden. Dies ist an sich ungeschickt, da es für Sie als Programmierer schwierig wird, die Kommas zwischen den einzelnen Werten von den Kommas in einem Wert zu unterscheiden. Hier empfehle ich, diese Parameter getrennt abzufragen.
Höhere Indexwerte führen nur noch zu einer Wiederholung der Inhalte. Vermutlich sollen die Codes zweistellig sein (Buchstabe + Zahl). Fällt die Zahl weg, so wir automatisch der Index 0 angenommen.
Daytrading-Daten
Leider bietet Yahoo!Finance nur die letzten 100 Tages-Kurswerte zum Ermittlungszeitpunkt an. Auch hier wirkt die Verzögerung von 15-60 Minuten, wie im Abschnitt “Aktuelle Kursdaten” beschrieben. Die Serviceadresse für die Daytrading-Daten lautethttp://logtrade.finance.vip./lastTrades?
und nimmt folgende drei bekannte Parameter entgegen:
Das Ergebnis einer solchen Abfrage liefert eine Liste mit Wertegruppen – eine Gruppe für jeden Trade. Ein solches Tupel enthält den Trading-Zeitpunkt, den Kurswert und die Volumina des Trades.
Historische Kursdaten
Für ein Wertpapier stehen bei Yahoo ebenfalls historische Daten zur Verfügung. Die Service-URL hierfür lautethttp://ichart./table.csv?
und besitzt Parameter für das Symbol, sowie für das Zeitintervall, innerhalb ein Entwickler die täglichen bzw. wöchentlichen Kursdaten ermitteln will:
Das Ergebnis besteht aus einer Liste täglicher, wöchentlicher oder monatlicher Werte zu dem übermittelten Zeitraum. Die erste Zeile enthält die Überschrift der einzelnen Spaltenwerte. In allen weiteren Zeilen liefert Yahoo!Finance danach das Datum, den Eröffnungskurs, den höchsten und tiefsten Kurswert, sowie den Tagesschlusskurs und das Handelsvolumen für jeden einzelnen Tag. Da diese Werte gegenüber Splits und Dividenden unbereinigt sind, liefert Yahoo! in der letzten Spalte “Adj. Close” noch bereinigte Schlusskurse. Ein bisschen anders sieht das Ergebnis aus, wenn als Chart-Abstufung der Wert “v” für die Dividendenausschüttungen angegeben wird. Dann werden nur noch zwei Spalten mit einem Datum sowie dem Wert selbst zurückgeliefert. Hier noch zwei Beispiele mit den ersten paar Zeilen der Ergebnisse:
http://ichart./table.csv?s=AAPL&d=3&e=3&f=&g=d&a=8&b=7&c=1984&ignore=.cvs --- Date,Open,High,Low,Close,Volume,Adj Close -04-02,148.78,151.20,145.85,147.49,37253700,147.49 -04-01,146.30,149.66,143.61,149.53,36846400,149.53 -03-31,143.27,145.71,142.52,143.50,27418300,143.50 -03-28,141.80,144.65,141.60,143.01,25521800,143.01 ...
http://itable./table.csv?s=AAPL&d=3&e=3&f=&g=v&a=8&b=7&c=1984&ignore=.cvs --- Date,Dividends 1995-11-21,0.030000 1995-08-16,0.030000 1995-05-26,0.030000 ...
Für die programmatische Auswertung dieser Daten bietet sich auch hier das Array als Ergebnisträger an. In jeder Zeile können so die Werte eines Tages (bzw. einer Woche, eines Monats oder der Dividenden) abgelegt werden. Folgende PHP-Funktion soll dies verdeutlichen:
<?php/* * Getting historical quotes in a given time period * Parameters: * $symbol: symbol * $startDay, $startMonth, $startYear: the first day for the historical quotes * $endDay, $endMonth, $endYear: the last day for the historical quotes * $step (d/w/m/v):d=daily, w=weekly, m=monthly, v=dividends * * (c) Matthias Brusdeylins, * License: CC-GNU GPL (/licenses/GPL/2.0/) */define ("HISTORY_QUOTES_URL", "/table.csv?");function loadHistoricalYahooQuotes ($symbol, $startDay, $startMonth, $startYear, $endDay, $endMonth, $endYear, $step){$lineCount = 0;$days = array(); // modify parameters$sM=$startMonth-1;$eM=$endMonth-1; // load the historical stock quotes: we are opening it for reading// /table.csv?s= SYMBOL.COUNTRY &a,b,c START $d,e,f ENDE $g d=daily/w=weekly/m=monthly/v=dividends$URL = HISTORY_QUOTES_URL."s=$symbol&a=$sM&b=$startDay&c=$startYear&d=$eM&e=$endDay&f=$endYear&g=$step&y=0&ignore=.cvs";$fileHandle = fopen ($URL,"r"); if ($fileHandle) { // use the fgetcsv function to store quote values into a array $lineValues // store one symbol in one line do { $stockValues = fgetcsv ($fileHandle, 999999, ","); if ($stockValues) { $lineCount++; $days[$lineCount] = $stockValues; } } while ($stockValues);// close handle fclose ($fileHandle);} else { $days[0][0] = "ERROR"; $days[0][1] = "No data found.";}return $days;} ?>
Länderunterschiede
An der Börse werden nicht nur Aktien in unterschiedlichen Währungen gehandelt, sondern auch Nebenwerte wie beispielsweise Optionsscheine. Der Handel solcher Wertpapiere ist meist auf ein Land bzw. Börsenplatz beschränkt. Aus diesem Grund bietet Yashoo!Finance auch unterschiedliche Serviceadressen an. In diesem Artikel wurden bisher nur die Adressen für US-Börsendaten aufgezeigt. So kann unter der URL/d/quotes.csv?
der aktuelle Kurs einer Aktie in US-Dollars ermittelt werden. Wollen Sie hingegen einen Kurs aus dem deutschen Raum ermitteln, steht Ihnen die URLhttp://de./d/quotes.csv?
zur Verfügung.
Die folgende Tabelle zeigt die Adressen (URL) zum Yahoo!Finance-Service für aktuelle Börsenkurse. In der ersten Spalte werden auch die Symbol-Suffixe aufgelistet, welche für eine aktive Börsenplatz-Wahl an die Symbolangabe gehängt werden können (z.B. “AAPL.DE
” für den XETRA-Kurs des Apple-Aktie). Ein Besuch auf die Webseite von Yahoo! Finance hilft hier bei der Auswahl der richtigen Symbolbezeichnung.
Download
Die KlasseFinance_API_Yahoo
bietet einen einfachen Zugriff auf die hier beschriebene Schnittstelle. Mit ihr lassen sich aktuelle, sowie historische Kursdaten ermitteln. Das Ergebnis wird in einem zweidimensionalen Array zurückgeliefert (siehe Beispiele im Text). Für die Package-Struktur diente das Zend-Framework als Vorlage. Somit ist eine einfache Integration in dieses gewährleistet.
Yahoo! Finance API, Version 1.0