基于vnpy的网页交易系统策略模板·

Vnpy是市面上开源基于CTP最盛行的一个生意业务系统, github上面也有几千的星了。 说它是生意业务系统,由于它包括了几个部分:

    支持包括CTP, 以及其他多生意业务接口(比特币,IB, 以及其他的生意业务接口)的数据平台。 这个特点应该是Vnpy

    在数据平台上, 支持各种生意业务应用(application):

    支持及时的数据收罗(data record)入库。

    CTA策略回测以及实盘生意业务, 参数优化(optimization)

    风险控制, 等等

说到它的长处, 固然就是可以支持多个生意业务接口(包括CTP),多账户。 这些底层的生意业务接口封装, 以及数据的及时收集,触发等机制和特点, 对于大多数没有本领要么没偶然间独立开发的生意业务员,以及小团队而言, 是至关重用的。

但是假如真正要把vnpy集成到一个美满的生意业务系统内里来, vnpy现在的功能还是有些略显不足。

首先, vnpy使用pyqt包做的前端GUI,从应用上有比较多的范围。 通常我们的生意业务服务器是摆设在云端的服务器, pyqt的GUI无法使用。 最好的解决方案是基于网页的管理dashboard。 其次, 现在vnpy版本1.6没有支持多账户绑定。 好比说CTP,我们通常需要Simnow,以及其他几个实盘生意业务的账户同时在线, 这样可以使用simnow跑模仿策略, 使用实盘账户跑生意业务。

别的, 我们除了普通的针对单一资产的CTA策略以外,另有许多多资产的生意业务策略, 好比:

  1. pairs trading strategy:需要针对两个差别的资产的价格关系,生意业务两者的价差spread。 比方我们可以使用伦敦铜和沪铜的价差来进行套利。在生意业务系统的实现上, 这个套利机制比较麻烦, 我们需要同时联通IB账户得到伦敦铜的生意业务接口, 并且同时联通CTP接口生意业务沪铜 。 Vnpy提供了很好的机制,可以做到多接口同时联通。 但是在策略回测,以及生意业务上, vnpy的回测系统略显单薄
  2. 期权生意业务:这里就涉及到多资产同时计价,生意业务。
  3. 多窗口和时间周期生意业务: Alexander Elder在《生意业务为生》的书中的3窗口生意业务系统, 是一个非常好的例子。 生意业务一个资产如股指期货, 通常会使用天图或周图来判定大盘的趋势, 用1小时-天图来判定中期的震荡强弱, 用5min-15min图来判定买入卖出点。以是我们需要在生意业务系统内里实现n个差别周期bar的策略触发机制。

基于上述的明白和需求, 盼望实现如下几个焦点的功能:

    尽大概使用vnpy的底层数据框架,连接多生意业务接口, 构建统一的数据平台

    将vnpy现在重要为单机运行计划的架构, 扩展成为一个可以支持云端摆设的多机架构。

    包括生意业务服务器,运算和分析服务器,与数据库,以及网页服务器分散

    支持及时数据收罗(使用vnpy的data recording功能)

    支持多资产,多窗口的庞杂策略回测,优化,以及实盘生意业务

我花了快要2个月时间, 构架了一个基于vnpy的网页前端框架,实现了一些基本的功能。 先上几个图:

![](data:image/svg+xml;utf8,)

Fig1: 同时联通了3个账户(CTP SimNow, 以及两个OkCoin的账户)

![](data:image/svg+xml;utf8,)

![](data:image/svg+xml;utf8,)

Fig 2: 通过OkCoin账户来捕获比特币BTC及时行情。

这里的实现跟vnpy1.6的实现差别。 vnpy的及时行情订阅是绑定在接口上的,好比订阅螺纹钢1710合约, 在vnpy只能捆绑在CTP上, 而CTP连接在制订的CTP账号(只有一个)上面。 我们这里可以实现针对账号的合约订阅: 同时有多个CTP账号的话, 我们需要指出在哪个账号上订阅rb1710。 如下是我们订阅合约的设置文件:

![](data:image/svg+xml;utf8,)

![](data:image/svg+xml;utf8,)

Fig 3: 策略回测:

