第二章:vn.py框架介绍

说实话,我第一次接触vn.py的时候,心里是有点抵触的。毕竟做量化交易这么多年,自己手撸过不少回测脚本,总觉得框架这东西太笨重。但后来真香了——当你需要同时跑十几个品种的策略,还要处理各种数据源、交易接口的时候,框架的价值就体现出来了。

这一章,我带大家看看vn.py到底长什么样。不扯虚的,直接看架构、核心组件,最后教你怎么装起来跑通。

2.1 vn.py的整体架构

vn.py的架构,说白了就是「事件驱动」四个字。什么意思呢?就是整个系统像一台精密的机器,每个零件都在等一个「信号」才动。这个信号就是事件。

我画了一张图,帮你理解这个架构:

vn.py 事件驱动架构图 事件驱动引擎 Event Engine 数据服务 Data Service 行情数据 · 历史数据 策略引擎 Strategy Engine 策略加载 · 回测 · 实盘 交易接口 Gateway CTP · 易盛 · 仿真 应用层 CTA策略 · 套利策略 · 期权策略 · 脚本策略 事件驱动:各组件通过事件总线通信,松耦合、高内聚

看到这张图了吗?核心就是中间那个「事件驱动引擎」。它像个调度中心,所有组件都通过它来通信。数据服务推送行情、策略引擎发出信号、交易接口执行下单——谁也不直接调用谁,全靠事件来驱动。

核心思想:事件驱动架构让各个模块解耦。你换数据源、换接口、换策略,都不影响其他部分。我当年从CTP切到易盛,只改了网关配置,策略代码一行没动。

2.2 核心组件详解

2.2.1 事件驱动引擎

这是vn.py的心脏。它维护着一个事件队列,不断从队列里取事件,然后分发给注册过的处理器。

为什么会设计成这样?你想想看,期货行情每秒都在变,如果每个组件都去轮询数据,CPU得炸。事件驱动的好处是——有行情来了才处理,没行情就闲着。

我记得有一次帮朋友调优,他的策略在回测时跑得飞快,但一上实盘就卡顿。查了半天,发现是他自己写了个死循环轮询行情。换成事件驱动后,CPU占用从80%降到了15%。

2.2.2 数据服务

数据服务负责两件事:一是提供历史数据用于回测,二是推送实时行情用于实盘。

vn.py内置了好几种数据源:

数据源 适用场景 特点
本地CSV/Parquet 回测、离线分析 速度快,但需要自己维护数据
MongoDB 中小规模回测 查询灵活,适合多品种
InfluxDB 高频、时序数据 写入快,适合Tick级别
数据库(SQL) 企业级部署 稳定,但性能一般

我的建议:刚开始做回测,用CSV最省事。等策略多了、数据量大了,再迁移到MongoDB。别一上来就搞分布式,容易把自己绕进去。

2.2.3 策略引擎

策略引擎是写策略的地方。它提供了一套基类,你只需要继承它,实现几个关键方法:

  • on_init() — 策略初始化,加载参数
  • on_start() — 策略启动,准备干活
  • on_tick() — 每来一个Tick行情,触发一次
  • on_bar() — K线合成后触发
  • on_order() — 订单状态变化时触发

说白了,你只需要关心「行情来了怎么办」和「订单成交了怎么办」。其他事情——数据合成、订单管理、资金计算——框架都帮你做了。

我曾经带过一个新人,他第一次写策略时总想自己管理订单状态。我跟他说:「你只管发信号,剩下的交给框架。」后来他改完代码,回测速度提升了3倍。

2.3 vn.py的安装与配置

安装这块,我踩过不少坑。直接说最稳的方法:

2.3.1 环境准备

建议用Python 3.8或3.9。3.10以上有些依赖还没完全适配,容易出幺蛾子。

# 推荐用conda创建虚拟环境
conda create -n vnpy python=3.9
conda activate vnpy

注意:千万别在base环境里直接装vn.py。我见过有人把系统Python搞崩了,最后重装了系统。虚拟环境是保护伞,养成好习惯。

2.3.2 安装vn.py

有两种方式:

  1. pip安装(推荐):适合大多数用户,一键搞定
  2. 源码安装:适合需要二次开发的同学
# 方式一:pip安装
pip install vnpy

# 方式二:源码安装
git clone https://github.com/vnpy/vnpy.git
cd vnpy
pip install .

安装完成后,验证一下:

python -c "import vnpy; print(vnpy.__version__)"

如果输出版本号,恭喜你,装好了。

2.3.3 配置数据路径

vn.py默认会在用户目录下创建 .vntrader 文件夹。你可以在这里放数据文件、策略文件、日志等。

# 查看默认路径
import os
print(os.path.expanduser("~/.vntrader"))

我个人习惯把数据放在 ~/.vntrader/data 下,策略放在 ~/.vntrader/strategies 下。这样结构清晰,找东西方便。

2.3.4 快速启动回测

装好之后,你可以用命令行启动图形界面:

vnpy

或者直接写脚本跑回测:

from vnpy.app.cta_strategy.backtesting import BacktestingEngine
from vnpy.trader.constant import Interval

engine = BacktestingEngine()
engine.set_parameters(
    vt_symbol="rb2205.SHFE",
    interval=Interval.MINUTE,
    start=datetime(2022, 1, 1),
    end=datetime(2022, 3, 31),
    rate=0.0001,
    slippage=0.5,
    size=10,
    pricetick=1,
    capital=1_000_000
)
engine.add_strategy(DemoStrategy, {})
engine.run_backtesting()
engine.calculate_result()
engine.calculate_statistics()
engine.show_chart()

这段代码就是回测的骨架。你只需要替换策略类、品种、时间范围,就能跑起来。

避坑指南:我曾经在回测时忘了设置 slippage(滑点),结果回测收益高得离谱,实盘直接亏成狗。记住,滑点一定要设,哪怕设小一点,也比不设强。

2.4 小结

这一章我们聊了vn.py的架构——事件驱动引擎是核心,数据服务、策略引擎、交易接口是三大支柱。安装配置其实不难,关键是理解它的设计思想。

嗯,框架这东西,刚开始会觉得多了一层抽象,但用顺手了就会发现——它帮你省掉的是那些重复造轮子的时间。下一章,我们就要开始真正写策略了,到时候你会更明白框架的价值。


公众号:蓝海资料掘金营,微信deep3321