web-dev-qa-db-fra.com

source des données historiques sur les stocks

J'essaie de faire un simulateur boursier (peut-être éventuellement devenir une IA prédictive), mais j'ai du mal à trouver des données à utiliser. Je cherche une source (espérons-le libre) de données historiques sur le marché boursier.

Idéalement, il s'agirait d'un ensemble de données très fines (intervalle de seconde ou minute) avec le prix et le volume de chaque symbole sur NASDAQ et NYSE (et peut-être d'autres si je suis aventureux). Est-ce que quelqu'un connaît une source pour de telles informations?

J'ai trouvé cette question qui indique que Yahoo offre des données historiques au format CSV, mais je n'ai pas pu trouver comment l'obtenir lors d'un examen rapide du site lié.

Je n'aime pas non plus l'idée de télécharger les données au coup par coup dans des fichiers CSV ... J'imagine que Yahoo se fâcherait et me fermerait après les quelques milliers de demandes.

J'ai aussi découvert ne autre question qui m'a fait penser que je toucherais le jackpot, mais malheureusement, le site OpenTick semble avoir fermé ses portes ... Dommage, car je pense qu'ils correspondaient exactement à ce que je voulais.

Je pourrais également utiliser chaque jour des données ne faisant qu'ouvrir/fermer le prix et le volume de chaque symbole, mais je préférerais toutes les données si je peux les obtenir. D'autres suggestions?

236
rmeador

Permettez-moi d'ajouter 2 ¢, mon travail consiste à obtenir des données correctes et fiables pour un hedge fund. J'ai vu pas mal de sources de données et de fournisseurs de données historiques. Ceci concerne principalement les données sur les actions américaines.

Pour commencer, si vous n’avez pas l’argent nécessaire pour télécharger des données de Yahoo, obtenez les données de fin de journée directement de données CSI, c'est là que Yahoo obtient leurs données EOD aussi loin que je sache. Ils ont une API où vous pouvez extraire les données dans le format de votre choix. Je pense que l'abonnement annuel pour les données est de quelques 100 dollars.

Le principal problème du téléchargement de données à partir d’un service gratuit est que vous n’obtenez que des actions existantes, appelées Survivorship Bias et qui peuvent vous donner des résultats erronés si vous examinez de nombreuses actions, car inclure ceux qui ont réussi jusqu'ici et non ceux qui ont été retirés de la liste.

Pour explorer certaines données intrajournalières, je voudrais examiner IQFeed, ils fournissent plusieurs API permettant d'extraire des données historiques, bien qu'ils sont principalement une tenue pour les flux en temps réel. Mais ici, il existe de nombreuses options, certains courtiers fournissant même des téléchargements de données historiques via leurs API, choisissez donc votre poison.

MAIS en général, toutes ces données ne sont pas très propres. Dès que vous effectuez un nouveau test, vous constaterez que certaines actions manquent ou apparaissent sous la forme de deux symboles différents, ou que les fractionnements d’actions ne sont pas correctement comptabilisés, etc. les données sur les dividendes sont également nécessaires et vous commencez donc à tourner en rond, en corrigeant les données de 100 sources de données différentes, etc. Donc, commencer avec un flux de données "discount" fera l'affaire, mais dès que vous exécutez des backtests plus complets, vous risquez de rencontrer des problèmes en fonction de ce que vous faites. Si vous ne regardez que, disons, les actions du S & P 500, cela ne posera pas vraiment de problème et une alimentation intra-journalière "bon marché" conviendra.

Ce que vous ne trouverez pas, ce sont des données intraday gratuites. Je veux dire que vous trouverez peut-être des exemples. Je suis sûr qu'il existe environ cinq années de données de ticks MSFT, mais cela ne vous mènera pas très loin.

Ensuite, si vous avez besoin de choses réelles (carnet d’ordres de niveau II, tous les ticks, comme ils se sont produits lors de tous les échanges), une option "abordable", mais qui reste excellente Nanex. En fait, ils vous expédieront un disque contenant des téraoctets de données. Si je me souviens bien, c’est environ 3 000 $ à 4 000 $ par année de données. Mais croyez-moi, une fois que vous aurez compris à quel point il est difficile d'obtenir de bonnes données intrajournalières, vous ne penserez plus qu'il s'agit de beaucoup d'argent.

Il est difficile de ne pas vous décourager, mais d’obtenir de bonnes données, si difficile en réalité que de nombreux fonds de couverture et banques dépensent des centaines de milliers de dollars par mois pour obtenir des données fiables. Encore une fois, vous pouvez commencer quelque part, puis à partir de là, mais il est bon de le voir un peu dans son contexte.


Edit: La réponse ci-dessus provient de ma propre expérience. Cet article de Caltech sur les sources de données disponibles donnera plus d'informations, et recommande en particulier QuantQuote.

222
lukebuehler

CETTE RÉPONSE IS N'EST PLUS PRÉCISE COMME L'ALIMENT YAHOO A CESSÉ D'EXister

En utilisant l'approche CSV de Yahoo ci-dessus, vous pouvez également obtenir des données historiques! Vous pouvez procéder au reverse engineering de l'exemple suivant:

http://ichart.finance.yahoo.com/table.csv?s=YHOO&d=0&e=28&f=2010&g=d&a=3&b=12&c=1996&ignore=.csv

Essentiellement:

sn = TICKER
a = fromMonth-1
b = fromDay (two digits)
c = fromYear
d = toMonth-1
e = toDay (two digits)
f = toYear
g = d for day, m for month, y for yearly

La liste complète des paramètres:

a   Ask
a2  Average Daily Volume
a5  Ask Size
b   Bid
b2  Ask (Real-time)
b3  Bid (Real-time)
b4  Book Value
b6  Bid Size
c   Change & Percent Change
c1  Change
c3  Commission
c6  Change (Real-time)
c8  After Hours Change (Real-time)
d   Dividend/Share
d1  Last Trade Date
d2  Trade Date
e   Earnings/Share
e1  Error Indication (returned for symbol changed / invalid)
e7  EPS Estimate Current Year
e8  EPS Estimate Next Year
e9  EPS Estimate Next Quarter
f6  Float Shares
g   Day's Low
h   Day's High
j   52-week Low
k   52-week High
g1  Holdings Gain Percent
g3  Annualized Gain
g4  Holdings Gain
g5  Holdings Gain Percent (Real-time)
g6  Holdings Gain (Real-time)
i   More Info
i5  Order Book (Real-time)
j1  Market Capitalization
j3  Market Cap (Real-time)
j4  EBITDA
j5  Change From 52-week Low
j6  Percent Change From 52-week Low
k1  Last Trade (Real-time) With Time
k2  Change Percent (Real-time)
k3  Last Trade Size
k4  Change From 52-week High
k5  Percent Change From 52-week High
l   Last Trade (With Time)
l1  Last Trade (Price Only)
l2  High Limit
l3  Low Limit
m   Day's Range
m2  Day's Range (Real-time)
m3  50-day Moving Average
m4  200-day Moving Average
m5  Change From 200-day Moving Average
m6  Percent Change From 200-day Moving Average
m7  Change From 50-day Moving Average
m8  Percent Change From 50-day Moving Average
n   Name
n4  Notes
o   Open
p   Previous Close
p1  Price Paid
p2  Change in Percent
p5  Price/Sales
p6  Price/Book
q   Ex-Dividend Date
r   P/E Ratio
r1  Dividend Pay Date
r2  P/E Ratio (Real-time)
r5  PEG Ratio
r6  Price/EPS Estimate Current Year
r7  Price/EPS Estimate Next Year
s   Symbol
s1  Shares Owned
s7  Short Ratio
t1  Last Trade Time
t6  Trade Links
t7  Ticker Trend
t8  1 yr Target Price
v   Volume
v1  Holdings Value
v7  Holdings Value (Real-time)
w   52-week Range
w1  Day's Value Change
w4  Day's Value Change (Real-time)
x   Stock Exchange
y   Dividend Yield
94
Fredrik E

Je sais que vous vouliez être "gratuit", mais je penserais sérieusement à obtenir les données de csidata.com pour environ 300 $/an, si j'étais vous.

C'est ce que Yahoo utilise pour fournir leurs données.

Il est livré avec une API décente, et les données sont (pour autant que je sache) très propres.

Vous obtenez 10 ans d’histoire lorsque vous vous abonnez, puis des mises à jour nocturnes par la suite.

Ils s'occupent également de toutes sortes de choses désagréables comme des scissions et des dividendes pour vous. Si vous n'avez pas encore découvert la joie que procure le nettoyage des données, vous ne réaliserez pas à quel point vous en avez besoin, et ce, jusqu'à la première fois que votre ATS (Automated Trading System) pense qu'un stock est vraiment très bon marché, uniquement parce qu'il est divisé en deux. : 1 et vous n'avez pas remarqué.

45
Eric H.

Intro:
À partir de Yahoo, vous pouvez obtenir les prix historiques EOD (en fin de journée) ou en temps réel. Les prix EOD sont incroyablement simples à télécharger. Voir mon blog pour des explications sur la façon d'obtenir les données et des exemples de code C #.

Je suis en train d'écrire un "moteur" de flux de données en temps réel qui télécharge et stocke les prix en temps réel dans une base de données. Le moteur sera initialement en mesure de télécharger les prix historiques de Yahoo et d'Interactive Brokers et pourra stocker les données dans une base de données de votre choix: MS SQL, MySQL, SQLite, etc. Il est open source, mais je posterai plus informations sur mon blog lorsque je suis sur le point de le publier (dans quelques jours).

Une autre option est Eclipse trader ... elle vous permet d’enregistrer les données historiques avec une granularité aussi faible que 1 minute et de stocker les prix localement dans un fichier texte. Il télécharge les données en temps réel de Yahoo avec un délai de 15 minutes. Comme je voulais une solution plus robuste et que je travaillais sur un grand projet d'école pour lequel nous avions besoin de données, j'ai décidé d'écrire mon propre moteur de flux de données (que j'ai mentionné ci-dessus).

