vn.py官网
开源量化社区
Member
avatar
加入于:
帖子: 470
声望: 24

发布于vn.py社区公众号【vnpy-community】
 
原文作者:用Python的交易员 | 发布时间:2021-04-18
 
新课上线!【量化零基础入门】的第二阶段《30天掌握Python数据分析》

对比市面上其他已有的数据分析类课程,《30天掌握Python数据分析》完全从实战的角度出发,围绕当下最为前沿的数据分析工具来讲解(比如大数据绘图方面,我们选择了Plotly交互式图表,而不是其他课程千篇一律的静态Matplotlib),同时结合vn.py策略开发过程中的具体案例,来帮助学员建立学得懂、用得到的数据分析知识体系。

课程原价599元,还是老规矩前100名用户8折(479元),目前优惠名额仅剩26个,欲购请从速戳我~~~

 

这篇文章的标题,可能是许多量化投资者最近两周以来的心声吧?

由于某些原因(听说是全国性的网络安全攻防演练),上期技术提供的SimNow仿真环境,以及各家期货交易所本身提供的大仿真环境(用于穿透式测试的那个),从4月初开始需要暂停服务1个半月,具体恢复时间还没确定

虽然平时SimNow也偶尔会磕磕碰碰出些小问题:

  • 行情数据推送延时高;
  • 昨仓结算数量不正确;
  • 只支持限价单委托;
  • 服务器异常无法登录;
  • 等等......

但就冲着免费开放使用和实盘行情撮合这两点优势,足以让SimNow吊打几乎所有同类竞争对手:

  • 期货公司大仿真环境(没有实盘行情)
  • 交易软件公司仿真环境(不提供API接入)
  • 其他柜台公司仿真环境(申请麻烦或收费)

所以这次SimNow的停机维护,不管是对于机构还是个人投资者,只要做期货量化交易的都或多或少受到了影响,我们vn.py社区的论坛、QQ群、微信群里也是持续有用户在提问和寻找临时性的替代方案。

围绕仿真交易,当前最新版本(2.2.0)的vn.py已经提供了两大相关模块:负责【本地模拟交易】的PaperAccount模块以及负责【交易盈亏分析】的PortfolioManager模块

只需要有一个实盘的CTP期货账户(无论里面是否有资金),结合上述两个vn.py应用模块,用户即可快速构建一套纯本地化的仿真交易环境,满足交易程序开发、策略仿真测试等相关的需求。

基于PaperAccount模块实现本地模拟交易

PaperAccount模块实现了直接在VN Trader交易客户端内部构建一套本地化的模拟交易撮合环境,通过从CTP接口订阅获取的实盘行情盘口进行仿真委托撮合。

该模块在使用上非常傻瓜,首先在VN Station中加载PaperAccount模块,以及想要进行模拟交易的接口(比如国内期货就选CTP、数字货币就选火币等):

description

启动VN Trader后,连接登录交易接口。点击菜单栏的【帮助】->【合约查询】,在弹出的对话框中直接点击右上角的【查询】按钮,发现所有合约的交易接口列均显示为PAPER:

description

此时所有合约的交易委托和撤单请求均已被PaperAccount模块接管,不会再发往实盘服务器,可以放心大胆的进行各种交易测试了。

关闭合约信息对话框,回到主界面先订阅某一合约的行情,注意一定要先订阅再进行后续的下单和撤单操作,否则会因为没有行情盘口导致委托无法撮合(挂在那里没反应):

description

