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/