111.jpg
想要连接交易接口?写好配置dict,调用engine.connect_gateway开始连接,所有初始化日志都会显示在单元格下方输出区域
想要获取最新行情?调用engine.subscribe订阅行情更新,后续随时通过engine.get_tick获取的Tick数据,都保证是最新推送的结果,本地瞬间返回(和其他数据工具每次查询服务器,然后等待服务端数据返回的阻塞模式完全不同)
想要交易?buy/sell/short/cover,传入vt_symbol、price、volume,直接执行委托(实盘账户请想清楚了再回车,不要乱点…)
想要获取K线数据?配置好RQData账号后,调用get_bars即可任意获取想要的股票/期货的K线时间序列数据(RQData试用期延长到1个月了!申请链接戳这里)
想要查询所有可交易合约?调用engine.get_all_contracts函数,可选参数use_df为True时将会以pandas.DataFrame数据结构返回,在Jupyter中更加便于分析
想要查询账户的状态?engine.get_all_accounts/get_all_positions/get_all_active_orders任意查询资金、委托、持仓情况
想要记录当前的运行信息?engine.write_log打印日志,engine.send_email发送邮件到指定邮箱(结合QQ邮箱就能实现微信实时通知)

经过一段时间研究后,你已经精通了如何通过engine进行交易,尽管Jupyter用来做学习研究非常方便,但直接拿来跑实盘好像就有点安全隐患了(想象下你的篮子委托函数单元格不小心Shift-Enter…),那么你可以选择使用脚本策略执行引擎,在一个完全独立的线程中运行你的脚本:

上图的是通讯接口的标准流程。

对于安装了VNStudio的用户,启动VN Station后,直接点击右下角的更新按钮就能完成自动更新。

对于没有安装的用户,请下载VNStudio-2.0.5,体验一键安装的量化交易Python发行版。
脚本策略

对于一些本身学习和工作背景是IT技术方向的用户来说,初学vn.py的时候可能比较难以理解CTA策略开发中的事件驱动概念。如果你在基于异步回调的思维逻辑来开发交易策略中感到非常的痛苦(那种想来想去就是不懂数据哪里来的痛苦),不妨试试ScriptTrader策略模块。

首先,你可以在这样的Jupyter Notebook中以REPL交互式开发的模式来进行各种行情订阅、数据查询、委托交易的功能:

222.png

完全同步的程序写法,所见即所得模式:

333.png

脚本主函数的持续运行,可以通过while engine.strategy_active循环来实现时间驱动的策略同步运行模式。

后续随着你的策略升级,需要更低的响应延时,可以考虑替换使用更加进阶的CtaStrategy或者SpreadTrading等模块来实现低延时实时交易。
RPC服务

RPC,全称Remote Procedure Call(远程过程调用),主要用于实现跨进程或者跨网络的服务功能调用,具体其中的各项概念细节网上可以找到非常丰富的资料,这里就不展开了。

尽管传闻Python 3.8(或者3.9)计划将全局锁GIL由进程唯一改为解释器唯一,从而实现单Python进程能够真正利用多核CPU的全部性能,但截止目前2019年7月,Python 3.7依旧最多只能利用到CPU的单核性能。

对于量化交易这种CPU密集型的计算应用程序,如何绕过GIL限制充分利用CPU的多核性能,一直是各类社区里讨论最火热的话题。

回顾下Python中并行的3种方案(按照从轻到重):
多进程,每个进程内有自己的GIL,得以完全利用CPU多核,但进程间的数据无法直接共享
协程,本质是用户态的逻辑流切换,对于IO密集型任务有用,但同样无法绕开GIL
多线程,由于GIL的存在,任意时间点永远只能有一个线程在运行,无法利用CPU多核

所以现阶段唯一能用的就是多进程,核心痛点则在于如何实现跨进程通讯(RPC),以及安排每个进程中运行的程序功能。

