国内4种常用日内CTA策略介绍及实现

2024-06-05 10:48

本文主要是介绍国内4种常用日内CTA策略介绍及实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文首发于微信公众号:优矿量化实验室。文章内容属作者个人观点,不代表和讯网立场。投资者据此操作,风险请自担。

本文将向大家介绍四种常见的CTA策略(Dual Thrust、R-Breaker、菲阿里四价、空中花园),实现各策略并以Dual Thrust为例进行参数优化及止盈止损分析对比。1常用日内CTA 策略简介

  1.1 Dual Thrust策略

  Dual Thrust策略是一种趋势跟踪系统,属于日内交易策略。该策略由Michael Chalek 在20世纪80年代开发,曾被Future Thruth杂志评为最赚钱的策略之一。Dual Thrust系统具有简单易用和适用度广的特点,其思路简单且参数少,配合不同的参数、止盈止损和仓位管理可以为投资者带来长期稳定的收益。而且该策略适用品种较多,被投资者广泛应用于股票、货币、贵金属、债券、能源及股指期货市场等。在Dual Thrust交易系统中,对于震荡区间的定义非常关键,这也是该交易系统的核心。

  Dual Thrust在Range的设置上,引入前N日的四个价位,Range = Max(HH-LC,HC-LL)来描述震荡区间的大小。

  其中HH 是N日High的最高价,LC是N日Close的最低价,HC是N日Close的最高价,LL是N日Low的最低价。这种方法使得一定时期内的Range相对稳定,可以适用于日间的趋势跟踪。Dual Thrust对于多头和空头的触发条件,考虑了非对称的幅度,做多和做空参考的Range可以选择不同的周期数,也可以通过参数K1和K2来确定。具体分为两步来实现:

  第一步:计算相关参数,得到上轨Buyline 和下轨Sellline:

  N日High的最高价HH, N日Close的最低价LC

  N日Close的最高价HC,N日Low的最低价LL

  Range = Max(HH-LC,HC-LL)

  BuyLine = Open + K1*Range

  SellLine = Open - K2*Range

  第二步:交易逻辑:

  当价格向上突破上轨时,如果当时持有空仓,则先平仓,再开多仓;如果没有仓位,则直接开多仓;

  当价格向下突破下轨时,如果当时持有多仓,则先平仓,再开空仓;如果没有仓位,则直接开空仓;

  当K1时,多头相对容易被触发,当K1>K2时,空头相对容易被触发。因此,投资者在使用该策略时,一方面可以参考历史数据测试的最优参数,另一方面,则可以根据自己对后势的判断,或从其他大周期的技术指标入手,阶段性地动态调整K1和K2的值。

  1.2 R-Breaker策略

  R-Breaker 是一种短线日内交易策略,它结合了趋势和反转两种交易方式。该策略也长期被Future Thruth 杂志评为最赚钱的策略之一,尤其在标普500股指期货上效果最佳。该策略的主要特点如下:

  第一、根据前一个交易日的收盘价、最高价和最低价数据通过一定方式计算出六个价位,从大到小依次为突破买入价、观察卖出价、反转卖出价、反转买入价、观察买入价和突破卖出价,以此来形成当前交易日盘中交易的触发条件。通过对计算方式的调整,可以调节六个价格间的距离,进一步改变触发条件。

  第二、根据盘中价格走势,实时判断触发条件,具体条件如下:

  1) 当日内最高价超过观察卖出价后,盘中价格出现回落,且进一步跌破反转卖出价构成的支撑线时,采取反转策略,即在该点位(反手、开仓)做空;

  2) 当日内最低价低于观察买入价后,盘中价格出现反弹,且进一步超过反转买入价构成的阻力线时,采取反转策略,即在该点位(反手、开仓)做多;

  3) 在空仓的情况下,如果盘中价格超过突破买入价,则采取趋势策略,即在该点位开仓做多;

  4) 在空仓的情况下,如果盘中价格跌破突破卖出价,则采取趋势策略,即在该点位开仓做空。

  第三、设定止损以及止盈条件;

  第四、设定过滤条件;

  第五、在每日收盘前,对所持合约进行平仓。

  具体来看,这六个价位形成的阻力和支撑位计算过程如下:

  观察卖出价 = High + 0.35 * (Close Low)

  观察买入价 = Low 0.35 * (High Close)

  反转卖出价 = 1.07 / 2 * (High + Low) 0.07 * Low

  反转买入价 = 1.07 / 2 * (High + Low) 0.07 * High

  突破买入价 = 观察卖出价 + 0.25 * (观察卖出价 观察买入价)

  突破卖出价 = 观察买入价 0.25 * (观察卖出价 观察买入价)

  其中,High、Close、Low 分别为昨日最高价、昨日收盘价和昨日最低价。这六个价位从大到小一次是,突破买入价、观察爱出价、反转卖出价、反转买入价、观察买入价和突破卖出价。

  1.3 菲阿里四价策略

  菲阿里四价策略是一种比较简单的趋势型日内交易策略。昨天高点、昨天低点、昨日收盘价、今天开盘价,可并称为菲阿里四价。它由日本期货冠军菲阿里实盘采用的主要突破交易参照系。菲阿里四价是日内突破策略,所以每日收盘之前都需要进行平仓。该策略的上下轨以及用法如下所示:

  上轨=昨日高点;

  下轨=昨日低点;

  昨日高点和昨日低点可以视为近期的一个波动范围,该范围的存在一定程度是一种压力线,只有足够的价格上涨或者下跌才会突破前期的高点或者低点。因此突破位臵是一个比较好的入场信号,如果突破该波动范围,则证明动能较大,后续走势强度维持较强的概率比较高,因此该策略采用以下开仓方式:

  当价格突破上轨,买入开仓;

  当价格跌穿下轨,卖出开仓。

  策略在开仓之后可能面临假突破的问题,因为该价位存在很大的阻力,可能是暂时性的突破,随机回落,因此具体策略使用之中可以设臵一些过滤条件来剔除假突破的情况。这样使得策略的胜率变大。开仓之后的止损止盈根据具体环境具体确定。

  1.4 空中花园策略

  空中花园属于日内突破策略。与之前的策略有所不同,空中花园比较看重开盘突破。开盘时的高开或者低开均说明有大的利好或者利空使得开盘大幅远离昨天的收盘价。开盘突破,是最快的一种入场方式。当然出错的概率也最高。因此为了提高策略的胜率,空中花园策略加了额外的条件,也就是开盘要大幅高开或者低开,形成一个空窗,因此顾名思义称为空中花园,然后再根据是否突破上下轨来进行开仓判断。这样一来,策略的胜率将大大提高,不过由于对高开或者低开的幅度要求过高,一般是超过1%,因此使得策略的交易次数可能相对其它策略而言要偏低一些。开盘第一根K线是收阳还是收阴,是判断日内趋势可能运动方向的标准。在当天开盘高开或低开时更有效。空中花园策略主要特点:

  日内交易策略,当日收盘平仓;空中花园在当天高开或低开时使用,即当开盘价>=昨天收盘价*1.01 或开盘价<=昨天收盘价*0.99 时:

  上轨=第一根K线的最高价;

  下轨=第一根K线的最低价;

  当价格突破上轨,买入开仓;

  当价格跌穿下轨,卖出开仓。

  2策略回测的数据准备和基本设置

  2.1 数据准备

  我们可以通过优矿DataAPI获得上期所、大商所、郑商所从2003 年以来所有上市的商品期货的不同月份合约的1 分钟行情数据,包含了open、high、low、close、volume、oi(开盘价、最高价、最低价、收盘价、成交量、持仓量)共6 种价格信息。但对于不同的期货品种来说,受市场关注度高、交易活跃的合约往往只有一个或者两个,因此在进行CTA 回测之前我们便需要对所有品种所有的月份合约都选择出来,筛选出属于不同品种的主力合约来进行CTA 日内交易策略的回测。

  一般情况下,主力合约的受关注度、成交量或持仓量较高,受交易品种的生产周期特性、交易者的交易习惯等几个方面所决定。本文回测所使用的主力合约是系统按照持仓量来进行计算的,一般只需在universe中进行设置即可。

