VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy

置顶主题

基于TDengine实现海量高频Tick数据录制

发布于VeighNa社区公众号【vnpy-community】
 
原文作者:用Python的交易员 | 发布时间:2025-03-15
 
在量化交易领域,高质量的行情数据是策略研发和回测的基础。近期在VeighNa社区中,经常有用户咨询关于高频Tick数据录制的问题。

传统的SQLite等关系型数据库在面对大量合约同时录制的场景时,往往因写入性能瓶颈导致丢包,影响数据完整性。

为了解决以上难题,本文中将介绍如何利用VeighNa量化平台结合TDengine时序数据库,实现高效的行情数据录制。

 

安装配置TDengine

 

对于大多数VeighNa用户,推荐使用TDengine 3.0版本的Docker容器镜像来安装配置时序数据库的服务端程序。

首先需要确保操作系统中已经安装好了Docker,并将其设置为随操作系统启动自动运行。使用Windows系统的同学可以参考这篇文章中的Docker Desktop安装教程:https://mp.weixin.qq.com/s/m3whdCs6jRs-Ye3Ip5oZmw

随后使用命令拉取TDengine容器镜像:

docker pull tdengine/tdengine:latest

拉取完成后,通过下述命令来启动数据库服务容器:

docker run -d `
  -v C:/my_tdengine/data:/var/lib/taos `
  -v C:/my_tdengine/log:/var/log/taos `
  -p 6030:6030 `  
  -p 6041:6041 `  
  -p 6043:6043 `  
  -p 6044-6049:6044-6049 `  
  -p 6044-6045:6044-6045/udp `  
  -p 6060:6060 `  
  --restart=always `  
  tdengine/tdengine

注意,以上PowerShell多行命令的每行结尾使用了反引号(键盘Tab上方按键)作为换行符。将上述命令复制到PowerShell窗口中运行,等待几秒后容器启动成功会输出一段较长的随机字符串(容器编号)。

命令中的具体参数(以-或者--开头)说明如下:

-v:用于挂载Windows系统下的指定文件夹到容器中,为容器中运行的TDengine程序提供数据存储输出,可以根据自己的需求修改:
* /var/lib/taos,对应的是TDengine的数据存储路径
* /var/log/taos,对应的是TDengine的日志输出路径。

-p:用于将Windows系统的端口映射绑定到容器中对应的端口,为外部程序提供数据库访问,这些端口参数建议保持不变:
* 6030,主要用于应用程序(如VeighNa)连接TDengine;
* 6041,提供数据库管理终端(如DBeaver)连接TDengine;
* 其他端口提供更加进阶的功能,这里可以忽略。

--restart:用于设置容器的重启策略,always代表每次Docker Desktop启动后都立即启动TDengine容器,结合之前设置的Docker Desktop开机自动启动即可实现时序数据库的后台服务式运行。

 

数据录制脚本

 

安装配置好TDengine后,只需运行一个简单的Python脚本,就能开始高效录制行情数据。

导入必要模块

首先,需要导入相关的Python标准库和VeighNa框架组件:

# 加载Python标准库
from logging import INFO
from time import sleep

# 加载VeighNa核心框架
from vnpy.event import EventEngine, Event
from vnpy.trader.setting import SETTINGS
from vnpy.trader.engine import MainEngine, LogEngine
from vnpy.trader.object import ContractData
from vnpy.trader.constant import Exchange, Product
from vnpy.trader.event import EVENT_CONTRACT

# 加载VeighNa插件模块
from vnpy_ctp import CtpGateway
from vnpy_datarecorder import DataRecorderApp, RecorderEngine
from vnpy_datarecorder.engine import EVENT_RECORDER_LOG

这部分代码导入了程序运行所需的各种模块:

  • Python标准库中的日志和时间模块
  • VeighNa核心框架中的事件引擎、主引擎、日志引擎等组件
  • VeighNa的CTP接口和数据录制应用模块

配置日志设置

日志对于监控系统运行状态和排查问题至关重要:

# 开启日志记录功能
SETTINGS["log.active"] = True       # 激活日志功能
SETTINGS["log.level"] = INFO        # 设置日志级别为INFO,输出详细信息
SETTINGS["log.console"] = True      # 在控制台显示日志,方便实时查看

这段代码配置了VeighNa的日志系统,设置为INFO级别并在控制台显示,便于实时监控数据录制过程中的各种事件和可能出现的问题。

设置登录信息

接下来,配置连接到期货市场所需的CTP接口信息:

# CTP接口登录信息
# 以下使用的是SimNow模拟账户信息,初学者可以在SimNow官网申请
ctp_setting: dict[str, str] = {
    "用户名": "demo",                        # SimNow账户名
    "密码": "123456",                        # SimNow密码
    "经纪商代码": "9999",                     # SimNow经纪商代码固定为9999
    "交易服务器": "180.168.146.187:10201",    # SimNow交易服务器地址和端口
    "行情服务器": "180.168.146.187:10211",    # SimNow行情服务器地址和端口
    "产品名称": "simnow_client_test",         # 产品名称,用于区分不同的客户端
    "授权编码": "0000000000000000"            # 授权编码,SimNow模拟账户使用默认值即可
}

这里使用的是SimNow仿真账户(记得替换为你的用户名和密码),在实盘环境中需要替换为实际的期货账户信息。

定义录制范围

为了灵活控制数据录制的范围,脚本允许指定要录制的交易所和品种类型:

# 要录制数据的交易所列表
recording_exchanges: list[Exchange] = [
    Exchange.CFFEX,          # 中国金融期货交易所
    # Exchange.SHFE,         # 上海期货交易所
    # Exchange.DCE,          # 大连商品交易所
    # Exchange.CZCE,         # 郑州商品交易所
    # Exchange.GFEX,         # 广州期货交易所
    # Exchange.INE,          # 上海国际能源交易中心
]

# 要录制数据的品种类型
recording_products: list[Product] = [
    Product.FUTURES,        # 期货品种
    # Product.OPTION,       # 期权品种
]

这段代码定义了两个列表,分别指定要录制数据的交易所和品种类型。默认只录制中国金融期货交易所的期货品种,用户可以根据需要取消注释来添加更多交易所和品种。

主函数实现

脚本的核心是run_recorder函数,它负责初始化系统组件并启动数据录制:

def run_recorder() -> None:
    """
    运行行情录制程序

    该函数是程序的主体,按照以下步骤工作:
    1. 创建VeighNa核心组件(事件引擎、主引擎)
    2. 添加交易接口和应用模块
    3. 设置数据录制规则
    4. 连接到交易所并开始录制数据
    """
    # 创建事件引擎,负责系统内各模块间的通信
    event_engine: EventEngine = EventEngine()

    # 创建主引擎,管理系统功能模块,包括底层接口、上层应用等
    main_engine: MainEngine = MainEngine(event_engine)

    # 添加CTP接口,连接到期货市场
    main_engine.add_gateway(CtpGateway)

    # 添加数据录制引擎,用于录制Tick行情入库
    recorder_engine: RecorderEngine = main_engine.add_app(DataRecorderApp)

这部分代码初始化了VeighNa的核心组件:

  1. 创建事件引擎,负责系统内各模块间的事件驱动通信
  2. 创建主引擎,管理系统的各个功能模块
  3. 添加CTP接口,用于连接到期货市场
  4. 添加数据录制应用,用于将接收到的行情数据保存到数据库

