相关文章推荐
新课上线!【量化零基础入门】的第二阶段《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模块,以及想要进行模拟交易的接口。

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

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

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

    这里列出PaperAccount模块在使用中的一些业务逻辑要点:

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

  • 委托撮合规则采用 到价成交 模式,以买入委托为例:

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

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

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

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

    • 成交滑点:用于影响市价单和停止单成交时,成交价格相对于盘口价格的滑点跳数;
    • 计算频率:多少秒执行一次持仓盈亏计算更新,如果持仓较多时发现程序卡顿,建议尝试调低频率;
    • 立即撮合:默认情况下,用户发出的委托需要等到下一个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字段进行映射和计算,来实现对于投资组合的盈亏统计和业绩分析功能:

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

      其中每列的含义如下:

    • 组合名称:委托的来源(reference)
      • 手动交易:ManualTrading
      • CTA策略:CtaStrategy_策略名
      • 价差交易:SpreadTrading_价差名
      • 期权交易:OptionMaster_ElectronicEye/DeltaHedging
      • 算法交易:AlgoTrading_算法编号
      • 脚本策略:ScriptTrader
      • 组合策略:PortfolioStrategy_策略名
      • 本地代码: 带交易所后缀 的合约代码
      • 开盘仓位:昨日收盘时(今日开盘),组合内该合约的持仓
      • 当前仓位:开盘仓位加上 今日成交数量 (多头成交 - 空头成交)的结果
      • 交易盈亏:今日所有成交,以 成交价格 映射到当前 最新价 的盈亏
      • 持仓盈亏:组合开盘仓位,以 昨收盘价 映射到当前 最新价 的盈亏
      • 总盈亏:交易盈亏和持仓盈亏的和
      • 多头成交:组合内该合约今日 买开和买平 成交数量
      • 空头成交:组合内该合约今日 卖开和卖平 成交数量
      • 其中交易盈亏(TradingPnl)和持仓盈亏(HoldingPnl)的计算,采用的是期货交易所每日结算时所用的【逐日盯市】(Marking to Market)算法,具体原理可以搜索相关资料学习。

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

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

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

        整体上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早日回归吧 ~ ~

  •  
    推荐文章