ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

用 Python 做量化回测,怎么少踩一半的坑:3 步跑通 VeighNa(vnpy)最小路径

用 Python 做量化回测,怎么少踩一半的坑:3 步跑通 VeighNa(vnpy)最小路径

用 Python 做量化回测,怎么少踩一半的坑:3 步跑通 VeighNa(vnpy)最小路径

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

先说个场景。你想验证一个多因子选股想法:拉一年 A 股日线,算几个因子,喂给模型,回测看看能不能赚钱。结果卡住了——数据时间戳对不齐,滚动特征手写了三天,回测里的滑点和手续费不知道往哪算,最后还发现想接实盘得重新学一遍券商 API。

说白了,你缺的不是某一个函数,而是一条从数据到实盘都走同一套接口的管线。VeighNa(vn.py)就是为这个做的基础设施:一个 Python 量化交易系统开发框架,行情、回测、策略、网关、AI 因子研究都拆成了独立模块,你只管填策略逻辑。

三个最常见的卡点,它分别接在哪里

  • 数据与特征工程太脏。做机器学习策略,八成时间耗在清洗数据上。vnpy 4.0 新增的 vnpy.alpha 模块里,AlphaDataset把这件事变成"写表达式":因子用表达式定义,缺失值填充、无穷值替换、时序标准化这些脏活有现成的处理函数,还支持多进程批量计算。
  • 换个模型就得重写一遍流程。AlphaModel模板只规定fit和predict两个方法,换算法不改管线。Lasso、LightGBM、MLP 三个模型开箱即用(见 model/models/),还内置了源自微软 Qlib 的 Alpha 158 因子集,不用自己从零凑特征。
  • 回测和实盘是两套代码。回测引擎BacktestingEngine会算手续费、滑点和资金占用,策略模板AlphaStrategy负责按模型信号调仓位;同一套策略代码通过网关接口也能接到实盘账户上,不存在"回测一套、实盘重写一套"的问题。

多因子研究这条链是怎么串的

把 vnpy/alpha/ 拆开看,其实就是研究员的工作流本身:dataset 算特征、model 训练预测、strategy 按信号出仓位、lab.py 的AlphaLab把中间产物(K 线、成分股、数据集、模型、信号)统一存在一个本地工作区里,不用自己管文件路径。

lab = AlphaLab(lab_path="alpha_lab") dataset = AlphaDataset(df, train_period=("2021-01-01", "2023-12-31"), valid_period=("2024-01-01", "2024-06-30"), test_period=("2024-07-01", "2024-12-31")) dataset.add_feature("mom_20", "ts_delay($close, 20) / $close - 1") dataset.set_label("ts_delay($close, -5) / $close - 1") dataset.prepare_data() model = lab.load_model("LassoModel") model.fit(dataset) signal = model.predict(dataset, segment="test")

跑通这段之后,信号直接喂给策略回测,整个过程就是"数据 → 特征 → 预测 → 仓位 → 绩效",没有任何一步需要手写胶水代码。

事件引擎和网关插件,实盘骨架就这两块

vn.py 的核心不是回测,是事件驱动的实时骨架。EventEngine 用一个单线程 + 队列分发事件:行情来了发 tick 事件,策略、风控、界面各自注册处理器,互不阻塞,也不用你操心线程安全。Event只有一个类型字符串和 data 载荷,轻量到可以当任何组件间通信的底座。

event_engine = EventEngine() event_engine.register("eTick", on_tick) event_engine.start()

交易所差异则被关在网关插件里:CTP(国内期货/期权)、XTP(A 股)等接口都是独立包,装哪个用哪个,MainEngine.add_gateway()一行接入,策略代码对下游毫无感知。

从零到跑起来,最小路径就三件

Python 3.10~3.13,然后装框架:

pip install vnpy pip install vnpy[alpha] # 做多因子研究时才需要

装完别急着写代码。官方在 examples/alpha_research/ 里放了一整套 notebook:下载指数成分股和 K 线 → 算因子 → 分别用 Lasso / LightGBM / MLP 训练 → 回测出绩效报告。照着 research_workflow_lgb 从第一个 cell 敲到最后一个,比读十篇教程都管用。CTA 策略回测可以看 examples/cta_backtesting/。

回测跑不通,先按这张清单排查

版本和 ta-lib 占了八成的报错。框架只支持 Python 3.10 及以上,低于这个版本直接装不上。ta-lib 是硬依赖,Linux 上要编译 C 库(仓库里的 install.sh 会自动处理这一步),Windows 和 macOS 一般 pip 直装即可。如果你看到一堆ta-lib的编译错误,先解决它,别的都是小事。

依赖装错位置是第二常见。vnpy[alpha]会带进 polars、lightgbm、torch、scikit-learn,体积不小但只服务于多因子模块;只想跑 CTA 回测的人装基础包就够了。另外vnpy.alpha的 K 线数据走 parquet 存本地工作区,数据时间列格式不对时prepare_data()会静默产出空特征,先print一下特征表的行数再怀疑模型。

它替你做多少,又在哪条线上停住

先说清楚:框架给的是基建,不保证收益。它替你把数据、回测、执行这三段路铺平了,但策略逻辑、因子研究、风控参数全是你自己的事。

两条实用边界:一,交易网关(如 vnpy_ctp)和 CTA 策略引擎(vnpy_ctastrategy)是独立的社区包,仓库核心不带,用到再装;二,生产级部署要自己搭——比如 examples/no_ui/run.py 展示了用多进程守护 CTA 实盘、按交易时段自动启停的完整写法,可以直接抄。更多组件介绍见 官方文档。

下一步:先pip install vnpy装好环境,打开 examples/alpha_research/research_workflow_lgb 把 notebook 从第一个 cell 跑到出绩效报告;跑顺之后再挑一个你关心的品种,把因子和标签换成自己的,用BacktestingEngine出一份完整回测。有问题翻 docs/,实在解决不了就去社区论坛问,这是最快的路。

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

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进