Python股票分析系列——獲得標普500的所有公司股票數據.p6


該系列視頻已經搬運至bilibili: 點擊查看

 

歡迎來到Python for Finance教程系列的第6部分。 在之前的Python教程中,我們介紹了如何獲取我們感興趣的公司名單(在我們的案例中是標准普爾500指數),現在我們將收集所有這些公司的股票定價數據。

到此為止的代碼:

import bs4 as bs
import pickle
import requests

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 datetime as dt
import os
import pandas as pd
import pandas_datareader.data as web

 

 

我們將使用datetime指定Pandas datareader的日期,os將檢查並創建目錄。 你已經知道什么是pandas了!

開始我們的新功能:

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)

 

在這里,我將展示一個可以處理是否重新加載標准普爾500列表的方法的快速示例。如果我們問這個問題,該計划將重新拉動標准普爾500指數,否則它只會使用我們的pickle。現在我們要准備抓取數據。

現在我們需要決定我們將如何處理數據。我傾向於只解析一次網站,並在本地存儲數據。我不會事先知道我可能用數據做的所有事情,但是我知道如果我將不止一次地拉它,我不妨將它保存起來(除非它是一個巨大的數據集,不是)。因此,我們將把所有可以從雅虎返回給我們的每一種股票都拿出來,並保存下來。為此,我們將創建一個新目錄,並在那里存儲每個公司的庫存數據。首先,我們需要這個初始目錄:

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

 

您可以將這些數據集存儲在與您的腳本相同的目錄中,但在我看來這會非常麻煩。現在我們准備好提取數據了。你已經知道如何做到這一點,我們在第一篇教程中做到了!

    start = dt.datetime(2000, 1, 1)
    end = dt.datetime(2016, 12, 31)
    
    for ticker in tickers:
        if not os.path.exists('stock_dfs/{}.csv'.format(ticker)):
            df = web.DataReader(ticker, "yahoo", start, end)
            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 as pd
import pandas_datareader.data as web
import pickle
import requests


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

#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(2000, 1, 1)
    end = dt.datetime(2016, 12, 31)
    
    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, "yahoo", start, end)
            df.to_csv('stock_dfs/{}.csv'.format(ticker))
        else:
            print('Already have {}'.format(ticker))

get_data_from_yahoo()

 

在運行它的過程中。 如果雅虎不給你持續抓取,你可能需要import time並添加一個time.sleep(0.5)。 在寫這篇文章的時候,雅虎並沒有完全扼殺我,而且我能夠毫無問題地完成整個過程。 但是,這可能還需要一段時間,尤其取決於您的機器。 但好消息是,我們不需要再做一次! 在實踐中,再次,因為這是每日數據,但是,您可能每天都會這樣做。

另外,如果你的互聯網速度很慢,你不需要做所有的事情,即使只有10次就足夠了,所以你可以用for ticker in ticker [:10]或者類似的東西來加快速度。

在下一個教程中,一旦你下載了數據,我們將把我們感興趣的數據編譯成一個pandas DataFrame。

 

本系列一共12集,如需更新后續內容,請留言告知我~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM