VeighNa量化社区
你的开源社区量化交易平台
xiaohe's Avatar
Member
离线
4300 帖子
声望: 268

发布于vn.py社区公众号【vnpy-community】

 

原文作者:用Python的交易员 | 发布时间:2020-08-27

 

感谢大家的支持,全新的《30天解锁Python量化开发》课程订阅量已达82份,8折优惠名额还剩最后18位,感兴趣的同学请欲购从速~~课程大纲详情戳我

 

这两周被催更了,先说明下这个技术架构的系列一共会有4篇文章和8个项目,分别对应:

  • 语言选择:Matlab
  • 系统设计:AlgoTrader
  • 标准接口:CTP API
  • CTA策略:MultiCharts
  • 价差交易:TT X_Trader
  • 期权交易:Horizon
  • 用户社区:Quantopian
  • 教学讲解:QuantStart

相比较于CTA策略,国内做价差交易(套利交易)和期权交易(波动率交易)的人数会少很多。所以相比于前面文章中的项目,可能大部分同学都完全没听说过这方面的平台,比如海飞鼠、ATP、飞豹、风软OptKingdom等等。

本篇文章中要讲的两个平台,分别是对启发了vn.py项目中SpreadTrading模块的的TT X_Trader平台,以及启发了OptionMaster模块的Horizon平台。

 

TT X_Trader

 

官网:www.tradingtechnologies.com

类型:商业软件

国家:美国

语言:C++

启发:价差交易

目前全世界的期货交易所,有许多已经在交易所系统内直接提供了丰富的价差合约(比如大商所的豆粕跨期组合),方便交易员直接进行价差交易。

但这类价差合约正因为交易太过方便导致竞争非常激烈,获利的空间也相对较小。许多情况下,交易员需要根据自己的经验和模型构建的非标准价差组合,才能找到更多的获利机会。

TT X_Trader是一款由Trading Technologies(缩写TT)公司推出,专门针对复杂价差交易的专业系统。在Google上搜索最常看到的就是类似下面的截图:

description

上图中从右到左一共三个OrderBook盘口信息,显示的分别是CME迷你标普期货、CME迷你纳指期货以及由这两个期货合成的价差组合。

交易员可以直接对价差组合发出买卖委托,由X_Trader内部的价差执行引擎AutoSpreader来完成具体各条价差腿上的交易执行,基于主动腿成交后被动腿瞬时对冲的模式,来最小化价差交易中的瘸腿风险。

description

其中价差组合的盘口价格信息,会根据如上图中用户自定义的价格乘数、交易乘数、主动被动腿等参数,由X_Trader内部的价差数据引擎来实时高速计算,并驱动价差执行算法来自动完成交易任务。

除了能将复杂的价差组合交易简化得接近单一期货合约的买卖,X_Trader还提供了ADL(Algo Design Lab)模块给交易员,来开发针对价差组合的量化交易策略。

最神奇的一点在于:使用ADL开发策略时用户完全用不着写代码!只需要通过类似下图中的界面,拖动和连接各种代表交易策略逻辑功能的图形块,就能完成整个量化策略的开发。

description

vn.py的SpreadTrading价差交易模块,在设计上采用了接近X_Trader的业务逻辑分层:

  • LegData负责跟踪和记录最底层各原始合约的数据(价格、持仓);
  • SpreadData维护价差组合的自定义参数,以及和LegData的映射;
  • SpreadDataEngine自动实时计算价差的盘口和持仓状态数据;
  • SpreadAlgoEngine执行用户下达的价差交易算法指令(手动、策略);
  • SpreadStrategyEngine则负责运行用户开发的价差量化策略。

目前vn.py在交易层面可以说基本实现了接近X_Trader的功能,但在UI界面上还有挺大的距离,尤其是这个ADL模块,从一个交易员的角度来看真是非常非常眼馋。

 

Horizon

 

官网:www.hsoftware.com

类型:商业软件

国家:法国(不确定)

语言:Java

启发:期权波动率交易

Horizon应该是最早进入中国市场的期权做市量化平台之一,另外还有后来被Bloomberg收购了的RTS(ORC当时还没进来),创始团队来自一家法国投行的做市部门(Societe Generale还是BNP Paribas的不记得了)。

对于期权方面的量化策略(做市、波动率交易、套利等),Horizon提供了相当完备的功能支持,首先基于市场价格来实时计算隐含波动率曲面,并进行定价波动率的拟合设置,如下图所示:

description

有了定好的定价波动率(Pricing Volatility或叫Reference Volatility)后,就可以基于标的物的实时价格来计算期权理论参考价值,再结合报价价差、报单数量、持仓调整系数等参数,挂出双边买卖委托来进行做市交易

做市算法的管理界面有点类似常见的T型报价,但是有更多用于调整算法参数的表格列,同时一定要有如下图中所示的表格高亮(防止交易员眼花):

description

成交后的期权持仓风险管理,除了最基本的Delta自动对冲功能外,对于其他希腊值也需要实时跟踪计算,方便交易员随时根据市场情况来执行相应的对冲调仓操作。

同时Horizon也内置了事件驱动引擎(Esper),对于更加个性化的套利交易策略,允许交易员自行使用Scala语言(关于这个语言的选择我倒是挺想吐槽)来快速开发策略程序,当然策略监控的界面就比较简单了,只有数字和开关按钮:

description

参考Horizon的交易业务流程,vn.py内面向期权波动率交易的OptionMaster模块,把底层数据分为了4个层次

  • 标的物:UnderlyingData
  • 期权:OptionData
  • 期权链:ChainData
  • 交易组合:PorfolioData

通过更紧密的数据结构优化,以及Cython化的定价模型组件,来解决纯Python程序在期权波动率交易这种追求低延时策略上的性能问题。

对于国内ETF期权上独有的合成期货长期贴水,OptionMaster模块内也额外添加了升贴水自动拟合算法,来保证系统内Call和Put隐含波动率计算的平衡性,避免出现许多平台上的两者对不齐的现象。

考虑到大部分用户并没有做市商牌照,无法使用CTP等柜台提供的ReqQuoteInsert双边报价函数,因此OptionMaster自带的电子眼交易算法ElectronicEyeAlgo只支持见价主动成交。当然,对于有做市需求的机构用户也可以自行修改后实现双边报价的做市功能。

 

同样,有什么想问的问题或者分享的内容,欢迎在文章下方留言。本期我们将会随机抽取一位留言者赠送《vn.py全实战进阶 - 深入期权定价模型》课程的5折优惠券一张。

 

发布于vn.py社区公众号【vnpy-community】

 

原文作者:用Python的交易员 | 发布时间:2020-07-20

 

上一篇文末的抽奖福利中

获奖的朋友是:

Shirley S

请在48小时内通过公众号留言联系领取奖品~

 
 

讲到中国金融市场的量化交易发展历史,绕不开的一个主题就是CTA策略。CTA这个词本身是Commodity Trading Advisor的缩写,在定义上是欧美一种交易期货衍生品为主的投资顾问,或者也可以理解为一种对冲基金的类型。

但在国内的CTA这个词,更多指的是一种以趋势跟踪(Trend Following)为主的量化交易策略,交易品种也同样是期货。因为其门槛较低(相对于多因子、期权波动率等策略),CTA策略大概2010年前后就开始在国内市场上流行起来。

虽然没有做过特别正式的统计,但CtaStrategy无疑一直是vn.py平台内用户量最大的量化应用模块。所以在这第二篇文章中,就来讲讲和CtaStrategy相关的两个项目:CTP APIMultiCharts

 

CTP API

 

官网:www.sfit.com.cn

类型:交易接口

国家:中国

语言:C++

启发:数据定义

CTP是上期技术公司推出的一套期货交易柜台系统,目前大概70-80%的期货公司都已经上线,其整体架构如下图所示:

description

用今天2020年的眼光来看,CTP柜台在交易方面的技术优势可能已经不那么明显,但是它的交易接口CTP API却走得远得多,甚至在一定程度上成为了国内金融市场的量化交易接口设计标准,类似FIX协议在欧美的地位。

究其原因,个人观点可以总结为代码精简和功能完善两个方面。

首先,不管行情还是交易,接口中都只包含两个大类:

  • API类

    • 提供主动函数,用于发送请求到服务器
  • SPI类

    • 提供回调函数,用于接收服务器的回报

没有麻烦的数据打包器、解包器,也没有消息客户端、主推订阅者,更没有一大堆的配置选项(授权文件、加密签名、缓冲区大小......),只有简简单单的两个类,不管哪家期货公司几乎都是完全一致的配置,做到了真正的标准化接入。

其次,在业务数据的定义上,不像恒生T2SDK等消息收发类接口需要查看Excel文档,才能知道代码要怎么写(还特别容易掉坑),CTP API则是采用了Struct结构体的定义形式,开发者只需看着.h头文件中的内容就能快速完成代码开发。其中最核心的业务数据结构,甚至两只手都能数的过来:

  • 主动请求

    • 登录请求
    • 下单请求
    • 撤单请求
  • 被动回报

    • 合约信息
    • 行情信息
    • 委托信息
    • 成交信息
    • 持仓信息
    • 资金信息

vn.py的底层接口设计,整体上借鉴了CTP API的风格。通过vnpy.trader.object定义了所有的标准数据结构,如ContractData、TickData、OrderRequest等,通过vnpy.trader.gateway定义了标准对接基类BaseGateway,从而实现将所有不同类型的接口(C++、Python、REST、FIX等)统一对接到vn.py系统上层的量化策略应用。

 

MultiCharts

 

官网:www.multicharts.com

类型:商业软件

国家:美国

语言:C#

启发:CTA策略

MultiCharts(缩写MC)是一款主要针对CTA类策略的量化交易平台,其创始人Dennis Globa曾经也是TradeStation(缩写TS,另一款起源于1991年的量化交易平台)的忠实用户。但因为觉得TS的功能有所不足(数据源限制、没有组合回测等),所以在2005年决定自立门户推出了MC,并且在策略开发语言上选择和TS保持兼容,使用经典的EasyLanguage语言。

EasyLanguage语言的特点,用一句话概括叫做:用普通英语来写量化策略。什么意思呢,看一行代码:

buy 2 contracts this bar close;

几乎不需要去学什么编程语法,你也能看明白这是要在当前K线收盘点买入2手合约。

简单易用的EasyLanguage让用户能够很快把策略代码给实现出来,同时MC也提供了许多强大的历史回测和参数优化功能:

description

逐日盯市的回测曲线

description

200个多个回测统计指标

description

参数优化结果的3D绘制

准确的历史数据回测,是CTA策略开发过程中最为重要的环节。所以vn.py的CtaStrategy模块在历史数据回测上,采用了和MC一致的计算逻辑,列举一些关键点:

  • 委托类型

    • 限价单(常规交易)
    • 停止单(突破交易)
  • 成交规则

    • T时刻下单,只能在T+1时刻后成交
    • 支持K线内部撮合成交,而非只能以收盘价成交
    • 策略只能下单和撤单,无法控制委托成交与否
    • 委托成交价格,由回测引擎基于撮合规则计算

同时也结合Python语言的优势做了额外改进:

  • 调用下单函数后,会立即返回本地委托号,用于实现细粒度委托挂撤单管理(回测+实盘)
  • 提供on_tick/on_order/on_trade等回调函数,允许用户获取交易底层数据,而不仅仅是K线和持仓
  • CTA策略以Python类的形式存在,采用面向对象的编程模式,可以实现复杂嵌套的策略逻辑(例如海龟的开仓过滤)

 

同样,有什么想问的问题或者分享的内容,欢迎在文章下方留言。本期我们将会随机抽取一位留言者赠送《vn.py全实战进阶 - 期权零基础入门》课程的5折优惠券一张。
 

发布于vn.py社区公众号【vnpy-community】

 

原文作者:用Python的交易员 | 发布时间:2020-07-20

 

和其他软件项目一样,vn.py同样也是建立在诸多前人工作的成果之上,这些项目中凝结的知识和经验给了vn.py许多启发,有些是技术选型的方向,有些是新功能的灵感,也有些是社区运营的思路。

最近几个月在vn.py社区中,开始出现越来越多围绕系统架构和技术体系方面的讨论,而不仅仅是过去围绕策略和交易相关的话题,可能也意味着我们社区成员的整体水平进入了一个更高的阶段?知其然后,更希望知其所以然。

满足用户需求一向是我们的主要工作目标,所以接下来打算做一个围绕vn.py技术架构相关的系列文章,希望能帮助大家去了解其中的诸多技术细节。作为第一篇文章,本文中我们先来看看两个影响了vn.py主要技术选型的项目:MatlabAlgoTrader

 

Matlab

 

官网:www.mathworks.com

类型:商业软件

国家:美国

语言:Java/C++/Fortran

启发:编程语言

Matlab本身相信不用我过多介绍了,我本人在大学金融工程课程中唯一接触过的编程语言就是Matlab。几乎所有的作业论文,不管是数据建模、期权定价还是策略回测,基于Matlab的矩阵运算功能以及内置金融模块,都能够相当方便的完成出来,多花点心思的话还能进一步开发出定制化的UI界面工具(如下图所示):

description

2012年毕业进入工作后,却很快发现了Matlab的一个重要短板:针对数值运算设计的Matlab在事件驱动编程方面相当薄弱,无法作为实盘交易程序的核心。搞定了数据分析,搞定了策略回测,但却倒在了最终的实盘交易。

无奈之下只能去寻找新的编程语言,筛选标准其实还是围绕着Matlab的特点:

  • 动态语言:写起来方便,不用声明变量,更不用手动管理内存;
  • 数学运算:原生支持矩阵计算,同时语法尽可能接近Matlab;
  • 应用模块:越多越好,尤其是金融和投资方面的成熟应用案例;
  • 通用语言:支持主要的编程范式,尤其得能实现事件驱动编程。

筛了一圈,最后找到得答案就是Python。

首先各方面功能足够强大:矩阵运算有numpy,时序分析有pandas,图形界面有PyQt,API封装有boost.python(现在是pybind11了)。总之只要学一种编程语言,就能搞定量化交易种的所有环节

其次,Python在基础语法上和Matlab近似度很高,对于我本人这种非专业IT出身的量化交易员,只要不怕麻烦不怕累,花点时间硬着头皮学一两个月,很快就能入门上手开始出点成果。不必像C++学个半年,还在和各种野指针、内存泄露的问题上来回折腾不可自拔。

当然Matlab后来也推出了专门针对量化交易的工具库Trading Toolbox,对接了一系列主流的数据和交易系统,例如下图中对接CQG系统的交易流程图:

description

但可惜还是没有对接国内的CTP柜台。

 

AlgoTrader

 

官网:www.algotrader.com

类型:商业软件(曾是开源软件)

国家:瑞士

语言:Java

启发:系统架构

差不多10年前,欧美量化交易领域曾经有三个非常知名的开源项目,分别是Marketcetera、AlgoTrader、TradeLink(详细介绍可以参考《Quantitative Trading》这本书,同一时间段出版的,也是我本人的量化启蒙书)。随着时间的发展,Marketcetera逐渐没落(已经很久没再看到有什么版本更新或者用户交流了),而AlgoTrader和TradeLink这两家则选择了闭源路线,转型成了商业软件。

AlgoTrader的开发团队主要来自于瑞士,最初也是为了期权波动率交易策略而专门开发。其核心架构如下图所示:

description

基于Java语言开发的AlgoTrader,在系统层面做了非常好的解耦设计:

  • 三层架构

    • 接口层:实时行情、委托交易、历史数据
    • 引擎层:事件处理、算法对冲、风险管理,等等
    • 应用层:量化策略、手动界面、管理工具
    • 每层均为独立的进程
  • 数据通讯

    • 使用RabbitMQ作为消息中间件来实现各层之间的通讯
  • 事件驱动

    • 基于Esper复杂事件处理引擎(CEP)的实时数据驱动

第一次看到AlgoTrader的时候,感觉只有一个:惊艳,然后立马开始学习Java。无奈几个月的学习后,还是只会调用非常基础的库,量化策略相关的代码一点写不出来。尽管主要原因肯定是我的编程水平太差,但长时间投入出不了成果,兴趣和热情逐渐就磨没了,所以AlgoTrader的学习计划,卒。

虽然没能学得会,倒是把AlgoTrader的系统架构深深印在了脑子里,后面在开发vn.py的过程中也采用了同样的三层架构

description

不过由于一些Python语言自身和Java的特性区别,vn.py在细节方面还是做了许多额外修改,比较主要的两个:

  • 各层组件只作为对象存在,在同一进程内避免无谓的网络通讯开销
  • 针对GIL全局锁,开发了单线程的事件驱动引擎保证高效的处理速度

最后,有什么想问的问题或者分享的内容,欢迎在文章下方留言,我们将会随机抽取一位留言者赠送《vn.py全实战进阶 - CTA策略》课程的5折优惠券一张。

 

  

vn.py社区活动公告

上海地区这边写字楼已经允许举办会议活动了,所以这个月底7月26号的社区活动改为线上线下同时进行,这次的主题是vn.py在外盘市场量化策略方面的分享,活动大纲:

  1. 认识外盘市场
    a. 全球期货市场

    b. 港股美股市场

  2. vn.py的解决方案
    a. 交易通道选择

    b. 历史数据服务

    c. CTA趋势策略

    d. 境内外套利交易

  3. 直达期货分享
    a. 外盘经纪业务

    b. 对比IB的优势

报名请扫描图片中的二维码(99元,Elite会员免费参与):

description

发布于vn.py社区公众号【vnpy-community】

 

《30天解锁Python量化开发》课程已经更新过半(至25集),计划在9月底全部更新完毕,通过概念讲解和实践操作结合的方式,加上vn.py框架内部代码细节的梳理学习,来帮助你快速掌握Python量化开发能力,详情请戳

 

原文作者:KeKe | 发布时间:2020-09-15

 

不管是研究价差套利策略还是多因子组合策略,都需要同时用到诸多合约的历史数据。

而vn.py目前提供的图形界面数据下载工具(CtaBacktester和DataManager两个模块),每次操作只能下载一个合约的数据,当要下载的合约数量较多时,逐个点过去既浪费时间也容易误操作。

本文中,我们将来介绍如何通过Python脚本执行的形式,直接调用vn.py框架内的数据下载和整理入库功能,来实现全市场期货数据的批量下载和自动更新。

 

全市场数据批量下载

 

设置合约品种

首先,我们要先生成一个字典,来指定需要下载的数据,关键字段有3个:

  • 交易所代号:上期所-> SHFE
  • 合约代号: 螺纹钢-> rb
  • 合约品种类型: 指数合约 -> 99

基于以上字段,我们即可生成在使用rq_client(位于vnpy.trader.rqdata模块中)下载数据时所需的本地代码vt_symbol(如rb99.SHFE)。

然后,由于要下载全市场品种的行情数据,所以采用字典和列表嵌套的复合数结构来表示:

symbols = {    
    "SHFE": ["cu", "al", "zn", "pb", "ni", "sn", "au", "ag", "rb", "wr", "hc", "ss", "bu", "ru", "nr", "sp", "sc", "lu", "fu"],    
    "DCE": ["c", "cs", "a", "b", "m", "y", "p", "fb","bb", "jd", "rr", "l", "v", "pp", "j", "jm", "i", "eg", "eb", "pg"],    
    "CZCE": ["SR", "CF", "CY", "PM","WH", "RI", "LR", "AP","JR","OI", "RS", "RM", "TA", "MA", "FG", "SF", "ZC", "SM", "UR", "SA", "CL"],    
    "CFFEX": ["IH","IC","IF", "TF","T", "TS"]}

symbol_type = "99"

在symbols字典中,每个键(key)是交易所的英文缩写,而对应的值(value)则是包含了该交易所各期货品种英文前缀的列表。这样在使用时只需要遍历这个字典,就可以快速生成所有如rb99.SHFE这样结构的本地代码。

 

设置下载时间段

 

这一步我们只需对所有品种设置相同的下载数据开始时间和结束时间即可。需要注意的是,rq_client中关于时间的参数采用datetime.datetime格式,所以这里要做到格式的一致,代码如下:

from datetime import datetime
start_date = datetime(2005,1,1)
end_date = datetime(2020,9,10)

 

执行批量下载任务

 

完成了前面的两步准备,最后就是运行脚本来执行批量下载任务,脚本的整理逻辑步骤如下:

  1. 遍历symbols字典
  2. 生成不同的HistoryRequest参数
  3. 调用数据下载模块rqdata_client.query_history,得到数据data
  4. 调用数据保存模块database_manager.save_bar_data,把下载好的数据data写入数据库
from vnpy.trader.rqdata import rqdata_client
from vnpy.trader.database import database_manager
from vnpy.trader.constant import Exchange, Interval
from vnpy.trader.object import HistoryRequest

def load_data(req):    
    data = rqdata_client.query_history(req)     
    database_manager.save_bar_data(data)    
    print(f"{req.symbol}历史数据下载完成")

for exchange, symbols_list in symbols.items():    
    for s in symbols_list:        
        req = HistoryRequest(            
            symbol=s+symbol_type,            
            exchange=Exchange(exchange),            
            start=start_date,            
            interval=Interval.DAILY,            
            end=end_date,        
        )        
        load_data(req)

写好脚本文件后可以在cmd中通过python命令来直接运行,或者也可以选择将代码写在Jupyter Notebook来运行。每完成一个品种的下载任务后会打印输出相应的日志信息:

description

如果要下载小时或者分钟级别数据,只需把上一段代码中创建HistoryRequest对象时的interval参数,由日线周期的Interval.DAILY改成分钟线的Interval.MINUTE或者小时线的Interval.HOUR即可。

 

每日定时自动更新

 

尽管已经构建了包含全市场品种的历史数据库,但随着每日交易数据的不断产生,还是需要每天下载新的数据来更新数据库。

 

每日定时执行

 

通常我们希望在收盘后的某个时间点(比如下午5点),来自动执行数据更新任务。最简单的方案就是在Python脚本中启动一个持续运行的while循环,然后不断检测当前时间,到下午5点时就开始下载更新数据,其他时间则sleep等待,相关代码如下:

from datetime import datetime, time
from time import sleep

last_dt = datetime.now()
start_time = time(17,0)

while True:      
    dt = datetime.now()      

    if dt.time() > start_time and last_dt.time <= start_time:  
        download_data()      

    last_dt = dt

 

增量更新逻辑

 

数据库中已有的数据没必要重复下载,因此在执行每日数据更新时,应该选择当前数据库中每个合约的最新一条数据的时间作为今日更新下载的起始时间点(start_time)。这样在前一天已经批量下载完全市场所有合约的数据后,今天就只需要下载当日内产生的新数据即可。

增量更新的原理步骤如下:

1)通过database_manager(位于vnpy.trader.database模块中)来查询当前数据库中已有的合约数据统计情况:

data = database_manager.get_bar_data_statistics()

2)遍历data列表中各合约数据的统计信息,查询每个合约所对应的最新一条数据的时间戳:

for d in data:    
    newest_bar = database_manager.get_newest_bar_data( 
        d["symbol"], Exchange(d["exchange"]), Interval(d["interval"])   
    )    
    d["end"] = newest_bar.datetime

3)针对每个合约的数据更新,起始时间均为数据库中最新一条数据的时间戳,结束时间则是当前最新时间戳:

end_date = datetime.now()

for d in data:      
    symbol = d["symbol"]      
    exchange = d["exchange"]        

    req = HistoryRequest(          
        symbol=symbol,          
        exchange=Exchange(exchange),          
        start=d["end"],          
        interval=Interval.DAILY,          
        end=end_date,      
    )      
    load_data(req=req)

运行完成后,我们可以重复1、2两步来查询数据库中已有数据的最新一条记录时间戳,发现已经成功更新了今日所有合约的数据:

description

 

 
9月26日社区线下活动:CTA策略复杂交易算法实现

内容:

  1. CTA策略复杂交易算法:

    a.回调函数细节:

    ​ i. on_tick的K线合成

    ​ ii. on_order的推送时机

    ​ iii. on_trade的持仓更新

    b. CTA交易中的算法状态机
    c. 替换频繁cancel_all模式的停止单

    d. 盘口连续挂单的交易执行逻辑

    e. 实现一个策略内的TWAP算法

  2. K线图表绘制回测买卖记录

    a.成交的逐笔对冲统计模式

    b. vnpy.chart模块的图层开发
    c. 实现买卖记录连线图层

报名请扫描下方二维码:

description

发布于vn.py社区公众号【vnpy-community】
 
《30天解锁Python量化开发》课程已经更新过半(至25集),计划在9月底全部更新完毕,通过概念讲解和实践操作结合的方式,加上vn.py框架内部代码细节的梳理学习,来帮助你快速掌握Python量化开发能力,详情请戳

 

原文作者:NY | 发布时间:2020-09-10

 

很多刚接触期货的投资者可能会疑惑,为什么商品期货在10:15到10:30之间,要有一个15分钟的交易休市,而国内的其他金融市场(证券股票、银行间债券、金融期货等)却都没有。

但其实,上午的这个休盘15分钟还真有历史渊源。话说在基于电脑的自动化交易系统还没有诞生的“远古”时期,交易所内还存在着一群场内交易员,一旦进入工作时间,需要持续保持精神高度集中,边盯着报价板边帮客户喊单交易。

上午开盘时间比较早,可能早盘行情的价格波动相对剧烈,也可能场内交易员们还没有准备充分,所以大家就需要一小段休息时间来调整一下,比如去下洗手间、吃个点心等。时至今日,国内各家期货交易所虽然都已经取消了场内交易员的模式,但商品期货上午15分钟休市的习惯却保留了下来。

 

特殊分钟K线的合成

 

回归到正题,vn.py中的K线合成器工具BarGenerator(位于vnpy.trader.utility模块下),从Tick合成K线的标准逻辑是对当前时间戳的分钟数字求余来进行切片的,具体代码如下:

if self.interval == Interval.MINUTE: 
    # x-minute bar    
    if not (bar.datetime.minute + 1) % self.window:        
        finished = True

要准确的把60分钟完整切片到等份,切片区间必须是以下这些能够整除60的数字:

2、3、5、6、10、15、20、30

但对于商品期货来说,由于上午的15分钟休盘,会导致某些情况下合成K线数据的不正确。

以20分钟为例,正常应该在每小时的19分、39分和59分的分钟线走完时合成20分钟K线。因为10:19的分钟数据不存在(休盘时间),不会触发切片合成,而要等到10:39分才会触发,导致这跟K线中会包含10:00-10:14和10:30-10:49两段共计35分钟的数据,和交易策略中预期的逻辑不符。

解决方案也很简单,只需对三大商品期货交易所的品种都进行一条特殊的逻辑处理,当收到上午10:14的分钟数据更新时我们立刻进行切分,这样下一根K线中的数据就一定从10点30分开始了:

if self.interval == Interval.MINUTE:    
    # x-minute bar    
    if not (bar.datetime.minute + 1) % self.window:        
        finished = True    
    elif (        
        bar.datetime.time() == time(10, 14)        
        and bar.exchange in [            
            Exchange.SHFE, Exchange.DCE, Exchange.CZCE        
        ]
    ):        
        finished = True

完成修改后,我们可以通过使用1分钟的螺纹钢数据合成20分钟K线来测试下效果,如下图所示:

description

可以看到由于15分钟休盘时段的数据缺失,这个时刻的20分钟K线是从30分钟开始,该结果也和文华等其他期货软件中的K线数据一致。

 

日K线数据的合成

 

由于国情区别,每个国家的开收盘时间也不一定相同,下文中的日K线合成方法仅针对国内期货市场。

和前文中的特殊分钟K线切分逻辑类似,日K线合成的关键也在于找到正确的当日行情的结束点,即当日收盘时间。

需要注意的是,目前国内期货品种中除了国债期货收盘时间是15:15,其他都是15:00整点收盘。所以我们只需对国债期货进行特殊处理,代码如下:

elif self.interval == Interval.DAILY:    
    day_end = time(14, 59)    
    if bar.exchange == Exchange.CFFEX and not bar.symbol.startswith("I"):               
        day_end = time(15, 14)    
    if bar.datetime.time() == day_end:        
        finished = True        
        self.interval_count = 0

通过交易所为CFFEX,以及合约代码不以I开头(股指期货为IF、IC和IH前缀)两个条件即可判断是否为国债期货。

这样我们就完成了从分钟K线到日K线的合成切分逻辑,使用上只需在创建BarGenerator对象时,将interval参数设置为Interval.DAILY,即可直接合成日线。

我们也用3个不同类型的期货品种来进行测试,效果如下图所示,都能正常合成:

description

对于螺纹钢等存在夜盘交易时段的期货品种,上述合成逻辑会将其夜盘时段的行情合并到下一日行情中切分(日K线的开盘价是夜盘开盘价),该逻辑也符合交易所对于每日交易时段的划分规则。

 
 

 
9月26日社区线下活动:CTA策略复杂交易算法实现

内容:

  1. CTA策略复杂交易算法:

    a.回调函数细节:

    ​ i. on_tick的K线合成

    ​ ii. on_order的推送时机

    ​ iii. on_trade的持仓更新

    b. CTA交易中的算法状态机
    c. 替换频繁cancel_all模式的停止单

    d. 盘口连续挂单的交易执行逻辑

    e. 实现一个策略内的TWAP算法

  2. K线图表绘制回测买卖记录

    a.成交的逐笔对冲统计模式

    b. vnpy.chart模块的图层开发
    c. 实现买卖记录连线图层

报名请扫描下方二维码:

description

发布于vn.py社区公众号【vnpy-community】

 

原文作者:用Python的交易员 | 发布时间:2020-08-24

 

先来做一个简单的测试,看看你在学习和使用vn.py的过程中有没有碰到过以下的疑问:

  • CTA策略中的变量,为什么有的前面要加self,有的却不用?
  • 手头有一批CSV历史数据文件,如何用脚本来一次性批量导入数据库?
  • 修改了vn.py文件夹里的源代码,但不管怎么重启都无法生效?
  • 想要录制全市场的TICK行情数据,要怎样配置DataRecorder模块?

如果你的回答是【没有】,那么可以直接退出不用继续往下看了,你已经很好的掌握了Python这门语言。

如果回答是【有】,那么这门新的课程《量化交易零基础入门系列 - 30天解锁Python量化开发》相信正好能帮到你。

这几年随着vn.py的用户数量不断增加,用户群体也从最初的专业机构量化交易员(老用户)逐渐下沉:有些刚从TB、文华之类的传统量化平台转过来,有些之前主要做的是主观交易刚开始接触量化,有些是对量化交易感兴趣的财经专业学生等等(新用户)。

而对于这些vn.py新用户来说,比起一上来就跟着老用户学CTA策略怎么写或者期权波动率交易怎么做,更重要的是先学好Python这门语言来解锁自己的量化开发能力。

否则就可能出现目前我们社区里一些新用户的情况:来回在论坛和QQ群里学习提问,折腾几个月却连一个完整能跑的Python程序都写不出来。工欲善其事必先利其器,这句老话在量化交易领域也同样适用。

整个课程完全针对Python零基础的初学者设计,目前已经计划的课时是50节。制作过程中也会根据大家的反馈增加额外的实战案例讲解课时,内容大纲如下:
 

description

 

课程目前已经上线,原价399元,还是老规矩前100名用户8折(319元)。直接在vn.py社区微信公众号(vnpy-community)里就能购买和观看(点击底部菜单栏的【进阶课程】进入)。推荐使用PC微信打开,视频分辨率更加清晰。

【30天解锁Python量化开发 - 快速传送门】

发布于vn.py社区公众号【vnpy-community】

 

原文作者:用Python的交易员 | 发布时间:2020-06-29
 

差不多半年没做统计了,这次做的是【金融市场】相关的开源量化项目排名,主要内容就一张图:

description

总结下:

  • 使用Python语言的项目,占了9/10
  • 由国内团队开发的项目,占了6/10
  • 针对策略开发功能的项目,占了5/10

需要注意的是,无论Star数量还是排名位置,都不能绝对说明某个项目的实际价值和代码质量,更多还是作为一种参考信息,来了解当前的量化开源生态情况。

关于这个排名,有什么观点或者建议,欢迎留言讨论~

