介绍:考虑到长远的未来,如果我们想要加快回测运行速度,就要分布式地在不同的机器上进行策略回测。那么将股票数据保存到数据库上则是必然的选择,因为这样每台服务器都能够直接连接到同一个数据库拉到数据,管理起来方便许多。
今天我们就先讲讲如何使用MongoDB
保存股票数据。
准备
python依赖环境
开始之前,你要确保Python
和pip
已经成功安装在电脑上或者服务器上,我是服务器上用JupyterLab
完成的,具体请看JupyterLab,极其强大的下一代notebook!
在终端输入以下命令安装我们所需要的依赖模块:
pip install tushare
pip install pymongo
或者在JupyterLab
# Python2
! pip install tushare
! pip install pymongo
# Python3
! pip install tushare
! pip install pymongo
安装mongodb
- 服务器用户可安装宝塔再一键
- 本地用户官网下载安装宝安装
我用的是阿里云的云Mongodb
数据库
Tushare 股票数据接口
为了下载股票数据,我用到了tushare
,一个相对稳定的股票数据服务。
tushare
采用积分制,你的积分越高,能调的接口约高级。不过其实我们的策略所需要的接口用普通账号的积分就够了。
你需要到 tushare 上注册一个tushare
账户,然后进入账号页面拿到token
:
这是我们需要用到的接口:
编写代码
首先,学会连接MongoDB数据库并创建集合(表),也就3行代码的事情(我链接的是远程阿里云数据库,所以用的第二个,如果你是本地,请用第一个,推荐一个免费的Mongodb
:免费获取 MongoDB 云数据库):
这样就能连接远程(或者本地)MongoDB
的stock
数据库,如果该库不存在,当你往集合中插入数据的时候,就会自动新建数据库。
有一点需要非常注意:MongoDB
默认不设密码,因此你如果要上线MongoDB
,请注意手动设置密码。可参考:
其次,拿到股票数据:
因为并不一定需要用到所有股票数据,所以我维护了一个股票列表点击可下载:codes.csv.
当然,这个股票列表最好也写到MongoDB
里以方便维护(我这里省麻烦就没写入了)。
如果你需要用到所有股票,请调tushare
的stock_basic
接口:
data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
这个接口能返回当前所有正常上市的股票列表。
最后,将这些股票数据写入到MongoDB
中
获得请求数据后,将其使用.T进行转置,以变成【字段-值】的形式,并转成json
.
转成json后就可以保存到数据库中,这里我们选择了一条条数据地插入,而不是批量插入。
因为批量插入在遇到重复值的时候,可能会导致那一批数据全部丢失,对于股票回测而言,丢失数据是致命的。
最后,为了防止请求接口频率过高,设置了一个time.sleep
延时。
完整代码
注意事项
- 依赖:
pymongo
、tushare
- 修改:你的
下载目录路径
'''*************************************************
Copyright (Python), 2020-,Literature Tech. Co., Ltd.
source: None
Author: Written by Literature
Version: 1.0
Date: 2020.07.19
Description:
Others: None
Function List: main
History: The first edition 2020.07.19
*************************************************'''
import pymongo
import time
import json
import tushare as ts
# 建立连接
# client = pymongo.MongoClient(host='localhost', port=27017)
# 云数据库
client = pymongo.MongoClient(host='链接地址', port=27017)
# 连接stock数据库,注意只有往数据库中插入了数据,数据库才会自动创建
stock_db = client.stock
# 创建一个daily集合,类似于MySQL中“表”的概念
daily = stock_db["daily"]
def get_stock_daily(start_date, end_date):
"""
获得A股所有股票日数据
Args:
start_date (str): 起始日
end_date (str): 结束日
"""
pro = ts.pro_api(token="填写你的Token")
# w注意修改你的路径,可默认
codes = open('./codes.csv', 'r', encoding='utf-8').readlines()
# 遍历所有股票ID
for code in codes:
code = code.strip('\n')
# 请求tushare数据,并转化为json格式
df = pro.daily(ts_code=code, start_date=start_date, end_date=end_date)
data = json.loads(df.T.to_json()).values()
# 对股票每一天数据进行保存,注意唯一性
# 这里也可以批量创建,速度更快,但批量创建容易丢失数据
# 这里为了保证数据的绝对稳定性,选择一条条创建
for row in data:
daily.update({"_id": f"{row['ts_code']}-{row['trade_date']}"}, row, upsert=True)
time.sleep(0.5)
get_stock_daily("20180101", "20200627")
代码运行效果
云数据库状态
已建立表,程序设定0.5的休眠时间,可能数据调用慢
运行完了查看,已有数据
[1]: https://k6366.com.cn/index.php/archives/99/ [2]: http://k6366.20000111.xyz/20200719142143.png [3]: https://tushare.pro/ [4]: http://k6366.20000111.xyz/20200719135219.png [5]: http://k6366.20000111.xyz/20200719135504.png [6]: https://k6366.com.cn/index.php/archives/124/ [7]: http://k6366.20000111.xyz/20200719140359.png [8]: http://k6366.20000111.xyz/20200719140955.png [9]: http://k6366.20000111.xyz/20200719141102.png [10]: http://k6366.20000111.xyz/20200719141807.png [11]: http://k6366.20000111.xyz/20200719142630.png [12]: http://k6366.20000111.xyz/20200719143430.png