如何:Python Pandas 获取当前股票数据
Posted
技术标签:
【中文标题】如何:Python Pandas 获取当前股票数据【英文标题】:How To: Python Pandas get current stock data 【发布时间】:2013-05-29 23:57:09 【问题描述】:我用过:
data = DataReader("yhoo", "yahoo", datetime.datetime(2000, 1, 1),
datetime.datetime.today())
在熊猫(python)中获取雅虎的历史数据,但无法显示今天的价格(市场尚未关闭)我该如何解决这个问题,提前谢谢。
【问题讨论】:
【参考方案1】: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
【讨论】:
【参考方案2】:找到一种解决方法,只需使用 urllib 来获取数据:
http://download.finance.yahoo.com/d/quotes.csv?s=yhoo&f=sd1ohgl1l1v
然后将其添加到数据框
【讨论】:
【参考方案3】:此代码使用 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()
【讨论】:
【参考方案4】:因此,通过尝试并查看数据框,它看起来不太可能。你告诉它从特定的一天到今天,但数据框在 2013 年 5 月 31 日停止。这告诉我,雅虎可能在过去几天里没有让你使用它,或者不知何故 pandas 只是没有捡起它.不只是少了 1 天,还少了 3 天。
如果我执行以下操作:
>>> df = DataReader("yhoo", "yahoo", datetime.datetime(2013, 6, 1),datetime.datetime.today())
>>> len(df)
0
它告诉我,到目前为止,在那些日子里根本没有数据可供收集。如果有办法解决这个问题,那么我无法弄清楚,但您似乎还没有数据,这很难相信。
【讨论】:
由于在 R 中,quantmod 包可以通过在时间序列数据中添加一列来解决此问题。 您可以轻松地向 pandas 添加列,但是您没有来自 yahoo 的数据来填充它...我真的很惊讶 pandas 没有让它一直到日期并用 NAN 填充这些行【参考方案5】: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=daysd&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
【讨论】:
【参考方案6】:将印度股票价格数据提取到 Python 中的最简单方法是使用 nsepy 库。 如果您没有 nsepy 库,请执行以下操作:
pip install nsepy
以下代码可让您提取 HDFC 10 年的股票价格。
from nsepy import get_history
from datetime import date
dfc=get_history(symbol="HDFCBANK",start=date(2015,5,12),end=date(2020,5,18))
这是迄今为止我找到的最简单的代码。
【讨论】:
以上是关于如何:Python Pandas 获取当前股票数据的主要内容,如果未能解决你的问题,请参考以下文章
Python 实战基础Pandas如何给股票数据新增年份和月份
text [股票数据提取]考虑到Pandas_Datareader不再适用于雅虎数据,获取股票数据。 #pandas #e