VeighNa Trader 数据库配置与脚本读写实战:八种数据库接入、插件化架构与增删查操作
2026/9/19 10:42:02 网站建设 项目流程

VeighNa Trader 数据库配置与脚本读写实战:八种数据库接入、插件化架构与增删查操作

【免费下载链接】vnpy基于Python的开源量化交易平台开发框架项目地址: https://gitcode.com/vnpy/vnpy

导读

VeighNa Trader(vnpy)是一套基于 Python 的开源量化交易平台开发框架,其核心功能之一就是把行情 K 线与 Tick 数据统一持久化到数据库,供回测、实盘和策略研究复用。本文以 docs/community/info/database.md 为骨架,系统讲解 VeighNa Trader 支持的八种数据库(SQLite、MySQL、PostgreSQL、MongoDB、InfluxDB、DolphinDB、Arctic、LevelDB)的选型特点、配置字段与完整示例,并结合 vnpy/trader/database.py 的抽象基类与插件化加载机制,深入说明数据库驱动的工作原理,最后给出可直接运行的脚本读写(加载、读取、写入、删除)代码。读完本文,你将能够为 VeighNa Trader 配置任意一种支持的数据库,并熟练使用 Python 脚本对行情数据进行增删查操作。


一、数据库插件化架构:BaseDatabase 抽象基类

在深入逐库配置之前,先理解 VeighNa Trader 的数据库抽象层,这对理解后文所有配置字段非常关键。

从源码 vnpy/trader/database.py 可以看到,框架定义了一个BaseDatabase抽象基类(database.py 第 52 行起),它声明了八个抽象接口:

接口签名要点用途
save_bar_data(bars, stream=False) -> bool批量写入 K 线数据
save_tick_data(ticks, stream=False) -> bool批量写入 Tick 数据
load_bar_data(symbol, exchange, interval, start, end) -> list[BarData]按合约与时间区间读取 K 线
load_tick_data(symbol, exchange, start, end) -> list[TickData]按合约与时间区间读取 Tick
delete_bar_data(symbol, exchange, interval) -> int按合约删除 K 线(不可恢复)
delete_tick_data(symbol, exchange) -> int按合约删除 Tick(不可恢复)
get_bar_overview() -> list[BarOverview]返回库中 K 线数据的概览(合约、区间、条数)
get_tick_overview() -> list[TickOverview]返回库中 Tick 数据的概览

每种数据库的驱动都是一个独立 Python 包,命名规范为vnpy_<database.name>,内部实现一个继承BaseDatabaseDatabase类。核心加载逻辑在 get_database():

  1. 从全局配置SETTINGS["database.name"]读取数据库类型名称;
  2. 拼出模块名f"vnpy_{database_name}"并尝试import_module动态导入;
  3. 若驱动未安装(ModuleNotFoundError),则打印提示并自动回退到默认的vnpy_sqlite驱动;
  4. 实例化module.Database()并返回单例。

这意味着:SQLite 是开箱即用的兜底方案,而使用其他数据库前,必须先用 pip 安装对应的驱动包(如vnpy_mysqlvnpy_mongodb),否则框架会静默回退到 SQLite。这一机制正是后文所有database.name字段的意义所在。

全局配置项定义于 vnpy/trader/setting.py,其中数据库相关默认值为:

"database.timezone": get_localzone_name(), # 数据库存储时区,默认取本机时区 "database.name": "sqlite", # 默认数据库类型 "database.database": "database.db", # 默认数据库名/文件名 "database.host": "", # 服务器地址 "database.port": 0, # 端口 "database.user": "", # 用户名 "database.password": "" # 密码

这些默认值会与用户主目录下.vntrader/vt_setting.jsonSETTING_FILENAME,见 setting.py 第 42 行)中的用户配置合并覆盖。另外注意,MainEngine 初始化时会切换工作目录到 TRADER_DIR,而TRADER_DIR即用户主目录下的.vntrader文件夹(见 vnpy/trader/utility.py 第 60 行)——这正是 SQLite 数据库文件默认存放的位置。


二、SQL 类数据库

VeighNa Trader 支持三种 SQL 关系型数据库:SQLite(默认)、MySQL、PostgreSQL。

2.1 SQLite(默认数据库)

