web-dev-qa-db-fra.com

Comment créer une application de récupération de cours boursiers dans python

Je suis assez nouveau dans la programmation en Python .

Je souhaite créer une application qui récupère les cours des actions auprès de google finance . Un exemple est CSCO (Cisco Sytems). J'utiliserais alors ces données pour avertir l'utilisateur lorsque le stock atteint une certaine valeur . Il doit également se rafraîchir toutes les 30 secondes .

Le problème est que je n'ai aucune idée de comment récupérer les données!

Quelqu'un a des idées?

14
Alex

Ce module est fourni par Corey Goldberg .

Programme:

import urllib
import re

def get_quote(symbol):
    base_url = 'http://finance.google.com/finance?q='
    content = urllib.urlopen(base_url + symbol).read()
    m = re.search('id="ref_694653_l".*?>(.*?)<', content)
    if m:
        quote = m.group(1)
    else:
        quote = 'no quote available for: ' + symbol
    return quote

Exemple d'utilisation:

import stockquote
print stockquote.get_quote('goog')

Mise à jour : modification de l'expression régulière pour qu'elle corresponde au dernier format de Google Finance (au 23 février 2011). Cela démontre le principal problème lorsque l'on se fie au grattage d'écran.

15
Ben Hoffstein

Pour l'instant (2015), l'API google finance est obsolète. Mais vous pouvez utiliser le module pypi googlefinance .

Installez googlefinance

$pip install googlefinance

Il est facile d'obtenir le cours actuel des actions:

>>> from googlefinance import getQuotes
>>> import json
>>> print json.dumps(getQuotes('AAPL'), indent=2)
[
  {
    "Index": "NASDAQ", 
    "LastTradeWithCurrency": "129.09", 
    "LastTradeDateTime": "2015-03-02T16:04:29Z", 
    "LastTradePrice": "129.09", 
    "Yield": "1.46", 
    "LastTradeTime": "4:04PM EST", 
    "LastTradeDateTimeLong": "Mar 2, 4:04PM EST", 
    "Dividend": "0.47", 
    "StockSymbol": "AAPL", 
    "ID": "22144"
  }
]

Google Finance est une source qui fournit des données boursières en temps réel. Il existe également d'autres API de yahoo, telles que yahoo-finance , mais elles sont retardées de 15 minutes pour les actions du NYSE et du NASDAQ.

13
hongtao
import urllib
import re

def get_quote(symbol):
    base_url = 'http://finance.google.com/finance?q='
    content = urllib.urlopen(base_url + symbol).read()
    m = re.search('id="ref_(.*?)">(.*?)<', content)
    if m:
        quote = m.group(2)
    else:
        quote = 'no quote available for: ' + symbol
    return quote

Je trouve que si vous utilisez ref _ (. *?) Et utilisez m.group (2), vous obtiendrez un meilleur résultat lorsque l'ID de référence change de stock en stock.

2
Peter Party Bus

Je suggère d'utiliser le HTMLParser pour obtenir la valeur des balises meta google places dans son html

<meta itemprop="name"
        content="Cerner Corporation" />
<meta itemprop="url"
        content="https://www.google.com/finance?cid=92421" />
<meta itemprop="imageUrl"
        content="https://www.google.com/finance/chart?cht=g&q=NASDAQ:CERN&tkr=1&p=1d&enddatetime=2014-04-09T12:47:31Z" />
<meta itemprop="tickerSymbol"
        content="CERN" />
<meta itemprop="exchange"
        content="NASDAQ" />
<meta itemprop="exchangeTimezone"
        content="America/New_York" />
<meta itemprop="price"
        content="54.66" />
<meta itemprop="priceChange"
        content="+0.36" />
<meta itemprop="priceChangePercent"
        content="0.66" />
<meta itemprop="quoteTime"
        content="2014-04-09T12:47:31Z" />
<meta itemprop="dataSource"
        content="NASDAQ real-time data" />
<meta itemprop="dataSourceDisclaimerUrl"
        content="//www.google.com/help/stock_disclaimer.html#realtime" />
<meta itemprop="priceCurrency"
        content="USD" />

Avec un code comme celui-ci:

import urllib
try:
    from html.parser import HTMLParser
except:
    from HTMLParser import HTMLParser

class QuoteData:
    pass

class GoogleFinanceParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.quote = QuoteData()
        self.quote.price = -1

    def handle_starttag(self, tag, attrs):
        if tag == "meta":
            last_itemprop = ""
            for attr, value in attrs:
                if attr == "itemprop":
                    last_itemprop = value

                if attr == "content" and last_itemprop == "name":
                    self.quote.name = value
                if attr == "content" and last_itemprop == "price":
                    self.quote.price = value
                if attr == "content" and last_itemprop == "priceCurrency":
                    self.quote.priceCurrency = value
                if attr == "content" and last_itemprop == "priceChange":
                    self.quote.priceChange = value
                if attr == "content" and last_itemprop == "priceChangePercent":
                    self.quote.priceChangePercent = value
                if attr == "content" and last_itemprop == "quoteTime":
                    self.quote.quoteTime = value
                if attr == "content" and last_itemprop == "exchange":
                    self.quote.exchange = value
                if attr == "content" and last_itemprop == "exchangeTimezone":
                    self.quote.exchangeTimezone = value


def getquote(symbol):
    url = "http://finance.google.com/finance?q=%s" % symbol
    content = urllib.urlopen(url).read()

    gfp = GoogleFinanceParser()
    gfp.feed(content)
    return gfp.quote;


quote = getquote('CSCO')
print quote.name, quote.price
2
Chad Skeeters

Juste au cas où vous souhaiteriez extraire des données de Yahoo ... Voici une fonction simple. Cela ne supprime pas les données d'une page normale. Je pensais avoir un lien vers la page décrivant cela dans les commentaires, mais je ne le vois pas maintenant - il y a une chaîne magique ajoutée à l'URL pour demander des champs spécifiques.

import urllib as u
import string
symbols = 'AMD ibm gm kft'.split()

def get_data():
    data = []
    url = 'http://finance.yahoo.com/d/quotes.csv?s='
    for s in symbols:
        url += s+"+"
    url = url[0:-1]
    url += "&f=sb3b2l1l"
    f = u.urlopen(url,proxies = {})
    rows = f.readlines()
    for r in rows:
        values = [x for x in r.split(',')]
        symbol = values[0][1:-1]
        bid = string.atof(values[1])
        ask = string.atof(values[2])
        last = string.atof(values[3])
        data.append([symbol,bid,ask,last,values[4]])
    return data

Ici, j'ai trouvé le lien qui décrit la chaîne magique: http://cliffngan.net/a/1

1
phkahler

http://docs.python.org/library/urllib.html pour récupérer des URL arbitraires.

En dehors de cela, vous devriez mieux regarder un service Web fournissant les données au format JSON.

Sinon, vous devez implémenter vous-même l'analyse, etc.

Capture d'écran de yahoo.com pour obtenir les stocks est peu probable que la bonne voie vers le succès.

0
Andreas Jung

Vous pouvez commencer par regarder les API Google Finance , même si je ne vois pas d'API ou de wrapper Python). Il semble que les seules options pour accéder directement aux données are Java et JavaScript. Vous pouvez également tilisez cURL si vous le connaissez et qu'il est disponible sur votre système.

0
Bill the Lizard

L'API de Google Finance est un autre bon point de départ: http://code.google.com/apis/finance/ Vous pouvez consulter leur gadgets financiers pour un exemple de code .

0
Ryan Castillo