Python在Finance上的应用6 :获取是S&P 500的成分股股票数据

  • 2020 年 2 月 10 日
  • 筆記

欢迎来到Python for Finance教程系列的第6讲。

在之前的Python教程中,我们介绍了如何获取感兴趣的公司名单(在我们的案例中是S&P 500指数),现在我们将收集所有这些公司的股票数据。

到此为止的代码:


import bs4 as bs  import pickle  import requests  # 更改工作路径  os.getcwd()  os.chdir(r'C:UsersHPDesktopstockpython for finance')  os.getcwd()    def save_sp500_tickers():     resp = requests.get('http://en.wikipedia.org/wiki/List_of_S%26P_500_companies')     soup = bs.BeautifulSoup(resp.text, 'lxml')     table = soup.find('table', {'class': 'wikitable sortable'})     tickers = []     for row in table.findAll('tr')[1:]:         ticker = row.findAll('td')[0].text         tickers.append(ticker)   with open("sp500tickers.pickle","wb") as f:         pickle.dump(tickers,f)   return tickers

这次,我们将新导入一些模块

import bs4 as bs  import datetime as dt  import os  import pandas_datareader.data as web  import pickle  import requests

将使用datetime指定Pandas datareader的日期,os将检查并创建目录。你已经知道什么是pandas了!

在这里,我将展示一个可以处理是否重新加载S&P500列表的方法的快速示例。如果我们提出要求,该计划将重新抽取S&P500指数,否则将只使用我们的pickle。现在我们要准备抓取数据。

# save_sp500_tickers()  def get_data_from_yahoo(reload_sp500=False):     if reload_sp500:         tickers = save_sp500_tickers()     else:         with open("sp500tickers.pickle", "rb") as f:             tickers = pickle.load(f)

现在需要决定如何处理数据。我倾向于尝试解析网站ONCE,并在本地存储数据。我不会事先知道可能用数据做的所有事情,但是知道如果我将不止一次地拉它,不妨将它保存起来(除非它是一个巨大的数据集,不是)。因此,我们将把所有可以从雅虎返回给我们的每一种股票都拿出来,并保存下来。为此,我们将创建一个新目录,并在那里存储每个公司的库存数据。首先,需要这个初始目录:

  if not os.path.exists('stock_dfs'):         os.makedirs('stock_dfs')

您可以将这些数据集存储在与脚本相同的目录中,但在我看来,这将是非常混乱的。现在我们已经准备好了数据。你应该已经知道如何做到这一点,因为在第一个教程中做到了!

 start = dt.datetime(2010, 1, 1)     end = dt.datetime.now()     for ticker in tickers:         # just in case your connection breaks, we'd like to save our progress!         if not os.path.exists('stock_dfs/{}.csv'.format(ticker)):             df = web.DataReader(ticker, 'morningstar', start, end)             df.reset_index(inplace=True)             df.set_index("Date", inplace=True)             df = df.drop("Symbol", axis=1)             df.to_csv('stock_dfs/{}.csv'.format(ticker))         else:             print('Already have {}'.format(ticker))

你很可能会及时对这个函数做一些 force_data_update 参数,因为现在,它将不再重放已经拥有的数据。因为我们每天都在拉数据,所以你希望能重新拉动至少最新的数据。也就是说,如果是这样的话,你最好用一个数据库代替一个公司的表,然后从雅虎数据库中提取最新的值。不过,我们现在要把事情简单化!

import bs4 as bs  import datetime as dt  import os  import pandas_datareader.data as web  import pickle  import requests# change work directory  os.getcwd()  os.chdir(r'C:UsersHPDesktopstockpython for finance')def save_sp500_tickers():     resp = requests.get('http://en.wikipedia.org/wiki/List_of_S%26P_500_companies')     soup = bs.BeautifulSoup(resp.text, 'lxml')     table = soup.find('table', {'class': 'wikitable sortable'})     tickers = []     for row in table.findAll('tr')[1:]:         ticker = row.findAll('td')[0].text         tickers.append(ticker)     with open(r'C:UsersHPDesktopstockpython for financesp500tickers.pickle', 'wb') as f:         pickle.dump(tickers, f)     return tickers# save_sp500_tickers()  def get_data_from_yahoo(reload_sp500=False):     if reload_sp500:         tickers = save_sp500_tickers()     else:         with open('sp500tickers.pickle', 'rb') as f:             tickers = pickle.load(f)     if not os.path.exists('stock_dfs'):         os.makedirs('stock_dfs')   start = dt.datetime(2017, 1, 1)     end = dt.datetime.now()     # for ticker in tickers:     for ticker in tickers[:10]:         # just in case your connection breaks, we'd like to save our progress!         if not os.path.exists('stock_dfs/{}.csv'.format(ticker)):             df = web.DataReader(ticker, 'morningstar', start, end)             df.reset_index(inplace=True)             df.set_index("Date", inplace=True)             df = df.drop("Symbol", axis=1)             df.to_csv('stock_dfs/{}.csv'.format(ticker))         else:             print('Already have {}'.format(ticker))get_data_from_yahoo()

继续并运行上述code。如果雅虎扼杀了你,你可能需要import time 并添加一个time.sleep(0.5)。在写这篇文章的时候,雅虎并没有完全扼杀我,而且能够毫无问题地完成整个过程。但是,这可能还需要一段时间,尤其取决于您的机器。但好消息是,我们不需要再做一次!在实践中,因为这是每日数据,您可能每天都会这样做。

另外,如果你的网速很慢,你不需要做所有的事情,即使只有10次就足够了,所以你可以用ticker [:10]或者类似的东西来加快速度。

在下一个教程中,一旦你下载了数据,我们将把感兴趣的数据编译成一个Pandas DataFrame。

ticker[:10] 的股票数据

雅培(ABT)的股票数据

英文版请戳: https://pythonprogramming.net/sp500-company-price-data-python-programming-for-finance/

Exit mobile version