开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情
开发自己的交易系统系列
开发自己的量化交易系统,5年一个亿(一)------获取所有股票列表 - 掘金 (juejin.cn)
前言
上一章我们讲了获取所有的股票列表,这一章开始我们开始讲获取单个的股票行情
获取股票的 K 线数据 API
我们使用的获取股票数据的平台是API REFERENCE - efinance 0.5.0 documentation
从上面的api中我们可以看出,我们写自己的函数,需要传入code,开始时间,结束时间
获取单个股票行情
def get_single_stock_price(code, start_time=None, end_time=None):
"""
# 获取单个股票行情
:param code 股票代码
:param end_time 获取股票结束时间
:param start_time 获取股票开始时间
:return
"""
# 时间转化
if start_time:
start_time = start_time.replace('-', '');
if end_time:
end_time = end_time.replace('-', '');
# 如果start_time为None的话,那么为上市开始时间
if start_time is None and end_time is None:
data = ef.stock.get_quote_history(code);
elif end_time is None and start_time:
data = ef.stock.get_quote_history(code, start_time);
else:
data = ef.stock.get_quote_history(code, start_time, end_time);
data = handle_data(data);
return data[['name', 'code', 'date', 'open', 'close', 'close_pct', 'volume']];
handle_data为转化数据的函数,因为efinance平台返回的数据都是中文的,所以我们转化一下英文
def handle_data(data):
# 数据转化
data.rename(
columns={
"股票名称": 'name',
"股票代码": 'code',
"日期": 'date',
"开盘": 'open',
"收盘": 'close',
"最高": 'high',
"最低": "low",
"涨跌幅": 'close_pct',
"成交量": 'volume',
"成交额": 'money'
},
inplace=True
);
# data.index = pd.to_datetime(data['date']);
return data;
我们使用平安银行进行测试一下000001
我们现在也不需要太多数据,就返回这些数据吧
'name', 'code', 'date', 'open', 'close', 'close_pct', 'volume'
data = st.get_single_stock_price('000001');
print(data);
测试一下ok的
导出数据
有同学说为什么不把数据存储到数据库,而是导出到本地,我们现在是先导出到本地,后面我们会学习导入到数据库,一步一步来
导出数据要注意几个点
- 我们的数据会重复,这个时候我们就要以时间为准删除重复的值
- 新加入的数据根据时间要排到后面,所以不需要header部分
确认参数
- data: 传入的数据
- filename: 文件名:请传入code
- to_csv的模式: mode为a是新加入数据,否则就是重新写入
def export_stock_data(data, filename, mode=None):
"""
:param data: 传入的数据
:param filename: 文件名:请传入code
:param mode: to_csv的模式: mode为a是新加入数据,否则就是重新写入
:return:
"""
# 导出股票行情
file_root = '/Users/wson/Desktop/Trader/data/' + filename + '.csv';
# 如果mode为a那么就是新添加数据
if mode == 'a':
# 因为是新加入的数据,要排到后面,所以header为false
data.to_csv(file_root, mode=mode, header=False);
# 删除重复值
data = pd.read_csv(file_root);
# 以日期为准进行删除重复值
data = data.drop_duplicates(subset=['date']);
data = data.sort_values('date');
data.to_csv(file_root, index=False);
# 否则就是重新写入数据
else:
data.to_csv(file_root);
print('已成功存储至:', file_root);
修改一下数据处理函数。因为现在我们的索引数字,如果再添加新的数据,新的数据第一个序号还是1,所以这就重复了,所以我们修改一下,如果数据中含有时间,那么以时间为索引
def handle_data(data):
...
if 'date' in data:
data.index = pd.to_datetime(data['date']);
return data;
此时我们开始进行测试
我们的时间间隔小一点,方便观察数据
code = '000001';
data = st.get_single_stock_price('000001', '20191201', '20191210');
st.export_stock_data(data, code);
print(data);
没错good
然后开始时间改成20191201,结束时间改成20191210看是否时间添加到前面了,因为是添加数据,所以mode为a
code = '000001';
data = st.get_single_stock_price(code, '20191101', '20191110');
st.export_stock_data(data, code, 'a');
print(data);
依然正确,good