发布于vn.py社区公众号【vnpy-community】

 
《30天解锁Python量化开发》课程已经更新过半(至25集),计划在9月底全部更新完毕,通过概念讲解和实践操作结合的方式,加上vn.py框架内部代码细节的梳理学习,来帮助你快速掌握Python量化开发能力,详情请戳
 
原文作者:用Python的交易员 | 发布时间:2020-09-20

 

本周末发布了vn.py的2.1.6版本,本次更新的内容主要是增加了PaperAccount本地模拟交易模块,以及优化了CtaBacktester模块的回测记录K线图表显示功能。

和之前一样,对于使用VN Studio的用户,启动VN Station后,直接点击界面右下角的【更新】按钮就能完成自动更新升级,对于没有安装的用户,请下载VNStudio-2.1.6,体验一键安装的量化交易Python发行版,下载链接:

https://download.vnpy.com/vnstudio-2.1.6.exe

 

本地模拟交易模块(PaperAccount)

 

该模块在vn.py社区是呼声已久,主要为了解决目前各类需要依赖服务端功能的仿真交易账户的问题,例如:

  1. SimNow的CTP仿真环境,从2019年之后稳定性就逐渐变差,时不时会出现宕机连不上,或者和实盘行情出现较大的偏差;

  2. 截至目前,国内期权方面始终没有类似SimNow能提供实盘行情撮合的仿真环境:

    1. 期货期权用的交易所大仿真环境需要有用户报单才有行情(类似实盘的独立环境);
    2. ETF期权用的经纪商自建仿真环境,存在着行情延时不根据盘口\撮合****等问题;

对于上述这类问题,最简单的解决方案就是直接在交易客户端内部提供一套本地化的模拟交易环境,同时基于实盘行情的盘口数据进行委托撮合,也就是我们全新的PaperAccount本地模拟交易模块。

该模块在使用上非常傻瓜,首先在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模块的功能进行若干配置:

description

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

PaperAccount模块同样也可以配合vn.py内部的所有其他策略应用模块一起使用(如CtaStrategy、SpreadTrading等),从而实现完全本地化的量化策略仿真交易测试。

 

CTA回测结果K线图增强

 

先来看一眼新的CtaBacktester回测K线图:

description

图表中各个组成部分的功能看最下方的说明就行。这次修改的版本,整体上参考了TB和文华的回测图表显示风格,尽管我个人不太喜欢这种配色,但是社区里大部分用户似乎都属于【看久后已经习惯了】,所以还是满足大部分人的需求吧。

买卖交易结果的配对,采用了v1.0版本中CTA回测盈亏统计曾经提供的【逐笔对冲】逻辑,可以比较精确的显示出策略每次开平仓交易的结果。

 

其他更新

 

接口方面:

  1. 升级重构了宽睿证券极速柜台的接口OesGateway,一方面改为基于其C++版本封装(之前基于C版本),另一方面增加了对ETF期权业务的支持;

文档方面:

  1. 更新了官网的文档目录,可以直接通过这里访问;
  2. 新增OptionMaster、PortfolioStrategy和DataManager模块的文档。

 

 
9月26日社区线下活动:CTA策略复杂交易算法实现

内容:

  1. CTA策略复杂交易算法:

    a.回调函数细节:

    ​ i. on_tick的K线合成

    ​ ii. on_order的推送时机

    ​ iii. on_trade的持仓更新

    b. CTA交易中的算法状态机
    c. 替换频繁cancel_all模式的停止单

    d. 盘口连续挂单的交易执行逻辑

    e. 实现一个策略内的TWAP算法

  2. K线图表绘制回测买卖记录

    a.成交的逐笔对冲统计模式

    b. vnpy.chart模块的图层开发
    c. 实现买卖记录连线图层

报名请扫描下方二维码:

description

发布于vn.py社区公众号【vnpy-community】

 

原文作者:用Python的交易员 | 发布时间:2020-08-14

 

最近两个月公司的商业项目比较忙,这次2.1.5版本拖了一个月的时间到这周才发布,本次更新的内容主要是增加了对金纳算法交易服务的支持。

和之前一样,对于使用VN Studio的用户,启动VN Station后,直接点击界面右下角的【更新】按钮就能完成自动更新升级,对于没有安装的用户,请下载VNStudio-2.1.5,体验一键安装的量化交易Python发行版,下载链接:

https://download.vnpy.com/vnstudio-2.1.5.exe

如果使用AlgoTrading模块还需要quickfix这个包(开源FIX引擎),直接通过pip安装的话需要机器上有Visual Studio编译器,否则会报错安装失败,所以推荐在cmd中运行下列命令来安装:

pip install https://pip.vnpy.com/colletion/quickfix-1.15.1-cp37-cp37m-win_amd64.whl

 

金纳算法交易服务

 

description

上图中的本文封面图是从金纳科技首页截取的,简洁明了的一句话说出了这家公司的主要产品:智能算法交易

有些朋友可能搞不清楚【交易算法】和【量化策略】这两个词之间的区别,举一个简单的例子来说明:

  • 作为一名债券固收交易员,基于国债现券的利率曲线变化,你的【量化策略】给出了买入信号,此时你需要立即去买入1000手10年期国债期货T2012来建立多头仓位;
  • 而T2012合约的盘口流动性,通常1档只有5-20手的挂单量,1000手无法一次性买入进去,只能通过【交易算法】把1000手拆分开来,每6秒买10手,10分钟(600秒)后全部执行完毕。

