TB

Auslesen von Aktienkursen und deren Symbole mit PHP und YQL

Geschrieben am Dienstag, 13. Dezember 2011

Die letzten Wochen habe ich wieder einmal an meinem privaten Depot-Erfassungs und Analyse-Projekt Trading-Analyzer.com gearbeitet und wollte nun endlich den schon lange überfälligen automatischen Kurs-Import in die Seite integrieren.

Jeder Entwickler, der schon einmal an einem Finanzprojekt gearbeitet hat – ohne ein Unternehmen im Rücken zu haben, welches einem die entsprechenden Datenschnittstellen finanziert – kennt sicherlich das Problem, dass man eigentlich kaum eine Möglichkeit hat, kostenlos an Kursdaten von Wertpapieren sowie deren Symbolen zu gelangen. Google hatte zwar einmal eine eigene Finance-API im Angebot, diese wurde beziehungsweiße soll allerdings eingestellt werden und konnte leider auch nicht meine Ansprüche erfüllen. Über Umwege ist es zwar auch möglich, Aktienkurse über die Google-Suche abzufragen, allerdings kann man auf diesen Weg zum größten Teil nur an die Kurse von amerikanischen Aktien gelangen.

Auf der Suche nach anderen Anbietern bin ich relativ schnell auf die YQL-Console gestoßen, über die man mit einer SQL-ähnlichen Abfragesprache auf etliche von Yahoo! bereitgestellten Daten zugreifen kann – darunter glücklicherweiße auch Finanzdaten.

Also habe ich mich in der letzten Zeit ein bisschen in die Materie eingearbeitet und mit Hilfe der YQL-Console sowie PHP ein kleines Script geschrieben, welches demonstriert, wie man relativ einfach mit der Angabe des Namen eines Unternehmen den dazugehörigen Kurs sowie das dafür benötigte Aktiensymbol auslesen kann.

Allgemeine Informationen

Bevor man den Kurs eines börsennotierten Unternehmens ermitteln will, muss man wissen, dass man dafür das entsprechende Symbol des Wertpapiers benötigt. Der Grund ist relativ einfach: Der Handel mit Aktien von börsennotierten Unternehmen ist in der Regel weltweit an verschiedenen Handelsplätzen möglich. Jede dieser Börsen ermittelt einen eigenen Kurs für ein Wertpapier, welcher durch Angebot und Nachfrage entsteht. Ebenso wird eine Aktie an der jeweiligen Börse mit der länderspezifischen Währung gehandelt. Da eine an einer bestimmten Börse gehandelte Aktien eindeutig über ein Symbol identifizierbar sein muss, ergibt sich durch die Vielzahl der globalen Handelsplätze eine Vielzahl an Symbolen, welche eine Aktie an einer bestimmten Börse widerspiegeln.

In diesem kleinen Tutorial interessieren mich nur Aktien, die in Deutschland über XETRA gehandelt werden. Dies bedeutet, dass ich zuvor das Symbol für eine bestimmte Aktie herausfinden muss, welches den Handel an diesem Handelsplatz beschreibt. Erst wenn man dieses Symbol hat, kann man mit jenem Symbol den entsprechenden Kurs abfragen.

Laden der Symbolliste

Im ersten Schritt wird, wie bereits oben ausführlich erklärt, das Symbol der gewünschten Aktie benötigt. In diesem Beispiel werde ich den Namen des Unternehmens über die URL übergeben und dessen Existenz PHP-Script überprüfen.

if (!isset($_GET['unternehmen']) || empty($_GET['unternehmen']))
{
	die('Bitte übergebe den Namen des Unternehmens.')');
}

Ist dies der Fall, muss der mit der PHP-Funktion urlencode() aufbereitete Name des Unternehmens an einen von Yahoo! bereitgestellten Callback-Handler übergeben werden, welcher uns eine Liste der entsprechenden Symbole für das übergebene Unternehmen zurückliefert:

http://d.yimg.com/autoc.finance.yahoo.com/autoc?query=Unternehmensname&callback=YAHOO.Finance.SymbolSuggest.ssCallback

Die von diesem Callback-Handler zurückgelieferten Daten wandeln wir in ein JSON-Objekt um und speichern dann nur die Informationen des Datenbereichs zwischen, der uns wirklich interessiert. Schließlich überprüfen wir noch, ob wirklich Daten zurückgeliefert wurden, denn es kann durchaus vorkommen, dass ein Unternehmen übergeben wird, welches gar nicht börsennotiert ist oder für welches momentan aus unbestimmbaren Gründen keine Daten vorliegen.

$url = 'http://d.yimg.com/autoc.finance.yahoo.com/autoc?query='.urlencode($_GET['unternehmen']).'&callback=YAHOO.Finance.SymbolSuggest.ssCallback';

$result = file_get_contents($url);
$json = preg_replace('/.+?({.+}).+/', '$1', $result);
$object = json_decode($json);
$data = $object->ResultSet->Result;

if ($data) {
	// ...
}

