来自python

时间:2016-05-13 20:15:38

标签: python finance

我在python中使用yahoo_finance来提取库存数据,出于某种原因,get_prev_close()方法在每次调用时都没有返回相同的数据。

这是一个简单的例子:

from yahoo_finance import Share
from time import sleep

while True:
    stock = Share('XLV')
    prevClose = float(stock.get_prev_close())
    print prevClose

    sleep(1)

出于某种原因,这将看似随机打印两个不同的数字。所以今天我打印出69.369.71。但由于这是昨天关闭的数据,因此应该只有一个值。

这是已知错误吗?有解决方法吗?

2 个答案:

答案 0 :(得分:4)

此问题与yahoo_finance python库无关。许多用户都观察到雅虎金融的结果不一致。您可以在forums.developer.yahoodifferent result找到投诉。 我今天运行了几个查询,并得到了不同的结果。 可能你最好找到另一个财务数据来源。

答案 1 :(得分:2)

看来yahoo_finance包使用的实时YQL数据是陈旧的。 69.71是5月11日收盘价。正确的值应该是69.3。

简单的解决方案是访问与

中相同的包的历史数据表
>>> from yahoo_finance import Share
>>> stock = Share('XLV')
>>> data, = stock.get_historical('2016-05-12','2016-05-12')
>>> data['Close']
69.300003

或者,直接从雅虎/财经网站获取密切数据。 (更快更灵活)当我试图复制你的情况时,我没有得到你报告的值的闪烁,但我确实得到了陈旧的结果(5月20日而不是5月23日)。也许你看到的闪烁是YQL有时会带有陈旧数据的服务器的结果,有时候不是。这里的代码从yahoo_finance(a)的历史数据,yahoo_finance(b)的实时数据,直接来自yahoo-finance实时报价(c)以及直接来自yahoo-finance历史数据( d)。

import csv
import time
import datetime

import requests
import pytz

from yahoo_finance import Share

hist_url = 'http://real-chart.finance.yahoo.com/table.csv?s=XLV&a=4&b=23&c=2016&g=d&ignore.csv'
realtime_url = 'http://download.finance.yahoo.com/d/quotes.csv?s=XLV&f=p&e=.csv'

eastern = pytz.timezone('US/Eastern')

while True:
    stock = Share('XLV')
    a = stock.get_historical('2016-05-23','2016-05-23')[0]['Close']
    b = stock.get_prev_close()
    r = requests.get(hist_url)
    reader = csv.DictReader(r.iter_lines())
    c = float(next(reader)['Close'])
    d = float(requests.get(realtime_url).text)
    print datetime.datetime.now(eastern).time(), a, b, c, d
    time.sleep(120)

第3列中stock.get_prev_close()的关闭始终是陈旧的,而其他数字根据以下输出是正确的:

09:24:51.582532 69.410004 69.69 69.410004 69.41
09:26:52.749902 69.410004 69.69 69.410004 69.41
09:28:54.589506 69.410004 69.69 69.410004 69.41
09:30:56.681914 69.410004 69.69 69.410004 69.41
09:32:58.255181 69.410004 69.69 69.410004 69.41