前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python在Finance上的应用6 :获取是S&P 500的成分股股票数据

Python在Finance上的应用6 :获取是S&P 500的成分股股票数据

作者头像
用户6021891
发布2020-02-10 18:10:36
1.8K0
发布2020-02-10 18:10:36
举报
文章被收录于专栏:万能的小草万能的小草

欢迎来到Python for Finance教程系列的第6讲。

在之前的Python教程中,我们介绍了如何获取感兴趣的公司名单(在我们的案例中是S&P 500指数),现在我们将收集所有这些公司的股票数据。

到此为止的代码:


代码语言:javascript
复制
import bs4 as bs
import pickle
import requests
# 更改工作路径
os.getcwd()
os.chdir(r'C:\Users\HP\Desktop\stock\python for finance')
os.getcwd()

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

这次,我们将新导入一些模块

代码语言:javascript
复制
import bs4 as bs
import datetime as dt
import os
import pandas_datareader.data as web
import pickle
import requests

将使用datetime指定Pandas datareader的日期,os将检查并创建目录。你已经知道什么是pandas了!

在这里,我将展示一个可以处理是否重新加载S&P500列表的方法的快速示例。如果我们提出要求,该计划将重新抽取S&P500指数,否则将只使用我们的pickle。现在我们要准备抓取数据。

代码语言:javascript
复制
# 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)

现在需要决定如何处理数据。我倾向于尝试解析网站ONCE,并在本地存储数据。我不会事先知道可能用数据做的所有事情,但是知道如果我将不止一次地拉它,不妨将它保存起来(除非它是一个巨大的数据集,不是)。因此,我们将把所有可以从雅虎返回给我们的每一种股票都拿出来,并保存下来。为此,我们将创建一个新目录,并在那里存储每个公司的库存数据。首先,需要这个初始目录:

代码语言:javascript
复制
  if not os.path.exists('stock_dfs'):
       os.makedirs('stock_dfs')

您可以将这些数据集存储在与脚本相同的目录中,但在我看来,这将是非常混乱的。现在我们已经准备好了数据。你应该已经知道如何做到这一点,因为在第一个教程中做到了!

代码语言:javascript
复制
 start = dt.datetime(2010, 1, 1)
   end = dt.datetime.now()
   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, 'morningstar', start, end)
           df.reset_index(inplace=True)
           df.set_index("Date", inplace=True)
           df = df.drop("Symbol", axis=1)
           df.to_csv('stock_dfs/{}.csv'.format(ticker))
       else:
           print('Already have {}'.format(ticker))

你很可能会及时对这个函数做一些 force_data_update 参数,因为现在,它将不再重放已经拥有的数据。因为我们每天都在拉数据,所以你希望能重新拉动至少最新的数据。也就是说,如果是这样的话,你最好用一个数据库代替一个公司的表,然后从雅虎数据库中提取最新的值。不过,我们现在要把事情简单化!

代码语言:javascript
复制
import bs4 as bs
import datetime as dt
import os
import pandas_datareader.data as web
import pickle
import requests# change work directory
os.getcwd()
os.chdir(r'C:\Users\HP\Desktop\stock\python for finance')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(r'C:\Users\HP\Desktop\stock\python for finance\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(2017, 1, 1)
   end = dt.datetime.now()
   
 # for ticker in tickers:
   for ticker in tickers[:10]:
       # 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, 'morningstar', start, end)
           df.reset_index(inplace=True)
           df.set_index("Date", inplace=True)
           df = df.drop("Symbol", axis=1)
           df.to_csv('stock_dfs/{}.csv'.format(ticker))
       else:
           print('Already have {}'.format(ticker))get_data_from_yahoo()

继续并运行上述code。如果雅虎扼杀了你,你可能需要import time 并添加一个time.sleep(0.5)。在写这篇文章的时候,雅虎并没有完全扼杀我,而且能够毫无问题地完成整个过程。但是,这可能还需要一段时间,尤其取决于您的机器。但好消息是,我们不需要再做一次!在实践中,因为这是每日数据,您可能每天都会这样做。

另外,如果你的网速很慢,你不需要做所有的事情,即使只有10次就足够了,所以你可以用ticker [:10]或者类似的东西来加快速度。

在下一个教程中,一旦你下载了数据,我们将把感兴趣的数据编译成一个Pandas DataFrame。

ticker[:10] 的股票数据

雅培(ABT)的股票数据

英文版请戳: https://pythonprogramming.net/sp500-company-price-data-python-programming-for-finance/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小草学Python和SQL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档