上一期中,我们批量获取了上证50全部股票的交易数据,并将每支股票的交易数据以CSV的格式保存到本地。这一期中,我们将把五十支股票的复权收盘价汇总为一个文件,并将其保存到本地。
FinTech History
Python 与金融数据|股票数据的获取与可视化
Python 与金融数据|数据的滑动平均值及多图可视化
Python 与金融数据|数据的重采样与蜡烛图(K线图)的绘制
Python 与金融数据|网页爬取上证50股票代码
Python 与金融数据|批量抓取并保存上证50的交易数据
![598f91854d09126e25f3379d95e31a30.png](https://i-blog.csdnimg.cn/blog_migrate/7981a32077792f3d3fde1d2dc09cdc58.png)
目前我们获取到每一支股票的交易数据中包含 开盘价 Open,收盘价 Close,最高价 High,最低价 Low,交易量 Volume 和复权收盘价 Adj Close。这一期我们重点关注复权收盘价,并将五十支股票的复权收盘价汇总到同一个文档中。
类似的的,我们使用函数 compileData 来实现本期的功能:
def compileData(): with open ('SS50tickers.pickle', 'rb') as f: tickers = pickle.load(f)
首先获取上证50所有的股票代码供后续使用。获取的方式与之前相同:
使用文件操作 open 设置为读取模式 'rb',然后使用 load 方法读取 pickle 格式文件中的内容。因为要将所有的复权收盘价存放到一个文件中,所以首先需要创建一个 data frame 格式的变量用于存放数据。
使用 pandas 中的 DataFrame 方法可以创建一个空的 data frame 格式的变量。
因此,首先需要导入 pandas 这个工具包:
import pandas as pd
然后在函数中使用 pd.DataFrame() 方法创建一个新的变量:
mainDataFrame = pd.DataFrame()
接下来通过一个循环语句,按照保存的文件名,分别读取每支股票的数据文件:
for ticker in tickers: dataFrame = pd.read_csv('stockDataFrames/{}.csv'.format(ticker))
然后对每支股票的数据进行预处理。首先设置索引方式为按照时间列 'Date' 索引:
dataFrame.set_index('Date', inplace = True)
因为我们只汇总复权成交价,也就是 'Adj Close' 这一列的数据,因此,我们只保存这一列的数据,并以当前股票的名称来命名这一列。
使用 rename() 这个方法重命名列名称,另外使用 drop() 这个方法删除其它几列。
dataFrame.rename(columns = {'Adj Close': ticker}, inplace = True)dataFrame.drop(['Open', 'Close', 'High', 'Low', 'Volume'], 1, inplace = True)
接下来,将处理好的只剩下复权成交价的股票数据,存入我们前面新建好的 mainDataFrame 这个变量中。
如果当前 mainDataFrame 为空的话,就直接将当前交易数据赋值给该变量,否则使用 join() 这个方法将数据附加到该变量中:
if mainDataFrame.empty: mainDataFrame = dataFrameelse: mainDataFrame = mainDataFrame.join(dataFrame, how = 'outer')
join() 这个方法中的第二个参数表示的数据的连接(附加)方式。可选择的方式有下面几种:
left, left_outer 或者 leftouter 代表 左连接。
使用左侧 DataFrame 中的索引作为连接键。数据量不足时填充 NaN。
right, right_outer 或者 rightouter 代表 右连接。
使用右侧 DataFrame 中的 索引作为连接键 。数据量不足时填充 NaN。 inner 代表 内连接。使用两侧 DataFrame 中索引的交集作为连接键。
full, outer, full_outer, fullouter 代表 全连接。使用两侧 DataFrame 中索引的并集作为连接键。数据量不足时填充 NaN。
最后将合并之后的数据导出到本地 CVS 的格式:
mainDataFrame.to_csv('SS50JoinedClose.csv')
这里我们使用 print 输出合并后数据的前几行观察一下:
print(mainDataFrame.head(6))
最后,我们调用并使用 compileData() 这个函数:
getDataFromYahoo()
代码运行结束后,观察到输出内容如下:
600036.SS 601229.SS 600031.SS ... 601328.SS 601939.SS 600340.SSDate ... 2010-01-04 11.171289 NaN 7.596135 ... 5.171541 3.535063 1.1047342010-01-05 11.183971 NaN 7.602398 ... 5.301394 3.587049 1.0945332010-01-06 10.950527 NaN 7.811027 ... 5.228001 3.529286 1.0764892010-01-07 10.666690 NaN 7.733828 ... 5.047334 3.477300 1.0584452010-01-08 10.666690 NaN 7.594051 ... 5.075567 3.488852 1.0647242010-01-11 10.685614 NaN 7.354129 ... 5.081213 3.546615 1.063152
参考代码
#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@author: IT信息教室(微信公众号)订阅/关注,点在看、分享三连吧~"""# 导入 beautiful soup4 包,用于抓取网页信息import bs4 as bs# 导入 pickle 用于序列化对象import pickle# 导入 request 用于获取网站上的源码import requestsimport datetime as dtimport osimport pandas_datareader.data as webimport pandas as pddef saveSS50Tickers(): resp = requests.get('https://q.stock.sohu.com/cn/bk_4272.shtml') resp.encoding = 'gb2312' soup = bs.BeautifulSoup(resp.text, 'lxml') # print(soup) table = soup.find('table', {'id': 'BIZ_MS_plstock'}) print(table) tickers = [] # print(table.find_all('tr')) for row in table.findAll('tr')[2:]: # print(row) ticker = row.findAll('td')[0].text tickers.append(ticker + '.SS') with open('SS50tickers.pickle', 'wb') as f: pickle.dump(tickers, f) return tickersdef getDataFromYahoo(reloadSS50 = False): if reloadSS50 == True: saveSS50Tickers() else: with open('SS50tickers.pickle', 'rb') as f: tickers = pickle.load(f) if not os.path.exists('stockDataFrames'): os.makedirs('stockDataFrames') start = dt.datetime(2010, 1, 1) end = dt.datetime.now() for ticker in tickers: if not os.path.exists('stockDataFrames/{}.csv'.format(ticker)): dataFrame = web.DataReader(ticker, 'yahoo', start, end) dataFrame.reset_index(inplace=True) dataFrame.set_index("Date", inplace=True) # dataFrame = dataFrame.drop("Symbol", axis=1) dataFrame.to_csv('stockDataFrames/{}.csv'.format(ticker)) else: print('Already have {}'.format(ticker))def compileData(): with open ('SS50tickers.pickle', 'rb') as f: tickers = pickle.load(f) mainDataFrame = pd.DataFrame() for ticker in tickers: dataFrame = pd.read_csv('stockDataFrames/{}.csv'.format(ticker)) dataFrame.set_index('Date', inplace = True) dataFrame.rename(columns = {'Adj Close': ticker}, inplace = True) dataFrame.drop(['Open', 'Close', 'High', 'Low', 'Volume'], 1, inplace = True) if mainDataFrame.empty: mainDataFrame = dataFrame else: mainDataFrame = mainDataFrame.join(dataFrame, how = 'outer') mainDataFrame.to_csv('SS50JoinedClose.csv') print(mainDataFrame.head())compileData()
Codes: M先森看世界 Edit: M先森看世界
![b60a0cb7527bdb904bd6e99448f1cf7f.gif](https://i-blog.csdnimg.cn/blog_migrate/15dd6a060df4a8cb2ce126cb9efc0810.gif)
![c109b9119a424a09615d4ace4b9816f4.png](https://i-blog.csdnimg.cn/blog_migrate/d2f5eeb029940ef2fb51e298f570c9cc.jpeg)
![d842dc7d4b327b4220e6420a2e645261.png](https://i-blog.csdnimg.cn/blog_migrate/f62434f8f641a274cefde8ee8bc1e411.jpeg)
![0208bb64fd40a4112e17c57093b952b8.png](https://i-blog.csdnimg.cn/blog_migrate/f2a86108291a86dd1ab92cd4531f0560.jpeg)
![435d0867cfdc8c8e63bf07a6d3504d6f.png](https://i-blog.csdnimg.cn/blog_migrate/c62046c8a62a8ab226bb84d08edc3596.jpeg)
![54b963b99bcc258381ce2351ffaf63b3.png](https://i-blog.csdnimg.cn/blog_migrate/e36e223763ba3b1a726fc02afb96d66d.jpeg)
![599ec1a1a78d1622703e2fbe5598005e.png](https://i-blog.csdnimg.cn/blog_migrate/17021253221630c4cbe31c629be65b76.jpeg)
ONE MORE THING
如果您对内容有什么需求建议,或者遇到了什么软件、应用使用方面的问题,请直接在公众号主界面下发私信给我,我看都会及时回复。感谢大家的支持!
合作: classroom.it@hotmail.com
Hi
你好呀
我是 M先森
这是一个共同学习的平台
我会把我会的 你们想学的
做成教程或者写成文章
我们在这一起学英语
学编程 学算法
学各种各样
好玩的好用的软件
记得要常回来看看呀
(^_^)a(^_^)a
点击 阅读原文 查看Python入门教程~
喜欢就点个 分享 点赞 在看 三连吧!