所以,总结下来:

  • 量化策略:负责计算生成买卖的信号,等待时机来捕捉市场Alpha;
  • 交易算法:负责实际执行买卖的委托,减少捕捉Alpha时的执行成本。

对于交易数量不大的用户,可以选择直接将买卖委托的操作嵌入到量化策略的信号生成中(比如中小型资金跑CTA策略)。但对于资金较大的量化机构,算法交易就是业务中的刚需了。

所以从很早的版本中,vn.py就提供了AlgoTrading模块用于满足这类中低频量化策略的算法交易需求。

对比vn.py中的标准执行算法实现,金纳科技提供的交易算法则加入了更多智能的功能,通过结合全息盘口和L2行情数据来优化算法中的买卖执行细节,从而进一步降低交易成本,或者大家也可以理解为在金纳的交易算法中嵌入了一部分高频量化策略的信号来优化买卖点。

金纳算法交易服务对外提供了FIX协议的接口,用户可以自行联系金纳科技购买账号(按年收费),或者也可以联系自己的券商看是否有采购(比如中泰、申万宏源)来申请免费账号。

vn.py使用了QuickFIX引擎来和金纳算法交易服务对接,针对算法母单的上行和算法子单的下行分别创建了对应的FIX APP,拿到金纳的账户信息后,只需在vn.py主界面的全局配置中添加相关的配置:

description

上图中以genus.为前缀的就是金纳相关的配置选项,parent前缀的是母单部分,child前缀的是子单部分,都需要填入对应的服务器地址、通讯端口、发送方名称、接收方名称信息。

修改完成后点击【确定】按钮退出,然后重启VN Trader打开AlgoTrading算法交易模块,检查日志监控中输出的内容:

description

同时能看到母单和子单FIX APP连接成功的信息,就说明已经成功完成了金纳算法交易服务的登录,此时就可以和之前调用vn.py内置算法一样,来使用金纳提供的交易算法了:

description

同时,由于FIX协议的标准化和通用性特点(金纳用的是FIX 4.2),如果大家有对接其他FIX协议交易系统(海外金融市场居多,比如各种MT4 Bridge)的需求,也可以参考vnpy.app.algo_trading.genus中的代码来进行开发。

 

InfluxDB支持

 

随着vn.py对多标的类量化策略的支持(PortfolioStrategy模块),数据存储访问的需求(尤其是在读取跑回测上)变得越来越高,毕竟谁都不想浪费太多时间在等待数据从硬盘载入到内存上。

InfluxDB是一套专门针对时间序列数据存储设计的NoSQL类数据库,相比于SQL类数据库的MySQL能提供快得多的写入和读取速度(5-20倍),同时采用独立服务进程的模式运行,也能支持多进程的并发访问需求(SQLite的痛点)。

新的2.1.5版本中,也加入了对InfluxDB数据库的原生支持。首先前往InfluxDB的官网:https://portal.influxdata.com/downloads/ ,下载v1.8.1版本的InfluxDB。解压下载后的压缩包,编辑配置influxdb.conf文件,将max_body_size参数设为0。最后打开cmd,切换到当前目录,运行下述命令启动:

./influxd.exe –config ./influxdb.conf

然后同样打开VN Trader主界面的全局配置对话框,修改数据库相关的配置如下:

description

确认保存设置后重启VN Trader,即可开始享受InfluxDB带来的迅捷数据存储。最后需要提醒的是,运行influxd.exe的cmd需要保持运行,如果关闭则会导致InfluxDB退出,或者也可以用一些辅助工具将其注册为后台运行的Windows服务。

 

其他更新

 

接口方面:

  1. 增加顶点飞创的ETF期权接口SecGateway,至此国内主要的ETF期权量化接口vn.py就全部都支持了;

同样,有什么想问的问题或者分享的内容,欢迎在文章下方留言。本期我们将会随机抽取一位留言者赠送《vn.py全实战进阶 - 深入定价模型》课程的5折优惠券一张。

应该是没有收到交易所下单的回报,有可能是接口的连接断开了,可以去飞鼠查看一下订单状态看看。
如果有卡住的情况,也可请在cmd中用python -m vnstation启动,卡住后看看cmd是否有任何报错?

应该是你用了paper_account的原因,请在vn trader pro不勾选paper_account,只勾选币安和data_manager再试试

应该是代码:BTCUSDT
交易所:BINANCE吧。
建议还是先在菜单栏的”帮助“->“查询合约”里查到合约的写法再试试吧

比如说2019.1.2 9:10,加上全球时间戳以后变成了2019.1.2 9:10 + 08:06, 然后输出的时候可能被utc处理了变成了2019.1.2 9:04 + 08:00。建议可以在在输出的前一步先用replace(tzinfo=None)处理一下数据再缓存试试看

是要登录ctp还是ctptest?
以SinNow仿真交易账号登陆CTP接口的话,请参考文档-基本使用-连接接口去填;
登录ctptest做穿透式认证的话,必须输入产品名称和授权码,还是请参考这个链接

那就在run.py文件里把main_engine.add_gateway(CtpGateway)这一行和from vnpy.gateway.ctp import CtpGateway这一行前面的#号试试看

description

vnpy采用的是逐日盯市(把一笔一笔的成交映射到每天收盘的净值上)的方法,感兴趣的话可以去vnpy.app.cta_strategy.backetesting.py里看一下calculate_result函数或者去官方微信公众号里看vn.py全实战进阶系列-CTA策略里的24课回测统计和25课逐日盯市。

run.py打开的vn trader应该也是有ctp的

description

© 2015-2022 微信 18391752892
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】