我用过:
data = DataReader("yhoo", "yahoo", datetime.datetime(2000, 1, 1),
datetime.datetime.today())
在熊猫(python)中获取雅虎的历史数据,但无法显示今天的价格(市场尚未关闭)我该如何解决这个问题,提前谢谢。
我用过:
data = DataReader("yhoo", "yahoo", datetime.datetime(2000, 1, 1),
datetime.datetime.today())
在熊猫(python)中获取雅虎的历史数据,但无法显示今天的价格(市场尚未关闭)我该如何解决这个问题,提前谢谢。
import pandas
import pandas.io.data
import datetime
import urllib2
import csv
YAHOO_TODAY="http://download.finance.yahoo.com/d/quotes.csv?s=%s&f=sd1ohgl1vl1"
def get_quote_today(symbol):
response = urllib2.urlopen(YAHOO_TODAY % symbol)
reader = csv.reader(response, delimiter=",", quotechar='"')
for row in reader:
if row[0] == symbol:
return row
## main ##
symbol = "TSLA"
history = pandas.io.data.DataReader(symbol, "yahoo", start="2014/1/1")
print history.tail(2)
today = datetime.date.today()
df = pandas.DataFrame(index=pandas.DatetimeIndex(start=today, end=today, freq="D"),
columns=["Open", "High", "Low", "Close", "Volume", "Adj Close"],
dtype=float)
row = get_quote_today(symbol)
df.ix[0] = map(float, row[2:])
history = history.append(df)
print "today is %s" % today
print history.tail(2)
只是为了完成近地点的答案,我花了相当多的时间来找到一种附加数据的方法。
Open High Low Close Volume Adj Close
Date
2014-02-04 180.7 181.60 176.20 178.73 4686300 178.73
2014-02-05 178.3 180.59 169.36 174.42 7268000 174.42
today is 2014-02-06
Open High Low Close Volume Adj Close
2014-02-05 178.30 180.59 169.36 174.420 7268000 174.420
2014-02-06 176.36 180.11 176.00 178.793 5199297 178.793
找到一种解决方法,只需使用 urllib 来获取数据:
http://download.finance.yahoo.com/d/quotes.csv?s=yhoo&f=sd1ohgl1l1v
然后将其添加到数据框
此代码使用 pandas read_csv 方法从 yahoo 获取新报价,并检查新报价是当前日期的更新还是新日期,以更新历史中的最后一条记录或附加新记录。如果您在 new_quote 部分周围添加一个 while(true) 循环和一个 sleep,您可以让代码在白天刷新报价。鉴于盘中收盘价和调整收盘价始终相同,它还具有重复的最后交易价格来填写收盘价和调整收盘价。
import pandas as pd
import pandas.io.data as web
def get_quote_today(symbol):
url="http://download.finance.yahoo.com/d/quotes.csv?s=%s&f=d1t1ohgl1vl1"
new_quote= pd.read_csv(url%symbol,
names=[u'Date',u'time',u'Open', u'High', u'Low',
u'Close', u'Volume', u'Adj Close'])
# generate timestamp:
stamp = pd.to_datetime(new_quote.Date+" "+new_quote.time)
new_quote.index= stamp
return new_quote.iloc[:, 2:]
if __name__ == "__main__":
symbol = "TSLA"
history = web.DataReader(symbol, "yahoo", start="2014/1/1")
print history.tail()
new_quote = get_quote_today(symbol)
if new_quote.index > history.index[-1]:
if new_quote.index[-1].date() == history.index[-1].date():
# if both quotes are for the first date, update history's last record.
history.iloc[-1]= new_quote.iloc[-1]
else:
history=history.append(new_quote)
history.tail()
因此,通过尝试并查看数据框,它看起来不太可能。你告诉它从特定的一天到今天,但数据框在 2013 年 5 月 31 日停止。这告诉我,雅虎可能在过去几天里没有让你使用它,或者不知何故 pandas 只是没有捡起它. 它不仅缺少 1 天,还缺少 3 天。
如果我执行以下操作:
>>> df = DataReader("yhoo", "yahoo", datetime.datetime(2013, 6, 1),datetime.datetime.today())
>>> len(df)
0
它告诉我,到目前为止,在那些日子里根本没有数据可供收集。如果有办法解决这个问题,那么我无法弄清楚,但似乎您还没有数据,这很难相信。
pandas 的模块不再工作,因为 google 和 yahoo 不再提供支持。因此,您可以创建一个函数,使用 url 直接从 Google Finance 获取数据。这是执行此操作的代码的一部分
import csv
import datetime
import re
import codecs
import requests
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
您可以编写一个函数来使用 url 从 Google Finance 获取数据,您必须缩进下面的部分。
#You have to indent this part
def get_google_finance_intraday(ticker, period=60, days=1, exchange='NASD'):
"""
Retrieve intraday stock data from Google Finance.
Parameters
----------------
ticker : str
Company ticker symbol.
period : int
Interval between stock values in seconds.
i = 60 corresponds to one minute tick data
i = 86400 corresponds to daily data
days : int
Number of days of data to retrieve.
exchange : str
Exchange from which the quotes should be fetched
Returns
---------------
df : pandas.DataFrame
DataFrame containing the opening price, high price, low price,
closing price, and volume. The index contains the times associated with
the retrieved price values.
"""
# build url
url = 'https://finance.google.com/finance/getprices?p={days}d&f=d,o,h,l,c,v&q={ticker}&i={period}&x={exchange}'.format(ticker=ticker, period=period, days=days, exchange=exchange)
page = requests.get(url)
reader = csv.reader(codecs.iterdecode(page.content.splitlines(), "utf-8"))
columns = ['Open', 'High', 'Low', 'Close', 'Volume']
rows = []
times = []
for row in reader:
if re.match('^[a\d]', row[0]):
if row[0].startswith('a'):
start = datetime.datetime.fromtimestamp(int(row[0][1:]))
times.append(start)
else:
times.append(start+datetime.timedelta(seconds=period*int(row[0])))
rows.append(map(float, row[1:]))
if len(rows):
return pd.DataFrame(rows, index=pd.DatetimeIndex(times, name='Date'), columns=columns)
else:
return pd.DataFrame(rows, index=pd.DatetimeIndex(times, name='Date'))
现在您可以使用所需的票证调用函数,在我的例子中是 AAPL,结果是一个包含开盘价、最高价、最低价、收盘价和成交量的 pandas DataFrame。
ticker = 'AAPL'
period = 60
days = 1
exchange = 'NASD'
df = get_google_finance_intraday(ticker, period=period, days=days)
df
将印度股票价格数据提取到 Python 中的最简单方法是使用 nsepy 库。如果您没有 nsepy 库,请执行以下操作:
pip install nsepy
以下代码允许您提取 10 年的 HDFC 股票价格。
from nsepy import get_history
from datetime import date
dfc=get_history(symbol="HDFCBANK",start=date(2015,5,12),end=date(2020,5,18))
这是迄今为止我发现的最简单的代码。