合约订阅处理

接下来,定义了一个合约订阅函数,用于自动订阅符合条件的合约行情:

# 定义合约订阅函数
    def subscribe_data(event: Event) -> None:
        """
        处理合约推送并订阅行情

        当系统接收到合约信息后,根据预设的交易所和品种过滤条件,
        自动为符合条件的合约添加行情录制任务。

        参数:
            event: 包含合约信息的事件对象
        """
        # 从事件对象中获取合约数据
        contract: ContractData = event.data

        # 判断合约是否符合录制条件
        if (
            contract.exchange in recording_exchanges    # 检查合约所属交易所是否在预设列表中
            and contract.product in recording_products  # 检查合约品种类型是否在预设列表中
        ):
            # 添加该合约的行情录制任务,vt_symbol是VeighNa中的唯一标识符,格式为"代码.交易所"
            recorder_engine.add_tick_recording(contract.vt_symbol)
    # 注册合约事件处理函数,当有新合约信息推送时,会自动调用subscribe_data函数
    event_engine.register(EVENT_CONTRACT, subscribe_data)

这里基于VeighNa平台核心的事件驱动架构,实现了一套自动化的合约订阅机制:

  1. 当CTP接口接收到合约信息时,会触发EVENT_CONTRACT事件
  2. 事件引擎调用注册的subscribe_data函数处理该事件
  3. 函数检查合约是否符合预设的交易所和品种条件
  4. 对于符合条件的合约,自动添加Tick数据录制任务

该机制使得系统能够自动识别和订阅符合条件的合约,无需手动指定每个合约代码。

模块日志输出

为了方便监控DataRecorder数据录制模块的内部运行状态,脚本还定义了专门的日志输出函数:

# 获取日志引擎并设置日志处理
    log_engine: LogEngine = main_engine.get_engine("log")

    def print_log(event: Event) -> None:
        """
        处理数据录制模块的日志事件

        将数据录制模块产生的日志信息输出到控制台和日志文件中,
        便于监控录制过程和排查问题。

        参数:
            event: 包含日志信息的事件对象
        """
        log_engine.logger.log(INFO, event.data)

    # 注册日志事件处理函数,当有新的日志推送时,会自动调用print_log函数
    event_engine.register(EVENT_RECORDER_LOG, print_log)

注意前面对于SETTINGS全局配置字典的修改,仅影响底层接口和核心引擎部分的日志记录,而这里的DataRecorder模块属于上层应用,需要注册额外的日志事件处理函数后才能实现输出。

接口连接登录

之后就可以连接登录CTP接口并开始录制数据:

# 连接CTP接口并登录,第一个参数是接口设置,第二个参数是接口名称
    main_engine.connect(ctp_setting, CtpGateway.default_name)

    # 等待30秒,CTP接口连接后需要一段时间来完成初始化
    sleep(30)

    # 提示用户程序已经开始运行,用户可以根据需要随时退出
    input(">>>>>> 高频行情数据录制已启动,正在记录数据。按回车键退出程序 <<<<<<")

    # 关闭主引擎实现安全退出,避免出现内存中未入库数据的丢失
    main_engine.close()

这部分代码完成了以下操作:

  1. 连接CTP接口并登录
  2. 等待30秒,让CTP接口完成初始化(包括合约查询、订阅等操作)
  3. 提示用户程序已经开始运行,并等待用户按回车键退出
  4. 当用户按下回车键后,安全关闭主引擎,确保所有数据都被正确保存

程序标准入口

最后是Python程序的标准入口:

# Python程序的标准入口写法,直接运行此脚本时会执行run_recorder函数
if __name__ == "__main__":
    run_recorder()

当直接运行该脚本时,会执行run_recorder函数开始数据录制。

脚本补充说明

通过替换脚本中加载的底层接口模块和连接登录配置,就可以很方便的实现不同市场的高频Tick数据录制。

除了TDengine外,同样也可以使用其他VeighNa支持的高性能数据库(如DolphinDB等)作为后端的数据存储服务。

 

完整脚本代码

 

在文章结尾,附上完整的tick_recorder.py脚本源代码:

"""
该程序使用VeighNa框架通过CTP接口连接到期货市场,并自动录制指定交易所和品种的行情数据。

适合初学者了解VeighNa框架的基本用法和数据录制流程。
"""

# 加载Python标准库
from logging import INFO
from time import sleep

# 加载VeighNa核心框架
from vnpy.event import EventEngine, Event
from vnpy.trader.setting import SETTINGS
from vnpy.trader.engine import MainEngine, LogEngine
from vnpy.trader.object import ContractData
from vnpy.trader.constant import Exchange, Product
from vnpy.trader.event import EVENT_CONTRACT

# 加载VeighNa插件模块
from vnpy_ctp import CtpGateway
from vnpy_datarecorder import DataRecorderApp, RecorderEngine
from vnpy_datarecorder.engine import EVENT_RECORDER_LOG


# 开启日志记录功能
# 日志对于排查问题和监控系统运行状态非常重要
SETTINGS["log.active"] = True       # 激活日志功能
SETTINGS["log.level"] = INFO        # 设置日志级别为INFO,输出详细信息
SETTINGS["log.console"] = True      # 在控制台显示日志,方便实时查看


# CTP接口登录信息
# 以下使用的是SimNow模拟账户信息,初学者可以在SimNow官网申请
ctp_setting: dict[str, str] = {
    "用户名": "demo",                       # SimNow账户名
    "密码": "Vnpy@123456",                    # SimNow密码
    "经纪商代码": "9999",                     # SimNow经纪商代码固定为9999
    "交易服务器": "180.168.146.187:10201",    # SimNow交易服务器地址和端口
    "行情服务器": "180.168.146.187:10211",    # SimNow行情服务器地址和端口
    "产品名称": "simnow_client_test",         # 产品名称,用于区分不同的客户端
    "授权编码": "0000000000000000"            # 授权编码,SimNow模拟账户使用默认值即可
}


# 要录制数据的交易所列表
# 可以根据需要取消注释来添加更多交易所
recording_exchanges: list[Exchange] = [
    Exchange.CFFEX,          # 中国金融期货交易所
    # Exchange.SHFE,         # 上海期货交易所
    # Exchange.DCE,          # 大连商品交易所
    # Exchange.CZCE,         # 郑州商品交易所
    # Exchange.GFEX,         # 广州期货交易所
    # Exchange.INE,          # 上海国际能源交易中心
]


# 要录制数据的品种类型
# 可以根据需要取消注释来添加更多品种
recording_products: list[Product] = [
    Product.FUTURES,        # 期货品种
    # Product.OPTION,       # 期权品种
]


