vn.py量化社区
By Traders, For Traders.
Administrator
avatar
加入于:
帖子: 198
声望: 37

数据库模块原理

 

做量化,不管在研究策略还是实盘交易的过程中,都离不开数据。更准确地说,是都不离开从数据库读取中精确的数据。

 

高质量的数据,有利于保证模型分析和策略开发时最终产出结果的准确性,并且也能帮助避免在策略实盘初始化过程中由于异常数据导致的无谓损失。

 
在数据的获取方面,vn.py内部集成了以下常用的数据源:

 

  • 国内期货股票:米筐推出的RQData数据服务
  • 海外市场:盈透证券(IB)
  • 数字货币:币圈交易所(如BitMex,币安,火币)

 

其中,RQData数据源是vn.py通过对米筐提供的rqdatac库再次封装调用实现的,具体实现逻辑包含在RqdataClient类中。

 

而后两者,则是通过对应交易接口Gateway类的query_history函数,来实现历史数据下载的功能。

 

除了使用以上的集成数据功能来在线下载数据外,vn.py的CsvLoader模块还提供了从csv文件读取数据,并自动插入到数据库中的功能,方便用户更加灵活的使用来自其他地方的数据。
 

多渠道的数据获取和维护,在另一方面也凸显出数据库管理的重要性,所以vn.py选择将所有数据库相关的逻辑代码,全部整合在一个模块中进行实现,这就是数据库模块:

 
description

 

该模块位于vnpy\trader\database目录下,其中database.py中的BaseDatabaseManager类定义了数据插入和读取相关的标准接口。为了更直观的展示,我们使用了框架图来辅助说明:

 
description

 

数据库模块内部的调用过程,整体来说可以分成4个步骤:

 

  1. import模块时,自动运行的init.py文件,读取用户目录下.vntrader/vt_setting.json中的数据库配置信息(可以VN Trader的全局配置对话框中进行修改),然后调用同一文件夹下initialize.py中的init函数,来判断数据库驱动driver的类型。
  2. 在settings中保存着数据库driver的类型,根据不同的类型分别调用同一文件中的init_sql或者init_nosql。vn.py官方支持的数据库包括:SQLite、MySQL、PostgreSQL和MongoDB,其中除了MongoDB属于nosql类外,其余三个都属于sql类。
  3. vn.py安装后默认使用的SQLite数据库(轻量方便),以其为例:SQLite的driver类型是sql,初始化应该调用init_sql函数,在init_sql函数内部从database_sql.py中调用真正的init函数。
  4. 最后在database_sql.py中,会通过peewee的ORM功能,自动生成两张表(DbTickData和DbBarData)并添加到SqlManager中。

 
在介绍database_sql.py逻辑之前,我们需要简单讲一下peewee库:peewee是一个轻量级的对象-关系映射(Object-Relational Mapping,简称ORM)框架,用统一的形式对SQL数据库进行管理,开放上层接口给用户使用。

 
peewee的用法比较简单:

 

  • 通过继承peewee提供的model类来实现数据类,每一个数据类代表一个表(table);
  • 数据类的每个实例可以视为一条记录(row);
  • 数据类的每个field字段可以视为一列(column)。

 

所以,我们可以用peewee库提供的数据库引擎类实例化,建立与数据文件的连接;然后定义一个model类用于表示表;最后将model类添加到数据库引擎类(即生成数据表)。

 

此时,db即可表示一个与数据文件连接着的数据引擎实例,上面添加到db的model类即可表示db中的一张张表,并且可以取出来继续单独使用。

 

那么在database_sql.py中,整个逻辑过程如下:
 

  1. 在init中调用peewee的Database Engine(SQLiteDatabase)生成实例,表示与数据库文件建立连接,将该实例对象称为db。
  2. 调用init_models函数生成model类同时将model类添加到db中,然后将两张表返回(DbTickData和DbBarData)。
  3. 最后,将这两张表(类)添加到SqlManager中,生成统一的DatabaseManager,并提供给外界调用。

description

 

 

数据库具体配置

 
上面大致介绍了DataManager在VN Trader启动时的初始化过程,对于没有太多数据库使用经验的读者来说可能看的云里雾里(其实对于作者来说以上语言也十分的绕口不好读)。

 

但是不用担心,要把一辆自动挡汽车开起来并不需要知道具体的发动机和变速箱工作原理,只要分得清楚油门刹车,会打方向盘就行。接下来我们进入实操阶段的内容,具体讲解不同数据库该如何配置。
 
 

SQLite

 

SQLite是vn.py默认的数据库,无需用户做任何配置即可直接使用。作为轻量级的文件数据库,SQLite只有数据库驱动而没有服务器程序,且所有Python标准库都自带,无需用户另外安装。

 

除了SQLite以外,其他的数据库都需要我们自行安装,并在VN Trader的全局配置对话框中设置相关参数。
 

 

MySQL

 

首先在MySQL官网下载Windows版本安装包【MySQL Installer for Windows】:

 

description

 

下载完成后得到msi格式的安装包,双击打开后选择【Full】模式,安装MySQL完整版,然后一直点击【Next】按钮即可完成安装。
 

description

 

安装过程中将会自动从网站下载相关组件,先点击【Execute】按钮来补全,再点击【Next】按钮。

 

安装过程中将会要求我们输入3次密码,这里为了方便演示,我们将密码设置为1001(请在自己安装的过程中使用更加复杂安全的密码)。
 
description

 

安装完毕后会自动打开MySQL的图形管理工具MySQL WorkBench,点击菜单栏【Database】->【Connect to Database】:

 
description

 

在弹出的对话框中,直接选择默认数据库Local Instance MySQL,然后点击【OK】按钮连接上我们的MySQL数据库服务器。

 