2.2 回测框架搭建
2.2 回测框架搭建

  本文这里直接均采用优矿期货回测平台,使用方法可以参考期货策略API文档。

  3主要CTA策略实证研究

  3.1 DualThrust策略

  我们在前文当中已经对Dual Thrust 策略进行了简单的介绍。在Dual Thrust 系统中有两个主要参数k1、k2,是昨日波动幅度的倍数,分别决定了上轨线和下轨线与当日开盘价的差距,显然地,如果k1、k2增大时,上下轨线的距离也会变大,直至很难再有触发生成信号的条件。而这种策略实际抓取的是上轨和下轨之外的趋势部分的收益,所以反之如果上轨和下轨之间的距离非常小,就会降低潜在的趋势性收益反而提高了交易次数和交易成本。因为每一次的平仓反转做多或做空实际就意味着该笔交易的收益为负,所以尤其对于震荡型行情来说,就会使得整体的收益表现变差。

  3.1.1 策略未进行优化时的参数选择

  正因为k1和k2的不同大小而使得上下轨线的位置也产生变化,触发产生信号的时间和价格也因此不同,而不同的期货品种所适合的参数也表现不一。为了体现出Dual Thrust 策略的历史表现,我们以全样本数据集进行样本内测试。

  年化收益:

国内4种常用日内CTA策略介绍及实现
最大回撤:
国内4种常用日内CTA策略介绍及实现
夏普:
国内4种常用日内CTA策略介绍及实现
热力图:
国内4种常用日内CTA策略介绍及实现
3.1.2 ATR过滤优化

  前文提到了如果市场处于平稳的震荡整理行情时或者Dual Thrust的两个参数值都较小的时候,就会容易多次触发产生开平仓的信号,反而获取不到轨线之外的趋势收益部分,这时Dual Thrust的表现就变得很差。所以,我们就应该在每日回测时先对近期市场行情波动进行一次考察,如果市场波动过小,表明市场近期没有较明显的行情,而是处于震荡整理的态势,那么我们就越过当天不再进行任何操作;如果市场近期波动较大,而实证研究告诉我们金融市场具有波动率簇集的程式化事实特征,即表明大波动行情后面常常也会跟随较大的波动,所以这时我们应选择抓住这样由波动性带来的风险收益。

  如何量化近期市场波动呢?ATR(平均真实波动幅度)便是这样一种可以衡量市场波动情况的指标。需要注意的是,ATR并不能反映行情的趋势程度或者趋势持续状态,而只能对市场行情的波动性有所反映,不管是上涨区间还是下跌区间。如果我们采用ATR指标来对回测时的交易行为进行过滤的话,那么该指标是否真实有效呢?

  这里把ATR的触发条件设为5,当过去20期ATR值超过5时,才能进行下一步的操作。

  回测结果如下:

