Python在Finance上的应用5 :自动获取是S&P 500的成分股

  • 2020 年 2 月 10 日
  • 筆記

欢迎来到Python for Finance教程系列的第5讲。 在本教程和接下来的几篇文章中,我们将着手研究如何为更多公司提供大量的定价信息,以及我们如何一次处理所有这些数据。

首先,我们需要一份公司名单。 我可以给你一个清单,但实际上获得股票清单可能只是你可能遇到的众多挑战之一。 在我们的案例中,我们需要一个标普500公司的Python列表。

无论您是在寻找道琼斯指数,标普500指数还是罗素3000指数,都有可能在某个地方发布了这些公司的帖子。 你会想确保它是最新的,但它可能还不是完美的格式。 在我们的例子中,我们将从维基百科获取列表http://en.wikipedia.org/wiki/List_of_S%26P_500_companies.

维基百科中的代号/符号被组织在table。 为了解决这个问题,我们将使用HTML解析库 Beautiful Soup ,如果你想了解更多关于这个库的,请关注web scraping with Beautiful Soup(https://pythonprogramming.net/introduction-scraping-parsing-beautiful-soup-tutorial/)

首先让我们导入这些库:

import bs4 as bs  import pickle  import requests

bs4是Beautiful Soup,pickle是可以让我们很容易地保存这些公司名单,而不是每次运行时都敲击维基百科(记住及时更新这个清单!),我们将使用 请求从Wikipedia的页面获取源代码。

定义函数:

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'})

首先,访问维基百科页面,并做出响应,其中包含我们的源代码。 为了得到想要的源代码,我们希望访问.text属性,并使用BeautifulSoup转为soup。 BeautifulSoup所做的工作基本上可理解为将源代码转换为BeautifulSoup对象,我们可以将其视为典型的Python Object。

有时会出现维基百科试图拒绝Python的访问。 目前,在我写这篇文章的时候,代码工作时没有改变头文件。 如果您发现原始源代码(resp.text)似乎不像在家用计算机上看到的那样返回相同页面,请添加以下内容并更改resp var代码:

headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17'}     resp = requests.get('http://en.wikipedia.org/wiki/List_of_S%26P_500_companies',                         headers=headers)

一旦有了soup,我们就可以通过简单地搜索可维护的可排序类来查找库存数据表。 我知道指定此表的唯一原因是因为我首先在浏览器中查看了源代码。 可能会有一段时间,你想解析一个不同的网站的股票列表,也许它是在一个table,或者它可能是一个list,也可能是一些div tags。 这只是一个非常具体的解决方案。 本文只是遍历表格:

 tickers = []     for row in table.findAll('tr')[1:]:         ticker = row.findAll('td')[0].text         tickers.append(ticker)

对于每一行,在标题行之后(这就是为什么要写[1:]),说的是股票行情是“表格数据”(td),通过抓住它的.text,将此代码添加到列表 tickers。

现在,如果可以保存这份清单,那就太好了。 这里为此将使用pickle模块,它为我们序列化Python对象。

with open("sp500tickers.pickle","wb") as f:         pickle.dump(tickers,f)   return tickers

我们希望继续并保存这些内容,这样就不用每天多次请求维基百科。 在任何时候都可以更新这个清单,或者可以将它编程为每月检查一次……等等。

完整的代码到目前为止:

import bs4 as bs  import pickle  import requestsdef 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 tickerssave_sp500_tickers()# 获取S&P500 里面的内容 zhujin 注  with open('sp500tickers.pickle', 'rb') as f:     # The protocol version used is detected automatically, so we do not     # have to specify it.     data = pickle.load(f)    print('Top 100 list of S&P500 %s' %data[:100])

现在知道了S&P列表,我们将在下一个教程中准备把所有信息都提取出来

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