def run_recorder() -> None:
    """
    运行行情录制程序

    该函数是程序的主体,按照以下步骤工作:
    1. 创建VeighNa核心组件(事件引擎、主引擎)
    2. 添加交易接口和应用模块
    3. 设置数据录制规则
    4. 连接到交易所并开始录制数据
    """
    # 创建事件引擎,负责系统内各模块间的通信
    event_engine: EventEngine = EventEngine()

    # 创建主引擎,管理系统功能模块,包括底层接口、上层应用等
    main_engine: MainEngine = MainEngine(event_engine)

    # 添加CTP接口,连接到期货市场
    main_engine.add_gateway(CtpGateway)

    # 添加数据录制引擎,用于录制Tick行情入库
    recorder_engine: RecorderEngine = main_engine.add_app(DataRecorderApp)

    # 定义合约订阅函数
    def subscribe_data(event: Event) -> None:
        """
        处理合约推送并订阅行情

        当系统接收到合约信息后,根据预设的交易所和品种过滤条件,
        自动为符合条件的合约添加行情录制任务。

        参数:
            event: 包含合约信息的事件对象
        """
        # 从事件对象中获取合约数据
        contract: ContractData = event.data

        # 判断合约是否符合录制条件
        if (
            contract.exchange in recording_exchanges    # 检查合约所属交易所是否在预设列表中
            and contract.product in recording_products  # 检查合约品种类型是否在预设列表中
        ):
            # 添加该合约的行情录制任务,vt_symbol是VeighNa中的唯一标识符,格式为"代码.交易所"
            recorder_engine.add_tick_recording(contract.vt_symbol)

    # 注册合约事件处理函数,当有新合约信息推送时,会自动调用subscribe_data函数
    event_engine.register(EVENT_CONTRACT, subscribe_data)

    # 获取日志引擎并设置日志处理
    log_engine: LogEngine = main_engine.get_engine("log")

    def print_log(event: Event) -> None:
        """
        处理数据录制模块的日志事件

        将数据录制模块产生的日志信息输出到控制台和日志文件中,
        便于监控录制过程和排查问题。

        参数:
            event: 包含日志信息的事件对象
        """
        log_engine.logger.log(INFO, event.data)

    # 注册日志事件处理函数,当有新的日志推送时,会自动调用print_log函数
    event_engine.register(EVENT_RECORDER_LOG, print_log)

    # 连接CTP接口并登录,第一个参数是接口设置,第二个参数是接口名称
    main_engine.connect(ctp_setting, CtpGateway.default_name)

    # 等待30秒,CTP接口连接后需要一段时间来完成初始化
    sleep(30)

    # 提示用户程序已经开始运行,用户可以根据需要随时退出
    input(">>>>>> 高频行情数据录制已启动,正在记录数据。按回车键退出程序 <<<<<<")

    # 关闭主引擎实现安全退出,避免出现内存中未入库数据的丢失
    main_engine.close()


# Python程序的标准入口写法,直接运行此脚本时会执行run_recorder函数
if __name__ == "__main__":
    run_recorder()

 



本地部署vnpy$发环境[适用于windows+mac]

安装流程:

  1. 下载 anaconda,并安装
  2. 下载pycharm,并安装
  3. 下载vnpy源码vn.py
    下载源码
  4. 打开 pycharm, file->open,选择下载的vnpy 文件夹
    pycharm打开vnpy文件夹
  5. 配置 python 开发环境, file- settings
    pycharm项目设置
    添加新的anaconda环境
    description
    选择python3.7
    description
    这里我使用的环境名称是 py37_vnpy

打开terminal-注意环境切换成 py37_vnpy,执行以下命令,安装需要的插件

pip install -r requirements.txt -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

description
遇到安装失败的可以单独安装:

pip install PyQt5 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

description

  1. 创建run.py文件,复制以下代码,来源 README.md

description

  1. 运行 python run.py,注意环境名称是 py37_vnpy

description

备注:
如果需要在cmd 下使用 py37_vnpy 环境。

打开 CMD
运行: conda activate py37_vnpy
会切换到py37_vnpy环境下

description



VeighNa发布v4.0.0 - 迈向开源量化的下一个十年!

发布于VeighNa社区公众号【vnpy-community】
 
原文作者:用Python的交易员 | 发布时间:2025-04-15
 
自2015年3月发布以来,VeighNa已经走过了作为开源项目的第一个十年。在这段时间里,VeighNa的成长离不开广大社区用户的持续贡献。在此,我们要向VeighNa社区的每一位成员表达最真挚的感谢!

上月底,VeighNa迎来了4.0.0版本的发布,这是VeighNa 4.0大版本的首次更新。此次更新的核心亮点包括全新推出的针对AI量化策略的vnpy.alpha子模块,并将核心支持版本升级至Python 3.13,大幅提升整体性能的同时,还进一步完善了VeighNa的软件工程架构。

鉴于本次更新涉及Python核心支持的升级(从3.10更新至3.13),因此无法通过VeighNa Station的自动更新功能完成升级。用户需要先卸载旧版的VeighNa Studio,然后重新下载并安装VeighNa Studio 4.0.0版本,下载链接:

https://download.vnpy.com/veighna_studio-4.0.0.exe

 

面向AI量化策略的vnpy.alpha

 

本次发布中新增了面向AI量化策略的vnpy.alpha模块,为专业量化交易员提供一站式多因子机器学习(ML)策略开发、投研和实盘交易解决方案:

description

📊dataset - 因子特征工程

  • 专为ML算法训练优化设计,支持高效批量特征计算与处理
  • 内置丰富的因子特征表达式计算引擎,实现快速一键生成训练数据
  • Alpha 158:源于微软Qlib项目的股票市场特征集合,涵盖K线形态、价格趋势、时序波动等多维度量化因子

💡 model - 预测模型训练

  • 提供标准化的ML模型开发模板,大幅简化模型构建与训练流程

  • 统一API接口设计,支持无缝切换不同算法进行性能对比测试

  • 集成多种主流机器学习算法:

    • Lasso:经典Lasso回归模型,通过L1正则化实现特征选择
    • LightGBM:高效梯度提升决策树,针对大规模数据集优化的训练引擎
    • MLP:多层感知机神经网络,适用于复杂非线性关系建模

🤖 strategy - 策略投研开发

  • 基于ML信号预测模型快速构建量化交易策略
  • 支持截面多标的和时序单标的两种策略类型

🔬 lab - 投研流程管理

  • 集成数据管理、模型训练、信号生成和策略回测等完整工作流程
  • 简洁API设计,内置可视化分析工具,直观评估策略表现和模型效果

📖 notebook - 量化投研Demo

  • download_data_rq:基于RQData下载A股指数成分股数据,包含指数成分变化跟踪及历史行情获取
  • research_workflow_lasso:基于Lasso回归模型的量化投研工作流,展示线性模型特征选择与预测能力
  • research_workflow_lgb:基于LightGBM梯度提升树的量化投研工作流,利用高效集成学习方法进行预测
  • research_workflow_mlp:基于多层感知机神经网络的量化投研工作流,展示深度学习在量化交易中的应用

vnpy.alpha模块的设计理念受到Qlib项目的启发,在保持易用性的同时提供强大的AI量化能力,特此向Qlib开发团队致以诚挚感谢!

由于截面多因子策略的开发涉及跨学科知识体系——包括金融理论建模、海量数据处理、以及机器学习算法实践,不少社区用户在阅读相关开源代码后仍反馈“无从下手、不知如何系统学习”。如果你也有类似困惑,我们强烈推荐即将于6月举办的2025年第二场小班特训营《机器学习截面多因子策略》,本次特训营将以实战为导向,从零搭建一套完整的机器学习因子策略开发流程,课程大纲及报名信息详见报名公告

 

Python 3.13核心支持升级

 

自Guido启动Shannon Plan项目以来,过去数年中每一个Python大版本的迭代都显著提升了解释器的执行性能。因此,在VeighNa 4.0版本中,我们将核心支持升级至最新的Python 3.13,并结合新引入的语言特性,对核心框架的代码进行了重构,以进一步提升系统的运行效率与代码可维护性。

同时,依据《2025年VeighNa项目计划》中所提出的路线,4.0版本也在软件工程层面进行了多项关键性改进,全面优化了项目的架构设计与开发流程,具体包括:

  • 构建系统升级:全面采用pyproject.toml 构建体系,替代传统的 setup.py/setup.cfg,对接更现代的Python构建工具生态。
  • 跨平台编译支持:交易接口模块中涉及C++封装的部分,现使用meson-python进行编译,支持模块化安装的pybind11,并实现对 Windows、Linux 和Mac的统一跨系统构建。
  • 代码质量管理:引入ruff作为默认的代码质量检查工具,替代传统的flake8;并使用mypy进行静态类型检查,全面提升代码的类型注解完整性与一致性。
  • 开发环境管理:在涉及VeighNa二次开发的使用场景中,推荐使用uv工具作为开发环境管理方案,覆盖从虚拟环境创建、依赖管理,到打包上传发布的全流程。
  • 日志系统优化:采用第三方库loguru替代原有内置的logging模块,为底层日志系统提供更强大、更灵活的输出功能。

 

4.0版本的功能模块移植计划

 

VeighNa 4.0核心框架在升级过程中始终坚持“兼容优先”的原则,尽可能保障现有插件模块的平稳过渡。除涉及C++ API封装的接口模块需进行重编译外,绝大多数功能模块可在无需修改的情况下直接使用。

但由于前述对 Python 3.13 的支持升级以及软件工程层面的结构性调整,部分模块仍需进行适配性更新。目前已完成适配并通过测试的模块包括:

  • vnpy_ctp
  • vnpy_rqdata
  • vnpy_sqlite
  • vnpy_ctastrategy

其余模块的适配工作计划将在 4.1.0 版本中完成(预计于2025年5月发布)。与此同时,我们也将清理部分使用量较低、长期无人关注的模块,具体清单和说明可参见GitHub上的相关Issue

 

CHANGELOG

 

新增

  1. 新增面向机器学习多因子策略的vnpy.alpha模块

调整

  1. 核心支持版本升级到Python 3.13
  2. 使用pyproject.toml统一项目配置
  3. 日志功能使用loguru替代logging
  4. 使用mypy优化静态类型声明
  5. 使用ruff优化代码细节质量
  6. 使用uv作为开发环境管理工具
  7. 升级扩展模块适配4.0版本:vnpy_ctp/vnpy_ctastrategy/vnpy_sqlite/vnpy_rqdata

修复

  1. 修复PySide6中单元格排序可能出现的乱序问题

 



喜欢PyCharm的同学,请收好这份开发指南!

发布于vn.py社区公众号【vnpy-community】
 
原文作者:何若楠 | 发布时间:2023-08-02
 
社区有不少新接触VeighNa的同学咨询如何上手学习,这里推荐下官方团队推出的小鹅通线上课程:《零基础入门系列》覆盖【Python基础】【数据分析】【GUI开发】三阶段,适合有金融背景的编程小白快速建立自己的Python开发知识体系;《全实战进阶系列》则针对具体的量化策略应用,适合有开发背景的金融小白通过实践来迅速掌握量化投研能力,包括【CTA实战】【超越海龟】【期权入门】【投组策略】

 

PyCharm是由JetBrains公司推出针对Python语言的IDE,其内置一整套可以帮助用户在使用Python语言开发时提高其效率的工具。本文意在为用户提供通过PyCharm开发使用VeighNa的方案以供参考。

本中的内容基于Windows系统编写,但对于Linux和Mac系统大部分也都适用。

当前时点,VeighNa适用的Windows系统包括:

  • Windows 10/11
  • Windows Server 2019/2022

    其他版本的Windows系统安装时可能遇到各种依赖库问题,不推荐使用。

在Windows系统上使用VeighNa,推荐安装官方推出的【VeighNa Studio】Python发行版,尤其是初次接触Python开发的新手用户

 

PyCharm安装

 

首先从PyCharm官网下载PyCharm Community安装包:

description

下载完成后,双击安装包则可进入PyCharm安装向导:

description

如果想对安装选项进行设置,可以在PyCharm Community Edition Setup页面对相关选项进行勾选:

description

安装完成后,会跳转到安装成功页面:

description

如果前面勾选了Create Desktop Shortcut选项来创建桌面快捷方式的话,此时桌面上会出现PyCharm的图标,双击图标即可运行PyCharm。

 

VeighNa开发

 

创建项目

启动PyCharm之后,在弹出的欢迎界面中点击【New Project】创建新项目,如下图所示:

description

在弹出的新项目窗口中,首先需要选择存放项目的文件夹路径【Location】,然后勾选Python解释器选项中的【Previously configured interpreter】选项(即当前系统中已经安装的Python环境):

description

点击右侧Add Interpreter下拉框中的【Add Local Interpreter】,在弹出的对话框中点击左侧的【System Interpreter】标签,并在右侧出现的下拉框中选择VeighNa Studio自带Python解释器所在的路径:

description

点击底部的【OK】按钮保存解释器配置,回到新项目窗口中,点击右下方的【Create】按钮来完成新项目的创建:

description

创建成功的项目窗口如下图所示:

description

此时点击左上方的【External Libraries】,即可看到项目中可以调用的外部库:

description

点击site_packages文件夹,往下滚动就能找到VeighNa Studio中的vnpy核心框架包以及vnpy_前缀的插件模块包。此时可以通过点击对应图标来查看每个包中的文件源码,如下图所示:

description

把鼠标光标移到代码上方,会自动弹出对应代码的文档信息:

description

若按住Ctrl键的同时用鼠标左键点击代码,则会跳转到代码的声明部分:

description

点击窗口右下角的【Python 3.10】按钮,会弹出【Settings】项目配置窗口,可以看到当前解释器环境下安装的包名称和版本号信息。带有升级符号(向上箭头)的包,说明当前版本有更新版本,点击升级符号即可自动升级。

请注意:由于VeighNa对于部分依赖库有严格的版本要求,不建议用户手动升级安装的包,可能会出现版本冲突。

description

 

运行程序

从Github代码仓库下载VeighNa Trader启动脚本文件run.py,并将其放置于trader文件夹下,即可在窗口左侧的项目导航栏中看见run.py文件:

description

若部分代码下方可以看见绿色波浪线显示(变量名称英文词语检查),可以点击项目名称左方的主菜单按钮 -【File】-【Settings】-【Editor】-【Inspections】-【Proofreading】,取消【Typo】的勾选后点击【OK】确认。再回到主窗口,可以发现绿色波浪线已经消失:

description

点击鼠标右键,选择【Run 'run'】,即可开始运行run.py脚本:

description

此时在界面底部的终端内容输出区域中,可以看到程序运行时的打印信息:

description

与此同时,VeighNa Trader的主窗口也会自动弹出显示:

description

回到PyCharm,可以看到项目界面右上角已经有run脚本的运行记录了,后续直接点击三角形运行按钮也可运行脚本,如下图所示:

description

 

断点调试

PyCharm的断点调试功能十分强大,这里使用一个VeighNa的策略历史回测脚本来演示。

在左侧项目导航栏中点击鼠标右键,选择【New】-【File】, 在弹出的对话框中创建backtest.py