Ermitteln des Börsenplatzes

Im besten Falle wird uns der Aufruf nun eine Liste von Symbolen – bezogen auf die verschiedenen Börsenplätze, an denen die Aktie gehandelt wird – zurückgeben. Da ein Wertpapier in den meißten Fällen an etlichen Börsenplätzen gehandelt wird, wollen wir uns auf einen bestimmten Handelsplatz beschränken. In unserem Beispiel wollen wir wie bereits besprochen das Symbol für Aktien, die über XETRA gehandelt werden, haben. Dabei gehen wir die uns zurückgelieferte Symbolliste durch und schauen nach, ob ein solcher Eintrag vorhanden ist. Sollte dies der Fall sein, speichern wir uns das dem Handelsplatz zugehörige Wertpapier-Symbol zwischen:

$stockSymbol	= "";
$stockExchange	= "";
$stockName	= "";
$gotSymbol	= false;

foreach($data as $company) {
	if (!$gotSymbol && $company->exchDisp == "XETRA")
	{
		$stockSymbol	= $company->symbol;
		$stockExchange	= $company->exchDisp;
		$stockName		= $company->name;
		$gotSymbol		= true;
	}
}

if ($gotSymbol)
{
	// ...
}

Auslesen des Kurses

Im besten Fall haben wir das Aktiensymbol für den gewünschten Handelsplatz XETRA zurückgeliefert bekommen. Nun wollen wir bei diesem den eigentlichen Kurs der Aktie abfragen.

Dafür muss zunächst eine YQL-Abfrage erstellt werden, welche folgendermaßen aufgebaut ist:

select Name, LastTradePriceOnly from yahoo.finance.quotes where symbol in („Aktiensymbol.Handelsplatzsymbol„) | sort(field=“LastTradePriceOnly“, descending=“true“)

Diese Abfrage senden wir dann über die folgende URL an den Yahoo!-Server:

http://query.yahooapis.com/v1/public/yql?q=Abfrage&format=json&env=http://datatables.org/alltables.env&callback=

Die Antwort erhalten wir im JSON-Format, welche wir in unserem Script entgegennehmen. In dieser muss nur noch der entsprechende Knotenpunkt ausgewählt werden und schon können wir explizit auf die von uns gewünschten Daten zugreifen – in unserem Fall der Name des Wertpapiers sowie der aktuelle Kurs.

Der komplette vollständige Code zum Auslesen des Kurses schaut nun folgedermaßen aus:

$statment = 'select Name, LastTradePriceOnly from yahoo.finance.quotes where symbol in ("'.$stockSymbol.'") | sort(field="LastTradePriceOnly", descending="true")';

/* Request-URL zusammensetzen */
$base = 'http://query.yahooapis.com/v1/public/yql?';
$config = '&format=json&env=http://datatables.org/alltables.env&callback=';
$url = $base.'q='.urlencode($statment).$config;

/* Response einlesen */
$json = file_get_contents($url);

/* JSON-Objekt erzeugen */
$object = json_decode($json);

/* Objektknoten auswählen */
$data = $object->query->results->quote;

echo $data->Name.'<br />';
echo $data->LastTradePriceOnly.' &euro;<br />';

Fertig!

Natürlich können wir auf diesen Weg an noch viele weitere Informationen gelangen. Diese alle Aufzuzählen würde allerdings den Rahmen deutlich sprengen, weshalb man am besten mit den Abfragen und den zurückgelieferten Ergebnissen etwas herumspielt, um sich ein Bild von dem Umfang zu machen.

Der komplette Code als Download

Den kompletten Beispiel-Code mit vielen Kommentaren und Debug-Ausgaben stelle ich im folgenden .ZIP-Archiv als Download zur Verfügung:

Download „Kursabfrage.zip“ (2 KB)

Vielleicht ist dieses kleine Beispiel ja für den einen oder anderen eine kleine Hilfe. Bei auftretenden Fragen oder Problemen würde ich mich über Kommentare freuen. :-)

Kommentare (13):

Jürgen Ziegler 10. September 2012

Hallo Thomas,
danke für deine tolle Seite und die Möglichkeit Kurse zu importieren.
Danach habe ich lange gesucht und bin hier fündig geworden.
Leider habe ich auch ein kleines Problem. Hin und wieder ist die Datei $json leer, es werden also keine Daten von der URL eingelesen. Mal  geht es und mal nicht. Wenn ich die URL so im Browser eingebe, kommen die Daten immer, nur nicht über das PHP Skript. Ich hoste meine Webseite bei 1blu. Du gibst hier wahrscheinlich kein Support, aber ich komme da nicht mehr weiter.
 
Danke für deine Hilfe und dein Skript,
Jürgen

Thomas Belser 11. September 2012

Hi,

tritt das Problem oft auf oder nur ab und an? Selbiges habe ich bei mir im moment auch so circa einmal die Woche, bin aber noch nicht dazu gekommen, mir es einmal näher anzuschauen. Eventuell hat es etwas mit der Menge der Daten oder den Zeitabständen, in welchen man die Daten abruft, zu tun (Schutzmechanismus seitens Yahoo, etc). Vielleicht ist es aber auch was ganz anderes.