SQLite 是一个轻量的嵌入式数据库,无需安装和配置数据服务程序,是 VeighNa 的默认数据库,特别适合入门新手用户。其特点如下:

  • 存储在一个单一的跨平台磁盘文件上;
  • 不需要在系统中配置、安装和管理;
  • 不需要一个单独的服务器进程。

SQLite 配置字段:

字段名是否必填
database.namesqlite可选(不填默认使用 sqlite)
database.database数据库文件(相对于 trader 目录)必填

SQLite 配置示例:

字段名
database.namesqlite
database.databasedatabase.db

从源码看,SETTINGSdatabase.namedatabase.database的默认值恰好就是"sqlite""database.db"(setting.py 第 32-33 行),因此理论上 SQLite 甚至可以不填任何配置直接运行。数据库文件database.db会生成在用户主目录的.vntrader目录下(即TRADER_DIR,见 vnpy/trader/utility.py 第 60 行)。

2.2 MySQL

MySQL 是目前主流的开源关系型数据库,其特点如下:

  • 文档材料丰富,社区及用户活跃;
  • 支持多种操作系统、多种开发语言;
  • 可替换其他高性能 NewSQL 数据库兼容实现(如 TiDB)。

MySQL 配置字段:

字段名是否必填
database.name"mysql"必填
database.host地址必填
database.port端口必填
database.database数据库名必填
database.user用户名可选
database.password密码可选

MySQL 配置示例:

字段名
database.namemysql
database.hostlocalhost
database.port3306
database.databasevnpy
database.userroot
database.password

注意 MySQL 的 user 与 password 标注为可选——未填写时驱动会使用默认账号,但实际生产环境中强烈建议显式填写。使用 MySQL 前需先安装驱动包vnpy_mysql,否则 get_database() 会因导入vnpy_mysql失败而回退到 SQLite。

2.3 PostgreSQL

PostgreSQL 是特性更为丰富的开源关系型数据库,只推荐熟手使用。相比于 MySQL,其特点如下:

  • 采用多进程结构;
  • 支持通过扩展插件来新增功能。

PostgreSQL 配置字段:

字段名是否必填
database.name"postgresql"必填
database.host地址必填
database.port端口必填
database.database数据库名必填
database.user用户名必填
database.password密码必填

PostgreSQL 配置示例:

字段名
database.namepostgresql
database.hostlocalhost
database.port5432
database.databasevnpy
database.userpostgres
database.password123456

2.4 关系型数据库的建库前提

请注意,VeighNa 不会主动为关系型数据库创建数据库,所以请确保所填写的database.database字段对应的数据库已经创建好了。若未创建数据库,请手动连接数据库并运行该命令:

create database <填写的database.database>;

例如配置中填写的是vnpy,则执行create database vnpy;


三、非 SQL 类数据库

除 SQL 数据库外,VeighNa Trader 还支持五种非 SQL 数据库,覆盖文档型、时序型与高性能 Key/Value 存储。

3.1 MongoDB

MongoDB 是一个基于分布式文件存储(bson 格式)的非关系型数据库,其特点如下:

  • 面向文档存储,操作比较简单;
  • 支持丰富的存储类型和数据操作;
  • 内置的热数据内存缓存实现更快的读写速度。

MongoDB 配置字段:

字段名是否必填
database.name"mongodb"必填
database.host地址必填
database.port端口必填
database.database数据库名必填
database.user用户名可选
database.password密码可选
database.authentication_source创建用户所用的数据库可选

MongoDB 带认证配置示例:

字段名
database.namemongodb
database.hostlocalhost
database.port27017
database.databasevnpy
database.userroot
database.password
database.authentication_sourcevnpy

其中authentication_source表示创建该用户时所用的认证数据库(即用户认证数据库),只有开启认证时才需要填写。注意,SETTINGS默认字典中并未预置authentication_source字段(见 setting.py 第 11-38 行),需要在vt_setting.json中自行补充,驱动包会读取它完成认证。

3.2 InfluxDB

InfluxDB 是专门针对时间序列数据存储设计的非关系型数据库,其特点如下:

  • 列式数据存储提供极高的读写效率;
  • 采用独立服务进程的模式运行,也能支持多进程的并发访问需求。

在安装时需要选择2.0 版本的 InfluxDB。

请注意,运行influxd.exe的 cmd 窗口需要保持运行,如果关闭则会导致 InfluxDB 退出;也可以使用一些辅助工具将其注册为后台运行的 Windows 服务。

InfluxDB 配置字段:

字段名是否必填
database.name"influxdb"必填
database.host地址必填
database.port端口必填
database.database数据库名必填
database.user用户名必填
database.password密码必填

InfluxDB 配置示例:

字段名
database.nameinfluxdb
database.hostlocalhost
database.port8086
database.databasevnpy
database.userroot
database.password12345678

3.3 DolphinDB

DolphinDB 是浙江智臾科技有限公司研发的一款高性能分布式时序数据库,特别适用于对速度要求极高的低延时或实时性任务,其特点如下:

  • 列式分析型(OLAP)数据库,采用混合引擎(基于内存和硬盘),充分利用缓存来加速;
  • 原生分区表存储,合理的分区方案可以让 CPU 多线程并行加载每个分区内的数据;
  • 支持高效的数据压缩,显著减小硬盘存储空间的同时,还能大幅降低 IO 通讯的开销。

尽管 DolphinDB 是商业软件,但也提供了免费的社区版,安装时需选择2.0 Beta版本。

请注意:

  • 运行dolphindb.exe的 cmd 窗口需要保持运行,如果关闭则会导致 DolphinDB 退出,也可以使用辅助工具将其注册为后台运行的 Windows 服务;
  • 因为 DolphinDB 目前不支持 Python 3.10,所以VeighNa Studio 3.0.0 没有提供 DolphinDB 支持

DolphinDB 配置字段:

字段名是否必填
database.name"dolphindb"必填
database.host地址必填
database.port端口必填
database.database数据库名必填
database.user用户名必填
database.password密码必填

DolphinDB 配置示例:

字段名
database.namedolphindb
database.hostlocalhost
database.port8848
database.databasevnpy
database.useradmin
database.password123456

3.4 Arctic

Arctic 是由英国量化对冲基金 Man AHL 基于 MongoDB 开发的高性能金融时序数据库,其特点如下:

  • 支持直接存储 pandas 的 DataFrame 和 numpy 的 ndarray 对象;
  • 允许对数据进行版本化管理(类似于数据库中的 git),便于因子挖掘过程中的数据迭代管理;
  • 基于分块化存储和 LZ4 压缩,在网络和磁盘 IO 方面节省大量资源,实现超高性能的数据查询。

请注意,因为 Arctic 目前不支持 Python 3.10,所以VeighNa Studio 3.0.0 没有提供 Arctic 支持

Arctic 配置字段:

字段名是否必填
database.name"arctic"必填
database.host地址必填
database.port端口必填

Arctic 配置示例:

字段名
database.namearctic
database.hostlocalhost
database.databasevnpy

由于 Arctic 基于 MongoDB,database.database在此处实际对应 MongoDB 中的库名。

3.5 LevelDB

LevelDB 是由 Google 推出的高性能 Key/Value 数据库,其特点如下:

  • 定位为通用型数据存储方案;
  • 基于 LSM 算法实现进程内存储引擎;
  • 支持数十亿级别的海量数据。

请注意,因为 LevelDB 目前不支持 Python 3.10,所以VeighNa Studio 3.0.0 没有提供 LevelDB 支持

LevelDB 配置字段:

字段名是否必填
database.name"leveldb"必填
database.database数据库名必填
database.port端口必填

LevelDB 配置示例:

字段名
database.nameleveldb
database.databasevnpy_data

四、数据库配置实战:以 MySQL 为例

本节以 MySQL 为例,完整演示从零安装数据库到 VeighNa Trader 配置启用的全过程。请确保先通过 pip 安装vnpy_mysql驱动包,并确认 MySQL 服务已正常运行。

第一步:安装 MySQL 服务器

在 MySQL 官网下载 Windows 版本安装包【MySQL Installer for Windows】,下载完成后得到 msi 格式的安装包,双击打开后选择【Full】模式安装 MySQL,一路点击【Next】按钮即可完成安装。

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

安装过程中会要求输入 3 次密码,请务必使用复杂安全的密码(下文演示中以1001为例,仅用于演示)。安装完毕后会自动打开 MySQL 的图形管理工具 MySQL WorkBench。

第二步:创建数据库

在 MySQL WorkBench 中,点击菜单栏【Database】→【Connect to Database】,在弹出的对话框中直接选择默认数据库 Local Instance MySQL,然后点击【OK】按钮连接 MySQL 数据库服务器。

在自动打开的数据库管理界面中,点击菜单栏中的新建数据库按钮,在【Name】中输入vnpy,然后点击下方的【Apply】按钮确认。在弹出的数据库脚本执行确认对话框中,同样点击【Apply】,即可完成数据库创建。

这一步对应前文 2.4 节的建库前提:VeighNa 不会自动建库,create database vnpy;就是上述图形化操作的等价 SQL。

第三步:在 VeighNa Trader 中填写数据库配置

随后启动 VeighNa Trader,点击菜单栏的【配置】,设置数据库相关字段:

  • name要改成mysql(请注意大小写);
  • database改成vnpy
  • host为本地 IP,即localhost或者127.0.0.1
  • port为 MySQL 的默认端口3306
  • user用户名为root
  • password密码则是之前设置的1001
database.name: mysql database.database: vnpy database.host: localhost database.port: 3306 database.user: root database.password: 1001

保存完成配置修改后,重启 VeighNa Trader来启用新的数据库配置。重启后,在打开 VeighNa Trader 的过程中若无报错提示,则说明 MySQL 数据库配置成功。

从源码角度可以印证这一过程:图形界面的【配置】最终写入的正是用户主目录.vntrader/vt_setting.json,而SETTINGS启动时通过 load_json 读取该文件并与默认值合并(setting.py 第 42-43 行);随后首次调用 get_database() 时,根据database.name = "mysql"动态导入vnpy_mysql驱动完成连接。若该驱动未安装,控制台会打印“找不到数据库驱动 vnpy_mysql,使用默认的 SQLite 数据库”的提示——这也是配置 MySQL 后最常见的失败原因。


五、脚本使用:行情数据的读写与删除

配置好数据库之后,就可以脱离图形界面,通过 Python 脚本直接操作数据库。脚本使用前,请先按照上文配置好使用的数据库,使用时调用相应的函数接口。

5.1 加载所需的包和数据结构

from datetime import datetime from typing import List from vnpy.trader.constant import Exchange, Interval from vnpy.trader.database import get_database from vnpy.trader.object import BarData, TickData # 获取数据库实例 database = get_database()

get_database()返回的实例即前文所述的BaseDatabase具体实现(SQLite/MySQL/MongoDB 等),后续所有读写操作都通过它完成。

5.2 配置所需合约的具体参数数据

# 合约代码,888为米筐的连续合约,仅用于示范,具体合约代码请根据需求自行更改 symbol = "cu888" # 交易所,目标合约的交易所 exchange = Exchange.SHFE # 历史数据开始时间,精确到日 start = datetime(2019, 1, 1) # 历史数据结束时间,精确到日 end = datetime(2021, 1, 20) # 数据的时间粒度,这里示例采用日级别 interval = Interval.DAILY

其中Exchange枚举定义了 CFFEX、SHFE、CZCE、DCE、INE、GFEX、SSE、SZSE 以及 CME、NYMEX、LME 等全球主流交易所(见 vnpy/trader/constant.py 第 81-137 行);Interval枚举支持MINUTE("1m")HOUR("1h")DAILY("d")WEEKLY("w")TICK("tick")五种粒度(见 constant.py 第 150-158 行),可按需替换。

5.3 数据库的读取操作

如数据库指定时间段没有数据,返回空列表:

# 读取数据库中k线数据 bar1 = database.load_bar_data( symbol=symbol, exchange=exchange, interval=interval, start=start, end=end ) # 读取数据库中tick数据 tick1 = database.load_tick_data( symbol=symbol, exchange=exchange, start=start, end=end )

读取结果分别是list[BarData]list[TickData]。从数据结构源码看,BarData包含symbolexchangedatetimeintervalvolumeturnoveropen_interestopen/high/low/close_price等字段,并在初始化时自动生成vt_symbol(格式为symbol.exchange,见 vnpy/trader/object.py 第 88-108 行);TickData则额外包含五档买卖盘口、涨跌停价等字段(object.py 第 30-84 行)。这些字段即是数据库表中实际存储的列。

5.4 数据库的写入操作

请注意,示例中的bar_datatick_data均未在示例中展现获取和转换方法。如需以脚本方式写入,请自行参考源码或其他途径,转换成示例中的数据结构(即List[BarData]/List[TickData])。

# 需要存入的k线数据,请自行获取并转换成所需的形式 bar_data: List[BarData] = None database.save_bar_data(bar_data) # 需要存入的tick数据,请自行获取并转换成所需的形式 tick_data: List[TickData] = None # 将tick数据存入数据库 database.save_tick_data(tick_data)

save_bar_datasave_tick_data都支持stream参数(默认False),用于控制是否以流式方式写入(见 database.py 第 57-69 行)。写入前请确保每个数据对象的symbolexchangedatetime等关键字段均已正确赋值,因为它们是数据库表的主键索引依据。

5.5 数据库的删除操作

删除操作无法恢复,请谨慎操作

# 删除数据库中k线数据 database.delete_bar_data( symbol=symbol, exchange=exchange, interval=interval ) # 删除数据库中tick数据 database.delete_tick_data( symbol=symbol, exchange=exchange )

删除接口按“合约 + 交易所(+ 周期)”定位整段数据:delete_bar_data会删除指定合约在该周期下的全部 K 线;delete_tick_data会删除指定合约的全部 Tick。接口返回被删除的记录数(见 database.py 第 98-119 行)。


六、进阶说明与时区处理

6.1 数据概览查询

BaseDatabase还提供了get_bar_overview()get_tick_overview()两个概览接口,返回库中各合约的数据统计(symbolexchangeintervalcountstartend,见 database.py 第 25-49 行),可用于检查数据下载是否完整、统计数据规模,也是 VeighNa Trader 内置数据管理器中展示数据概览的底层实现。

6.2 时区约定

在 vnpy/trader/database.py 第 14-22 行 中,框架定义了数据库统一时区:

DB_TZ = ZoneInfo(SETTINGS["database.timezone"]) def convert_tz(dt: datetime) -> datetime: """将任意时区的 datetime 转换为数据库时区并去掉 tzinfo""" dt = dt.astimezone(DB_TZ) return dt.replace(tzinfo=None)

database.timezone默认取本机时区(get_localzone_name(),见 setting.py 第 31 行)。这意味着:写入数据库的行情时间统一按database.timezone存储,且不带时区信息。国内用户默认即东八区,无需额外处理;若在跨时区服务器上运行,建议显式配置该字段,避免读取历史数据时出现时间错位。

6.3 常见问题速查

  • 配置了 MySQL/MongoDB 但数据仍写入 SQLitevnpy_<name>驱动包未安装,查看启动日志中“找不到数据库驱动……”的提示,用 pip 安装对应驱动后重启;
  • 连接数据库报错“Unknown database”:未执行建库操作,按 2.4 节手动create database
  • InfluxDB / DolphinDB 服务掉线influxd.exe/dolphindb.exe所在的 cmd 窗口被关闭,保持窗口运行或注册为 Windows 服务;
  • VeighNa Studio 3.0.0 缺少 DolphinDB、Arctic、LevelDB 选项:这三个数据库暂不支持 Python 3.10,需等待驱动更新或使用其他 Python 版本环境。

七、总结

VeighNa Trader 通过BaseDatabase抽象基类与vnpy_<name>命名约定的插件化机制,将八种数据库统一收敛为一套读写接口,用户只需在配置中修改database.*字段并安装对应驱动即可无缝切换存储后端。默认的 SQLite 开箱即用,适合入门;MySQL/PostgreSQL 适合需要稳定服务与多端访问的场景;MongoDB、InfluxDB、DolphinDB、Arctic、LevelDB 则分别在文档存储、时序查询、高性能分析、因子迭代与海量 Key/Value 场景各有所长。结合本文提供的脚本读写示例与 vnpy/trader/database.py 源码,你可以快速为回测、实盘与研究工作流搭建可靠的数据基础设施。

【免费下载链接】vnpy基于Python的开源量化交易平台开发框架项目地址: https://gitcode.com/vnpy/vnpy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询