安装流程:
打开terminal-注意环境切换成 py37_vnpy,执行以下命令,安装需要的插件
pip install -r requirements.txt -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
遇到安装失败的可以单独安装:
pip install PyQt5 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
备注:
如果需要在cmd 下使用 py37_vnpy 环境。
打开 CMD
运行: conda activate py37_vnpy
会切换到py37_vnpy环境下
发布于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模块,为专业量化交易员提供一站式多因子机器学习(ML)策略开发、投研和实盘交易解决方案:
📊dataset - 因子特征工程
💡 model - 预测模型训练
提供标准化的ML模型开发模板,大幅简化模型构建与训练流程
统一API接口设计,支持无缝切换不同算法进行性能对比测试
集成多种主流机器学习算法:
🤖 strategy - 策略投研开发
🔬 lab - 投研流程管理
📖 notebook - 量化投研Demo
vnpy.alpha模块的设计理念受到Qlib项目的启发,在保持易用性的同时提供强大的AI量化能力,特此向Qlib开发团队致以诚挚感谢!
由于截面多因子策略的开发涉及跨学科知识体系——包括金融理论建模、海量数据处理、以及机器学习算法实践,不少社区用户在阅读相关开源代码后仍反馈“无从下手、不知如何系统学习”。如果你也有类似困惑,我们强烈推荐即将于6月举办的2025年第二场小班特训营《机器学习截面多因子策略》,本次特训营将以实战为导向,从零搭建一套完整的机器学习因子策略开发流程,课程大纲及报名信息详见报名公告。
自Guido启动Shannon Plan项目以来,过去数年中每一个Python大版本的迭代都显著提升了解释器的执行性能。因此,在VeighNa 4.0版本中,我们将核心支持升级至最新的Python 3.13,并结合新引入的语言特性,对核心框架的代码进行了重构,以进一步提升系统的运行效率与代码可维护性。
同时,依据《2025年VeighNa项目计划》中所提出的路线,4.0版本也在软件工程层面进行了多项关键性改进,全面优化了项目的架构设计与开发流程,具体包括:
VeighNa 4.0核心框架在升级过程中始终坚持“兼容优先”的原则,尽可能保障现有插件模块的平稳过渡。除涉及C++ API封装的接口模块需进行重编译外,绝大多数功能模块可在无需修改的情况下直接使用。
但由于前述对 Python 3.13 的支持升级以及软件工程层面的结构性调整,部分模块仍需进行适配性更新。目前已完成适配并通过测试的模块包括:
其余模块的适配工作计划将在 4.1.0 版本中完成(预计于2025年5月发布)。与此同时,我们也将清理部分使用量较低、长期无人关注的模块,具体清单和说明可参见GitHub上的相关Issue。
新增
调整
修复
发布于VeighNa社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2025-04-30
关于MultiCharts量化平台本身,在2020年的这篇公众号文章中就有介绍过《vn.py技术架构2 - 受启发的项目:CTP API、MultiCharts》。
我本人和MultiCharts可以算是相当有缘分:职业生涯中学习上手的第一套量化平台就是MultiCharts,10多年前还在英国念硕士的时候买了MultiCharts国际版终身授权,当时的价格大概是1300美金,差不多10000$,足足省吃俭用了半年,遗憾的是授权码已经找不到了。回国后在期货公司开始第一份工作的时候,用的也是由艾杨软件代理的MultiCharts中国版,某种意义上促成了后续CtaStrategy模块的开发。
去年艾杨软件在MultiCharts专策版中支持了Python接口功能,同时也推出了用于对接VeighNa量化平台的交易接口模块vnpy_icetcore(具体可以阅读这篇文章),但对于许多已经使用VeighNa直连CTP(或者其他交易柜台)的用户来说无法直接使用该模块。
因此我们根据VeighNa社区用户的习惯,开发了新的vnpy_mcdata数据服务模块。在此过程中受到了艾杨技术团队的大力支持,在此表示感谢!与vnpy_icetcore定位于gateway不同的是,vnpy_mcdata专注于datafeed,也就意味着使用任何交易接口的同学都可以使用MultiCharts作为数据服务。
目前支持的期货和期货期权数据范围包括:
交易所
数据类型
VeighNa社区的新用户可以发送邮件申请试用权限:
申请成功后会收到回复的邮件,其中包含以下信息:
访问以下网页下载安装MultiCharts 14(专策版):
https://www.multicharts.cn/download
点击网页中的【64位元】下载链接:
下载完成后运行安装,注意记住选择的安装目录,后面配置datafeed时需要用到。
完成后双击桌面的【MC14 专策版】图标启动。首次运行确认用户协议后,会看到登录对话框:
在其中填入会员账号和密码后点击【登录】按钮,经过一段初始化等待后看到如下图所示的注册对话框:
在其中填入MC注册名和MC注册码,勾选【记住密码】后点击【登录】按钮即可进入MultiCharts主界面。
此时桌面底部的任务栏中会出现两个进程,分别是:
首先需要安装vnpy_mcdata数据服务模块:
pip install vnpy_mcdata
然后修改全局配置中的数据服务相关字段(以datafeed开头):
注意username需要填入你的MultiCharts安装目录(结尾的APPs文件夹保持不变),并将路径中的 “\” 替换为 “/”。
重启VeighNa Trader并加载DataManager模块,即可测试从MultiCharts获取历史K线数据:
除了期货交易所合约外,MultiCharts还提供了多种连续合约的数据,以期货产品名称 + 标准后缀标识:
MultiCharts专策版数据服务的价格为2980元/年,试用结束后需要购买可以扫描下方二维码:
发布于VeighNa社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2025-01-25
还记得在《2024年VeighNa项目计划》中,我们对Python 3.12新增的【解释器级别GIL】充满期待,预期后续将会迎来多解释器支持的标准库(PEP 734 – Multiple Interpreters in the Stdlib),从而实现在Python单进程的程序中充分调用CPU多核心算力。
然而,2024年10月发布的Python 3.13中,社区选择了另一条优化方向,即推出了No-GIL模式(无全局解释器锁),以实现多线程并行运行,充分发挥CPU多核性能。但遗憾的是,该功能仍处于【实验性阶段】,且目前已有的社区测试数据显示,启用No-GIL模式后会显著降低单线程性能。
尽管多线程性能优化尚未完全成熟,从Python 3.10到3.13的三个大版本迭代中,Python解释器的性能已经得到了显著提升,采用的技术改进包括:引入自适应字节码、优化对象结构、提升内置函数效率,以及对垃圾回收与锁机制的持续优化等。
与此同时,Python语言也新增了多项特性以提升开发效率,例如:更精确的错误提示(3.11)、支持任意表达式的f-string(3.12)、以及更加友好的REPL交互式环境(3.13)等。
2025年我们将会启动VeighNa项目4.0大版本的开发工作。综合前文所述,4.0大版本将优先采用Python 3.13作为核心支持,待No-GIL进入【稳定阶段】后再考虑迁移到后续Python版本。
从软件工程的视角,当前的工作计划包括:
在量化交易功能方面,则是将延续VeighNa的传统,根据社区用户需求新增更多交易接口(gateway),并持续优化现有策略应用模块(app)。
长期以来,许多VeighNa社区用户反馈过在截面多因子策略(如股票日频选股)领域的需求与痛点。然而受限于我们团队本身缺乏这块的专业背景,此类功能模块一直未能开发完成。
2024年的【Qlib投研平台系列社区活动】成为了重要转折点。在社区同学们的支持下,我们深入探索并学习了行业领先截面多因子策略平台的整体业务逻辑。遗憾的是,原本计划将Qlib与VeighNa无缝整合以实现投研和交易一体化的解决方案,因为种种原因发现无法走通。
因此,我们结合团队自身在量化业务上的深入理解,研发了全新的AlphaStrategy模块,完整覆盖截面多因子策略投研的四大核心环节:
在即将发布的4.0大版本中,我们计划分阶段将AlphaStrategy模块整合到VeighNa核心框架中,使其成为vnpy.alpha关键子模块,为社区用户提供一站式的截面多因子策略投研解决方案。
从两年多前ChatGPT引发的全球热潮,到近一周DeepSeek-R1模型的横空出世,LLM大模型已经在众多行业掀起了生产力革命。我们团队对LLM的应用也从初期的简单问答交互,逐步发展到熟练掌握提示词工程,并深度融入日常工作流,大幅提升了开发效率。
2025年,我们计划推出更多LLM相关的分享内容和社区活动,帮助用户探索如何将这一新兴AI技术应用于量化交易领域,并借助大模型提升投研工作效率和突破技术瓶颈。
发布于VeighNa社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2025-04-28
想弄清楚MainEngine的工作原理?看完这张图秒懂:
实盘中BarGenerator如何将Tick数据合成为K线?一目了然:
事件驱动化回测引擎是怎么个工作流程?拆细了一步步学:
期货交易中的自动开平仓转换是怎么运行的?数据流转关系图如下:
想要使用RPC模块开发多进程分布式应用?先来弄懂底层通讯原理:
搞不清楚VeighNa框架的程序运行流程?三条逻辑线简洁明了:
想要扩展开发自己的底层交易接口?对照函数列表不遗漏:
4.0新增的多因子机器学习投研有哪些关键步骤?一张图看清楚:
关注AI大模型领域的同学,这两天估计没少被DeepWiki刷屏。如果你还没听过,DeepWiki是由Cognition公司(前段时间爆火的Devin开发团队)新近推出的“Github仓库百科全书”,前文中的所有图片均由其Agent分析VeighNa的Github仓库后自动生成。
尽管我本人就是VeighNa项目的核心维护者,但昨天看到DeepWiki上VeighNa页面(https://deepwiki.com/vnpy/vnpy)的时候,脑子还是直接被震撼到宕机了一把:居然有人能把VeighNa的核心架构信息,以这么清晰的百科和图表的方式呈现出来!!!
对于想要学习VeighNa核心架构的同学,DeepWiki真是一款能称得上【神器】的Agent工具:
需要注意的是:DeepWiki中的内容均由AI Agent分析代码库后直接生成,无法保证内容全部正确,在部分图表中确实发现了一些仍需优化的细节。
过去的一年里,我们看到VeighNa社区已经有越来越多的同学开始将各种AI Agent应用在自己的量化投研和交易中,但同时也有许多人依然停留在把AI(大模型)当作一个简单的聊天工具来使用。
当前互联网上关于AI Agent的文章已经多如牛毛,但是真正能落地到量化实战的则是屈指可数。因此我们决定推出这个新的【AI Agent量化实战】系列文章,希望能够帮助更多同学将这些新一代的生产力工具应用到自己的量化实战中。
系列历史文章列表:
AI Agent量化实战 1 - VeighNa AI - 你的专属Desk Quant
AI Agent量化实战 2 - VeighNa AI - 提问指南
用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
其他的接口我不熟。
发布于VeighNa社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2025-03-15
在量化交易领域,高质量的行情数据是策略研发和回测的基础。近期在VeighNa社区中,经常有用户咨询关于高频Tick数据录制的问题。
传统的SQLite等关系型数据库在面对大量合约同时录制的场景时,往往因写入性能瓶颈导致丢包,影响数据完整性。
为了解决以上难题,本文中将介绍如何利用VeighNa量化平台结合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
这部分代码导入了程序运行所需的各种模块:
日志对于监控系统运行状态和排查问题至关重要:
# 开启日志记录功能
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的核心组件:
接下来,定义了一个合约订阅函数,用于自动订阅符合条件的合约行情:
# 定义合约订阅函数
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平台核心的事件驱动架构,实现了一套自动化的合约订阅机制:
EVENT_CONTRACT
事件subscribe_data
函数处理该事件该机制使得系统能够自动识别和订阅符合条件的合约,无需手动指定每个合约代码。
为了方便监控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()
这部分代码完成了以下操作:
最后是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()
发布于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 Server 2019/2022
其他版本的Windows系统安装时可能遇到各种依赖库问题,不推荐使用。
在Windows系统上使用VeighNa,推荐安装官方推出的【VeighNa Studio】Python发行版,尤其是初次接触Python开发的新手用户。
首先从PyCharm官网下载PyCharm Community安装包:
下载完成后,双击安装包则可进入PyCharm安装向导:
如果想对安装选项进行设置,可以在PyCharm Community Edition Setup页面对相关选项进行勾选:
安装完成后,会跳转到安装成功页面:
如果前面勾选了Create Desktop Shortcut选项来创建桌面快捷方式的话,此时桌面上会出现PyCharm的图标,双击图标即可运行PyCharm。
启动PyCharm之后,在弹出的欢迎界面中点击【New Project】创建新项目,如下图所示:
在弹出的新项目窗口中,首先需要选择存放项目的文件夹路径【Location】,然后勾选Python解释器选项中的【Previously configured interpreter】选项(即当前系统中已经安装的Python环境):
点击右侧Add Interpreter下拉框中的【Add Local Interpreter】,在弹出的对话框中点击左侧的【System Interpreter】标签,并在右侧出现的下拉框中选择VeighNa Studio自带Python解释器所在的路径:
点击底部的【OK】按钮保存解释器配置,回到新项目窗口中,点击右下方的【Create】按钮来完成新项目的创建:
创建成功的项目窗口如下图所示:
此时点击左上方的【External Libraries】,即可看到项目中可以调用的外部库:
点击site_packages文件夹,往下滚动就能找到VeighNa Studio中的vnpy核心框架包以及vnpy_前缀的插件模块包。此时可以通过点击对应图标来查看每个包中的文件源码,如下图所示:
把鼠标光标移到代码上方,会自动弹出对应代码的文档信息:
若按住Ctrl键的同时用鼠标左键点击代码,则会跳转到代码的声明部分:
点击窗口右下角的【Python 3.10】按钮,会弹出【Settings】项目配置窗口,可以看到当前解释器环境下安装的包名称和版本号信息。带有升级符号(向上箭头)的包,说明当前版本有更新版本,点击升级符号即可自动升级。
请注意:由于VeighNa对于部分依赖库有严格的版本要求,不建议用户手动升级安装的包,可能会出现版本冲突。
从Github代码仓库下载VeighNa Trader启动脚本文件run.py,并将其放置于trader文件夹下,即可在窗口左侧的项目导航栏中看见run.py文件:
若部分代码下方可以看见绿色波浪线显示(变量名称英文词语检查),可以点击项目名称左方的主菜单按钮 -【File】-【Settings】-【Editor】-【Inspections】-【Proofreading】,取消【Typo】的勾选后点击【OK】确认。再回到主窗口,可以发现绿色波浪线已经消失:
点击鼠标右键,选择【Run 'run'】,即可开始运行run.py脚本:
此时在界面底部的终端内容输出区域中,可以看到程序运行时的打印信息:
与此同时,VeighNa Trader的主窗口也会自动弹出显示:
回到PyCharm,可以看到项目界面右上角已经有run脚本的运行记录了,后续直接点击三角形运行按钮也可运行脚本,如下图所示:
PyCharm的断点调试功能十分强大,这里使用一个VeighNa的策略历史回测脚本来演示。
在左侧项目导航栏中点击鼠标右键,选择【New】-【File】, 在弹出的对话框中创建backtest.py:
然后在文件中编写简单的策略回测代码(具体可参考Github仓库中的回测示例),在想要调试的地方打上断点,如下图所示:
点击鼠标右键选择【Debug 'backtest'】, 即可开始调试脚本:
此时项目界面右上角已经可以看到backtest.py的运行记录,后续也可以通过点击这里的按钮直接启动调试任务:
启动调试后,可以看到主界面底部的Debug窗口开始输出程序运行信息,并且程序会暂停运行在第一个断点处。左侧显示的是线程信息,右侧则是当前上下文中的变量信息:
点击类似播放键的【Resume Program】即可继续运行调试,直到下一个断点处再次暂停:
此时可以看到底部右侧监控窗口中,当前上下文中的变量发生了变化:
后续重复上述步骤,点击【Resume Program】直到调试结束,可以看到Debug窗口的相应输出:
调试完之后,点击【Rerun 'backtest'】即可重新调试:
在调试过程中,点击【Step Into】可以进入函数的内部查看运行时的细节状态:
点击【Step Out】则可跳出当前函数,查看外层调用栈的状态:
点击【Step Over】可越过子函数(子函数会执行):
点击【Stop 'backtest'】则会直接停止当前程序的运行:
在PyCharm中新建项目时,默认是在当前目录下运行程序。若需要指定程序运行的目录,可以点击项目界面右上角的【Edit】进入【Run/Debug Configurations】界面:
修改程序启动时的目录【Working directory】即可:
通常情况下,PyCharm只能在Python解释器中启动的线程里进行代码断点调试。之前有部分用户反馈过尝试在C++回调函数(如CTP API接口、PySide图形库等)中打断点但无法起效的问题。针对这种情况,可以通过在代码中设置断点的方式,来实现对非Python线程(即C++线程)的断点调试。
在项目左侧导航栏中点击鼠标右键,选择【New】-【File】, 创建geteway_test.py。
在创建成功的geteway_test.py中添加一段脚本策略的代码(可参考该文件),然后按住Ctrl同时用鼠标左键点击代码中的CtpGateway,跳转至ctp_gateway.py的源码中,在想要调试的回调函数内打上断点(注意不要打在函数定义的def那一行),如下图所示:
回到gateway_test.py,点击鼠标右键选择【Debug 'gateway_test'】开始调试:
请注意,如果用load_json函数读取connect_ctp.json,请确保读取对应.vntrader文件夹的json文件中配置了CTP账户登录信息。
此时可观察到并没有进入之前设定的断点,如下图所示:
终止调试后,找到之前在ctp_gateway.py中设定的断点处,在回调函数内的断点之前添加以下代码:
import pydevd
pydevd.settrace(suspend=False, trace_only_current_thread=True)
请注意:
然后再次运行调试gateway_test.py脚本:
此时可以看到底部的调试窗口中开始输出相关信息,同时程序暂停在了之前设置的断点处。左侧显示的是线程信息(可以看到多了一个Dummy线程显示),右侧显示的是变量信息(可以看到回调函数的入参):
发布于VeighNa社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2024-12-29
今年【社区活动尊享卡】的受欢迎程度大幅超出我们的预期,为了保证每场社区活动的交流质量,尊享卡已经变更为仅对部分专业交易员用户定向提供。同时当前的999优惠价格(12次活动)将于2024年12月31日结束,25年将会上涨到1099的价格。有需要的同学请扫描二维码添加小助手咨询:
本周发布了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 2.0版本中相对复杂的安装流程(WSL安装配置、FQDN服务器地址验证、服务自动启动等),难住了许多对于Linux命令操作不那么熟悉的VeighNa社区同学。
本次3.9.4版本更新中升级实现了对于TDengine 3.0版本的适配,在保持原有高性能的同时,大幅降低了在Windows系统上使用VeighNa平台对接TDengine的安装配置难度,强烈推荐已经遇到默认SQLite数据库性能瓶颈的同学们上手体验。
对于大多数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程序,点击窗口右上角的齿轮按钮进入全局配置页面,如下图所示:
勾选【General】下的【Start Docker Desktop when you sign in to your computer】后,点击右下角的【Apply & restart】按钮,将Docker Desktop设置为随操作系统启动(配合后面的容器自动重启参数,实现TDengine的后台服务式运行)。
完成后可以关闭Docker Desktop窗口,此时软件不会退出,而是最小化到系统右下角的托盘栏中。随后打开PowerShell或者其他命令行工具(文中使用的是Windows Terminal中运行的PowerShell),运行命令:
docker
如果能看到如下图所示输出,则说明Docker运行正常:
下一步是使用命令拉取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窗口中运行,等待几秒后容器启动成功会输出一段较长的随机字符串(容器编号)。
启动容器后,可以通过下述命令来查看当前容器的运行状态:
docker ps
正常运行状态下,输出的信息如下图所示:
命令中的具体参数(以-或者--开头)说明如下:
-v:用于挂载Windows系统下的指定文件夹到容器中,为容器中运行的TDengine程序提供数据存储输出,可以根据自己的需求修改:
/var/lib/taos,对应的是TDengine的数据存储路径;
/var/log/taos,对应的是TDengine的日志输出路径。
-p:用于将Windows系统的端口映射绑定到容器中对应的端口,为外部程序提供数据库访问,这些端口参数建议保持不变:
--restart:用于设置容器的重启策略,always代表每次Docker Desktop启动后都立即启动TDengine容器,结合之前设置的Docker Desktop开机自动启动即可实现时序数据库的后台服务式运行。
完成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文件里)填入以下内容:
重启后,即可体验VeighNa Trader连接TDengine时序数据库的高能性能数据读写。
本次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容器环境进行了适配,如下图所示:
上述命令中的"-v /mnt/c/veighna/home:/home",用于将宿主机中的"/mnt/c/veighna/home"文件夹,挂载到Docker容器中的"/home"路径,作为VeighNa运行时的数据存储和日志输出,实际使用时可以根据自己的需求进行调整。
发布于VeighNa社区公众号【vnpy-community】
原文作者:VeighNa小助手 | 发布时间:2025-04-09
2025年3月,VeighNa量化平台4.0版本正式开源了面向多因子策略的vnpy.alpha模块,为专业量化交易员提供完整的因子特征工程框架和策略回测系统。然而,由于截面多因子策略开发涉及跨学科知识体系(金融理论建模、海量数据处理、机器学习算法实践),许多社区同学看完开源代码后的反馈是依旧不知从何下手开始学习。
基于此,2025年第二场小班特训营将继续深化【机器学习截面多因子策略】核心主题,并在往期课程基础上实现两大升级:
老规矩还是放几张之前特训营的照片:
准备完毕,静候小班同学到达
学习量化,掌握核心理论框架
深入代码,分析策略逻辑细节
现场实践,剖析机器学习算法
截面多因子策略还有另一个大家可能更为熟悉的名字:Alpha策略。作为一种广义的统计套利型量化策略,截面多因子策略除了应用在股票量化选股领域外(指数增强和绝对收益),同样也可以应用于带杠杆的衍生品多空组合领域(期货、固收、互换等)。
ML模型预测信号分析
截面策略超额收益绩效
基于之前学员的反馈,小班特训营这种2天10小时+的高强度课程通过线上直播学习的效果并不理想。为了保证更好的学习质量,我们对授课模式进行了调整:后续小班特训营不再提供线上直播参加和视频内容回看,而是改为同一主题的每场小班课都可以再次到场听讲。同时,我们会针对每一个特训营的主题建立专项社群,持续提供专业交流与学习服务,而不再只局限于三个月的答疑时间。
小班特训营优先面向买方投资机构。由于截面多因子策略本身的复杂性(因子数据、算力需求、金融理论等),不建议新手报名,本场课程部分名额已经被提前锁定,感兴趣的同学请抓紧。
VeighNa机器学习截面多因子策略
日期:2025年6月7日(周六)和6月8日(周日)
时间:两天下午1点-6点,共计10小时
地点:上海浦东(具体地址会在报名成功后发送)
大纲:
快速上手投研开发
a. 针对机器学习投研的硬件和系统选择
b. VeighNa AlphaStrategy开发环境准备
c. 跑通LightGBM模型截面多因子策略开发
截面多因子策略原理
a. 经典理论的量化交易实践
i. 主动投资组合管理
ii. 金融资产定价模型
iii. 统计套利因子模型
b. 截面类策略的完整投研流程
因子特征数据准备
a. 因子的主要分类和数据来源
b. 特征数据开发模板AlphaData
i. 基于表达式的特征计算引擎
ii. 特征数据的清洗和预处理
iii. 如何选择ML模型的预测目标
c. 商品期货多因子特征数据集
ML预测模型训练
a. 监督学习算法概述:线性模型、树模型、神经网络
b. ML预测模型的训练与优化
i. 模型评估统计指标详解
ii. 特征重要性分析与可解释性研究
iii. 超参数调整与模型验证方法
c. 基于AlphaModel模板快速开发ML预测模型
i. 线性回归类:Lasso
ii. 集成学习类:XGBoost、DoubleEnsemble
iii. 神经网络类:LSTM、GRU、ALSTM、Transformer
截面投组策略构建
a. 时序类策略 vs 截面类策略
b. 标准化截面策略开发模板AlphaStrategy
c. 截面策略回测中的关键细节梳理
实战进阶开发应用
a. 更有效日内高频Alpha因子特征
b. 基于GPLearn遗传规划的因子特征挖掘
c. Alphalens因子特征和预测信号评估
d. 不止于股票市场的截面类策略
价格:11999元
报名请扫描下方二维码添加小助手提供相关信息(想参加的课程、姓名、手机、公司、职位),报名结果以确认回复为准: