我在python中使用金融来提取股票数据,出于某种原因,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.3和69.71打印出来。但由于这是昨日的收盘数据,应该只有一个值。
这是已知的bug吗?有没有办法解决这个问题?
发布于 2016-05-23 14:46:37
看来,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或者,直接从Yahoo/Finance网站获取接近的数据。(速度更快、更灵活)当我试图复制你的情况时,我不会看到你报告的价值观的闪烁,但我确实得到了一个陈腐的接近(5月20日而不是5月23日)。可能您看到的闪烁是由于YQL有时使用陈旧的数据转到服务器,有时不是。下面的代码是从yahoo_finance (a)的历史数据、yahoo_finance (b)的实时数据、雅虎财务实时报价(c)和雅虎财务历史数据(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发布于 2016-05-18 20:37:49
此问题与金融 python库无关。许多用户都观察到雅虎财务的结果不一致。你可以在这里找到抱怨,forums.developer.yahoo和不同结果。我今天运行了几个查询,得到了不同的结果。也许你最好找到另一个财务数据的来源。
https://stackoverflow.com/questions/37218685
复制相似问题