Поток данных о ценах на акции Python в реальном времени (отладка скрипта)

я только начинаю учиться программировать и хочу заранее извиниться, если этот вопрос тривиален.

Я пытался найти способ передавать данные фондового рынка в Python в режиме реального времени и наткнулся на этот блог http://www.quantatrisk.com/2015/05/07/hacking-google-finance-in-pre-market-trading-python/

Ниже приведен сценарий, который я скопировал и вставил.

import urllib2  # works fine with Python 2.7.9 (not 3.4.+)
import json
import time

def fetchPreMarket(symbol, exchange):
    link = "http://finance.google.com/finance/info?client=ig&q="
    url = link+"%s:%s" % (exchange, symbol)
    u = urllib2.urlopen(url)
    content = u.read()
    data = json.loads(content[3:])
    info = data[0]
    t = str(info["elt"])    # time stamp
    l = float(info["l"])    # close price (previous trading day)
    p = float(info["el"])   # stock price in pre-market (after-hours)
    return (t,l,p)


p0 = 0
while True:
    t, l, p = fetchPreMarket("AAPL","NASDAQ")
    if(p!=p0):
        p0 = p
        print("%s\t%.2f\t%.2f\t%+.2f\t%+.2f%%" % (t, l, p, p-l,
                                                 (p/l-1)*100.))
    time.sleep(60)

это кажется отличным кодом, за исключением того, что когда я его запускаю, я получаю следующее сообщение об ошибке

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-11-012ec6dc7b0c> in <module>()
     18 p0 = 0
     19 while True:
---> 20     t, l, p = fetchPreMarket("AAPL","NASDAQ")
     21     if(p!=p0):
     22         p0 = p

<ipython-input-11-012ec6dc7b0c> in fetchPreMarket(symbol, exchange)
     10     data = json.loads(content[3:])
     11     info = data[0]
---> 12     t = str(info["elt"])    # time stamp
     13     l = float(info["l"])    # close price (previous trading day)
     14     p = float(info["el"])   # stock price in pre-market (after-hours)

KeyError: 'elt'

Я попытался изменить fetchPreMarket таким образом, чтобы он просто выводил info = data[0], но когда я попытался «распечатать информацию», из этого ничего не вышло.

заранее спасибо


person stratofortress    schedule 24.02.2016    source источник
comment
Вместо этого напечатайте data. На что это похоже?   -  person OneCricketeer    schedule 24.02.2016
comment
если я подавляю t,l,p в функции и делаю data = fetchPreMarket("AAPL","NASDAQ") print(data) time.sleep(60) , то я получаю [{u'c': u'+0.95', u'ccol': u'chg', u'e': u'NASDAQ', u'ltt': u'2:40PM EST', u'cp_fix': u'1.00', u'c_fix': u'0.95', u'l': u'95.64', u's': u'0', u'lt': u'Feb 24, 2:40PM EST', u'pcls_fix': u'94.69', u't': u'AAPL', u'lt_dts': u'2016-02-24T14:40:36Z', u'l_fix': u'95.64', u'cp': u'1.00', u'id': u'22144', u'l_cur': u'95.64'}]   -  person stratofortress    schedule 24.02.2016
comment
@stratofortress Редактируйте свой вопрос вместо того, чтобы публиковать кучу кода и данных в комментарии.   -  person elixenide    schedule 24.02.2016
comment
@EdCottrell мои извинения   -  person stratofortress    schedule 24.02.2016


Ответы (1)


Итак... Поддержка Google Finance API прекращена. Я удивлен, что ссылка работает, но в данных нет ключа "etl" (или "el").

Итак, вы получите KeyError: 'elt' в info["elt"]

Для справки,

{
"id": "22144"
,"t" : "AAPL"
,"e" : "NASDAQ"
,"l" : "95.52"
,"l_fix" : "95.52"
,"l_cur" : "95.52"
,"s": "0"
,"ltt":"2:34PM EST"
,"lt" : "Feb 24, 2:34PM EST"
,"lt_dts" : "2016-02-24T14:34:54Z"
,"c" : "+0.83"
,"c_fix" : "0.83"
,"cp" : "0.88"
,"cp_fix" : "0.88"
,"ccol" : "chg"
,"pcls_fix" : "94.69"
}

Возможно, вам больше повезет с googlefinance или yahoo-finance, а не напрямую вызывать адрес API.

Однако стоит отметить, что API Yahoo не работает в режиме реального времени. Это примерно 15-минутная задержка котировки.

person OneCricketeer    schedule 24.02.2016
comment
Похоже, что l_cur — это текущая цена, pcls_fix — предыдущая цена закрытия, а lt_dts — дата и время. - person Charlie Haley; 24.02.2016
comment
@stratofortress - вы можете использовать "lt" вместо "etl" и "pcls_fix" вместо "el". Похоже, это те же цифры, которые извлекает блог. - person OneCricketeer; 24.02.2016
comment
@cricket_007 Замена "elt" на "lt" и "el" на "pcls_fix" из исходный код работал. - person 3kstc; 03.01.2017