zoukankan      html  css  js  c++  java
  • Python股票分析系列——获得标普500的所有公司股票数据.p6

    欢迎来到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。

  • 相关阅读:
    Ubuntu 14.04 卸载通过源码安装的库
    Ubuntu 14.04 indigo 相关依赖
    Ubuntu 14.04 indigo 安装 cartographer 1.0.0
    Ubuntu 14.04 改变文件或者文件夹的拥有者
    安装cartographer遇到Unrecognized syntax identifier "proto3". This parser only recognizes "proto2"问题
    Unrecognized syntax identifier "proto3". This parser only recognizes "proto2". ”问题解决方法
    查看所有用户组,用户名
    1卸载ROS
    Ubuntu14.04 软件安装卸载
    Ubuntu14.04系统显示器不自动休眠修改
  • 原文地址:https://www.cnblogs.com/medik/p/10989787.html
Copyright © 2011-2022 走看看