环境如下:
语言:python3.7
IDE: Pycharm-2020.1.1
包环境管理:anaconda 4.8.2
库文件:request, pandas, matplotlib, bs4, pandas_datareader
要连接互联网~~~~
问题:很多小伙伴想用机器学习方法对股票进行量化分析,我们面临的第一个问题是如何获得其历史数据?
如何解决上述问题?使用python爬虫爬取历史数据,或者更确切的说,先爬取股票代码,然后使用pandas_datareader从yahoo上获取该股票的历史数据。该网站可以获取到所有上证股票的股票代码。借鉴蒹葭杰克兄弟的代码,对其代码稍作改进,以方便使用。
- 获取数据部分
import matplotlib.pyplot as plt
import pandas as pd
import pandas_datareader.data as web
import requests
import bs4 as bs
def get_stock_code():
res = requests.get('https://www.banban.cn/gupiao/list_sh.html')
res.encoding = res.apparent_encoding
soup = bs.BeautifulSoup(res.text, 'lxml')
content = soup.find('div', {'class':'u-postcontent cz'})
result = []
for item in content.findAll('a'):
result.append(item.text)
return result
def get_stock_history(stock_name, stock_code, save_dir):#当然你可以在参数里加上起始日期,start_date, end_date,在DataReader()里替换'2012-01-01'和'2020-05-08'
if stock_code[-2:] != 'ss':
stock_code = str(stock_code) + '.ss'
df = web.DataReader(stock_code, data_source='yahoo', start='2012-01-01', end='2020-05-08')
df.to_csv(save_dir + '/{}{}.csv'.format(stock_name, stock_code))
if __name__=='__main__':
stock_name_code = get_stock_code()
for i in stock_name_code:
print(i)
输出结果如下图所示:
如果需要爬取其中一个股票的历史数据,我们可以利用get_stock_histroy()函数来获取。以包钢股份为例具体的代码如下:
if __name__=='__main__':
get_stock_histroy('包钢股份', '600010', dir)#这里dir根据自己要存的地方改写,我使用的centos 8 操作系统,需要存在Desktop,这里dir就可以写成'/home/icedragonliu/Desktop'
输出结果如下图所示:
如果你想下载所有上证股票的数据,那就换下面的代码:
if __name__=='__main__':
stock_name_code = get_stock_code()
for i in stock_name_code:
stock_name = i[:-8]
stock_code = i[-7:-1]
get_stock_history(stock_name, stock_code, '/home/icedragonliu/Desktop')
Starbucks的网不是很好,先下如下图所示:
- 画出某个股票(以九鼎投资为例)历史收盘价曲线
有了数据,我们需要先画出其历史数据来对数据有感性的认识,然后再对其进行分析。我也不知道为啥,kaggle里的大神都是先这样做。
def plot_stock_close_price(stock_price_path, fig_save_path):
stock_df = pd.read_csv(stock_price_path)
fig = plt.figure(figsize=(12, 8))
stock = stock_history_path.split('/')[-1].split('.')[0][-6:]
plt.title('{} Closed price'.format(stock))
plt.plot(stock_df['Close'], color='blue')
plt.xlabel('Date', fontsize=18)
plt.ylabel('Close Price ($\yen$)')
plt.savefig(fig_save_path + '/{}.png'.format(stock))
plt.show()
if __name__=='__main__':
stock_history_path = '/home/icedragonliu/Desktop/九鼎投资600053.ss.csv'
fig_save_path = '/home/icedragonliu/Desktop/picture'
plot_stock_close_price(stock_history_path, fig_save_path)
这样我们可以获取如下图片:
这个图片还是有些问题,下一篇在利用股票近60天的收盘价预测其后面一天的收盘价里进行改正。我在使用jupyter notebook时,日期是可以正常显示的。比如新华保险的这个如下图所示:
后面使用keras这个神经网络的库,对历史数据进行学习,训练出一个使用前60日的收盘价预测第二天收盘价的模型玩一玩。