本文是《以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天。请大家务必抓紧在这段时间内尽可能的下载更多历史数据。

注册天勤账户

天勤官网首页

天勤官网首页

  1. 访问官网:https://www.shinnytech.com/

  2. 注册账户

    • 点击"用户中心",进入到注册登录界面

    • 填写手机号码和验证码

    • 设置密码完成注册

  3. 天勤量化升级到专业版(可选,获取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邮箱配置

QQ邮箱配置

开启SMTP服务

  1. 登录QQ邮箱网页版

  2. 点击"设置" → "账号"

  3. 找到"POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务"

  4. 开启"IMAP/SMTP服务"

  5. 获取授权码(不是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 快速开始

  1. 安装数据库驱动(SQLite推荐):

pip install vnpy_sqlite
  1. 复制配置文件

cp .env.example .env
  1. 编辑配置(可选,默认使用SQLite):

vim .env
  1. 启动程序

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文件但配置没有生效

解决

  1. 检查.env文件格式是否正确

  2. 确保没有多余的空格

  3. 重启程序让配置生效

9.3 数据库连接失败

问题:数据库连接失败

解决

  1. 检查数据库服务是否启动

  2. 验证用户名密码是否正确

  3. 确认网络连接正常

  4. 确保已安装对应的数据库驱动

9.4 数据源认证失败

问题:数据源登录失败

解决

  1. 检查用户名密码是否正确

  2. 确认账户是否有效

  3. 查看数据源服务状态

9.5 邮件发送失败

问题:邮件通知发送失败

解决

  1. 检查邮箱SMTP服务是否开启

  2. 确认使用的是授权码而非登录密码

  3. 验证SMTP服务器地址和端口

  4. 检查网络防火墙设置

十、配置原理

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 加载流程

程序启动时的完整流程:

  1. 读取.env文件:解析键值对到环境变量

  2. 构建配置字典:从环境变量构建vnpy配置

  3. 更新SETTINGS:将配置应用到vnpy.trader.setting.SETTINGS

  4. 导入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 下一步

在下一篇文章中,我们将基于这个配置系统,介绍:

  1. 数据源接入:如何配置和使用各种数据源

  2. 历史数据管理:数据下载、存储和查询

  3. 实时数据处理:构建数据流处理系统

  4. 策略开发基础:为策略开发做准备


下期预告:《以AI量化为生:5.数据源接入与历史数据管理》


关注公众号"堂主的ATMQuant",获取更多量化交易干货!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