Left, Down, Page DownNext slide
Right, Up, Page UpPrevious slide
SpaceForward
Python程序化交易开源开发框架 - VNPY介绍

国泰君安 固定收益部 IT组

2018-05-25 / Johann Huang
目录
- VNPY简介
- VNPY的架构
- VNPY的安装
- VNPY的使用
- VNPY封装的接口
- VNPY事件驱动编程引擎
- VNPY行情记录应用
- VNPY套利交易应用
- VNPY事件驱动过程
- VNPY SniperAlgo策略细节
- VNPY代码重构
- 量化交易系统整合
- 参考资源
        
## VNPY简介

VNPY是一个 **Python** **程序化交易** **开源**开发框架

VNPY主要包含以下几个部分功能

- `vnpy.api`,使用Python对C++行情及交易接口的封装(语言翻译)
- `vnpy.event`,使用Python对事件驱动编程框架的实现
- `vnpy.data`,使用Python对历史行情数据接口的封装(使用简化),不完整
- `vnpy.pricing`,使用Python对部分定价模型的实现(事实上也即一些通用函数),不完整
- `vnpy.rpc`,使用Python多进程解耦的实现(RPC是指远程过程调用,跨进程通讯,核心是实现 C能给S说话,S也能给C说话)
- `vnpy.trader`,使用Python对以上实现的综合运用(结构组织比较混乱)
  - `vnpy.trader.gateway`,使用Python对原始行情及交易接口的封装(使用简化及事件驱动编程框架运用)
  - `vnpy.trader.app`,使用Python对各种应用引擎、前端GUI的实现
    - ctaStrategy, dataRecorder, optionMaster, riskManager, spreadTrading
    - jaqsService, rpcService, rtdService
  - `vnpy.trader.*`,使用Python对基础引擎、通用方法及前端GUI模块的实现
      
## VNPY简介.续

VNPY使用示例、文档及其他

- `examples`,VNPY使用示例
  - VnTrader,最常用的vn.py图形交易界面
  - ServerClient,服务端(业务逻辑)和客户端(GUI界面)分离的VnTrader,使用了`vnpy.rpc`
  - WebTrader,使用Web前端作为GUI的交易系统,使用了Web API及`vnpy.rpc`
  - OptionMaster,期权量化交易系统
  - DataRecording,全自动行情记录工具(无需用户每日定时重启)
  - CtaTrading,无图形界面模式的CTA策略交易
  - CtaBacktesting,CTA策略的回测和优化
  - ShcifcoDataService,上海中期历史行情服务(期货)
  - TqDataService,天勤历史行情服务(期货)
  - TushareDataService,TuShare历史行情服务(A股)
  - FutuDataService,富途证券历史行情服务(美股、港股)
  - QuantosDataService,quantOS历史行情服务(A股、期货)
  - JaqsService,Jaqs服务
- `docker`, `docs`, `beta`,环境,教程及计划中的开发,不完整
      
## VNPY的架构

![参考架构](images/20180525/VNPY_AlgoTrader_Framework.png)
      
## VNPY的架构.续

![VNPY jhTrader Framework](images/20180525/VNPY_jhTrader_Framework.png)
      
## VNPY的架构.再续

![quantOS架构](images/20180525/VNPY_quantOS_Framework.png)
      
## VNPY的安装

### 环境要求

因为作者基于Windows 7采用Visio Studio 2013对Windows版本C++及dll文件涉及的接口进行的封装,所以生成的Python封装接口也需要Windows环境。
另外,作者要求使用32位的Python 2.7(个人观点,如果仅使用VNPY提供的封装接口,则理论上应该可以采用其他版本的Python)。

### 安装方法