上图中委托、成交、持仓三个监控组件中显示的信息,其接口列均显示为PAPER(本地模拟的数据)。这里列出PaperAccount模块在使用中的一些业务逻辑要点:

  • 支持的委托类型(不支持的类型会被拒单):

    • 限价单;
    • 市价单;
    • 停止单;
  • 委托撮合规则采用到价成交模式,以买入委托为例:

    • 限价单:当盘口卖1价ask_price_1小于等于委托价格,则成交;
    • 停止单:当盘口卖1价ask_price_1大于等于委托价格,则成交;
  • 委托成交时不考虑盘口挂单量,一次性全部成交;

  • 成交后,先推送委托状态更新OrderData,再推送成交信息TradeData,和实盘交易中的顺序一致;

  • 委托成交后,模块会自动记录相应的持仓信息PositionData:

    • 根据合约本身的持仓模式(多空仓 vs 净仓位)信息,维护对应的持仓信息;
    • 开仓成交时,采用加权平均计算更新持仓成本价;
    • 平仓成交时,持仓成本价不变;
    • 多空仓模式下,挂出平仓委托后会冻结相应的持仓数量,可用数量不足时会拒单;
    • 持仓的盈亏会基于持仓成本价和最新成交价定时计算(默认频率1秒);
  • 数据的持久化保存:
    • 成交数据和委托数据不保存,关闭VN Trader后即消失;
    • 持仓数据会在有变化时立即写入硬盘文件,重启VN Trader登录交易接口后即可看到(要收到相应的合约信息)。

点击菜单栏的【功能】->【模拟交易】,在打开的对话框中可以对PaperAccount模块的功能进行若干配置:

description

  • 成交滑点:用于影响市价单和停止单成交时,成交价格相对于盘口价格的滑点跳数;
  • 计算频率:多少秒执行一次持仓盈亏计算更新,如果持仓较多时发现程序卡顿,建议尝试调低频率;
  • 立即撮合:默认情况下,用户发出的委托需要等到下一个TICK盘口推送才会撮合(模拟实盘情景),对于TICK推送频率较低的不活跃合约可以勾选该选项,委托后会立即基于当前的最新TICK盘口撮合(不推荐使用,某些策略模块可能出现兼容性BUG);
  • 清空所有持仓按钮,顾名思义用于把所有本地持仓数据一键清空。

基于PortfolioManager模块实现交易盈亏分析

基于上一步的PaperAccount模块,我们已经实现了:

  • 模拟交易撮合(send_order/cancel_order)
  • 委托成交推送(on_order/on_trade)
  • 持仓数据跟踪(on_position)

但由于资金计算业务逻辑的复杂性(验资验券、保证金冻结解冻、手续费计算扣除等),目前的PaperAccount模块尚未提供账户资金数据跟踪的功能(on_account)。对于仿真交易中的策略盈亏统计和业绩分析的功能,则由PortfolioManager模块来实现。

在2.1.7版本增加了委托来源标识(reference字段)后,所有从vn.py发出的委托请求都可以直接通过该标识来区分其交易来源,如手动交易、算法执行、量化策略等,每个交易来源可以视作一个独立的【投资组合】。

PortfolioManager模块将所有委托基于reference字段进行映射和计算,来实现对于投资组合的盈亏统计和业绩分析功能:

description

界面整体可以分为左右两部分,左边显示的是当前已有交易组合的信息表:

description

其中每列的含义如下:

  • 组合名称:委托的来源(reference)
    • 手动交易:ManualTrading
    • CTA策略:CtaStrategy_策略名
    • 价差交易:SpreadTrading_价差名
    • 期权交易:OptionMaster_ElectronicEye/DeltaHedging
    • 算法交易:AlgoTrading_算法编号
    • 脚本策略:ScriptTrader
    • 组合策略:PortfolioStrategy_策略名
  • 本地代码:带交易所后缀的合约代码
  • 开盘仓位:昨日收盘时(今日开盘),组合内该合约的持仓
  • 当前仓位:开盘仓位加上今日成交数量(多头成交 - 空头成交)的结果
  • 交易盈亏:今日所有成交,以成交价格映射到当前最新价的盈亏
  • 持仓盈亏:组合开盘仓位,以昨收盘价映射到当前最新价的盈亏
  • 总盈亏:交易盈亏和持仓盈亏的和
  • 多头成交:组合内该合约今日买开和买平成交数量
  • 空头成交:组合内该合约今日卖开和卖平成交数量