Ich werde versuchen, mir das demnächst mal genauer anzuschauen – kann aber noch nicht versprechen, wann das sein wird. :-( Aber ich denke mal bis spätestens im laufe der nächsten Woche.

Viele Grüße,
Thomas 

Jürgen Ziegler 11. September 2012

Das Problem tritt nicht immer auf, aber leider immer wieder mal.
Wenn ich den Aufruf direkt in den Browser eingebe, dann bekomme ich immer die richtigen Daten im Browser angezeigt, egal wie oft und schnell ich die Seite aktualisiere.
http://query.yahooapis.com/v1/public/yql?q=select+Name%2C+PreviousClose%2C+LastTradePriceOnly+from+yahoo.finance.quotes+where+symbol+in+%28%22AFL.F%22%29+%7C+sort%28field%3D%22LastTradePriceOnly%22%2C+descending%3D%22true%22%29&format=json&env=http://datatables.org/alltables.env&callback=url
Sobald die Daten mit der Funktion:
$json = file_get_contents($url);
eingelesen werden, gehen sie dann schon mal komplett verloren, $json ist also leer.
Würde mich sehr freuen, wenn du mal schauen könntest :-)
Ich bin auf jedem Fall sehr glücklich mit dieser Funktion, ich habe sie jetzt auf meiner Homepage hinzugefügt.
 
Danke nochmals !!!!!!

Thomas Belser 29. Oktober 2012

Sorry für die späte Rückmeldung, aber bis jetzt konnte ich dein Problem leider nicht reproduzieren. :-(

Gruß,
Thomas 

Dimi 24. Januar 2013

Hallo Thomas,
klasse, vielen Dank für den Script! War auch schon sehr lange auf der Suche – ich nehme an, es gibt bei dieser JSON Abfrage keine Quote (Begrenzung) seitens Yahoo? Mir geht darum auch für ein Aktienportfolio bei jedem Aufruf der Seite die Kurse sofort von Yahoo zu holen. Also keine Zwischenspeicherung in der Datenbank.
Vielen Dank,
Dimi

Thomas Belser 24. Januar 2013

Bezüglich der Aufrufbegrenzung müsstest du mal auf den Yahoo!-Seiten nachschauen, da ich mir dessen nicht sicher bin. Deshalb speichere ich die Werte in meiner Datenbank.

Wenn du aber nicht gerade tausende Seitenaufrufe hast, sollte es auch so funktionieren. :-)

321meins 3. April 2013

Hallo, erst mal danke für die Anleitung.
Ich habe noch Probleme. Folgende zwei Beispiele funktionieren
http://*****/aktie.php?unternehmen=SAP
http://*****/aktie.php?unternehmen=deutsche%20post
Bei Nestle geht das ganze nicht. Egal ob man Nestle oder Nestle SA angibt.
http://*****/aktie.php?unternehmen=Nestle%20SA%20
Ausgabe: Kein passendes Symbol gefunden.

Thomas Belser 3. April 2013

Hi,

ich bekomme bei der Übergabe von „Nestle“ einige Symbole zurückgeliefert, nur keines für den Handelsplatz XETRA. Eventuell müsstest du dafür einen alternativen Handelsplatz nehmen.

Das Problem ist auch, dass immer nur eine gewisse Menge an Ergebnissen zurückgeliefert wird, so dass das gewünschte Symbol oftmals irgendwo im nirgendwo verschwindet. Vielleicht findest du ja eine Möglichkeit die Anzahl der Rückgabewerte zu erhöhen.

Gruß, Thomas

321meins 3. April 2013

Danke, habe XETRA durch Frankfurt ersetzt jetzt geht es.

Frank 15. April 2013

Hallo,
Vielen Dank für das tolle Tutorial.
Hättest du eventuell auch noch eine Version mit Abfrage der Namen aus einer Datenbank und Speicherung der Kurs ebenfalls in einer DB?
Viele Grüße
Frank

Christoph 28. September 2014

@Frank: Das geht doch ganz einfach – google doch einfach mal nach PHP MySQL speichern und baue das Ganze in dein Script ein ;-)

Gutes Tutorial, den Code werde ich mir mal anschauen …

Robin 14. Oktober 2014

Hallo,

das kleine Skript ist sehr hilfreich. Jetzt würde mich noch brennend interessieren, von wo du deine Informationen bezüglich den Parametern, die du an Yahoo per Query sendest, bezogen hast. Ich finde auf der Yahoo-Seite keinerlei Informationen.

Viele Grüße

Robin

Dennis 26. Juni 2015

Hallo Thomas,
super Script. sowas suche ich schon lange.
Geht das ganze auch für Rohstoffe?
Ich bräuchte hier Werte wie Kupfer, Silber, Platin.
Beste Grüße

Kommentar schreiben:


Kommentar: