以AI量化为生:4.vnpy配置管理与系统集成
本文介绍了一种轻量级的vnpy配置管理方案,通过.env文件实现集中化配置管理。文章详细讲解了vnpy的默认配置机制,提出了基于.env文件的解决方案,包括数据库、数据源和邮件通知等核心配置项。方案支持环境隔离、自动加载配置,并给出了SQLite和MySQL数据库的配置建议。同时提供了天勤数据源等数据接入方式,以及QQ邮箱等通知服务配置方法。最后阐述了程序集成方案和最佳实践,包括环境隔离、安全建议
本文是《以AI量化为生》系列的第四篇,我们将介绍一个轻量级的vnpy配置管理方案,让你能够轻松管理数据库、数据源等配置,为后续的策略开发奠定基础。
前言
在使用vnpy框架进行量化开发时,配置管理是一个绕不开的话题。vnpy的配置包括数据库连接、数据源设置、日志配置等,默认存储在用户目录的.vntrader
文件夹中。
对于项目开发,我们希望:
-
配置集中管理:所有配置在项目目录中
-
环境隔离:开发、测试、生产环境独立配置
-
简单易用:无需复杂的配置文件和向导
本文将介绍一个轻量级的解决方案,通过.env
文件管理配置,在程序启动时自动应用到vnpy。
一、vnpy配置机制
vnpy通过主程序菜单"配置"窗口来管理全局配置,具体代码实现在vnpy.trader.setting.SETTINGS
,主要包括:
-
数据库配置:连接信息、类型选择
-
数据源配置:账户信息、接口选择
-
界面配置:字体、主题等
-
日志配置:级别、输出方式
-
邮件配置:通知设置
全局配置窗口
当配置存储在操作系统用户目录的.vntrader/vt_setting.json
文件中。对于项目开发,我们需要一个更灵活的配置方案。
二、轻量级配置方案
我们采用.env
文件来管理配置,这是一种简单而有效的方案:
2.1 方案特点
-
简单直观:使用键值对格式,易于理解和编辑
-
环境隔离:不同环境使用不同的
.env
文件 -
版本控制友好:敏感信息不会意外提交到Git
-
自动加载:程序启动时自动读取并应用配置
2.2 核心实现
我们在config/settings.py
中实现了轻量级的配置管理:
def load_env_file(env_file: str = ".env") -> None:
"""加载.env文件到环境变量"""
env_path = Path(env_file)
ifnot env_path.exists():
return
with open(env_path, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if line andnot line.startswith('#') and'='in line:
key, value = line.split('=', 1)
os.environ[key.strip()] = value.strip()
def get_atmquant_settings() -> Dict[str, Any]:
"""获取ATMQuant配置"""
# 加载.env文件
load_env_file()
# 基础配置
settings = {
# 字体设置
"font.family": "微软雅黑",
"font.size": 12,
# 日志设置
"log.active": True,
"log.level": INFO,
"log.console": True,
"log.file": True,
# 邮件设置
"email.server": os.getenv("EMAIL_SERVER", ""),
"email.port": int(os.getenv("EMAIL_PORT", "0")),
"email.username": os.getenv("EMAIL_USERNAME", ""),
"email.password": os.getenv("EMAIL_PASSWORD", ""),
"email.sender": os.getenv("EMAIL_SENDER", ""),
"email.receiver": os.getenv("EMAIL_RECEIVER", ""),
# 数据源设置
"datafeed.name": os.getenv("DATAFEED_NAME", ""),
"datafeed.username": os.getenv("DATAFEED_USERNAME", ""),
"datafeed.password": os.getenv("DATAFEED_PASSWORD", ""),
# 数据库设置
"database.timezone": get_localzone_name(),
"database.name": os.getenv("DATABASE_TYPE", "sqlite"),
"database.database": os.getenv("DATABASE_NAME", "atmquant.db"),
"database.host": os.getenv("DATABASE_HOST", ""),
"database.port": int(os.getenv("DATABASE_PORT", "0")),
"database.user": os.getenv("DATABASE_USER", ""),
"database.password": os.getenv("DATABASE_PASSWORD", ""),
}
return settings
def apply_settings():
"""应用配置到vnpy.trader.setting.SETTINGS"""
from vnpy.trader.setting import SETTINGS
# 加载.env文件
load_env_file()
# 从环境变量构建配置
atmquant_settings = get_atmquant_settings()
# 更新vnpy的SETTINGS
SETTINGS.update(atmquant_settings)
2.3 程序集成
在main.py
中,我们在程序启动的最开始调用配置加载:
def main():
# 在导入vnpy模块之前加载配置
try:
from config.settings import apply_settings
apply_settings()
except Exception as e:
print(f"⚠️ 配置加载失败: {e}")
# 然后导入vnpy模块
from vnpy.trader.engine import MainEngine
# ... 其他初始化代码
这样确保vnpy使用的是我们自定义的配置。
三、配置文件详解
3.1 .env文件格式
.env
文件使用简单的键值对格式:
# ATMQuant环境配置文件
# 数据库配置
DATABASE_TYPE=sqlite
DATABASE_NAME=atmquant.db
DATABASE_HOST=localhost
DATABASE_PORT=3306
DATABASE_USER=root
DATABASE_PASSWORD=your_password
# 数据源配置
DATAFEED_NAME=tqsdk
DATAFEED_USERNAME=your_username
DATAFEED_PASSWORD=your_password
# 邮件配置(可选)
EMAIL_SERVER=smtp.qq.com
EMAIL_PORT=465
EMAIL_USERNAME=your_email@qq.com
EMAIL_PASSWORD=your_email_password
3.2 配置项说明
数据库配置:
-
DATABASE_TYPE
:数据库类型(sqlite/mysql/postgresql) -
DATABASE_NAME
:数据库名称或SQLite文件名 -
DATABASE_HOST
:数据库主机地址 -
DATABASE_PORT
:数据库端口 -
DATABASE_USER
:数据库用户名 -
DATABASE_PASSWORD
:数据库密码
数据源配置:
-
DATAFEED_NAME
:数据源名称(tqsdk/joinquant等) -
DATAFEED_USERNAME
:数据源用户名 -
DATAFEED_PASSWORD
:数据源密码
四、数据库配置
4.1 SQLite配置(推荐)
SQLite是轻量级文件数据库,无需安装服务器,是开发环境的最佳选择。
安装数据库驱动:
pip install vnpy_sqlite
配置文件:
DATABASE_TYPE=sqlite
DATABASE_NAME=atmquant.db
适用场景:开发环境、个人使用、小规模数据
4.2 MySQL配置
MySQL适合生产环境和大数据量场景。在第三篇文章中我们已经介绍过MySQL的安装配置,这里简要回顾一下。
安装数据库驱动:
pip install vnpy_mysql
安装MySQL服务器(如果还没有):
# macOS
brew install mysql
brew services start mysql
# Ubuntu/Debian
sudo apt update
sudo apt install mysql-server
sudo systemctl start mysql
# CentOS/RHEL
sudo yum install mysql-server
sudo systemctl start mysqld
创建数据库:
mysql -u root -p
CREATEDATABASE atmquant CHARACTERSET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATEUSER'atmquant'@'localhost'IDENTIFIEDBY'your_password';
GRANTALLPRIVILEGESON atmquant.* TO'atmquant'@'localhost';
FLUSHPRIVILEGES;
配置文件:
DATABASE_TYPE=mysql
DATABASE_HOST=localhost
DATABASE_PORT=3306
DATABASE_USER=atmquant
DATABASE_PASSWORD=your_password
DATABASE_NAME=atmquant
适用场景:生产环境、大数据量、多用户并发
五、数据源配置
5.1 天勤数据
根据本人使用经验,经过对比米筐、恒生等多家数据服务商,天勤数据在准确性方面表现最佳,免费版本已能满足大部分量化开发需求。且每个手机号注册新账号可以升级为专业版,试用15天。请大家务必抓紧在这段时间内尽可能的下载更多历史数据。
注册天勤账户:
天勤官网首页
-
访问官网:https://www.shinnytech.com/
-
注册账户:
-
点击"用户中心",进入到注册登录界面
-
填写手机号码和验证码
-
设置密码完成注册
-
-
天勤量化升级到专业版(可选,获取tick和K线任意周期数据权限):
-
登录后进入"个人中心"
-
点击“天勤量化专业版试用申请”,提交个人信息
-
专业版用户可获得更高的数据访问权限
-
免费版权限:
-
实时行情数据
-
历史K线数据(任意周期序列最多前10000条)
-
期货、期权数据
配置方法:
DATAFEED_NAME=tqsdk
DATAFEED_USERNAME=your_phone_number
DATAFEED_PASSWORD=your_password
安装天勤SDK:
pip install vnpy_tqsdk
5.2 其他数据源
-
米筐数据:
DATAFEED_NAME=rqdata
-
Wind数据:
DATAFEED_NAME=wind
六、邮件通知配置
vnpy支持邮件通知功能,可以在策略运行、系统异常等情况下发送邮件提醒。
6.1 QQ邮箱配置(推荐)
QQ邮箱是最常用的邮件服务,配置简单:
QQ邮箱配置
开启SMTP服务:
-
登录QQ邮箱网页版
-
点击"设置" → "账号"
-
找到"POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务"
-
开启"IMAP/SMTP服务"
-
获取授权码(不是QQ密码)
配置文件:
EMAIL_SERVER=smtp.qq.com
EMAIL_PORT=465
EMAIL_USERNAME=your_qq@qq.com
EMAIL_PASSWORD=your_authorization_code
EMAIL_SENDER=your_qq@qq.com
EMAIL_RECEIVER=your_qq@qq.com
6.2 163邮箱配置
配置文件:
EMAIL_SERVER=smtp.163.com
EMAIL_PORT=465
EMAIL_USERNAME=your_name@163.com
EMAIL_PASSWORD=your_authorization_code
EMAIL_SENDER=your_name@163.com
EMAIL_RECEIVER=your_name@163.com
6.3 Gmail配置
配置文件:
EMAIL_SERVER=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USERNAME=your_name@gmail.com
EMAIL_PASSWORD=your_app_password
EMAIL_SENDER=your_name@gmail.com
EMAIL_RECEIVER=your_name@gmail.com
6.5 邮件通知使用场景
-
策略启动/停止:策略状态变化通知
-
交易信号:重要交易信号提醒
-
系统异常:程序错误、连接断开等
-
风控触发:止损、仓位超限等风控事件
-
定时报告:每日交易总结、收益报告
注意事项:
-
使用授权码而非登录密码
-
建议使用SSL加密连接(端口465)
-
发送频率不要过高,避免被限制
-
可以设置不同的发送者和接收者邮箱
七、程序集成
7.1 main.py中的配置加载
为了让配置自动生效,我们在main.py
的开头添加了配置加载代码:
def main():
"""主函数"""
print("=" * 60)
print("ATMQuant - AI量化交易系统")
print("基于vnpy 4.1框架")
print("=" * 60)
# 加载ATMQuant配置
try:
from config.settings import apply_settings
apply_settings()
except Exception as e:
print(f"⚠️ 配置加载失败: {e}")
try:
# 导入vnpy核心模块
from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
# ... 其他初始化代码
关键点:
-
配置加载在vnpy模块导入之前执行
-
这样确保vnpy使用的是我们的配置
-
异常处理确保配置加载失败不会影响程序启动
7.2 快速开始
-
安装数据库驱动(SQLite推荐):
pip install vnpy_sqlite
-
复制配置文件:
cp .env.example .env
-
编辑配置(可选,默认使用SQLite):
vim .env
-
启动程序:
python main.py
7.3 配置验证
启动程序后,你会看到类似输出:
============================================================
ATMQuant - AI量化交易系统
基于vnpy 4.1框架
============================================================
✓ ATMQuant配置已加载
✓ vnpy核心模块导入成功
✓ 事件引擎创建成功
✓ 主引擎创建成功
如果看到"✓ ATMQuant配置已加载",说明配置系统工作正常。
七、最佳实践
7.1 环境隔离
为不同环境创建不同的配置文件:
# 开发环境
.env.dev
# 测试环境
.env.test
# 生产环境
.env.prod
使用时指定环境:
cp .env.dev .env # 切换到开发环境
python main.py
7.2 安全建议
-
不要提交敏感信息:将
.env
添加到.gitignore
-
使用强密码:数据库和数据源密码要足够复杂
-
定期更换:定期更换数据源账户密码
-
权限控制:限制
.env
文件的访问权限
7.3 配置模板
为团队提供配置模板:
# .env.template
DATABASE_TYPE=sqlite
DATABASE_NAME=atmquant.db
DATAFEED_NAME=
DATAFEED_USERNAME=
DATAFEED_PASSWORD=
八、最佳实践
8.1 环境隔离
为不同环境创建不同的配置文件:
# 开发环境
.env.dev
# 测试环境
.env.test
# 生产环境
.env.prod
使用时指定环境:
cp .env.dev .env # 切换到开发环境
python main.py
8.2 安全建议
-
不要提交敏感信息:将
.env
添加到.gitignore
-
使用强密码:数据库和数据源密码要足够复杂
-
定期更换:定期更换数据源账户密码
-
权限控制:限制
.env
文件的访问权限
8.3 配置模板
为团队提供配置模板:
# .env.template
DATABASE_TYPE=sqlite
DATABASE_NAME=atmquant.db
DATAFEED_NAME=
DATAFEED_USERNAME=
DATAFEED_PASSWORD=
EMAIL_SERVER=
EMAIL_USERNAME=
EMAIL_PASSWORD=
九、常见问题
9.1 数据库驱动缺失
问题:启动时提示"找不到数据库驱动vnpy_sqlite"
解决:
# SQLite(推荐)
pip install vnpy_sqlite
# MySQL
pip install vnpy_mysql
# PostgreSQL
pip install vnpy_postgresql
9.2 配置不生效
问题:修改了.env
文件但配置没有生效
解决:
-
检查
.env
文件格式是否正确 -
确保没有多余的空格
-
重启程序让配置生效
9.3 数据库连接失败
问题:数据库连接失败
解决:
-
检查数据库服务是否启动
-
验证用户名密码是否正确
-
确认网络连接正常
-
确保已安装对应的数据库驱动
9.4 数据源认证失败
问题:数据源登录失败
解决:
-
检查用户名密码是否正确
-
确认账户是否有效
-
查看数据源服务状态
9.5 邮件发送失败
问题:邮件通知发送失败
解决:
-
检查邮箱SMTP服务是否开启
-
确认使用的是授权码而非登录密码
-
验证SMTP服务器地址和端口
-
检查网络防火墙设置
十、配置原理
10.1 加载时机
配置加载的关键是时机,必须在vnpy模块导入之前完成:
# main.py
def main():
# 1. 首先加载配置
from config.settings import apply_settings
apply_settings()
# 2. 然后导入vnpy模块
from vnpy.trader.engine import MainEngine
# 此时MainEngine使用的是我们的配置
10.2 加载流程
程序启动时的完整流程:
-
读取.env文件:解析键值对到环境变量
-
构建配置字典:从环境变量构建vnpy配置
-
更新SETTINGS:将配置应用到
vnpy.trader.setting.SETTINGS
-
导入vnpy模块:vnpy使用更新后的配置
10.3 核心代码
# config/settings.py
def apply_settings():
"""应用配置到vnpy.trader.setting.SETTINGS"""
from vnpy.trader.setting import SETTINGS
# 加载.env文件
load_env_file()
# 构建配置
atmquant_settings = get_atmquant_settings()
# 更新vnpy配置
SETTINGS.update(atmquant_settings)
这种方式直接覆盖vnpy的默认配置,简单有效。
十一、总结
11.1 方案优势
我们的轻量级配置方案具有以下优势:
-
简单易用:只需编辑
.env
文件 -
环境隔离:不同环境独立配置
-
自动加载:程序启动时自动应用
-
版本控制友好:敏感信息不会泄露
-
无侵入性:不修改vnpy源码
11.2 适用场景
-
个人开发:快速配置开发环境
-
团队协作:统一配置管理
-
多环境部署:开发、测试、生产环境
-
CI/CD:自动化部署流程
11.3 核心文件
-
config/settings.py:配置管理核心代码
-
.env:环境配置文件
-
main.py:程序入口,自动加载配置
11.4 下一步
在下一篇文章中,我们将基于这个配置系统,介绍:
-
数据源接入:如何配置和使用各种数据源
-
历史数据管理:数据下载、存储和查询
-
实时数据处理:构建数据流处理系统
-
策略开发基础:为策略开发做准备
下期预告:《以AI量化为生:5.数据源接入与历史数据管理》
关注公众号"堂主的ATMQuant",获取更多量化交易干货!
更多推荐
所有评论(0)