金融网络数据库本地化框架概述

一、本地数据库很有用

数据是任何量化框架的基石,种类丰富、齐全,质量可靠的各类数据,是产生可靠策略的必要条件。
对主要进行量化分析、投资的中大型以上、业务已经走上正规的机构投资人来说,商业化的数据库必不可少,虽然所费不少,但是相对于依托商业数据库所产生的效益,和其业务规模来说,还是物有所值。
但是个人投资者或者刚刚起步的小型机构/工作室,更倾向一款物美价廉的数据库。近几年陆续有相关的开源/免费网络数据库出现,前有tushare,后有akshare、dtshare、baostock ,以及其他等等,给大家提供了更多的选择空间。
但是,他们都是网络数据库,需要数据时都要先通过 api 将数据取到本地,再在本地进行相关的分析运算,数据落地的速度会受到以下情况的影响:
1)互联网的稳定性和速度。
2)不少网络数据库为了降低服务器压力,都有针对用户拉取数据的流控。
受它们的影响,有时在前期的数据准备上就要花不少时间。对我这种强迫癌晚期患者来说,还是希望能从本地电脑或者局域网里直接取到数据,而不用担心因为各种原因影响到网络数据库的连接、数据落地,继而影响到后续建模、回测等事情的正常开展。
这里就分享一下我在将网络数据库本地化的心得体会。

二、框架介绍

1、数据库的选择

1)本地数据库的选择
常见的有关系型的大型数据库 oracle、mysql、postgresql,mini型的sqlite,以及非关系型的mongodb。
根据以下考虑:
1)数据都比较规整,暂时用不到mongodb。
2)只在本机上用数据库,不考虑远程访问的问题。
3)最小日级别的数据吞吐量,对性能要求比较宽松。
4)使用大型数据库需要安装驱动,对系统资源有一定占用。
我决定使用 sqlite,反正以后如果有需要,要迁移到其他数据库也方便。
(嗯,贪图方便还说得那么清新脱俗。。。。。。)

2)网络数据库的选择
目前本人接触过的开源或者免费数据库有:tushare、akshare、dtshare、baostock ,以后可能会有别的类似的网络数据库出现,到时再更新本文。
这里要再向这些网络数据库的作者致意,因为他们的辛勤劳动,大家获取相关数据的门槛大大降低了。
以上几个数据库各自的特点这里就不展开了,以后有缘的话再展开。
从自身的使用考虑,我选择了 **share。(嗯。。。)
它的特点是传统的数据比较齐全,而且推出时间已经较长,用户较多,用户类型也较多样,可以预期数据的质量相对比较稳定。

2、本地数据库框架的功能

1)主要功能
a、在数据库中新建表,并根据数据属性设置每个字段的属性。
b、通过 api 接口,从网络数据库上取数据到本地。
c、将取到的数据写入本地数据库中。
d、定期或者不定期更新数据并入库。

2)框架大致描述
a、首先新建一个获取数据的基类 class DataTable(),包含以下基本功能:
i)根据获取的数据属性在数据库中新建表。
ii)将获取的数据写入数据库中。

b、将网络数据库上的数据表,按数据的类型分成以下几类:
i)数据量不大的表。
ii)数据量较大,可逐个交易日取数据的表。
iii)数据量较大,可逐个资产取数据的表。
iv)其他数据量较大,按其他方式取数据的表。

c、针对以上每类表,新建专门处理该类表数据的子类
分别命名为 class DataTable1(DataTable) ~ DataTable4(DataTable),其中第四类表的内容可能要多一点,因为所有非规整数据表的处理都在这里,但是因为表的总量不大,因此情况也还好。当然也不一定就4类,大家可以根据自己的喜好来分类。

d、访问数据库的代码实现路径
python中对数据库的读写,理论上,既可以用 pandas 中的方法来实现,也可以通过 sqlalchemy、peewee 等 orm 包实现,还可以直接导入 sqlite3、pymysql、cx_Oracle 等包,用 sql 代码来实现。
以上几种方法之间,当然有一定的性能差异,但因为不涉及高并发、大流量的动态吞吐,以上几种方法基本都能满足需要,因此具体采用哪种方式,完全看各人的偏好。
因为不涉及到太复杂的数据库操作,我偏好导入 sqlite3 之后,直接用 sql 语句进行操作。

3)关于流控
一般网络数据库为了降低服务器本身和所在网络的压力,都会对用户的访问进行控制,常见的有:
a)每秒最大同时访问次数;
b)每分钟 / 小时总访问次数;
c)返回数据的记录数量。
这些措施对网络服务器的长期稳定使用当然是好的,但是其直接后果就是给用户取数据增加了一些麻烦。
解决办法一般是在取数据时针对流控措施,进行等待、延迟、拆分申请时间跨度/资产数量等措施,这里就不一一展开了。

4)新建数据表时设定列数据格式
显式在数据库中建表时,要设定每个字段的格式,一般是先用 python 自动识别所取数据每列的格式,据以设定数据表对应字段的格式。
如果从早期向近期取数,由于早期各类数据都还不是很齐全,可能出现取来的某列数据都是 None 或者 nan 的情况,那么 python 会自动识别为 object 类型,如果不注意,有可能使得建表时相应字段数据类型不是很准确。

三、小结

最后,相信大家对如何将自己心仪的网络数据库落到本地,都有自己的思路,代码就不放上来了。
那么下一步就是如何在此基础上实现/复现一些应用、模型或者策略,这涉及到以下几个方面的内容:
1)定期数据的图形展现,了解近期市场的结构性变化。
2)对某个思路的验证。
3)将某个思路扩展成一个策略,并通过回测了解其效果。
4)将回测表现良好的策略进行模拟交易/实时交易。
这些内容我们以后慢慢聊。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值