description

然后在文件中编写简单的策略回测代码(具体可参考Github仓库中的回测示例),在想要调试的地方打上断点,如下图所示:

description

点击鼠标右键选择【Debug 'backtest'】, 即可开始调试脚本:

description

此时项目界面右上角已经可以看到backtest.py的运行记录,后续也可以通过点击这里的按钮直接启动调试任务:

description

启动调试后,可以看到主界面底部的Debug窗口开始输出程序运行信息,并且程序会暂停运行在第一个断点处。左侧显示的是线程信息,右侧则是当前上下文中的变量信息:

description

点击类似播放键的【Resume Program】即可继续运行调试,直到下一个断点处再次暂停:

description

此时可以看到底部右侧监控窗口中,当前上下文中的变量发生了变化:

description

后续重复上述步骤,点击【Resume Program】直到调试结束,可以看到Debug窗口的相应输出:

description

调试完之后,点击【Rerun 'backtest'】即可重新调试:

description

在调试过程中,点击【Step Into】可以进入函数的内部查看运行时的细节状态:

description

description

点击【Step Out】则可跳出当前函数,查看外层调用栈的状态:

description

点击【Step Over】可越过子函数(子函数会执行):

description

description

点击【Stop 'backtest'】则会直接停止当前程序的运行:

description

description

 

指定程序的运行目录

在PyCharm中新建项目时,默认是在当前目录下运行程序。若需要指定程序运行的目录,可以点击项目界面右上角的【Edit】进入【Run/Debug Configurations】界面:

description

修改程序启动时的目录【Working directory】即可:

description

 

C++回调断点调试

通常情况下,PyCharm只能在Python解释器中启动的线程里进行代码断点调试。之前有部分用户反馈过尝试在C++回调函数(如CTP API接口、PySide图形库等)中打断点但无法起效的问题。针对这种情况,可以通过在代码中设置断点的方式,来实现对非Python线程(即C++线程)的断点调试。

在项目左侧导航栏中点击鼠标右键,选择【New】-【File】, 创建geteway_test.py。

在创建成功的geteway_test.py中添加一段脚本策略的代码(可参考该文件),然后按住Ctrl同时用鼠标左键点击代码中的CtpGateway,跳转至ctp_gateway.py的源码中,在想要调试的回调函数内打上断点(注意不要打在函数定义的def那一行),如下图所示:

description

回到gateway_test.py,点击鼠标右键选择【Debug 'gateway_test'】开始调试:

description

请注意,如果用load_json函数读取connect_ctp.json,请确保读取对应.vntrader文件夹的json文件中配置了CTP账户登录信息。

此时可观察到并没有进入之前设定的断点,如下图所示:

description

终止调试后,找到之前在ctp_gateway.py中设定的断点处,在回调函数内的断点之前添加以下代码:

import pydevd
pydevd.settrace(suspend=False, trace_only_current_thread=True)

请注意:

  • pydevd是PyCharm自带的调试插件,没有安装在Python解释器所在的Python环境里;
  • suspend参数设置为True之后,调试会在这一句代码运行完之后暂停,而不是停在断点处。trace_only_current_thread参数设置为True之后,调试过程中只会监控当前线程;
  • 调试结束之后不要忘记删掉这段代码。

然后再次运行调试gateway_test.py脚本:

description

此时可以看到底部的调试窗口中开始输出相关信息,同时程序暂停在了之前设置的断点处。左侧显示的是线程信息(可以看到多了一个Dummy线程显示),右侧显示的是变量信息(可以看到回调函数的入参):

description

 

对比VS Code

 

  1. 在PyCharm中,每个项目都需要对Python环境进行配置。在VS Code中,默认通过窗口右下角的Python解释器来选择全局的Python环境(针对所有打开的文件);
  2. PyCharm的Community版仅对Jupyter提供了只读支持,需要Professional版才能编辑和运行。VS Code仅需安装功能插件,就可以使用和Jupyter相关全部功能(包括读取、编辑、运行)。

 



VeighNa发布v3.9.4 - 升级支持TDengine时序数据库3.0版本!

发布于VeighNa社区公众号【vnpy-community】
 
原文作者:用Python的交易员 | 发布时间:2024-12-29
 
今年【社区活动尊享卡】的受欢迎程度大幅超出我们的预期,为了保证每场社区活动的交流质量,尊享卡已经变更为仅对部分专业交易员用户定向提供。同时当前的999优惠价格(12次活动)将于2024年12月31日结束25年将会上涨到1099的价格。有需要的同学请扫描二维码添加小助手咨询:

description

本周发布了VeighNa的3.9.4版本,也是3.0大版本的最后一次发布。本次更新的主要内容是升级支持了TDengine时序数据库的3.0新版本,以及VeighNa Docker容器镜像功能的再度升级,整合了VeighNa Station投研一体化终端,提供和VeighNa Studio更加一致的用户体验。

对于已经安装了VeighNa Studio的用户,可以使用快速更新功能完成自动升级。对于没有安装的用户,请下载VeighNa Studio-3.9.4,体验一键安装的量化交易Python发行版,下载链接:

https://download.vnpy.com/veighna_studio-3.9.4.exe

 

TDengine时序数据库支持升级

 

作为知名国产开源时序数据库的TDengine,其对于金融时序数据的存储性能充分得到了量化行业用户的认可,但之前TDengine 2.0版本中相对复杂的安装流程(WSL安装配置、FQDN服务器地址验证、服务自动启动等),难住了许多对于Linux命令操作不那么熟悉的VeighNa社区同学。

本次3.9.4版本更新中升级实现了对于TDengine 3.0版本的适配,在保持原有高性能的同时,大幅降低了在Windows系统上使用VeighNa平台对接TDengine的安装配置难度,强烈推荐已经遇到默认SQLite数据库性能瓶颈的同学们上手体验

 

Docker服务端

对于大多数VeighNa用户,推荐使用TDengine 3.0版本的Docker容器镜像来安装配置时序数据库的服务端程序。对于Linux命令操作熟悉的同学,也可以参考这篇文档中的说明在WSL或者Linux服务器上直接安装,本文中就不做详细介绍。

首先需要确保Windows系统中已经安装好了Docker Desktop软件,可以在Docker官网的该页面找到下载链接:

https://www.docker.com/products/docker-desktop/

点击页面中部蓝色按钮的【Download Docker Desktop】,在弹出的下拉框中选择【Download for Windows - AMD64】,下载完成后运行安装程序,基本一路傻瓜安装即可。

安装完成后启动Docker Desktop程序,点击窗口右上角的齿轮按钮进入全局配置页面,如下图所示:

description

勾选【General】下的【Start Docker Desktop when you sign in to your computer】后,点击右下角的【Apply & restart】按钮,将Docker Desktop设置为随操作系统启动(配合后面的容器自动重启参数,实现TDengine的后台服务式运行)。

完成后可以关闭Docker Desktop窗口,此时软件不会退出,而是最小化到系统右下角的托盘栏中。随后打开PowerShell或者其他命令行工具(文中使用的是Windows Terminal中运行的PowerShell),运行命令:

docker

如果能看到如下图所示输出,则说明Docker运行正常:

description

下一步是使用命令拉取TDengine容器镜像:

docker pull tdengine/tdengine:latest

运行命令后,看到所有进度条都走完,则说明拉取成功:

description

拉取完成后,通过下述命令来启动数据库服务容器:

docker run -d `
  -v C:/my_tdengine/data:/var/lib/taos `
  -v C:/my_tdengine/log:/var/log/taos `
  -p 6030:6030 `
  -p 6041:6041 `
  -p 6043:6043 `
  -p 6044-6049:6044-6049 `
  -p 6044-6045:6044-6045/udp `
  -p 6060:6060 `
  --restart=always `
  tdengine/tdengine

以上PowerShell多行命令的每行结尾使用了反引号(键盘Tab上方按键)作为换行符,将上述命令复制到PowerShell窗口中运行,等待几秒后容器启动成功会输出一段较长的随机字符串(容器编号)。

启动容器后,可以通过下述命令来查看当前容器的运行状态:

docker ps

正常运行状态下,输出的信息如下图所示:

description

命令中的具体参数(以-或者--开头)说明如下:

-v:用于挂载Windows系统下的指定文件夹到容器中,为容器中运行的TDengine程序提供数据存储输出,可以根据自己的需求修改:

  • /var/lib/taos,对应的是TDengine的数据存储路径;

  • /var/log/taos,对应的是TDengine的日志输出路径。

-p:用于将Windows系统的端口映射绑定到容器中对应的端口,为外部程序提供数据库访问,这些端口参数建议保持不变:

  • 6030,主要用于应用程序(如VeighNa)连接TDengine;
  • 6041,提供数据库管理终端(如DBeaver)连接TDengine;
  • 其他端口提供更加进阶的功能,这里可以忽略。

--restart:用于设置容器的重启策略,always代表每次Docker Desktop启动后都立即启动TDengine容器,结合之前设置的Docker Desktop开机自动启动即可实现时序数据库的后台服务式运行。

 

Windows客户端

完成Docker服务端安装后,下一步需要安装Windows客户端程序:

https://www.taosdata.com/assets-download/3.0/TDengine-client-3.3.4.8-Windows-x64.exe

下载完成后运行程序直接安装即可,至此我们就完成了TDengine 3.0版本的安装流程。

在VeighNa中对接TDengine,需要通过vnpy_taos模块(VeighNa Station更新3.9.4版本时会自动安装),该模块又依赖于刚安装完成的TDengine客户端程序。

然后在VeighNa Trader菜单栏的全局配置中(或者vt_setting.json文件里)填入以下内容:

  • database.name: "taos"
  • database.database: "vnpy"
  • database.host: "127.0.0.1"
  • database.port: 6030
  • database.user: "root"
  • database.password: "taosdata"

重启后,即可体验VeighNa Trader连接TDengine时序数据库的高能性能数据读写。

 

VeighNa Docke容器镜像升级

 

本次3.9.4更新中对VeighNa Docker容器镜像的功能再次进行了升级,整合了广受欢迎的VeighNa Station投研一体化终端,为Linux和Mac系统用户提供和VeighNa Studio高度一致的体验。

安装好Docker后,在终端(如bash中)运行下述命令:

docker run \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /mnt/c/veighna/home:/home \
veighna/veighna:3.9.4 \
python3 -m veighna_station

即可启动VeighNa Station,同时【交易】页面下的【交易接口】和【功能模块】也都对Docker容器环境进行了适配,如下图所示:

description

上述命令中的"-v /mnt/c/veighna/home:/home",用于将宿主机中的"/mnt/c/veighna/home"文件夹,挂载到Docker容器中的"/home"路径,作为VeighNa运行时的数据存储和日志输出,实际使用时可以根据自己的需求进行调整。

 

CHANGELOG

 

新增

  1. vnpy_tora增加登录时终端动态密钥支持
  2. vnpy_taos升级支持TDengine的3.0版本

调整

  1. vnpy_xt行情接口增加实时行情中的涨跌停价字段
  2. vnpy_taos移除不必要的时区转换提高性能
  3. vnpy_dolphindb优化写入大量数据时候的内存占用
  4. vnpy_portfoliostrategy简化回测引擎的calculate_pnl每日盈亏计算函数
  5. vnpy_tap/vnpy_tts升级pybind11封装工具库的版本,支持Python 3.12编译
  6. EmailEngine发送邮件失败后,捕捉异常并输出日志

修复

  1. vnpy_optionmaster移除不必要的价格缓存代码
  2. vnpy_dolphindb修复保存overview的时区不正确问题

 



开始报名:2025小班特训营第二场【VeighNa机器学习截面多因子策略】!

发布于VeighNa社区公众号【vnpy-community】
 
原文作者:VeighNa小助手 | 发布时间:2025-04-09
 
2025年3月,VeighNa量化平台4.0版本正式开源了面向多因子策略的vnpy.alpha模块,为专业量化交易员提供完整的因子特征工程框架和策略回测系统。然而,由于截面多因子策略开发涉及跨学科知识体系(金融理论建模、海量数据处理、机器学习算法实践),许多社区同学看完开源代码后的反馈是依旧不知从何下手开始学习。

基于此,2025年第二场小班特训营将继续深化【机器学习截面多因子策略】核心主题,并在往期课程基础上实现两大升级:

  1. 算法进阶:新增GRU(门控循环单元神经网络)、 ALSTM(注意力长短期记忆网络)、Transformer(自注意力机制神经网络)及DoubleEnsemble(双重集成学习框架)等机器学习模型实践;
  2. 品种扩展:新增商品期货多因子特征数据集和策略开发模板,覆盖期货市场特有的因子特征构造与投资组合管理方案

老规矩还是放几张之前特训营的照片:

description
准备完毕,静候小班同学到达

description
学习量化,掌握核心理论框架

description
深入代码,分析策略逻辑细节

description

现场实践,剖析机器学习算法

截面多因子策略还有另一个大家可能更为熟悉的名字:Alpha策略。作为一种广义的统计套利型量化策略,截面多因子策略除了应用在股票量化选股领域外(指数增强和绝对收益),同样也可以应用于带杠杆的衍生品多空组合领域(期货、固收、互换等)。

description

ML模型预测信号分析

description
截面策略超额收益绩效

基于之前学员的反馈,小班特训营这种2天10小时+的高强度课程通过线上直播学习的效果并不理想。为了保证更好的学习质量,我们对授课模式进行了调整:后续小班特训营不再提供线上直播参加和视频内容回看,而是改为同一主题的每场小班课都可以再次到场听讲。同时,我们会针对每一个特训营的主题建立专项社群,持续提供专业交流与学习服务,而不再只局限于三个月的答疑时间。

小班特训营优先面向买方投资机构。由于截面多因子策略本身的复杂性(因子数据、算力需求、金融理论等),不建议新手报名,本场课程部分名额已经被提前锁定,感兴趣的同学请抓紧。

 

VeighNa机器学习截面多因子策略

日期:2025年6月7日(周六)和6月8日(周日)

时间:两天下午1点-6点,共计10小时

地点:上海浦东(具体地址会在报名成功后发送)

