【问题标题】:How can I download stock price data with Python?如何使用 Python 下载股票价格数据?
【发布时间】:2018-11-20 20:45:23
【问题描述】:

我已经安装了pandas-datareader,但我想知道是否有替代方案。

到目前为止,我正在使用这个:

import pandas_datareader.data as web
start_date = '2018-01-01'
end_date = '2018-06-08'
panel_data = web.DataReader('SPY', 'yahoo', start_date, end_date)

【问题讨论】:

    标签: python pandas stock pandas-datareader


    【解决方案1】:

    雅虎财经是获取股票数据的免费来源之一。您可以使用 pandas datareader 获取数据,也可以使用 yfinance 库获取数据。从 yfinance 库中获取数据的方法如下所示。

    import yfinance as yf
    # Get the data of the stock AAPL
    data = yf.download('AAPL','2016-01-01','2019-08-01')
    

    Wiki 是 quandl 上可用于获取 3000 多种美国股票数据的免费资源之一。这是社区维护的数据。最近它已停止维护,但是,它是一个很好的免费资源来回测您的策略。 要获取数据,您需要从 quandl 获取免费的 API 密钥,并将以下代码中的代码替换为您的 API 密钥。

    # Import the quandl package
    import quandl
    # Get the data from quandl
    data = quandl.get("WIKI/KO", start_date="2016-01-01", end_date="2018-01-01", 
        api_key=<Your_API_Key>)
    

    注意: Quandl 需要 NumPy(v1.8 或更高版本)和 pandas(v0.14 或更高版本)才能工作。 要获取您的 API 密钥,请注册一个免费的 Quandl 帐户。然后,您可以在 Quandl 帐户设置页面上找到您的 API 密钥。

    【讨论】:

      【解决方案2】:

      见下文。代码是用 Python 2.7 编写的,但是当您替换 print 函数时应该可以在 3.5 中工作。确保复制时编辑器中的间距是正确的:制表符是 4 个空格等。

      # pip install datareader
      import pandas as pd
      pd.core.common.is_list_like = pd.api.types.is_list_like
      import pandas_datareader.data as web
      import matplotlib.pyplot as plt
      import numpy as np
      
      from datetime import datetime, timedelta
      
      #stock of interest
      stock=['MSFT','SAP','V','JPM']
      
      # period of analysis
      end = datetime.now()
      start = end - timedelta(days=500)
      
      for i in range(len(stock)):
          f = web.DataReader(stock[i], 'morningstar', start, end)
      
          # nice looking timeseries (DataFrame to panda Series)
          f = f.reset_index()
          f = pd.Series(f.Close.values,f.Date)
      
          print "Start: Year, Month, Day, Time"
          print str(start)
          f.plot(label=stock[i]);
          plt.legend()
          plt.ylabel('price in [USD]')
      
      plt.show();
      

      【讨论】:

      • a = [float(f.close_price.values[i].encode('ascii')) for i in range(len(f.close_price.values))] f = pd.Series(a, f.begins_at.values) # Morningstar 停产 --> 改为 robinhood
      【解决方案3】:

      我发现最简单的方法是新的SimFin Python API,它可以让您下载股票价格和基本数据,将其保存到磁盘,然后只需几行代码就可以将其加载到 Pandas DataFrames 中。他们还提出了几个tutorials 说明如何将他们的数据与其他库(如 statsmodels、scikit-learn、TensorFlow 等)一起使用。下面的基本示例是从他们的 github 页面复制而来的。

      您可以通过在终端窗口中键入此命令来安装 SimFin python 包(最好在其自己的环境中,请参阅他们的full instructions):

      pip install simfin
      

      然后将以下内容复制粘贴到 Jupyter Notebook 或 Python 源文件中:

      import simfin as sf
      from simfin.names import *
      
      # Set your API-key for downloading data.
      # If the API-key is 'free' then you will get the free data,
      # otherwise you will get the data you have paid for.
      # See www.simfin.com for what data is free and how to buy more.
      sf.set_api_key('free')
      
      # Set the local directory where data-files are stored.
      # The dir will be created if it does not already exist.
      sf.set_data_dir('~/simfin_data/')
      
      # Load the annual Income Statements for all companies in USA.
      # The data is automatically downloaded if you don't have it already.
      df = sf.load_income(variant='annual', market='us')
      
      # Print all Revenue and Net Income for Microsoft (ticker MSFT).
      print(df.loc['MSFT', [REVENUE, NET_INCOME]])
      

      这会产生以下输出:

                        Revenue   Net Income
      Report Date
      2008-06-30   6.042000e+10  17681000000
      2009-06-30   5.843700e+10  14569000000
      2010-06-30   6.248400e+10  18760000000
      2011-06-30   6.994300e+10  23150000000
      2012-06-30   7.372300e+10  16978000000
      2013-06-30   7.784900e+10  21863000000
      2014-06-30   8.683300e+10  22074000000
      2015-06-30   9.358000e+10  12193000000
      2016-06-30   9.115400e+10  20539000000
      2017-06-30   9.657100e+10  25489000000
      2018-06-30   1.103600e+11  16571000000
      2019-06-30   1.258430e+11  39240000000
      

      我们还可以加载每日股价并绘制微软的收盘价(股票代码 MSFT):

      # Load daily share-prices for all companies in USA.
      # The data is automatically downloaded if you don't have it already.
      df_prices = sf.load_shareprices(market='us', variant='daily')
      
      # Plot the closing share-prices for ticker MSFT.
      df_prices.loc['MSFT', CLOSE].plot(grid=True, figsize=(20,10), title='MSFT Close')
      

      这会产生以下图像:

      【讨论】:

        【解决方案4】:

        您也可以使用 quandl,但您必须注册并获取自己的 API 密钥。不确定任何与 pandas 网络阅读器配合良好的免费金融 API 是否仍能可靠且良好地运行...

        # pip install datareader
        import pandas as pd
        pd.core.common.is_list_like = pd.api.types.is_list_like
        # quandl api explore
        import quandl
        from datetime import datetime, timedelta
        import matplotlib.pyplot as plt
        # api instructions
        quandl.ApiConfig.api_key = "YOUR_API_KEY"
        end = datetime.now()
        start = end - timedelta(days=365)
        # frankfurt stock exchange
        mydata2 = quandl.get('FSE/VOW3_X', start_date = start, end_date = end)
        f = mydata2.reset_index()
        # timeseries
        plt.figure(1)
        f = pd.Series(f.Close.values,f.Date)
        f.plot()
        plt.show()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-08
          • 2020-09-15
          • 1970-01-01
          • 1970-01-01
          • 2011-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多