其中交易盈亏(TradingPnl)和持仓盈亏(HoldingPnl)的计算,采用的是期货交易所每日结算时所用的【逐日盯市】(Marking to Market)算法,具体原理可以搜索相关资料学习。

该组件基于QTreeWidget(树形表格)开发,可以很方便的点击最左侧每行的箭头进行折叠和展开,也可以点击顶部的【全部展开】和【全部折叠】按钮进行批量操作,并通过【调整列宽】按钮自动调整表格每列的宽度。

右侧部分显示的是所有成交记录,支持通过右上角的下拉框根据组合进行筛选显示:

description

盈亏数字的更新基于定时逻辑自动计算,计算频率可以通过顶部中间的选项框调整:

description

整体上PortfolioManager使用非常傻瓜,大部分情况下只要在VN Station的启动界面加载PortfolioManager模块即可,运行策略交易的过程中打开【投资组合】界面,就能实时监控每个策略的当日交易和盈亏情况(不打开它也会在后台运行计算)。

虽然模块中最频繁运行的策略盈亏计算逻辑已经高度优化,实现了和成交数量无关的O(1)时间复杂度,即不会因为成交数量过多而导致计算耗时变长,但终究会有一定的额外开销(百微秒到几毫秒)。对于运行策略交易的程序,总归开销是越低越好,因此推荐刷新频率在不影响使用的情况下可以设的高些(比如30秒才计算一次)。

所有组合的持仓数据数据会在关闭VN Trader时写入缓存文件中,所以不要直接杀进程退出,会丢失数据!在隔日加载时,程序会自动将昨天的总仓位结算到今天的昨仓数据字段中。

如果发现有仓位记录错误,或者策略已经移除的情况,可以用VS Code手动修改缓存文件,修改后再重新启动VN Trader即可。缓存文件位于:

C:\users\administrator.vntrader\portfolio_manager_data.json

总结下整个方案

至此我们已经完成了整个本地化仿真交易环境的搭建,其实主要工作也就是在VN Station中启动时勾选上PaperAccount和PortfolioManager两个应用模块。

配合vn.py其他交易类应用模块,该环境可以非常方便的用于各类量化策略的仿真测试:

  • CTA趋势策略:CtaStrategy
  • 复杂组合策略:PortfolioStrategy
  • 价差套利交易略:SpreadTrading
  • 期权波动率交易:OptionMaster
  • 灵活脚本策略:ScriptTrader

最后,还是希望SimNow早日回归吧~~

Member
avatar
加入于:
帖子: 1
声望: 0

有ctp实盘账号,但用vnpy连接,还需要经过期货公司的许可流程吧?

Member
avatar
加入于:
帖子: 470
声望: 24

lingyun wrote:

有ctp实盘账号,但用vnpy连接,还需要经过期货公司的许可流程吧?

需要通过穿透式接入测试。

Member
avatar
加入于:
帖子: 8
声望: 0

我用实盘账号按照这个方法来连接的, 出现“代码63,信息:CTP客户端未认证”
是哪里有问题吗?

description

Member
avatar
加入于:
帖子: 470
声望: 24

不要同时勾选CTP接口和CTPTest接口,否则会报4097错误。
请正确填写app id或者auth code,否则会报代码63错误。
蜘蛛网的毅力 wrote:

我用实盘账号按照这个方法来连接的, 出现“代码63,信息:CTP客户端未认证”
是哪里有问题吗?

description

Member
加入于:
帖子: 39
声望: 0

请问Simnow 现在是不是恢复正常了?检测结束了?

Administrator
avatar
加入于:
帖子: 4871
声望: 283

目前恢复了部分测试环境,盘中可以用了

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3

沪公网安备 31011502017034号