zoukankan      html  css  js  c++  java
  • 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集,如需更新后续内容,请留言告知我~

  • 相关阅读:
    Android Gradle Plugin指南(五)——Build Variants(构建变种版本号)
    文件内容操作篇clearerr fclose fdopen feof fflush fgetc fgets fileno fopen fputc fputs fread freopen fseek ftell fwrite getc getchar gets
    文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write
    嵌入式linux应用程序调试方法
    version control system:git/hg/subversion/cvs/clearcase/vss。software configruation management。代码集成CI:Cruisecontrol/hudson/buildbot
    最值得你所关注的10个C语言开源项目
    如何记录linux终端下的操作日志
    CentOS 5.5 虚拟机安装 VirtualBox 客户端增强功能
    sizeof, strlen区别
    C/C++嵌入式开发面试题
  • 原文地址:https://www.cnblogs.com/Blaxon/p/8568029.html
Copyright © 2011-2022 走看看