Left, Down, Page DownNext slide
Right, Up, Page UpPrevious slide
SpaceForward

Use a spacebar or arrow keys to navigate

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的架构

参考架构

VNPY的架构.续

VNPY jhTrader Framework

VNPY的架构.再续

quantOS架构

VNPY的安装

环境要求

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

安装方法

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

VNPY的使用

推荐方法

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

换言之,使用 vnpy.api 提供的 行情接口 获取当前行情数据,然后根据 自己定义的流程及交易策略 进行决策, 最后通过 vnpy.api 提供的 交易接口 进行交易。(架构及通信方面采用或参照 vnpy.eventvnpy.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封装的接口.续

接口列表

VNPY事件驱动编程引擎

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

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

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

VNPY行情记录应用

相关源码位于 examples/DataRecordingvnpy/trader/app/dataRecorder

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

VNPY套利交易应用

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

VNPY事件驱动过程

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对象、EventType常量与EventEngine的关系
  • 单例模式与工厂模式的运用
    • eventEngine实际上为单例
    • 每个套利策略可以由工厂生成
  • 维护清晰的事件处理流程,建构更强大的事件管理器
    • 事件触发为核心
    • 事件处理函数列表
    • 事件动作的多层包装构成动作链,
  • 利用高级语言引用传递特征
量化交易系统整合

Python优势

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

量化架构

数据源及影响因子

  • 历史行情数据 | 统计分析
  • 新闻资讯数目,用户点击数目,用户评论数目 | 文本挖掘
  • 当日搜索引擎数据 | 搜索热度
Questions?
Thanks!

Johann Huang