近期由于一些特别的原因,需要获取股票数据并进行分析,由于之前没有过相关知识储备,很是踩了一些坑,特此记录,以备查验。
1.数据源获取:
一些比较老的资料都是教你从新浪甚至雅虎去爬取股票交易数据。
其实python有一个免费/开源的财经数据接口包tushare(由于本次只需要股票数据,还没深入研究其他的,但是粗粗扫了两眼,口水一地啊),直接pip安装即可(依赖pandas,lxml,如没有也需要安装)。
安装好后我们来看一下数据,这里我们以获取上证指数17年9月1号到9月10号的数据为例
>>> import tushare as ts
>>> ts.get_hist_data('sh', '2017-09-01','2017-09-10', 'D')
open high close low volume price_change \
date
2017-09-08 3364.43 3380.89 3365.24 3353.69 1984051.88 -0.26
2017-09-07 3383.63 3387.80 3365.50 3363.18 2211186.75 -19.89
2017-09-06 3372.43 3391.01 3385.39 3364.76 2290907.75 1.07
2017-09-05 3377.20 3390.82 3384.32 3371.57 2165529.50 4.74
2017-09-04 3369.72 3381.40 3379.58 3359.13 2674278.50 12.46
2017-09-01 3365.99 3381.93 3367.12 3358.47 2824975.75 6.31
后面还有其他列,篇幅原因就不列出了,可以直接看API 。。。:)
2.数据存储
这里有特殊要求,需要用HDF5存储(没接触过的存储,以前的数据要么存数据库,要么存csv,excel。。)
tushare其实也给了接口,有两种方法(第二种方法需要安装pytables,pip自动安装会有问题,推荐手动安装,参考Python常用包下载地址):
df = ts.get_hist_data('sh')
df.to_hdf('hdf.h5','sh')
df = ts.get_hist_data('sh')
store = HDFStore('store.h5')
store['sh'] = df
store.close()
数据存储成功后,现在来看一下写入的hdf5文件内容(附:HDF5查看工具(密码:qotk):HDFExplorer)
索引:
※※
由于后面需要用到index,这里我使用的是另一种方法,以table格式写入hdf5文件:
df = ts.get_hist_data('sh','2017-09-01','2017-09-10', 'D')
store = pd.HDFStore('store.h5')
store.append('sh', df, format='table', data_columns=['open', 'close', 'volume'])
store.close()
打开文件如下
table.png3.数据读取
这里需要查询指定条件(这里我只查了时间条件,如果还有其他条件,在where的list中加入即可)的指定字段数据:
>>> reader = pd.HDFStore('store.h5', mode='r')
>>> print(reader.select('sh', where=['index=="2017-09-01"'], columns=['open','close','volume']))
open close volume
date
2017-09-01 3365.99 3367.12 2824975.75
>>> reader.close()
附代码:
# -*- encoding: utf-8 -*-
import tushare as ts
import pandas as pd
FILENAME = 'ybb_sh.h5'
INDEX = 'ybb'
CODE = 'sh'
START = '2017-09-01'
END = '2017-09-30'
# get_data(date = "2017-09-10",field = ['open','volume'])
# 上证指数记录获取
def get_sh_hist_data(code, start, end, ktype, columns = []):
return ts.get_hist_data(code, start, end, ktype).loc[:, columns]
# 操作HDF5文件
def handle_hdf5(filename, mode):
return pd.HDFStore(filename, mode=mode)
# 写入HDF5
def write_hdf5(filename, index, dateframe, data_columns = []):
writer = handle_hdf5(filename, 'w')
try:
writer.append(index, dateframe , data_columns = data_columns)
return True
except Exception as e:
return False
finally:
writer.close()
# 按条件读取记录
def get_hdf5(filename, index, where = [], columns = []):
reader = handle_hdf5(filename, 'r')
try:
return reader.select(index, where = where, columns= columns)
except Exception as e:
print(e)
finally:
reader.close()
# 目标函数
def get_data(date = '', field = []):
return get_hdf5(FILENAME, INDEX, ['index=="%s"' %(date) ] , field)
if __name__ == '__main__':
df = get_sh_hist_data(CODE, START, END, 'D', ['open','close','volume'])
print('HDF5写入成功!') if write_hdf5('ybb_sh.h5', INDEX, df, ['open','close','volume']) else print('HDF5写入失败')
print('开始读取。。。')
res = get_data(date="2017-09-13",field = ['open','volume'])
print(res)
未完待续。。。
网友评论