作为互联网分布式架构的底层基础框架之一,RPC有着大量成熟的开源工具:gRPC、JSON-RPC、Thrift等等,这些工具的应用场景各有区别。对于量化交易程序中的一条腿,由客户端发起的主动函数调用,都能很方便的实现支持。但对于另一条腿,由服务端发起的被动事件推送,要么是无法实现,要么就得用双向RPC、Stream流返回等等非常复杂的办法。

针对量化交易这种需要两条腿的情况,我们也是纠结许久,最后选择基于pyzmq定制开发了一套轻量级的RPC框架(一共235行代码,真.轻量!)。

除了支持Client端调用Server端注册好的函数功能外,Server端也能广播(publish)推送事件数据到客户端。在Windows上通过常规的TCP Socket来实现通讯,在Linux上则进一步支持性能更高的Local Socket(数据不过网卡,大约是TCP性能10倍+)。

按照vn.py的设计理念,有了功能框架,自然就必须有解决实际交易需求的应用。v2.0.5版本中提供了一套包含客户端和服务端的RPC应用,包括:

RpcServiceApp:将VN Trader进程转化为RPC服务器,对外提供交易路由、行情数据推送、持仓资金查询等功能
RpcGateway:将RPC服务器视作类似于CTP的服务端系统,通过标准Gateway来连接并进行交易,对上层应用完全透明

具体的使用方法可以参考examples/client_server。

Server中默认加载了CtpGateway和RpcServiceApp,运行后会自动连接,如下图所示:
444.png
Client中则默认加载了RpcGateway和CtaStrategyApp,启动连接RPC接口后,使用体验和直接加载CTP接口完全一致,且上层的CTA策略模块也可以完全无缝兼容使用:

所以参考以上样例,可以非常方便的实现:
对于中小型投资机构用户,可以在通过在服务端加载各种交易接口以及RiskManagerApp,实现一个轻量级的资管交易系统,多个交易员共享统一的交易通道,并在实现基金产品级别的风险管理。
对于运行策略数量较多的用户,只需本地一条行情和交易通道,支持多个Client进程同时交易,且每个Client中独立运行交易策略互不影响;

交易接口

遵循传统,每个版本的vn.py更新都会接入更多的交易通道,v2.0.5新增:

华鑫奇点柜台接口,针对A股证券的量化交易通道ToraGateway
Alpaca美股证券接口,对接IEX交易所(Flash Boys主人工创立的那个)的0佣金交易通道AlpacaGateway

vn.py社区全新官网上线,尤其是文档板块,大幅改进了各种显示效果,现在终于能挺起胸膛不被鄙视文档了,使用过程中有任何提问请通过:https://www.vnpy.com/forum/

vn.py发布v2.0.4 - 算法交易

已经安装VNStudio早期版本的用户,可以直接通过VN Station界面的一键更新按钮来完成新版本的更新操作(有详细指令,跟着一步步做就行)。

对于还没有使用VNStudio的用户,新版本的VNStudio-2.0.4下载地址:https://download.vnpy.com/vnstudio-2.0.4-r.exe

另外,如果希望移除老版本直接重装新版本的部分用户(强迫症患者),推荐不要使用控制面板的卸载操作,而是直接删除c:\vnstudio文件夹,速度会快得多(重装还是到这个文件夹,因此没其他影响)。

v2.0.4中对数据库结构进行了升级,对于使用Anconda或者miniconda等Python环境安装vn.py的用户,请在更新完成后,使用数据库自动迁移脚本来完成迁移工作,脚本下载地址为:https://download.vnpy.com/script_2_0_4.py (使用VNStudio自动更新的用户则不需要)。
算法交易

算法交易AlgoTrading模块实际上在2.0.3中就已经完成了初步移植,在2.0.4中补完了之前尚未移植的算法,目前支持的算法包括:
BestLimit:最优限价 ,这是最简单的算法交易模型
Stop:条件委托
DMA:直接下单
Arbitrage:套利
TWAP:时间加权平均
Sniper:狙击手
Iceberg:冰山
Grid:网格交易

