量化投资系列文章:
Backtrader 教程 — Python 量化投资实战教程(1)
Python 量化投资实战教程(3) —A股回测MACD策略
Python 量化投资实战教程(5) — A股回测KDJ 策略
在前几篇量化投资文章中,使用的是保存为csv的本地股票数据。
但考虑到长远的未来,如果我们想要加快回测运行速度,就要分布式地在不同的机器上进行策略回测。
那么将股票数据保存到数据库上则是必然的选择,因为这样每台服务器都能够直接连接到同一个数据库拉到数据,管理起来方便许多。
今天我们就先讲讲如何使用MongoDB保存股票数据。
1.准备
开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda
Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。
当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。
在终端输入以下命令安装我们所需要的依赖模块:
pip install tushare pip install pymongo
看到 Successfully installed xxx 则说明安装成功。
安装MongoDB
MongoDB 请前往以下链接下载:
https://www.mongodb.com/try/download/community
第一步选择On-Premises, 第二部选择自己的操作系统,第三部点击Download下载安装包。
下载完成安装包后一路默认即可,不过推荐修改data_path, 毕竟数据库有可能变得比较大,装在C盘不合适。
安装完成后,打开CMD输入以下命令启动MongoDB服务:
C:\Program Files\MongoDB\Server\4.2\bin\mongod.exe --dbpath F:\mongodb\data
前者是你的mongod.exe所在文件夹,后者是你的数据库文件路径。请注意根据自己的安装配置更改。
Tushare 股票数据接口
为了下载股票数据,我用到了tushare,一个大佬做的相对稳定的股票数据服务。
tushare采用积分制,你的积分越高,能调的接口约高级。不过其实我们的策略所需要的接口用普通账号的积分就够了。
你需要到https://tushare.pro/上注册一个tushare账户,然后进入账号页面拿到token:
这是我们需要用到的接口:
2.编写代码
首先,学会连接MongoDB数据库并创建集合(表),也就4行代码的事情:
import pymongo # 建立连接 client = pymongo.MongoClient(host='localhost', port=27017) # 连接stock数据库,注意只有往数据库中插入了数据,数据库才会自动创建 stock_db = client.stock # 创建一个daily集合,类似于MySQL中"表"的概念 daily = stock_db["daily"]
这样就能连接本地MongoDB的stock数据库,如果该库不存在,当你往集合中插入数据的时候,就会自动新建数据库。
有一点需要非常注意:MongoDB默认不设密码,因此你如果要上线MongoDB,请注意手动设置密码。
其次,拿到股票数据:
def get_stock_daily(start_date, end_date): """ 获得A股所有股票日数据 Args: start_date (str): 起始日 end_date (str): 结束日 """ pro = ts.pro_api(token="你的账号token") 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)
因为并不一定需要用到所有股票数据,所以我维护了一个股票列表:codes.csv.
当然,这个股票列表最好也写到MongoDB里以方便维护(我这里省麻烦就没写入了)。
如果你需要用到所有股票,请调tushare的stock_basic接口:
data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
这个接口能返回当前所有正常上市的股票列表。
最后,将这些股票数据写入到MongoDB中:
def get_stock_daily(start_date, end_date): """ 获得A股所有股票日数据 Args: start_date (str): 起始日 end_date (str): 结束日 """ pro = ts.pro_api(token="你的账号token") 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.1)
获得请求数据后,将其转置一下,以变成【字段-值】的形式,并转成json.
转成json后就可以保存到数据库中,这里我们选择了一条条数据地插入,而不是批量插入。
因为批量插入在遇到重复值的时候,可能会导致那一批数据全部丢失,对于股票回测而言,丢失数据是致命的。
最后,为了防止请求接口频率过高,设置了一个time.sleep延时。
全部核心代码如上所示,可运行的完整代码可以在【Python实用宝典】后台回复:MongoDB 下载。
3.可视化查看数据
MongoDB可视化查看数据,我推荐NoSQLBooster. 一个免费的MongoDB查看器。
https://nosqlbooster.com/downloads
选择对应系统下载,一路默认安装就能开始使用。
基本上你需要的功能它都有了(这界面其实很像Mysql Workbench)
啊对了,最后别忘记加我们新的交流群,加我好友,备注上面红字语句答案即可进群(防范营销号,大家见谅):
我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。
原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!
Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典