大纲

  1. 快速上手投研开发

    a. 针对机器学习投研的硬件和系统选择
    b. VeighNa AlphaStrategy开发环境准备
    c. 跑通LightGBM模型截面多因子策略开发

  2. 截面多因子策略原理

    a. 经典理论的量化交易实践

    i. 主动投资组合管理
    

    ii. 金融资产定价模型
    iii. 统计套利因子模型

    b. 截面类策略的完整投研流程

  3. 因子特征数据准备

    a. 因子的主要分类和数据来源

    b. 特征数据开发模板AlphaData

    i. 基于表达式的特征计算引擎
    ii. 特征数据的清洗和预处理
    iii. 如何选择ML模型的预测目标

    c. 商品期货多因子特征数据集

  4. ML预测模型训练

    a. 监督学习算法概述:线性模型、树模型、神经网络

    b. ML预测模型的训练与优化

    i. 模型评估统计指标详解
    ii. 特征重要性分析与可解释性研究
    iii. 超参数调整与模型验证方法

    c. 基于AlphaModel模板快速开发ML预测模型

    i. 线性回归类:Lasso
    ii. 集成学习类:XGBoost、DoubleEnsemble
    iii. 神经网络类:LSTM、GRU、ALSTM、Transformer

  5. 截面投组策略构建

    a. 时序类策略 vs 截面类策略
    b. 标准化截面策略开发模板AlphaStrategy
    c. 截面策略回测中的关键细节梳理

  6. 实战进阶开发应用

    a. 更有效日内高频Alpha因子特征
    b. 基于GPLearn遗传规划的因子特征挖掘
    c. Alphalens因子特征和预测信号评估
    d. 不止于股票市场的截面类策略

价格:11999元

 

报名请扫描下方二维码添加小助手提供相关信息(想参加的课程、姓名、手机、公司、职位),报名结果以确认回复为准:

description

 



魔改VNPY

