vnpy开源量化系统源码初探
cn·@hashaki·
0.000 HBDvnpy开源量化系统源码初探
Vnpy基本是由py2写的,vnpy正在向py3改,我预计这工程挺大。。。 为什么还是要求32位的系统。。 所以我想把vnpy结合到我py3开发的量化机上。 Vnpy有很多功能,但实际应用上,我只用某一部分,既然是开源项目,那么我就试着把vnpy个性化。 从阅读vnpy的源码开始。 Vnpy板块分为:api,data,event,pricing,rpc,trader Vnpy.api接口基本覆盖国内外所有常规交易品种(股票、期货、期权、外汇、外盘、数字货币) 传统金融: • CTP(ctp) • 飞马(femas) • 中泰证券XTP(xtp) • 中信证券期权(cshshlp) • 金仕达黄金(ksgold) • 金仕达期权(ksotp) • 飞鼠(sgit) • 飞创(xspeed) • 飞创证券(sec) • QDP(qdp) • 上海直达期货(shzd) • Interactive Brokers(ib) • 福汇(fxcm) 数字货币: • OKEX(okex) • 火币(huobi) • 币安(binance) • BitMEX (bitmex) • Bitfinex (bitfinex) • Coinbase Pro (coinbase) • FCoin (fcoin) • BigOne (bigone) • LBank(lbank) • CCXT (ccxt) Vnpy.event为事件驱动型交易程序的核心 Vnpy.rpc是服务端数据推送,用于实现多线程分布式架构的交易系统 Vnpy.trader就是交易平台,vnpy.trader.app中实现以下功能: • 同时登录多个交易接口,在一套界面上监控多种市场的行情和多种资产账户的资金、持仓、委托、成交情况 • 支持跨市场套利(CTP期货和XTP证券)、境内外套利(CTP期货和IB外盘)、多市场数据整合实时预测走势(CTP的股指期货数据、IB的外盘A50数据、Wind的行业指数数据)等策略应用 • CtaStrategy,CTA策略引擎模块,在保持易用性的同时,允许用户针对CTA类策略运行过程中委托的报撤行为进行细粒度控制(降低交易滑点、实现高频策略) • SpreadTrading,价差交易模块,根据用户的配置自动实现价差组合的深度行情以及持仓变化计算,同时内置的交易算法SniperAlgo可以满足大部分到价成交策略的需求,用户也可以基于AlgoTemplate开发更复杂的价差算法 • OptionMaster,期权交易模块,强大的期权投资组合管理功能,结合基于Cython开发的高效期权定价模型,支持毫秒级别的整体希腊值持仓风险计算,用户可以基于期权交易引擎OmEngine快速开发各类复杂期权交易应用 • AlgoTrading,算法交易模块,提供多种常用的智能交易算法:TWAP、Sniper、BestLimit、Iceberg、Arbitrage等等,支持数据库配置保存、CSV文件加载启动以及RPC跨进程算法交易服务 • RiskManager,前端风控模块,负责在交易系统将任何交易请求发出到柜台前的一系列标准检查操作,支持用户自定义风控规则的扩展 • DataRecorder,实盘行情记录,支持Tick和K线数据的落地,用于策略开发回测以及实盘运行初始化 • RpcService,RPC跨进程调用服务,基于MainEngineProxy组件,用户可以如同开发单一进程应用搬开发多进程架构的复杂交易应用 • RtdService,EXCEL RTD服务组件,通过pyxll模块提供EXCEL表格系统对VnTrader系统内所有数据的访问和功能调用(未完成)  Vnpy.data是数据相关的API接口,用于构建好更新历史行情数据库 以官方例子CryptoTrader作为入口去理解vnpy的结构。 CryptoTrader下共三个py文件,run.py,uiCryptoWidget.py,uiCryptoWindow.py 其中uiCryptoWidget.py,uiCryptoWindow.py是UI文件,我比较奇怪为什么vnpy会把功能代码也加进UI代码里,可是pyqt好处就是界面与功能代码分离啊。 也许是pyqt4与pyqt5差别比较大吧,UI我并不是很熟悉。 run.py是运行入口,main()里面先实例化UI然后创建事件引擎。 在run.py里import了sys,importlib,platform,vnpy.event,vnpy.trader.vtEngine,vnpy.trader.uiQt,vnpy.trader.gateway,vnpy.trader.app以及自身的UI uiCryptoWindow.py  Vnpy github说明说,event是事件驱动程序. 所有的计算机程序都可以大致分为两类:脚本型(单次运行)和连续运行型(直到用户主动退出)。 脚本型 脚本型的程序包括最早的批处理文件以及使用Python做交易策略回测等等,这类程序的特点是在用户启动后会按照编程时设计好的步骤一步步运行,所有步骤运行完后自动退出。 连续运行型 连续运行型的程序包含了操作系统和绝大部分我们日常使用的软件等等,这类程序启动后会处于一个无限循环中连续运行,直到用户主动退出时才会结束。 连续运行型程序 我们要开发的交易系统就是属于连续运行型程序,而这种程序根据其计算逻辑的运行机制不同,又可以粗略的分为时间驱动和事件驱动两种。 时间驱动 时间驱动的程序逻辑相对容易设计,简单来说就是让电脑每隔一段时间自动做一些事情。这个事情本身可以很复杂、包括很多步骤,但这些步骤都是线性的,按照顺序一步步执行下来。 事件驱动 与时间驱动对应的就是事件驱动的程序:当某个新的事件被推送到程序中时(如API推送新的行情、成交),程序立即调用和这个事件相对应的处理函数进行相关的操作。 Event文件夹里只有两个py文件,eventEngine.py,eventType.py eventType.py是一个常量命名文件,我之前在写回测的时候就想过,如果我的量化机要让别人用,别人要写策略该怎么办,总不能告诉别人我的策略应该写在那个程序文件的哪个函数里,让他们打开IDE还得熟悉我的传入的数据,这个很不现实。 Vnpy的答案就是,先设定好变量,就是说与使用者约定好,比如说:HIGH就是最高价,LOW就是最低价,我们约定好,并写好说明文档告诉使用者什么变量代表什么,这样使用者就不需要熟悉我在程序里写的东西,他们只要按照他们想法去排列我们约定好的变量即可完成策略。 eventType.py就是干上面这些事,在trader\language\下有chinese,english里面constant.py,包含了近百个常量定义,eventEngine.py中import的库基本都是标准库(queue,threading,time,collections),除了标准库还有一个pyqt和eventType。 EventEngine.py 定义了三个类,eventEngine,eventEngine2,event以及一个测试函数。eventEngine和eventEngine2两个类用的方法有一点点不一样,先看eventEngine定义了事件驱动引擎,   看看trader里程序,其中vtGlobal.py导入的是get_JsonPath()方法,作用是获取JSON配置文件的路径,就vtGlobal.py而言,她获取的是VT_setting.json的路径,一般你可以在\vnpy\trader找到,打开VT_setting.json,可以看到里面包含一些设置,后面会用到。 VtGlobal.py 该文件就是将VT_setting.json里面的配置变成python可读取和使用的字典形式,并赋值给globalSetting,将它作为全局配置的字典。 VtConstant.py 从constant.py导入了常量,并把它们添加到vtConstant.py的局部字典中。 VtObject.py 定义了几种 数据基础类 vtEvent.py 基于vnpy.event.eventType并添加更多字段。 VtGateway.py 定义了vtGateway类作为交易接口,类方法都是关于事件的推送 注意到一个细节,以onTick(self,tick)为例,参数tick是不是传入的是类vtTickData的实例。 VtFunction.py 包含一些开发中常用的函数,检查接口数据是否正确,获取本机的时间,加载程序图标,获取存放临时文件的路径,获取JSON配置文件路径,加载JSON配置。