CTA策略

考虑到加载较长数据回测的时候,因为数据载入的时间太长容易引起用户的焦虑(卧槽,是不是死机了?!),将历史数据的加载改为分段实现,每加载完一个月数据后通过日志输出更新当前的数据加载进度,随时随地知道系统到底在干嘛~

增加了CtaBacktester模块中对于每一笔回测的逐笔成交和委托、逐日盈亏统计的表格查看功能,方便深入细节去了解到底策略在回测时做了哪些交易。预计2.0.6会增加将委托成交数据绘制在K线图表上的功能。

最后我们重新实现了社区需求呼声颇高的无界面CTA策略运行模式的启动脚本,依旧是靠谱的父子进程守护模式,有需求的话请在Github仓库的examples目录获取:https://github.com/vnpy/vnpy/tree/master/examples/no_ui
其他内容

新增接口

币安数字货币接口
易盛9.0的外盘期货接口(终于搞定易盛了~~~)

新增模块:

事前风控模块
RPC服务框架

v2.0.3版本一些最新功能的软件截图

2019年5月27日 用Python的交易员 Comments (1) 

VN Station量化管理终端
description

VN Trader启动配置工具(VN Station内置)
description

VN Trader主界面
description

CTA策略回测研究
description

CTA策略实盘交易
description

AlgoTrading算法交易
description

DataRecorder行情记录
description

交易合约查询
description

VN Trader全局配置
description

vn.py发布v2.0.3 - 遗传算法

上周末终于完成了v2.0.3的开发测试工作,安装使用v2.0.3最简单的方式就是VN Studio量化交易Python发行版:VNStudio-2.0.3,傻瓜式快速安装好所有环境,包括:

Python 3.7(社区官方版本)
vn.py框架和其他相关库
VN Station量化工作站(vn.py框架的图形化管理工具)

请注意:之前基于miniconda + constructor工具打包的VNConda发行版,由于相关工具成熟度较低,导致大家在使用过程中出现了许多小问题,尝试解决后发现修复难度太大(Anaconda确实是极好用的发行版,但打包工具这块真心不行),决定不再提供支持。

请之前安装了VNConda的用户卸载后重新安装VN Studio,大家卸载时不用担心自己的历史数据和系统配置(位于用户目录下),安装VN Studio后可以无缝直接使用,给大家造成的麻烦深表歉意。
遗传算法

v2.0.3版本最重要的更新内容:正式将遗传算法参数优化功能集成到了CtaStrategy模块的回测引擎中。

首先,什么是遗传算法:

遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最优化的搜索算法,是进化算法的一种。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。

遗传算法通常实现方式为一种计算机模拟。对于一个最优化问题,一定数量的候选解(称为个体)可抽象表示为染色体,使种群向更好的解进化。传统上,解用二进制表示(即0和1的串),但也可以用其他表示方法。进化从完全随机个体的种群开始,之后一代一代发生。在每一代中评价整个种群的适应度,从当前种群中随机地选择多个个体(基于它们的适应度),通过自然选择和突变产生新的生命种群,该种群在算法的下一次迭代中成为当前种群。

估计大部分人看完的表情如下:

但从应用的角度来讲,就完全不难理解了。与遗传算法(或者其他任何智能优化算法)对应的,叫做穷举算法(又名暴力求解,Brute-force Search),我们以vn.py中的经典CTA策略(AtrRsiStrategy)[https://github.com/vnpy/vnpy/blob/master/vnpy/app/cta_strategy/strategies/atr_rsi_strategy.py]为例做一个参数优化:

atr_length参数(默认22):从10到40,步进1,总样本32
atr_ma_length参数(默认10):从4到20,步进2,总样本9
rsi_length参数(默认5):从3到20,步进1,总样本18

如果用穷举算法的话,我们一共执行 32 x 9 x 18 = 5184 次回测计算(三个参数所有样本的排列组合数量),即时在一台8核机器上也要跑648轮,相当长的一段时间了。

我们知道,随着策略的参数变化,最终的优化结果(又称目标函数,比如Sharpe Ratio)的变化并不是完全随机的,而是存在着一定的相关性,比如当atr_length处于18-25范围内的优化结果可能都比较好(先不考虑另外两个参数),如果到38上方可能就全都是亏钱的情况。

那么如果在发现某一组参数的回测效果比较好的时候,在这组参数附近进一步搜索得到好参数的概率,就会远大于去找离得比较远的参数,就像自然界中生物的遗传一样:

远古时代一块地区的树都比较高(历史数据限制)
高个子的恐龙更容易吃到高处的树叶(目标函数)
高个子恐龙的生存能力更强,更有几率留下后代(符合条件的参数)
其后代中同样个子比较高的恐龙,能更好的生存下去(附近同样效果好的参数)

description

大自然高效的体现之一,就在于这些高个子恐龙的后代在身高方面的表现,绝对不会是平均分布的(暴力穷举),而是会围绕在父母恐龙的高个子身高附近分布(遗传算法)。以上的例子仅仅为了帮助大家能够对遗传算法有个比较快速直观的认识,在细节方面可能并不是那么切合,但从优化速度的对比方面就能很好的体现出其效果:

description

以布林策略(BollStrategy)的参数优化为例:
多进程穷举算法的总优化时间为357分钟(双核跑满)
单进程遗传算法的总优化时间为27分钟(单核跑满)
使用的机器是一台阿里云的2核4G云服务器(CPU主频2.5G)
使用3年的股指连续合约的1分钟线数据,一共有三个参数参与优化,总样本空间韦13824个

所以在算力少一半的情况下,遗传算法的优势差不多是穷举算法的12倍多!!!

所以,这么牛逼的功能怎么用?

在CTA回测组件的参数优化对话框中,设置好要优化的参数后点击第二个按钮“遗传算法优化”就行,没有任何其他步骤(这才叫做集成~)。

当然考虑到vn.py社区总有这么一群不甘寂寞热爱折腾的用户,遗传算法优化功能也同样可以通过cta_strategy模块的BacktestingEngine调用,函数名为:run_ga_optimization,支持更多的可选参数配置。

最后,上述遗传算法优化功能基于Python数据分析生态中强大的DEAP库,除了最常用的遗传算法外,还有更多相对小众但特别的优化算法:粒子算法、蚁群算法等等,绝对能满足你的折腾爱好。
行情记录模块

用于录制Tick和K线行情的DataRecorder行情记录模块,应该大部分vn.py用户都不陌生了。在v2.0.3中完成了对其的移植,同时也遵循2.0的全UI界面配置风格,所有的录制记录添加、移除操作都可以通过界面完成,傻瓜到我就不多介绍了,放个图吧:

本地代码编辑框,支持对当前已经连接上接口的合约代码自动补全。
全局配置

VN Trader中的一些内部功能需要通过全局配置来管理,之前需要用户手动修改用户目录下的.vntrader/vt_setting.json,在v2.0.3中也新增了全局配置对话框,注意:所有修改保存后必须重启VN Trader才能生效。

font:显示字体配置
log:日志记录配置
email:邮件引擎配置(用QQ邮箱可以给微信发信息)
rqdata:RQData数据服务配置
database:数据库相关配置

接口更新

vn.py每个版本更新不可或缺的就是新接口或者接口新功能了,v2.0.3新增了:
OkexfGateway:OKEX数字火币期货合约接口
XtpGateway:中泰证券XTP柜台接口
FemasGateway:飞马期货柜台接口
HbdmGateway:火币数字货币期货合约接口,支持历史数据查询

相关接口的使用说明请在官网文档板块查看。