Exemple de code:
Voici un exemple de code C # qui montre comment télécharger des données en temps réel:

public void Start()
{
    string url = "http://finance.yahoo.com/d/quotes.csv?s=MSFT+GOOG&f=snl1d1t1ohgdr";
    //Get page showing the table with the chosen indices
    HttpWebRequest request = null;
    IDatabase database =
        DatabaseFactory.CreateDatabase(
        DatabaseFactory.DatabaseType.SQLite);

    //csv content
    try
    {
        while (true)
        {
            using (Stream file = File.Create("quotes.csv"))
            {
                request = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
                request.Timeout = 30000;
                using (var response = (HttpWebResponse)request.GetResponse())
                using (Stream input = response.GetResponseStream())
                {
                    CopyStream(input, file);
                }
            }
            Console.WriteLine("------------------------------------------------");
            database.InsertData(Directory.GetCurrentDirectory() + "/quotes.csv");

            File.Delete("quotes.csv");
            Thread.Sleep(10000); // 10 seconds
        }
    }
    catch (Exception exc)
    {
        Console.WriteLine(exc.ToString());
        Console.ReadKey();
    }
}

Base de données:
Du côté de la base de données, j'utilise une connexion OleDb au fichier CSV pour renseigner un DataSet, puis je mets à jour ma base de données actuelle via DataSet, ce qui le rend fondamentalement possible. faire correspondre toutes les colonnes du fichier CSV renvoyé par Yahoo directement à votre base de données (si votre base de données ne prend pas en charge les insertions par lots de données CSV, comme SQLite). Sinon, l'insertion des données se fait en une seule ligne ... insérez simplement le fichier CSV par lot dans votre base de données.

