前言 《WonderTrader架构详解》系列文章曾经写了四篇了,对于笔者这样的懒人来说,切实是一个大工程。这次先临时不介绍架构了,本文将给大家介绍一下如何在WonderTrader上编写一个跨种类套利策略,旨在给大家演示一下WonderTrader下多标的策略的个别写法,同时也介绍一下笔者在wtpy最新版本v0.6.3中最新公布的绩效剖析模块。
WonderTrader架构文章列表:
WonderTrader架构详解之一——整体架构WonderTrader架构详解之二——从数据说起WonderTrader架构详解之三——信号与执行WonderTrader架构详解之四——浅谈平台对策略的反对套利策略简介 置信每一个做量化的人,都钻研过套利策略。套利策略以其逻辑的绝对简略、收益的绝对稳固而失去少数人的青眼。同时,套利策略和趋势策略有较强的互补性,这就意味着,如果配合切当,对平滑收益曲线,升高绩效的稳定,进步夏普有极大的促进作用。 套利策略的分类就十分多了,笔者曾在《WonderTrader架构详解之四——浅谈平台对策略的反对》文中援用了丁鹏博士的《量化投资——策略与技术》对于策略的分类,外面提到的套利的模式就有很多种,例如:期现套、跨期套、跨种类套、配对交易等等。 笔者为了开发该策略,查阅材料的时候,看到一个观点,深认为然:不论套利策略分类如许简约,套利策略的实质是在不同合约之间的价差稳定中寻找交易机会。
套利策略实现策略设计 鉴于笔者的量化策略的技能树,还没点亮,所以本文中的策略示例,是从互联网上学习到的,笔者在此由衷地感激此策略的分享者。该策略根本设计如下:
合约对抉择螺纹钢主力间断合约SHFE.rb.HOT和铁矿石主力间断合约DCE.i.HOT回测数据为主力间断数据,进行了复权解决,避免主力合约换月不同步的时候引起的价差变动基于1分钟数据,对过来N分钟两组收盘价序列进行线性回归,失去一个系数beta、一个常量c和一个残差序列对残差序列进行ADF测验,如果残差序列是一个安稳序列,则进入信号计算逻辑依据失去的系数beta和常量c,以及最新的价格计算新的残差当新的残差超出一个阈值,就触发入场信号,当价差再回归到阈值以内,就触发出场信号策略实现参数设计 依据上文的介绍,策略外围的参数如下:
code1:套利合约1,本例设置为SHFE.rb.HOTcode2:套利合约2,本例设置为DCE.i.HOTperiod:数据周期,本例设置为m1,即一分钟线threshold:阈值,本例设置为0.9N:统计的K线条数,本例设置为360,即一个交易日的一分钟线bar_cnt:策略读取的K线条数,大于N,次要思考预留滚动计算的空间def __init__(self, name:str, code1:str, code2:str, bar_cnt:int, period:str, N:int, threshold:float=1): BaseCtaStrategy.__init__(self, name) self.__n__ = N self.__threshold__ = threshold self.__period__ = period self.__bar_cnt__ = bar_cnt self.__code_1__ = code1 self.__code_2__ = code2协整测验 策略外围的逻辑在于协整测验,只有协整测验通过了,能力进行信号触发。
# 协整检验函数def cointegration_check(series01, series02): # 对两个序列别离进行ADF测验 urt_1 = ts.adfuller(np.array(series01), 1)[1] urt_2 = ts.adfuller(np.array(series02), 1)[1] # 同时安稳或不安稳则差分再次测验 if (urt_1 > 0.1 and urt_2 > 0.1) or (urt_1 < 0.1 and urt_2 < 0.1): urt_diff_1 = ts.adfuller(np.diff(np.array(series01)), 1)[1] urt_diff_2 = ts.adfuller(np.diff(np.array(series02), 1))[1] # 同时差分安稳进行OLS回归的残差安稳测验 if urt_diff_1 < 0.1 and urt_diff_2 < 0.1: matrix = np.vstack([series02, np.ones(len(series02))]).T beta, c = np.linalg.lstsq(matrix, series01, rcond=None)[0] resid = series01 - beta * series02 - c # 最初对残差序列再进行ADF测验 if ts.adfuller(np.array(resid), 1)[1] > 0.1: result = False else: result = True return beta, c, resid, result else: result = False return 0.0, 0.0, 0.0, result else: result = False return 0.0, 0.0, 0.0, result信号收回 当残差超出上边界,阐明残差正向扩充,依据残差均值回归的个性,这时就须要做空价差;相同的,当残差超出下边界,阐明残差反向扩充,这时就须要做多价差;当加入在高低边界范畴之内,则清掉已有的头寸,期待下一次机会。
...