- [Anaconda2-4.0.0-Windows-x86](https://repo.continuum.io/archive/.winzip/Anaconda2-4.0.0-Windows-x86.zip),包括Python 2.7 32位版本
- [Visual C++ Redistributable Packages for VS2013](https://www.microsoft.com/zh-cn/download/details.aspx?id=40784),vn.py项目的底层API接口封装开发时使用的编译环境为VS2013
- [MongoDB Windows Server 2008 R2 64-bit and later, with SSL support x64, Version 3.4](https://www.mongodb.com/download-center#community),最好设定为开机自启服务
- [VNPY Release](https://github.com/vnpy/vnpy/releases),解压运行`install.bat`,就是本地编译安装Python包

双击`examples/VnTrader`目录下的`VnTrader.bat`启动VnTrader检查是否安装成功。
      
## VNPY的使用

### 推荐方法

个人推荐,基于VNPY提供的对C++行情及交易接口封装的Python接口库(`vnpy.api`),自己重新对VNPY源码其他部分进行解耦及重构后使用。

换言之,使用 `vnpy.api` 提供的 **行情接口** 获取当前行情数据,然后根据 **自己定义的流程及交易策略** 进行决策, 最后通过 `vnpy.api` 提供的 **交易接口** 进行交易。(架构及通信方面采用或参照 `vnpy.event` 及 `vnpy.rpc`)

### 相关资源

1. 官方文档,GitHub VNPY Repository Wiki + 官网 + 知乎专栏
2. `examples`目录里的示例代码 + `vnpy/trader/`目录里的源代码
3. 其他源码及注释
      
## VNPY封装的接口

根据官方文档,VNPY对以下行情及交易接口进行了封装

- CTP(ctp)
- 飞马(femas)
- 中泰证券XTP(xtp)
- 中信证券期权(cshshlp)
- 金仕达黄金(ksgold),金仕达期权(ksotp)
- 飞鼠(sgit)
- 飞创(xspeed)
- QDP(qdp)
- 上海直达期货(shzd)
- Interactive Brokers(ib)
- OANDA(oanda)
- 福汇(fxcm)
- OKCOIN(okcoin),火币(huobi),LBank(lbank)

具体版本代码中可以使用的接口见源码的`vnpy/api`文件夹。
      
## VNPY封装的接口.续

![接口列表](images/20180525/VNPY_API_Table.jpg)
      
## VNPY事件驱动编程引擎

![](images/20180525/Event_Driven_Programming.png)

事件队列(put),轮询获取,回调函数列表(register)

相关源码代码位于 `vnpy/event` 文件夹

无界面的使用EventEngine2类(如examples/CtaTrading,使用的单独线程实现的定时器功能);
有界面的使用EventEngine类(如examples/VnTrader,使用了PyQt中的QTimer实现的定时器功能)。
      
## VNPY行情记录应用

![](images/20180525/VNPY_DataRecorder_Widget.png)

相关源码位于 `examples/DataRecording` 及 `vnpy/trader/app/dataRecorder`

对象初始化时,实现事件绑定,开始监听及记录行情数据(依靠主引擎推送相关事件及数据);
使用 `examples/VnTrader` 时,可以点击主界面菜单栏 `功能->行情记录` 来查看目前正在记录的行情数据内容。
      
## VNPY套利交易应用

相关源码位于 `examples/SpreadTrading` + `vnpy/trader/app/SpreadTrading`

![](images/20180525/VNPY_SpreadTrading_Engines.png)
      
## VNPY事件驱动过程

![](images/20180525/VNPY_EVENT_FLOW.png)
      
## VNPY SniperAlgo策略细节

### VNPY SniperAlgo

- 半自动化交易,人工设定阈值
- 程序化交易(自动触发下单,自动决定价与量,合理分拆订单)
- 主动腿 : 被动腿 = 1 : n

### 下单步骤

下单分为多个步骤

合约代码 - Contract - QuoteDecision - OrderRequest - Splited OrderRequests (委托转换及分离下单)

      
## VNPY SniperAlgo策略细节.续

### 策略参数

- payup
- multiplier
- ratio
      
VNPY代码重构
quantTrader
│  spreadTrader.bat
│  spreadTrader.py
├─configs
│      CTP_connect.json
│      ST_setting.json
│      VT_setting.json
├─trader
│  │  constants.py
│  │  objects.py
│  │  settings.py
│  │  utils.py
│  ├─apps
│  │  └─spreadTrader
│  │      │  stAlgo.py
│  │      │  stBase.py
│  │      │  stEngine.py
│  │      │  uiStWidget.py
│  │      └─ __init__.py
│  ├─engines
│  │      baseEngine.py
│  │      dataEngine.py
│  │      eventEngine.py
│  │      logEngine.py
│  ├─gateways
│  │  │  __init__.py
│  │  └─ctpGateway
│  │      │  ctpGateway.py
│  │      └─language
│  │          │  __init__.py
│  │          ├─chinese
│  │          │      text.py
│  │          └─english
│  │                  text.py
│  └─language
└─_temp
          
- 高内聚低耦合,基础引擎、上层应用及应用模块解耦
- 考虑函数依赖关系及对象依赖关系(Pycallgraph)
  - Event对象、Event_Type_常量与EventEngine的关系
- 单例模式与工厂模式的运用
  - eventEngine实际上为单例
  - 每个套利策略可以由工厂生成
- 维护清晰的事件处理流程,建构更强大的事件管理器
  - 事件触发为核心
  - 事件处理函数列表
  - 事件动作的多层包装构成动作链,
- 利用高级语言引用传递特征
          
量化交易系统整合
Python优势

- 胶水语言,可以粘合现有可用功能与接口
- 爬虫优势,有丰富的库从互联网采集数据
- 数据分析优势,高效率数据的清洗、变形及机器学习分析
- 可视化报告,高效的表达

量化架构

![](images/20180525/quantTrader_Framework.png)
          
数据源及影响因子

- 历史行情数据 | 统计分析
- 新闻资讯数目,用户点击数目,用户评论数目 | 文本挖掘
- 当日搜索引擎数据 | 搜索热度
          
## 参考资源

事件驱动引擎

- [VNPY 事件引擎](https://github.com/vnpy/vnpy/wiki/事件引擎)
- [教程4-事件驱动引擎原理和使用](http://www.vnpy.org/basic-tutorial-4.html)

实时行情记录

- [行情记录模块](https://github.com/vnpy/vnpy/wiki/行情记录模块)

CTA策略开发

- [CTA策略模块文件介绍](https://github.com/vnpy/vnpy/wiki/CTA策略模块文件介绍)
- [CTA策略模块策略开发](https://github.com/vnpy/vnpy/wiki/CTA策略模块策略开发)
- [CTA策略模块策略回测](https://github.com/vnpy/vnpy/wiki/CTA策略模块策略回测)
- [CTA策略模块策略实盘](https://github.com/vnpy/vnpy/wiki/CTA策略模块策略实盘)
- [使用TA-Lib在vn.trader上开发CTA交易策略](http://www.vnpy.org/talib-tutorial.html)
- [在Python中使用QuantLib](http://www.vnpy.org/quantlib-tutorial.html)
        
## 参考资源.续

历史行情数据

- [数据解决方案](https://github.com/vnpy/vnpy/wiki/数据解决方案)
- [上海中期数据解决方案](https://github.com/vnpy/vnpy/wiki/上海中期数据解决方案)
- [天勤终端数据解决方案](https://github.com/vnpy/vnpy/wiki/天勤终端数据解决方案)

集成交易平台

- [VnTrader基本使用](https://github.com/vnpy/vnpy/wiki/VnTrader基本使用)
- [vn.trader使用教程系列1-安装和配置](http://www.vnpy.org/trader-tutorial-1.html)
- [vn.trader使用教程系列2-基础交易](http://www.vnpy.org/trader-tutorial-2.html)
- [vn.trader使用教程系列3-策略算法](http://www.vnpy.org/trader-tutorial-3.html)

RPC通讯协议

- [VNPY RPC](https://github.com/vnpy/vnpy/wiki/RPC)

相关基础

- [WebSocket 教程](http://www.ruanyifeng.com/blog/2017/05/websocket.html)
        
## 参考资源.再续

VNPY层次结构

- [JAQS - 全面的开源策略研发框架](https://zhuanlan.zhihu.com/p/31755635),[Jaqs服务](https://www.quantos.org/)
- [教程5-底层接口对接](http://www.vnpy.org/basic-tutorial-5.html)
- [教程6-中层引擎设计](http://www.vnpy.org/basic-tutorial-6.html)

GUI开发

- [应用模块开发GUI界面](https://github.com/vnpy/vnpy/wiki/应用模块开发GUI界面)
- [教程7-顶层GUI界面开发(1)](http://www.vnpy.org/basic-tutorial-7.html)
- [教程8-顶层GUI界面开发(2)](http://www.vnpy.org/basic-tutorial-8.html)

C++接口封装

- [IB API](https://github.com/vnpy/vnpy/wiki/IB-API)
- [教程1-类CTP交易API的工作原理](http://www.vnpy.org/basic-tutorial-1.html)
- [教程2-类CTP交易API的Python封装设计](http://www.vnpy.org/basic-tutorial-2.html)
- [教程3-vn.py项目中API封装的编译](http://www.vnpy.org/basic-tutorial-3.html)
        
Questions?
Thanks!

Johann Huang