vn.py 量化交易框架完整指南:四步跑通事件驱动与 AI 选股流水线
【免费下载链接】vnpy基于Python的开源量化交易平台开发框架项目地址: https://gitcode.com/vnpy/vnpy
vn.py 是一个基于 Python 的开源量化交易框架,把行情接入、订单管理、数据存储和策略回测全部标准化,并内置一条 AI 选股流水线。新手照着两分钟能跑通,有基础的研究者可以直接拿它做机器学习选股。
它是什么
vn.py 的定位是"框架"而不是"终端"。行情网关、策略引擎、回测器、数据库、GUI 应用,它都给了标准实现,你的工作只剩写策略本身。适用人群分两类:刚入门、想要一套能实盘也能回测的起点的人;以及有 Python 基础、想把因子研究搬进生产的人。下面按"先跑起来,再讲为什么"的顺序走。
两条命令跑通第一个实例
先装核心包加你要用的网关和应用插件。CTP 是国内期货最常用的网关,CTA 策略与回测器、数据管理器是配套插件:
pip install vnpy vnpy_ctp vnpy_ctastrategy vnpy_ctabacktester vnpy_datamanager然后拉一份仓库代码,运行带界面的示例,几秒钟就能看到行情窗口:
git clone https://gitcode.com/vnpy/vnpy && cd vnpy && python examples/veighna_trader/run.py不想开 GUI 的话,examples/ 里还有一个no_ui/run.py,不到一百行演示了"主引擎 + CTP 网关 + CTA 策略引擎"的组合,顺带写了按交易时段启停子进程的守护逻辑,值得逐行读。接下来看它底层凭什么稳。
事件驱动架构怎么扛住行情
把 vn.py 想象成一条工厂产线:行情网关是进料口,策略是工人,数据库是仓库,中间隔着一台中央分拣台。EventEngine就是这台分拣台(vnpy/event/),跑在一个独立线程里。
每个Event只有两样东西:type说明消息归谁管,data装具体内容。网关收到行情,把事件扔进分拣台就走人,绝不在回调里顺手写数据库或算策略。策略、应用各自订阅自己关心的type,分拣台按类型投递。生产者和消费者从此解耦:慢消费者只会让队列变长,不会拖住进料口。
from vnpy.event import EventEngine, Event, EVENT_TIMER engine = EventEngine() def on_timer(event: Event): print("收到定时事件") engine.register(EVENT_TIMER, on_timer) engine.start()引擎默认每秒投递一次EVENT_TIMER。vnpy/trader/engine.py 里的MainEngine再往上一层,负责统一挂接网关和应用。看懂这套消息流,下面的 AI 选股模块就好接手了。
四步搭出 AI 选股流水线
vnpy/alpha/模块把"数据落盘 → 因子与标签 → 训练模型 → 回测验证"串成一条标准流水线。
第一步:数据落盘
AlphaLab(vnpy/alpha/lab.py)是研究数据的中转站,按合约把日线、分钟线写成 parquet 文件,之后取数、回测都从 lab 读:
from vnpy.alpha import AlphaLab lab = AlphaLab("lab_data") lab.save_bar_data(bars)第二步:因子与标签
AlphaDataset接收 polars 的 DataFrame,把时间段切成Segment.TRAIN / VALID / TEST三段。因子直接写表达式,也可以批量引入内置的 158 个经典 Alpha 因子:
from vnpy.alpha.dataset import AlphaDataset from vnpy.alpha.dataset.datasets.alpha_158 import Alpha158 dataset = Alpha158( df=df, train_period=("2019-01-01", "2021-12-31"), valid_period=("2022-01-01", "2022-12-31"), test_period=("2023-01-01", "2023-12-31"), ) dataset.set_label("ts_future_return(close, 5)") dataset.prepare_data()prepare_data()会用多进程并行算完所有表达式。它内置process_cs_norm、process_robust_zscore_norm等预处理,并把处理函数分成 infer 与 learn 两类,就是为了挡掉验证集信息在训练时泄进来的问题。
第三步:训练模型
模型接口统一成AlphaModel,只需实现fit和predict。内置 Lasso、LightGBM、MLP 三种,拿 LightGBM 最快:
from vnpy.alpha.dataset import Segment from vnpy.alpha.model.models.lgb_model import LgbModel model = LgbModel() model.fit(dataset) pred = model.predict(dataset, Segment.TEST)第四步:回测验证
把预测信号和策略交给BacktestingEngine。自带的EquityDemoStrategy是完整的多头选股模板:每天按信号排序取前 50 只,踢掉不在指数成分里的持仓,还要过最小持有天数和手续费约束:
from vnpy.alpha.strategy import BacktestingEngine from vnpy.alpha.strategy.strategies import EquityDemoStrategy engine = BacktestingEngine(lab) engine.set_parameters(vt_symbols=stock_list, interval=Interval.DAILY, start=datetime(2023, 1, 1), end=datetime(2023, 12, 31), capital=1_000_000) engine.add_strategy(EquityDemoStrategy, {}, signal_df=signal) engine.load_data() engine.run()跑完run()就能出绩效图表。整条流水线不碰行情接口和下单协议。下面几条是我踩过的坑,帮你省点时间。
踩坑提醒
- 因子写成 Python for 循环会慢几个数量级。错在哪:逐行遍历 DataFrame。怎么办:一律用 polars 表达式,还能用运算符重载拼新因子。
- 归一化在整段数据上拟合,等于把未来信息带进训练。错在哪:验证集参数污染训练。怎么办:参数只从训练集拟合,其余段只套用——这正是
AlphaDataset分 infer 与 learn 两条管线的原因。 - 回测起点当天信号一片空白。错在哪:长窗口因子没有预热期。怎么办:回测开始前多加载一段历史,
load_bar_df的extended_days参数就是干这个的。 - 数据没核实就上模型,结果出来没法信。怎么办:先用数据管理器手工查几根 K 线、核对行数和日期范围,再开训。
- 回测一套代码、实盘另写一套,行为迟早漂移。怎么办:回测与实盘共用同一份
AlphaStrategy回调代码,回测通过后再迁移,改动最小。
想动手的话,docs/community/ 从入门文档开始读最顺。
继续深入
- 官方文档:
docs/community/覆盖安装、网关、数据库和各应用模块,新人从 info 下的介绍文档读起。 - 示例代码:
examples/alpha_research/是整套 AI 选股 notebook,cta_backtesting/和portfolio_backtesting/覆盖期货与组合回测。 - 核心源码:事件引擎在
vnpy/event/,交易核心在vnpy/trader/,AI 量化在vnpy/alpha/,按需精读即可。 - 版本历史:
CHANGELOG.md记录了每个版本的演进,读它比读代码更快理解设计取舍。
今天就能做的事
把 examples/veighna_trader/ 的run.py跑起来,再花二十分钟通读 vnpy/event/engine.py,全文不过一百四十多行。然后打开 examples/alpha_research/ 里 LgbModel 的工作流,把股票池和时间段换成自己的数据,整条 AI 选股流水线就跑通了。
【免费下载链接】vnpy基于Python的开源量化交易平台开发框架项目地址: https://gitcode.com/vnpy/vnpy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考