Vous pouvez en savoir plus sur le formatage de l'URL ici: http://www.gummy-stuff.org/Yahoo-data.htm

16
Kiril

Un ensemble de données de chaque symbole du NASDAQ et de la NYSE à une seconde ou une minute d'intervalle sera massif .

Supposons qu'il y a au total 4000 sociétés cotées sur les deux bourses (c'est probablement très bas puisqu'il y a plus de 3200 sociétés cotées au NASDAQ). Pour les données à un second intervalle, en supposant qu'il y ait 6,5 heures de négoce dans une journée, cela vous donnerait 23400 points de données par jour et par entreprise, soit environ 93 600 000 points de données au total pour cette journée. En supposant 200 jours de bourse par an, environ 18 720 000 000 points de données pour un an seulement.

Peut-être que vous voulez commencer par un plus petit ensemble?

16
matt b

NASDAQ offre 10 ans de données historiques de NEM pour chaque symbole

http://www.nasdaq.com/aspx/historical_quotes.aspx?symbol=AAPL&selected=AAPL

Vous pouvez automatiser le processus de téléchargement de ces données.

9
Navi

Pour les données sans biais de survie, la seule source fiable que j'ai trouvée est QuantQuote ( http://quantquote.com )

Les données sont présentées en minutes, en secondes ou résolution de tick, avec un lien vers leur données historiques sur les actions .