现在已经实现了多资产, 多窗口的策略回测。 Fig 3是针对单一资产(螺纹钢)的一个策略模仿。 Fig 4是多周期策略(5min, 30min, 120min)的趋势跟踪策略模仿。

![](data:image/svg+xml;utf8,)

别的,我们做策略研发中,需要思量各个合约的生意业务本钱,滑点, 最小合约数目,margin ratio等等。同时, 我们大概需要在差别的设置下, 进行测试。比方,通常我们可以用尺度的滑点(1跳)来做开端的策略研发, 当策略体现不错, 我们大概需要用更极度的滑点(2-3跳)来测试策略。 以是, 这里我也实现了一个合约的生意业务信息管理界面,可以实现多组生意业务设置, 针对差别阶段(研究, 模仿,实盘)的生意业务需要。

![](data:image/svg+xml;utf8,)

现在我一个人在独立开发, 有感爱好的量化牛人, 欢迎联系我一起开发。

---------------------------------------------------------------!------------------------------------------------------------更新一下:

近来跟一个知乎小伙伴聊了一下,以为之前的架构(纯的bootstrap+css,没有js系统)有点范围, 添加一个界面,需要许多时间。

以是花了1个月时间, 学习了vue.js,做起页面感觉简单多了。 vue.js用来做前端, flask+python作为后端,提供REST服务接口。 这样的框架,如今就简化许多了。 上几个新的界面,大家看看。 夺取在干1个月,可以上线了。

![](data:image/svg+xml;utf8,)

![](data:image/svg+xml;utf8,)

![](data:image/svg+xml;utf8,)

![](data:image/svg+xml;utf8,)

![](data:image/svg+xml;utf8,)

vnpy风险控制

1.ctaTemplate.py

策略模板是详细生意业务策略的底子,一样平常把大部分策略都用到的方法和公共变量放到策略模板里(如:账户权益风险控制、生意业务合约撤单次数),而详细策略继承该策略模板,进而增长本性方法和变量(如:入场价格、止损止盈)。一样平常在最底子模板上,根据生意业务策略的种类衍生出生意业务种类模板(如:CTA、套利、对冲等),详细生意业务策略继承衍生的生意业务种类模板进行开发。

解决了这个问题后,我们来理解一下CtaTemplate

from ctaBase import * from vtConstant import *

ctaBase 位于vn.trader\ctaAlgo目次下(与CtaTemplate同目次)。该文件定义了些策略中会用的常量:生意业务方向、停止单状态、数据库的名称、及引擎的标识,别的定义了3个类:

StopOrder

相当于一样平常软件上当地的止损止盈单。当StopOrder中合约(vtSymbol)的tick数据更新时,CtaEngine会将满意条件的StopOrder转为生意业务指令发出。

CtaBarData

相当于一样平常行情软件上的K线图(1根K线),只是在策略中更新数据,保存在内存中而不表现出来。满意基于K线的策略需求(一样平常onBar触发)。

CtaTickData

同CtaBarData类似,只是他是每个tick数据(等长时间生意业务数据的切片)。满意基于最新价格、最高价格及最低价格(这两个价格需要联合CtaBarData数据使用)的策略需求(一样平常onTick触发)。

vtConstant 位于vn.trader目次下 重要定义一些常量,详细的我就不逐一枚举了,大家打开就很清晰了。

PS: 由于trader现在把各级地点都注册了,以是这里直接

from ctaBase import *

一样平常只注册根目次,从根目次下开始import,以上就要写成

from ctaAlgo.ctaBase import *