description
 

在自动打开的数据库管理界面中,点击下图中菜单栏红色方框的按钮,来创建新的数据库。在【Name】选择我们输入“vnpy”,然后点击下方的【Apply】按钮确认。

 

description

 

在之后弹出的数据库脚本执行确认对话框中,同样点击【Apply】即可,这样我们就完成了在MySQL WorkBench的所有操作。

 
description

 

现在我们需要启动VN Trader,点击菜单栏的【配置】后,设置数据库相关字段:

 

  • driver要改成mysql;
  • database改成vnpy;
  • host为本地IP,即localhost或者127.0.0.1;
  • port为MySQL的默认端口3306;
  • user用户名为root
  • password密码则是之前我们设置的1001。

 

"database.driver": "mysql"
"database.database": "vnpy"
"database.host": "localhost"
"database.port": 3306,
"database.user": "root"
"database.password": "1001"

 

上表中的双引号都无需输入,保存完成配置修改后,我们需要重启VN Trader来启用新的数据库配置。重启后,在打开VN Trader的过程中若无报错提示,则说明MySQL数据库配置成功。

 
 

PostgreSQL

 
PostgreSQL官网下载安装包:

description

 

运行安装文件,同样一路点击【Next】按钮即可完成安装,在安装途中需要输入密码(1001):

 
description
 

同时记住PostgreSQL的默认端口为5432:
 
description

 

安装完毕后,若弹出Stack Builder界面直接点击【取消】就可以了,它一般用来安装其他补充组件:
 
description

 

与MySQL一键安装完服务器和客户端不同,PostgreSQL需要用户自行安装图形管理工具。

 

这里我们选择pgAdmin,首先从pgAdmin官网下载最新的exe格式安装包:

 
description

 

安装过程同样是一路【Next】,完成后在浏览器中会自动打开pgAdmin管理界面,这里我们要输入之前设置的数据库密码(1001)进入管理界面:

 

description
 

在管理界面中,点击【Database】->【Create】->【Database】会弹出【Create-Datebase】窗口:

 

description
 

这里我们选择创建的数据库名称为database.db,当然你也可以选择其他任意的名称:

 
description

 

点击【Save】按钮完成新数据库创建后,发现它处于未连接状态:

 
description

 

鼠标点击一下即可自动完成连接:

 
description

 

然后我们需要检查一下PostgreSQL的登录用户名,点击【Login/Group Roles】可以发现下面8个都是Group,只有最后一个是User,User的名称是“postgres”:
 
description

 

到这里我们就已经获取到了所有相关的数据库信息,参考之前的MySQL配置过程在VN Trader中进行设置即可:

 

driver要改成postgresql;
database改成database.db;
host为本地IP,即localhost或者127.0.0.1;
port为5432;
user用户名为postgres
password密码为1001。

 

"database.driver": "postgresql"
"database.database": "database.db"
"database.host": "localhost"
"database.port": 5432
"database.user": "postgres"
"database.password": "1001"

 

同样,修改完后记得重启VN Trader。

 
 

MongoDB

 

MongoDB官网下载安装包:

 

description

 

运行安装包,点击【Complete】按钮来安装完整版,一路点击【Next】:

 

description

 

在安装过程中的最后阶段,会自动帮我们装上图形管理工具MongoDB Compass,并且在完成后自动运行。我们只需点击【CONNECT】按钮即可连接上MongoDB数据库服务器:

 
description

 

点击【CREATE DATABASE】按钮创建数据库:

 
description

 

在对话框中Database和Collection Name均填写“vnpy”,然后点击下方的【CREATE DATABASE】完成数据库的创建:

 
description

 

最后在VN Trader中完成配置:

 

  • driver要改成mongodb;
  • database改成vnpy;
  • host依旧是localhost
  • port端口改成27017;
  • 用户名user、密码password、认证authentication_source均留空

 

"database.driver": "mongodb"
"database.database": "vnpy"
"database.host": "localhost"
"database.port": 27017
"database.user": ""
"database.password": ""
"database.authentication_source": ""

 
最后,别忘记重启~~~

 

《vn.py全实战进阶》课程全新上线,一共50节内容覆盖从策略设计开发、参数回测优化,到最终实盘自动交易的完整CTA量化业务流程,目前已经更新到第十三集,详细内容请戳课程上线:《vn.py全实战进阶》!

 
了解更多知识,请关注vn.py社区公众号。
description

Member
加入于:
帖子: 3
声望: 0

感谢楼主!

Member
avatar
加入于:
帖子: 26
声望: 0

讲解很详细,万分感谢

Member
avatar
加入于:
帖子: 33
声望: 0

楼主救命 因为sqlite并发太差劲了 所以我们需要把sqlite的数据全迁入mysql 但总是各种问题 有没有类似的教程帖子可以帮助我们这些人的~

Member
avatar
加入于:
帖子: 916
声望: 46

目前应该没有SQLite转MySQL的帖子,应该可以从vnpy导出数据然后导入MySQL吧

Member
avatar
加入于:
帖子: 33
声望: 0

太大了 公司里没有一台电脑能把那个sql文件打开[笑哭]

Member
avatar
加入于:
帖子: 916
声望: 46

导出csv不用打开的呀。应该可以遍历所有vt_symbol用output_data_to_csv函数导出csv,然后按照这篇帖子把默认数据库配置成MySQL,然后再批量导入csv吧,可以尝试看看

Member
avatar
加入于:
帖子: 33
声望: 0

嗯嗯 这是个方法耶 多谢

不过另一个问题又出现了 那就是之前做回测的时候下载数据 现在试着用navicat传输数据时 发现sqlite数据库里莫名其妙出现了重复存储 不知道怎么回事……

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3