Il y avait une suggestion pour kibot ci-dessus. Je voudrais faire une recherche google rapide avant d'acheter chez eux, vous trouverez beaucoup de messages comme celui-ci avec des avertissements sur les problèmes de qualité des données de kibot. Il est également révélateur que leur soi-disant système sp500 de survie gratuit ne comporte que 570 symboles pendant 14 ans. C'est à peu près impossible, sp500 change de 1-2 symboles par mois ....

8
user788171

Malheureusement, il est difficile de trouver des données de ticker historiques gratuites. Maintenant qu'opentick est mort, je ne connais aucun autre fournisseur.

Dans une vie antérieure, j'ai travaillé pour un fonds de couverture doté d'un système de négociation automatisé, et nous avons utilisé abondamment les données historiques.

Nous avons utilisé TickData pour notre source. Leurs prix étaient raisonnables et les données avaient une résolution inférieure à la seconde.

7
Alan

Nous avons acheté des données intraday sur 12 ans à Kibot.com et sommes assez satisfaits de la qualité.

En ce qui concerne les besoins de stockage: environ 100 Go pour toutes les actions américaines (plus de 8 000 symboles) sur 12 ans.

Avec les données tick-by-tick, la situation est peu différente. Si vous enregistrez le temps et les ventes uniquement, cela représenterait environ 30 Go de données par mois pour toutes les actions américaines. Si vous souhaitez stocker les modifications d'enchères/demandes avec les transactions, vous pouvez vous attendre à environ 150 Go par mois.

J'espère que ça aide. S'il vous plaît laissez-moi savoir s'il y a quelque chose d'autre, je peux vous aider avec.

6
boe100

Permettez-moi d'ajouter une source que je viens de découvrir, trouvée ici .

Il contient beaucoup de données historiques sur les stocks au format csv et a été rassemblé par Andy Pavlo, qui, selon sa page d'accueil, est un "professeur adjoint du département d'informatique de la Carnegie Mellon University".

6
Noam

Mathematica nowoadays offre également un accès aux cours actuels et historiques des actions, voir http://reference.wolfram.com/mathematica/ref/FinancialData.html , si vous en possédez une copie.

5
Tom Wenseleers

Yahoo est l'option la plus simple pour obtenir des données préliminaires gratuites. Le lien décrit dans la réponse de eckesicle pourrait être facilement utilisé dans un code python, mais vous devez d'abord disposer de tous les tickers. J'utiliserais le NYSE pour cet exemple, mais cela peut également être utilisé pour différents échanges.

J'ai utilisé cette page wiki pour télécharger tous les tickers de la société avec le script suivant (je ne suis pas un pythoniste très talentueux, désolé si ce code n'est pas très efficace):

import string
import urllib2
from bs4 import BeautifulSoup

global f

