• 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集,如需更新后续内容,请留言告知我~

  • 相关阅读:
    数往知来C#面向对象准备〈二〉
    数往知来C#之面向对象准备〈一〉
    如果我比别人走得更远些,那是因为我站在巨人的肩上。
    小记一下
    关于servlet
    使用session防止表单重复提交
    session和cookie的区别
    数据结构排序算法Java实现
    用背景渐变的透明度设置不同颜色的背景渐变
    Java用DOM方法解析xml
  • 原文地址:https://www.cnblogs.com/Blaxon/p/8568029.html
Copyright © 2020-2023  润新知