在量化交易系统中,在哪里以及如何记录余额呢,这篇文章将会分享一个使用 MongoDB 官方云服务的思路。
MongoDB 是一款面向文档的数据库软件,和关系型数据库相比,优势在于条目的数据结构很灵活。要存储余额的话,可以每隔 N 分钟新建一条存储,数据内容是各个账户的余额数字。
MongoDB 都有官方提供的云服务,并且有免费的基础版。
官方云服务对我们个人用户来说非常方便,它免去了购买服务器搭建维护服务的工作,并且开通使用时不需要绑定信用卡,无需担心扣费问题。
MongoDB 的云服务免费版,容量大小限制为 512 MB,对我们记录余额来说也完全够用。
进入 https://www.mongodb.com ,点击右上角免费试用完成账户注册。
MongoDB Atlas 就是 MongoDB 的云服务,注册完成后登录进入 MongoDB Atlas。
依次创建项目和创建免费的数据库。为和 Grafana 的相匹配,区域我选择亚马逊 AWS 的亚洲新加坡。数据库添加用户(别忘了记下账号密码),添加允许访问的 IP 段(暂时填 0.0.0.0/0,后续有需要再进行限制)。
因为我已经开通,过程我也不再详细记录了,网上搜索“MongoDB 免费”可以找到相关教程。
上图是一段币圈的示例代码,用于获取所有子账户的余额并入库。股票和期货的原理相同,不同之处在于获取余额调用的 Api 不同。
代码首先连接了数据库,并指定了需要存入数据的库名 account 和表名 balances。
然后初始化了 CCXT,并用它的「私有 Api」获取所有子账户的余额。
所有子账户的余额经过处理,组成了新的数组,数组的每一项代表一个账户的余额,用 json 格式来表示。json 中 account 代表账户名,balance 数字表示余额。
最后,调用 pymongo 的 insert_one 函数将这个余额数组联同当前时间,插入到数据表中。
格式如下图所示,time 代表当前时间,balances 代表所有子账户余额的数组。
每执行一次上面的 Python 脚本,就会插入一条当时的余额信息,这就需要机器来定时自动执行。
我将这个脚本放在了 Linux 系统下执行,所以选择了 crontab 来执行定时任务。
定时脚本如上图所示,每小时的第 2、22、42 分钟的时候,执行一次上面的余额入库 Python 脚本。
这样每小时有 3 条数据,每天有 72 条数据,每年有 26280 条数据,数据量完全在 MongoDB 免费版的承载范围内。
打开 MongoDB Atlas 管理后台,进入我插入数据的数据库和表。
可以看到余额数据存在,并且是 Python 脚本所创建的数据结构。
对于已经存储的余额数据,可以继续编写程序展示和分析。
我的另一篇文章《搭建免费的量化交易看板》,展示了如何用 Grafana 读取上述存储的余额数据,并用图表展示出来,有兴趣的朋友可以阅读。
MongoDB 是一种 NoSQL 数据库,它可以存储的数据,其结构可以不必像关系型数据库一样事先定义。这方便我们在一条数据中,存储一个数组,用来表示所有账户的余额信息。很多关系型数据库也有存储 json 的功能,但不如 MongoDB 这种原生 NoSQL 数据库使用方便。
MongoDB 提供了免费版本的官方云服务,这让我们个人量化交易者免去了搭建维护数据库的工作,并且免费版的 MongoDB 在我们的数据量不大的情况下够用。
数据库不仅可以存储余额数据,也可以存储其他诸如订单和仓位数据,这对事后分析量化策略都有帮助。