def download_page(url):
    aurl = urllib2.urlopen(url)
    soup = BeautifulSoup(aurl.read())

    print url

    for row in soup('table')[1]('tr'):
        tds = row('td')
        if (len(tds) > 0):
            f.write(tds[1].string + '\n')


f = open('stock_names.txt', 'w')

url_part1 = 'http://en.wikipedia.org/wiki/Companies_listed_on_the_New_York_Stock_Exchange_'
url = url_part1 + '(0-9)'
download_page(url)

for letter in string.uppercase[:26]:
    url_part2 = letter
    url = url_part1 + '(' + letter + ')'

    download_page(url)

f.close()

Pour télécharger chaque ticker, j'ai utilisé un autre script assez similaire:

import string
import urllib2
from bs4 import BeautifulSoup


global f

url_part1 = 'http://ichart.finance.yahoo.com/table.csv?s='
url_part2 = '&d=0&e=28&f=2010&g=d&a=3&b=12&c=1996&ignore=.csv'

print "Starting"

f = open('stock_names.txt', 'r')
file_content = f.readlines()
count = 1;
print "About %d tickers will be downloaded" % len(file_content)

for ticker in file_content:
    ticker = ticker.strip()
    url = url_part1 + ticker + url_part2

    try:
        # This will cause exception on a 404
        response = urllib2.urlopen(url)

        print "Downloading ticker %s (%d out of %d)" % (ticker, count, len(file_content))

        count = count + 1
        history_file = open('C:\\Users\\Nitay\\Desktop\\Historical Data\\' + ticker + '.csv', 'w')
        history_file.write(response.read())
        history_file.close()

    except Exception, e:
        pass

f.close()

Notez que le principal inconvénient de cette méthode est que différentes données sont disponibles pour différentes sociétés. Les sociétés qui ne disposent pas de données existantes aux dates demandées (nouvellement répertoriées) vous obtiendront une page 404.

N'oubliez pas non plus que cette méthode n'est utile que pour les données préliminaires - Si vous voulez vraiment tester votre algorithme, vous devez payer un peu et utiliser un fournisseur de données de confiance tel que CSIData ou autre.

4
Nitay

Vous pouvez utiliser Yahoo pour obtenir des données quotidiennes (un ensemble de données beaucoup plus facile à gérer), mais vous devez structurer les URL. Voir ceci lien . Vous ne faites pas beaucoup de petites demandes, vous faites moins de demandes volumineuses. Beaucoup de logiciels libres l'utilisent donc ils ne devraient pas vous arrêter.

EDIT: This le gars le fait, vous pouvez peut-être jeter un coup d'œil aux appels que son logiciel passe.

4
jimconstable

J'utilise le site eodData.com. C'est assez décent. Pour 30 dollars par mois, vous obtenez 30 jours de barres de 1,5 et 60 minutes pour tous les échanges américains et 1 an de données EOD pour la plupart des autres.

3
Dez Udezue

Pourquoi ne pas modéliser un marché boursier factice avec Brownian Motion?

Beaucoup de ressources pour le faire. Facile à mettre en œuvre.

http://introcs.cs.princeton.edu/Java/98simulation/

3
Michael Thamm

J'explorerais finance.google.com (pour les citations) ou finance.yahoo.com.

Ces deux sites renverront des pages html pour la plupart des échanges dans le monde, y compris historiques. Ensuite, il suffit d'analyser le code HTML pour extraire ce dont vous avez besoin.

Je l'ai fait par le passé avec beaucoup de succès. Alternativement, si cela ne vous dérange pas d’utiliser Perl, plusieurs modules de CPAN ont effectué ce travail pour vous, c’est-à-dire extraire des citations de Google/Yahoo.

Pour plus d'informations, voir Historique des devis

2
Chaos

Un de mes anciens projets allait utiliser des données téléchargeables gratuitement de EODData .

1
Shaggy Frog

Jetez un coup d’œil à l’API de données sur les titres historiques de Mergent - http://www.mergent.com/servius

1
Eugene Osovetsky