从结果来看没有太多变化。
从结果来看没有太多变化。

  3.1.3 止盈止损优化

  至此,我们都暂未考虑止盈止损对策略回测结果的影响。尽管在某些参数组合中,最大回撤率被控制得很好,但仍然无法避免在某些时期连续的大幅度回撤。所以,考虑加入止盈止损方法对该策略进一步优化。

  在未进行止盈止损优化之前,原始的日内交易策略所采用的其实是持有至收盘(收盘前10-15分钟平仓)的方式,但这种出市的方式的弊端就是不能锁住潜在的高收益,也使得亏损的机会增加。而良好的主动出市策略,不仅能锁住利益,而且也能及时有效地减少损失,即真正地做到赢大亏小。与研报不同,我设置的止盈方法是固定比例的止盈,即当当前的价格超过开仓价格一定比例后进行相应的止盈止损。仍以螺纹钢为例,在之前所得的“最优”参数组合的条件下,在进行止盈止损的条件下进行回测,这次我把回测时间延长至2015年6月1日。

  把未止盈止损与ATR+止盈止损优化的策略进行对比分析

未优化:年化收益: 0.2403 ; 最大回撤: 0.0628 ; 夏普比率: 1.8462
未优化:年化收益: 0.2403 ; 最大回撤: 0.0628 ; 夏普比率: 1.8462

  优化后: 年化收益: 0.2317 ; 最大回撤: 0.0402 ; 夏普比率: 1.9403

  可以看到,进行ATR+止盈止损优化后,虽然年化收益有轻微的减少,但是却降低了回撤,提高了夏普比率,所以整体来看还是具有一定的有效性。

  3.1.4 部分品种的回测表现

  沪铜