这里简单说明一下,碰到文件路径不对,根据上面两种方法处置

  • init (self, ctaEngine, setting)
  • ' init '这个函数前后都有两个下划线。传入ctaEngine实例和setting设置初始化。初始化时定义了一些变量,此中有3个这里介绍一下:

    # 参数列表,保存了参数的名称 self.paramList = ['name', 'className', 'author', 'vtSymbol']

    这个变量重要记载和保存策略参数,除了'author'外,其他3个必选,根据需要可以拓展,但必须要先定义,后方可添加到参数列表。

    # 变量列表,保存了变量的名称 self.varList = ['inited', 'trading', 'pos']

    和前面一个变量类似,但这个是变量列表,区别重要在于,该列表中变量重要记载策略生意业务過逞中的一些状态,固然你可以根据需要拓展,设置把这些变量放在参数列表里(但提议不要这么做)。

    # 设置策略的参数 if setting: d = self.__dict__ for key in self.paramList: if key in setting: d[key] = setting[key]

    批量读取设置文件中保存的参数进行初始化。

    在创建实例后如有需要还可以用该方法进一步的初始化

    策略启动方法,一样平常做一些启动提示

    策略停止方法,如,撤单、平今转平昨,结算收盘等

    当最新tick数据更新时,做一些盘算,信号触发,固然也可以做撤单(一样平常不提议这么做)。收盘后一段时间后和开盘前一段时间前(一样平常15分钟)之间的这段时间会有垃圾数据(至少CTP是这样),提议登出账户或在策略要么引擎里自行处置。tick为实例,获取属性请使用对象方法,如,'tick.lastPrice',下面order,trade,bar皆如此。

    当发出票据后,就会收到票据状态的数据,无论是否成交。 可以根据回报的信息来进行撤单追单等处置。

    成交数据回报。重要用来盘算持仓,也可以用来触发发单追单等。

    一样平常该方法在onTick里被调用,当满意天生新K线的时间,触发该方法,进而触发基于K线的策略。

  • buy(self, price, volume, stop=False)
  • 开仓做多,默认合约为self.vtSymbol,stop为False直接发单,为True时发当地止损止赢单,默认False。

  • sell(self, price, volume, stop=False)
  • 平多

  • short(self, price, volume, stop=False)
  • 开空

  • cover(self, price, volume, stop=False)
  • 平空

  • sendOrder(self, orderType, price, volume, stop=False)
  • def sendOrder(self, orderType, price, volume, stop=False): """发送委托""" if self.trading: # 假如stop为True,则意味着发当地停止单 if stop: vtOrderID = self.ctaEngine.sendStopOrder(self.vtSymbol, orderType, price, volume, self) else: vtOrderID = self.ctaEngine.sendOrder(self.vtSymbol, orderType, price, volume, self) return vtOrderID else: # 生意业务停止时发单返回空字符串 return ''

    前面buy,sell等方法就是对这个方法的二次封装,在这个方法里区别看待当地止损止赢单和直接发生意业务柜台的票据。一样平常用的较少。

  • cancelOrder(self, vtOrderID)
  • def cancelOrder(self, vtOrderID): """撤单""" # 假如发单号为空字符串,则不进行后续操作 if not vtOrderID: return if STOPORDERPREFIX in vtOrderID: self.ctaEngine.cancelStopOrder(vtOrderID) else: self.ctaEngine.cancelOrder(vtOrderID)

    根据发单编号进行撤单,该方法根据vtOrderID来判定撤当地票据还是生意业务所列队的票据

    向数据库中插入tick数据。对ctaEngine函数的二次封装,方便使用,以下3个也是如此

    向数据库中插入bar数据

    根据天数读取tick数据

    根据天数读取bar数据

  • writeCtaLog(self, content)
  • def writeCtaLog(self, content): """记载CTA日记""" content = self.name + ':' + content self.ctaEngine.writeCtaLog(content)

    对ctaEngine日记方法进行二次封装,重要加上策略的name,用于区分多策略日记

    发出策略状态变革信号,重要是通知监控系统(现在是GUI,背面也可以web等)

    区分引擎,满意差别环境的处置

    功能介绍

    作为一套基于Python的量化生意业务程序开发框架,vn.py致力于提供从生意业务API对接到策略主动生意业务的完备解决方案。

    目的用户

    假如有以下需求,不妨试试看vn.py:

      基于Python语言来开发自己的量化生意业务程序,充实使用Python社区强盛的数据研究和机器学习生态

      通过一套尺度化的生意业务平台体系,对接国内诸多差别种类的金融市场:证券、期货、期权、外汇、数字钱币等

      使用经过充实实盘查验的量化策略引擎,来完成从数据维护、策略开发、回测研究到实盘主动生意业务的整个业务流程

      对平台进行种种定制扩展,满意本性化的生意业务需求:增长生意业务接口,修改GUI图形界面,基于事件驱动引擎开发庞杂策略应用

      掌控生意业务程序的全部源代码细节,彻底杜绝种种程序后门,制止被盗取策略、截获生意业务信号、偷窃账号密码等风险

      节省为量化生意业务平台支付的资金本钱,不必再付出上万每年的软件授权费要么每笔成交的分外加点

    应用场景

    从专业个人投资者、创业型私募,到券商资管部分、币圈Token Fund,都能找到vn.py的应用场景。

      专业个人投资者:使用VN Trader直连期货公司的CTP期货柜台,实现从策略开发到全实盘主动生意业务的完备CTA业务流程

      创业型私募:基于RpcService构建服务器端的统一报盘通道,容许生意业务员在自己的当地电脑自行开发各种生意业务策略应用

      券商资管部分:对接证券公司统一摆设的O32资管系统,基于事件驱动引擎定制开发多策略庞杂系统

      币圈Token Fund:使用VN Trader同时连接多个币圈生意业务所,通过AlgoTrading算法生意业务模块实现主动化委托实行,降低打击本钱

    支持的接口

    vnpy.gateway ,盖国内外全部生意业务品种的生意业务接口:

    • 国内市场

        CTP(ctp):国内期货、期权

        CTP Mini(mini):国内期货、期权

        飞马(femas):国内期货

        宽睿(oes):国内证券(A股)

        中泰XTP(xtp):国内证券(A股)

        华鑫奇点(tora):国内证券(A股)

    • 国外市场

    • 数字钱币

        BitMEX(bitmex):数字钱币期货、期权、永续合约

        OKEX合约(okexf):数字钱币期货

        火币合约(hbdm):数字钱币期货

        币安(binance):数字钱币现货

        OKEX(okex):数字钱币现货

        火币(huobi):数字钱币现货

        Bitfinex(bitfinex):数字钱币现货

        1Token(onetoken):数字钱币券商(现货、期货)

    • 特别应用

    支持的应用

    vnpy.app ,开箱即用的各种量化策略生意业务应用:

      cta_strategy:CTA策略引擎模块,在保持易用性的同时,容许用户针对CTA类策略运行過逞中委托的报撤行为进行细粒度控制(降低生意业务滑点、实现高频策略)

      cta_backtester:CTA策略回测模块,无需使用Jupyter Notebook,直接使用图形界面直接进行策略回测分析、参数优化等相关工作

      algo_trading:算法生意业务模块,提供多种常用的智能生意业务算法:TWAP、Sniper、Iceberg、BestLimit等等,支持常用算法设置保存

      script_trader:脚本策略模块,针对多标的组合类生意业务策略计划,同时也可以直接在下令行中实现REPL指令情势的生意业务,不支持回测功能

      rpc_service:RPC服务模块,容许将某一VN Trader历程启动为服务端,作为统一的行情和生意业务路由通道,容许多客户端同时连接,实现多历程分布式系统

      csv_loader:CSV历史数据加载器,用于加载CSV格式文件中的历史数据到平台数据库中,用于策略的回测研究以及实盘初始化等功能,支持自定义数据表头格式

      data_recorder:行情记载模块,基于图形界面进行设置,根据需求及时录制Tick要么K线行情到数据库中,用于策略回测要么实盘初始化

      risk_manager:风险管理模块,提供包括生意业务流控、下单数目、活动委托、撤单总数等规矩的统计和限定,有用实现前端风控功能

    通用类组件

    vnpy.api ,Python生意业务API接口封装,提供上述生意业务接口的底层对接实现。

    vnpy.event ,简便易用的事件驱动引擎,作为事件驱动型生意业务程序的焦点。

    vnpy.rpc ,跨历程通讯尺度组件,用于实现分布式摆设的庞杂生意业务系统。

    vnpy.chart ,Python高性能K线图表,支持大数据量图表表现以及及时数据更新功能。

    本文网址: https://www.4008140202.com/pp/2020711201652_5547_550967910/home

    推荐阅读

    tags

    最新发布