新课上线!【量化零基础入门】的第二阶段《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早日回归吧
~
~