[知乎专栏经验发布] (https://www.zhihu.com/column/c_1760768090802171904)

提取地址

本软件基于 VNPY 3.9.0 开源量化交易平台制作。VNPY是由  "上海韦纳软件科技有限公司" 发布的一款 "基于Python的开源量化交易平台开发框架"
本软件可能有未经发现的缺陷,只供学习使用,一切使用后果由您自行承担。

软件是已经编译好的exe可执行文件,策略代码放于strategies文件中
使用其它的python库,可在自己的环境中pip装好,复制到 _internal 目录中

链接:https://pan.baidu.com/s/1Sw95-GuaXv7hn-O9WyQHLw?pwd=agmj 
提取码:agmj

主窗口
description

多账户管理,自动登录

description

合约管理,收藏,手续费设置(策略中算手续费),定期从外部获取后计算最大持仓定为主力

description

交易持仓
description

绩效查看,按账户统计
description

数据管理,一键批量导入通达信数据(日线、分钟线)
description

策略执行
使用数据模拟定义参数和状态显示,配合限制输入框,对输入内容格式、最大最小值做限制
界面参数、状态值,使用模型指定的中文标题显示
Params、State 显示在窗口
Variable 仅做为中间变量存储,但不显示
扩展 on_ready,在在 on_start 后触发,不同的是,交易状态 self.trading == True
扩展 on_reset,在画面点击重置时触发

description

description

description



把你编写的指标用图表显示出来

用python编写指标和以往熟悉的文华,博弈大师等有很大的区别,你写的代码最终在图形上是什么样子,看一看才能心安。

于是有了下面这段代码:

from datetime import datetime
from typing import  Dict
from vnpy.trader.constant import Exchange, Interval
from vnpy.trader.database import database_manager
from vnpy.app.cta_strategy import ArrayManager
from vnpy.chart import ChartWidget, VolumeItem, CandleItem
import pyqtgraph as pg
from vnpy.trader.ui import create_qapp, QtCore, QtGui
from vnpy.trader.object import BarData
from vnpy.chart.manager import BarManager


class ZB(CandleItem):
    """自定义指标显示"""

    def __init__(self, manager: BarManager):
        """"""
        super().__init__(manager)

        self.blue_pen: QtGui.QPen = pg.mkPen(color=(100, 100, 255), width=2)
        self.sma_data: Dict[int, float] = {}

    def get_sma_value(self, ix: int) -> float:
        """"""
        if ix < 0:
            return 0

        if not self.sma_data:
            bars = self._manager.get_all_bars()
            sma_array = [bar.down_line for bar in bars]

            for n, value in enumerate(sma_array):
                self.sma_data[n] = value

        if ix in self.sma_data:
            return self.sma_data[ix]

        sma_value = sma_array[-1]

        return sma_value

    def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture:
        """"""
        sma_value = self.get_sma_value(ix)
        last_sma_value = self.get_sma_value(ix - 1)

        # Create objects
        picture = QtGui.QPicture()
        painter = QtGui.QPainter(picture)

        # Set painter color
        painter.setPen(self.blue_pen)

        # Draw Line
        start_point = QtCore.QPointF(ix-1, last_sma_value)
        end_point = QtCore.QPointF(ix, sma_value)
        painter.drawLine(start_point, end_point)

        # Finish
        painter.end()
        return picture

    def get_info_text(self, ix: int) -> str:
        """"""
        if ix in self.sma_data:
            sma_value = self.sma_data[ix]
            text = f"ZB {sma_value:.2f}"
        else:
            text = "ZB -"

        return text

class ZB2(CandleItem):
    """自定义指标显示"""

    def __init__(self, manager: BarManager):
        """"""
        super().__init__(manager)

        self.blue_pen: QtGui.QPen = pg.mkPen(color=(100, 100, 255), width=2)
        self.sma_data: Dict[int, float] = {}

    def get_sma_value(self, ix: int) -> float:
        """"""
        if ix < 0:
            return 0

        if not self.sma_data:
            bars = self._manager.get_all_bars()
            sma_array = [bar.up_line for bar in bars]

            for n, value in enumerate(sma_array):
                self.sma_data[n] = value

        if ix in self.sma_data:
            return self.sma_data[ix]

        sma_value = sma_array[-1]

        return sma_value

    def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture:
        """"""
        sma_value = self.get_sma_value(ix)
        last_sma_value = self.get_sma_value(ix - 1)

        # Create objects
        picture = QtGui.QPicture()
        painter = QtGui.QPainter(picture)

        # Set painter color
        painter.setPen(self.blue_pen)

        # Draw Line
        start_point = QtCore.QPointF(ix-1, last_sma_value)
        end_point = QtCore.QPointF(ix, sma_value)
        painter.drawLine(start_point, end_point)

        # Finish
        painter.end()
        return picture

    def get_info_text(self, ix: int) -> str:
        """"""
        if ix in self.sma_data:
            sma_value = self.sma_data[ix]
            text = f"ZB {sma_value:.2f}"
        else:
            text = "ZB -"

        return text


if __name__ == "__main__":
    app = create_qapp()

    symbol = "CL-20210322-USD-FUT"
    exchange = Exchange.NYMEX
    interval = Interval.MINUTE_30
    start = datetime(2021, 1, 1)
    end = datetime(2022, 1, 1)

    bars = database_manager.load_bar_data(
        symbol=symbol,
        exchange=exchange,
        interval=interval,
        start=start,
        end=end
    )

    am = ArrayManager(50)
    new_data = bars[:]
    line_up = []
    line_down = []

    while new_data :
        bar = new_data.pop(0)
        am.update_bar(bar)
        up, down = am.boll(20,2)
        line_up.append(up)
        line_down.append(down)   #这里调用合适的公式就好了

    print("K线数量是", len(bars), "指标数据是", len(line_up))

    i = 0
    while line_down :
        bars[i].down_line = line_down.pop(0)
        bars[i].up_line = line_up.pop(0)
        i = i + 1
    print("共处理了", i, "数据")

    widget = ChartWidget()
    widget.add_plot("candle", hide_x_axis=True)
    widget.add_plot("volume", maximum_height=250)
    widget.add_item(CandleItem, "candle", "candle")
    widget.add_item(VolumeItem, "volume", "volume")

    widget.add_item(ZB, "ZB", "candle")
    widget.add_item(ZB2, "ZB2", "candle")
    widget.add_cursor()

    history = bars
    widget.update_history(history)

    def update_bar():
        bar = new_data.pop(0)
        widget.update_bar(bar)

    timer = QtCore.QTimer()
    timer.timeout.connect(update_bar)

    widget.show()
    app.exec_()

因为我使用的盈透可以随时下载各种周期的历史数据,所以我只要下载然后存在数据库中。直接用代码读取就可以看见最新的k线。
如果你需要下载盈透的数据,可以参考我的上一个帖子。
https://www.vnpy.com/forum/topic/6123-ying-tou-jie-kou-xia-zai-5fen-zhong-xian-bing-xian-shi-tu-biao?page=1#pid21676

其他的接口我不熟。



2025年第3次社区活动 - 【FinRL投研平台学习系列3】 - 4月19日(成都)

发布于VeighNa社区公众号【vnpy-community】
 
原文作者:VeighNa小助手 | 发布时间:2025-03-31
 

去年【社区活动尊享卡】的受欢迎程度大幅超出我们的预期,为了保证每场社区活动的交流质量,尊享卡已经变更为仅对部分专业交易员用户定向提供。对于参加活动较多的同学强烈推荐!购买请扫描二维码添加小助手咨询:

description

FinRL投研平台学习系列的社区活动已经迎来第三场,前两场在深圳和上海的活动中,参与者的热情远远超出了我们的预期。今年年初,DeepSeek的现象级爆红使得人工智能(AI)和机器学习(ML)的概念更加深入人心。与此同时,量化领域的从业者们也正积极探索这些技术在投资和交易业务中的应用前景。

这里附上几张之前活动的照片:

description

description

description

列举一下目前整个系列活动计划的四场内容,分别是:

  1. 快速上手FinRL运行和项目背景介绍(已结束)
  2. FinRL投研数据获取扩展和环境交互剖析(已结束)
  3. 构建量化FinRL智能体和RL算法对比分析(本场)
  4. FinRL的进阶开发应用和实盘仿真环境接入

本次活动将于4月19日(周六)下午2:00至5:00在成都举办。普通报名仅支持线下参会,尊享卡持有者和Elite会员可通过线上直播参与。活动具体地址将在微信群中公布,请在报名成功后扫码加入社区活动群,以便获取相关信息!

 

活动内容大纲

 

  1. 量化领域越发广泛的AI应用

    a. 非监督学习:数据分析和特征工程

    b. 监督学习:多因子收益率信号预测模型

    c. 强化学习:投资组合以及交易算法构建

    d. LLM大模型:

    i. 智能化因子特征挖掘
    ii. 新闻文本市场情绪分类
    iii. 全自动量化投研工作流

  2. 构建量化FinRL智能体

    a. FinRL中的DRLAgent类

    i. 封装RL算法差异,提供统一接口
    ii. 模块化结构设计与可扩展性

    b. 构造函数与初始化流程

    i. 接收环境对象env_train
    ii. 模型参数的初始化方式

    c. 智能体和金融市场环境的交互

    d. DRLAgent功能函数详解

    i. get_model
    ii. train_model
    iii. DRL_prediction
    iv. DRL_prection_load_from_file

  3. RL算法对比分析

    a. 主流强化学习库集成

    i. Stable-Baseline3
    ii. RLlib
    iii. ElegantRL(FinRL团队开发)

    b. RL算法实现对比

    i. 策略梯度类算法:A2C、PPO
    ii. Actor-Critic架构算法:DDPG、TD3、SAC

  4. 闭门交流环节

 

时间:4月19日 14:00-17:00

地点:成都(具体地址后续在微信群中通知)

报名费:99元(Elite会员免费参加)

报名方式:扫描下方二维码报名(报名后请扫码加入社区活动微信群获取参会地址)

description

 



VeighNa AI,你的专属Desk Quant

发布于VeighNa社区公众号【vnpy-community】
 
原文作者:VeighNa小助手 | 发布时间:2025-03-24
 

在量化交易领域,灵活性与易用性往往难以兼得。

VeighNa作为一款开源量化平台,其设计哲学始终以灵活性为核心,力求满足多样化的量化交易场景。

然而,这种高度的灵活性也带来了相对较高的学习门槛。

尽管通过微信公众号、社区论坛、微信QQ社群等渠道积累了大量的分享文章和知识经验,但传统的搜索方式仍难以让用户快速解决遇到的问题:

  • 技术文档检索如同大海捞针

  • 社区问答需要等待人工响应

  • 公开大模型缺乏领域针对性

为了解决上述痛点,我们借鉴了专业机构交易台的Desk Quant专属服务理念。

首先,什么是Desk Quant?简单来说,它是专业机构交易团队的专属量化支持工程师,能快速响应交易员的各类技术需求。

基于这一理念,我们推出了VeighNa AI,采用RAG技术(检索增强生成,即先从知识库检索相关内容再生成答案),将多年沉淀的私有知识库与大模型深度融合,打造了具备领域专精能力的量化AI助手。

 

✨ VeighNa AI的核心特点

 

🔍 技术架构:基于RAG技术打造系统架构,后端使用云厂商版本的671B满血版DeepSeek-V3大模型,确保回答准确高效。

📚 知识库支持:系统接入了VeighNa官方私有知识库,并针对用户常见需求进行了参数微调,提供比普通大模型更加精准的问题解决能力。

🔢 积分机制:每次提问仅需消耗少量积分,内部测试数据显示:简单问题约消耗1-3积分,复杂问题(如代码编写)约消耗5-30积分。

💰 价格与积分:标准套餐价格为99元,含3000积分。积分长期有效无到期限制,根据日常使用频率,通常可满足数月至一年的使用需求。

🔒 安全提示:本服务运行于第三方公司的SaaS基础设施,并调用外部大模型,请勿上传敏感信息(如账号密码、实盘代码、个人资料等)。

 

💡 使用场景

 

疑问解答:快速解决用户在VeighNa平台使用过程中遇到的各种问题。
例如:「如何配置CTP接口?」「策略回测结果如何解读?」

💻 代码编写:协助用户编写和调试量化交易策略代码。
例如:帮我实现一个简单的双均线策略,或者诊断现有代码中的问题。

📖 知识查询:提供关于量化交易、金融市场等方面的知识查询服务。
例如:「什么是Greeks?」「如何计算Sharpe比率?」

 

🚀 购买链接

 

感兴趣的同学请扫描下方二维码即可购买开通VeighNa AI:

description

购买完成后请回到之前的页面,扫码添加小助手发送信息申请开通即可!通常小助手会在工作时间(周一到周五,9点-17点)不定时处理开通申请,如果非工作时间申请没有立即通过请耐心等待。
 


新消息

统计

主题
10071
帖子
38244
已注册用户
58835
最新用户
在线用户
227
在线来宾用户
11097
© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】