Python 如何:获取当前股票数据

Python 如何:获取当前股票数据,python,pandas,yahoo,yahoo-finance,Python,Pandas,Yahoo,Yahoo Finance,我用过: data = DataReader("yhoo", "yahoo", datetime.datetime(2000, 1, 1), datetime.datetime.today()) 在熊猫(python)中获得雅虎的历史数据,但它无法显示今天的价格(市场尚未关闭),我如何解决这样的问题,提前感谢 因此,通过尝试这个方法并查看数据帧,看起来不太可能。您告诉它从特定的一天一直到今天,但数据帧在2013年5月31日停止。这告诉我,在过去的几天里,雅虎

我用过:

data = DataReader("yhoo", "yahoo", datetime.datetime(2000, 1, 1),
                  datetime.datetime.today())

在熊猫(python)中获得雅虎的历史数据,但它无法显示今天的价格(市场尚未关闭),我如何解决这样的问题,提前感谢

因此,通过尝试这个方法并查看数据帧,看起来不太可能。您告诉它从特定的一天一直到今天,但数据帧在2013年5月31日停止。这告诉我,在过去的几天里,雅虎可能还没有提供给你使用,或者不知何故,熊猫只是没有把它捡起来。这不仅仅是错过了1天,而是错过了3天

如果我这样做:

>>> df = DataReader("yhoo", "yahoo", datetime.datetime(2013, 6, 1),datetime.datetime.today())
>>> len(df)
0
pip install nsepy

它告诉我,到目前为止,在那些日子里根本没有数据可供收集。如果有什么方法可以解决这个问题,那么我无法找到答案,但您似乎还无法获得数据,这很难相信。

找到一种解决方法,只需使用urllib通过以下方式获取数据:

    http://download.finance.yahoo.com/d/quotes.csv?s=yhoo&f=sd1ohgl1l1v
然后将其添加到dataframe

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

此代码使用pandas read_csv方法从yahoo获取新报价,并检查新报价是从当前日期更新还是新日期更新,以更新历史中的最后一条记录或追加新记录。 如果在新的引用部分添加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()

pandas的模块不再工作了,因为谷歌和雅虎不再提供支持。因此,您可以创建一个函数,使用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数据帧

ticker = 'AAPL'
period = 60
days = 1
exchange = 'NASD'

df = get_google_finance_intraday(ticker, period=period, days=days)
df

将印度股票价格数据提取到Python中的最简单方法是使用nsepy库。 如果没有nsepy库,请执行以下操作:

>>> df = DataReader("yhoo", "yahoo", datetime.datetime(2013, 6, 1),datetime.datetime.today())
>>> len(df)
0
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))

这是迄今为止我发现的最简单的代码。

因为在R中,quantmod包可以通过在时间序列数据中添加列来解决这个问题。您可以轻松地向pandas添加列,但您没有来自yahoo的数据来填充它……事实上,我很惊讶pandas没有一直到日期并用NAN填充这些行