未优化:年化收益: 0.5752 ; 最大回撤: 0.0997 ; 夏普比率: 3.0238
未优化:年化收益: 0.5752 ; 最大回撤: 0.0997 ; 夏普比率: 3.0238

  优化后: 年化收益: 0.4971 ; 最大回撤: 0.0766 ; 夏普比率: 2.3992

  焦炭

未优化:年化收益: 0.0886 ; 最大回撤: 0.1915 ; 夏普比率: 0.2584
未优化:年化收益: 0.0886 ; 最大回撤: 0.1915 ; 夏普比率: 0.2584

  优化后: 年化收益: 0.0888 ; 最大回撤: 0.0914 ; 夏普比率: 0.3639

  焦炭今年行情这么好,Dual Thrust居然赚不到钱,也有可能是代码不对!但从结果看来这个策略并不是对所有品种都有效,难道是螺纹钢的最优参数却不是其他品种最优的参数,有品种差异?

  3.1.5 推进分析

  思想就是用前一期最优的参数来代入当前期的策略中,不断的向前推进,日后有时间在实现。

  3.2 R-Break策略

  R-Breaker策略与Dual Thrust最大的不同在于它除了趋势交易外,还有反转操作。这种策略根据前一个交易日的最高价、最低价和收盘价通过一定的计算方式得到6个不同的价位,模拟出了价格运动的支撑位、阻力位。R-Breaker策略明确给出了在趋势建立的时候的开仓条件,以及当趋势恶化、行情不利的时候的反转操作的条件。

  表现如下:

在塑料主力上表现很差。
在塑料主力上表现很差。

  3.3 菲阿里四价策略

  菲阿里四价策略本身也是一个趋势突破型的策略,但是策略的突破买入卖出条件更加简单。该策略以昨日行情最高价为今日日内交易的上轨,昨日行情最低价为下轨。如果价格突破上轨,便买入开仓,如果突破下轨,便卖出开仓。显然,这种判断趋势是否存在的条件过于简单,在市场波动剧烈的情况下不是十分有效,回测结果也表明了这点。本文简单的测试了螺纹,糊涂,塑料,橡胶这四个主力期货合约,回测时间从2010年1月1日开始。

  表现如下:

沪铜主力在三个策略上表现都还不错。
沪铜主力在三个策略上表现都还不错。

  空中花园策略

  空中花园本身就已经包含了一定的过滤条件,它只考虑当天开盘的位置是否大幅度的跳空,即高开或低开昨日收盘的1%,所以该策略十分注重在非交易时间段内消息的累积对今天走势的影响。但是,可能正如研报所说的,往往很多情况下市场对消息的反馈会产生相反的效果,从而使得策略表现不好。

  回测结果如下:

组合测试
组合测试

  之前曾写过一个单策略多品种的,这次改成多策略多品种的,我也没比较两个序列的相关性而是直接组合,权当提供一种思路。

  回测结果如下:

往期精彩回顾
文章来源:微信公众号优矿量化实验室

这篇关于国内4种常用日内CTA策略介绍及实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032842

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time