量化研究 | CTA择时出场策略指南大全

松鼠宽客
2021-04-10

公众号致力于分享量化策略,培训视频,Python,算法研究等相关内容。



『正文』

ˇ


今天给大家介绍和普及一下我说知道的几种和我用的几种出场方式,其中有的出场方式是单独用的,有的是组合一起用的,并无所谓好坏高低之分,具体看你怎么用。


第一种:百分比跟踪止盈

如下图所示:1


上图很直观的给大家展示了开仓和平仓点位连线,以及蓝色跟踪止盈止损线的可视化展示。专门找一个比较教科书式的做多和跟踪止盈止损就是很直观的来给大家讲述。

百分比跟踪止盈逻辑:

   1、将开仓价格往下减去一定百分比的价格作为进场的止损位置。

   2、随着行情演变,只要没有触发1中止损价格线,那就说明行情再往上走,但行情往上演绎出现利润后,我们要将1中的止损线自动往上提,以达到跟踪行情往上,止盈止损线业自动往上的过程,目的就是保住利润啊。

   3、往上跟踪时我先将开仓价格赋值给一个变量,这个变量就是下图中的LowerAfterEntry,我个人采用的是当下K线最低价和LowerAfterEntry变量比较,在进场的K线中,进场价格肯定不是最低价,所以显而易见进场价格大于最低价,但是随着行情往上演绎,开仓后的第二个或者第N个K线最低价很有可能大于LowerAfterEntry[1]也就是前一个LowerAfterEntry,也就是开仓价格,然后新的LowerAfterEntry就被第二个或第N个K线的最低价所更新,一直持续迭代下去。

   4、我们跟踪就做好,百分比就是根据每一个K的开盘价往下减去一个百分比,这个百分比是个固定值,当然也就是参数值,这个区间是随着跟踪变化而不变的,不变的,不变的。变化的只有跟踪。

   5、至此跟踪百分比的逻辑就都跟大家讲清楚了,这种出场逻辑是新手也是初入中低频CTA领域最先最容易入手的一种出场方式,而后我在此基础上,进行了算法修改,加速了进场那一段时间的止损,以达到波段行情的快速跟踪止盈止损。从而减少止损和减少利润回撤。当然优点的另一面自然也是缺点,那就是会比没有加速的更容易打到跟踪线。



注释:

   MarketPosition:当前持仓状态(1为多单,-1为空单,0为空仓)

   BarsSinceentry:当前持仓的建仓位置K线index到当前位置的K线index计数


代码实例:2


代码释义:

  如果 持仓==1 且 建仓K线数==0

  {

  HigherAfterEntry前一个 赋值给 HigherAfterEntry

  LowerAfterEntry和K线最低价两者最大的一个 赋值给 LowerAfterEntry

  }

  如果 持仓==-1 且 建仓K线数==0

  {

  LowerAfterEntry前一个 赋值给 LowerAfterEntry

  HigherAfterEntry和K线最高价 两者最小的一个 赋值给 HigherAfterEntry

  }

  如果 持仓 不等于 0 且 建仓K线数>0

  {

  LowerAfterEntry前一个和K线最低价 两者最大的一个 赋值给 LowerAfterEntry

  HigherAfterEntry前一个和K线最高价 两者最小的一个 赋值给 HigherAfterEntry

  }


显然这段代码的目的就是为了计算“跟踪“的,跟踪止盈止损你要跟踪谁?总得有一个目标物跟踪把,那么这段代码就是计算跟踪目标物的,当进场后,多单是以进场价格和最低价格比较,通常基本上都是进场价格较大,那么当随着行情发展,第二个…第三个…第四个…K出现后他们各自的最低价和LowerAfterEntry前一个比较,如果此时行情往上涨,那么当下的最低价肯定要比LowerAfterEntry前一个要大,循环往复那么一直取这个最大的最低价。


计算完这个跟踪,我们来具体计算实现跟踪线,如下图代码所示:3

代码释义:

  如果 持仓 == 0

  {

  liQKA 赋值 1

  }

  否则(有持仓无论多空)

  {

  liQKA = liQKA – 0.1 (随着每一个K线演绎liQKA逐步减少)

  liQKA最大保持在0.5(从1到0.5,经历5个K线,加速5个K线)

  }

  如果 持仓 有多单

  {

  公式字面意思,自行理解

  }


至此,跟踪止盈百分比出场策略介绍完毕。






第二种:吊灯出场(一)

如图所示:4


乍一看这个图,基本上所有人都不会想到用这个图去讲“吊灯止盈止损”,实际上这个图的平仓走的就是吊灯其中一种逻辑——达到N利润后,回撤D利润平仓的逻辑。

百分比吊灯逻辑:

   1、当下进场建仓K线的最高价和最低价保存,随着行情演绎每一个新K线的最高价和建仓所属K线最高价和最低价比较,(以做多为例)假设进场后行情开始走高,那么当下的最高价和前面比较完毕的HighAfterEntry比较大小,随着K线的最高价逐步走高,那么HighAfterEntry也逐渐赋值持仓到现在所处K线的最高价。

   2、计算吊灯触发和平仓位置。吊灯触发是当HighAfterEntry>=建仓价*(1+N),吊灯平仓是当触发后,最低价<< span="">=HighAfterEntry - (HighAfterEntry – 建仓价)* D 按照这个不等式右边的价格平仓


代码实例:5


6



代码释义:

  如果 建仓K线数==0

  {

  HighAfterEntry 被赋值 High(K线最高价)

  LowAfterEntry 被赋值 Low(K线最低价)

  }

  否则 (建仓K线数>0)

  {

  HighAfterEntry 被赋值max(HighAfterEntry ,High) (最大的一个刷新HighAfterEntry)

  LowAfterEntry被赋值 min(LowAfterEntry,Low) (最小的一个刷新LowAfterEntry)

  }


  如果(持仓==1 且 当前持仓与建仓位置K线index差值>0 且 HighAfterEntry前一个>=建仓价*(1+N) 且 最低价<< span="">=HighAfterEntry前一个 -(HighAfterEntry前一个 – 建仓价)* D )

  {

  卖出(数量:全部卖出, 价格:min(开盘价,HighAfterEntry前一个 -   (HighAfterEntry前一个 – 建仓价)* D )

  }


至此,吊灯一百分比吊灯出场介绍完毕。



第二种:吊灯出场(二)

如图所示:7


该小结并未放置实际的K线图,而只是放置了吊灯中的核心——吊灯直观图,为什么叫吊灯?大家看上图中的K线形态,是否像过去小时候家里面的灯泡上面用电线吊着垂直下来的样子?

吊灯二——ATR波动率吊灯止盈止损逻辑:

   1、当下进场建仓K线的最高价和最低价保存,随着行情演绎每一个新K线的最高价和建仓所属K线最高价和最低价比较,(以做多为例)假设进场后行情开始走高,那么当下的最高价和前面比较完毕的HighAfterEntry比较大小,随着K线的最高价逐步走高,那么HighAfterEntry也逐渐赋值持仓到现在所处K线的最高价。

   2、计算吊灯触发和平仓位置。吊灯触发是当HighAfterEntry - 建仓价 > N1倍ATR,吊灯平仓是当触发后,最低价<< span="">=HighAfterEntry – N2倍ATR,按照这个不等式右边的价格平仓


代码实例:

8

9


代码释义:

  如果 建仓K线数==0

  {

  HighAfterEntry 被赋值 High(K线最高价)

  LowAfterEntry 被赋值 Low(K线最低价)

  }

  如果 (建仓K线数>0)

  {

  HighAfterEntry 被赋值max(HighAfterEntry ,High) (最大的一个刷新HighAfterEntry)

  LowAfterEntry被赋值 min(LowAfterEntry,Low) (最小的一个刷新LowAfterEntry)

  }

  否则 (没有仓位时候)

  {

  HighAfterEntry 被赋值 HighAfterEntry前一个

  }


  如果 (有多单 且 已开仓周期K线数>1 且 HighAfterEntry - 建仓价 > NATRstop倍ATR 且 最低价 << span="">= HighAfterEntry – NATRstop倍ATR)

  {

  卖出(数量:全部卖出, 价格:min(开盘价,HighAfterEntry – NATRstop倍ATR)

  }



吊灯总结:

  1、吊灯、吊灯名副其实的形象逻辑理解即为:建仓后,随着行情演绎,创造了多大的利润,随后回撤了多少的止盈止损方法。

   2、吊灯多普遍应用于止盈,实际止损是配合吊灯演变而附加的,例如在吊灯百分比止盈止损方法中,止损逻辑往往根据百分比吊灯止盈,在初步建仓后加入一定百分比的止损线,从而达到止损的目的。

   3、吊灯方法与跟随主要区别是:只有行情触发了波动参数中规则,但是跟随是时时刻刻的随着行情演绎而变动。也就是说,在行情中大家可以把吊灯理解为一个点出场,跟随是一个过程出场。








第三种:达到目标利润/目标亏损目标位出场

如图所示:

10

目标位出场逻辑:

   1、根据进场价格或位置,设定主动止损和主动止盈的位置,达到位置后即可出场,未达到位置,持续持仓。

   2、往往根据百分比、某种区间计算的range、ATR等计算而来,并附以止盈>止损的系数倍数,从而让策略达到稳定的盈亏比。

   3、该策略的开仓具有一定特殊性,但是我个人还没有验证过,因为此策略出场方式并不符合我个人的“审美”。

代码实例:11

12



代码释意:

  这里我们不一一的详解所有代码,因为其他的小结已经叙述了,这里我只针对进出场的价格构造公式进行释意:

进场:

    Buy语句中,按照open和therehold两个最大值来进行发单。

 

出场:(止盈)

  Getglobalvar(1)实际就是therehold,Getglobalvar(2)实际是当天开盘价, Getglobalvar(3)实际是前一天的range*ratio1,

止盈价格 = Getglobalvar(1)+profitratio* Getglobalvar(3),其中profitratio也是一个系数倍数

 

(止损)

Getglobalvar(1) - Getglobalvar(3),进场的therehold价格 - 前一天的range*ratio1。

止损价格 = Getglobalvar(1) - Getglobalvar(3)。

  止盈和止损两者差距了一个 profitratio系数倍数。这个倍数是恒定的,因此也就让该策略回测绩效的盈亏比稳定在了profitratio/1。



第四种:时间出场

  顾名思义:以时间因素为标准的出场策略,例如:日内交易、黑色星期四等等。但是还有一种逻辑,在这里跟大家分享一下。那就是以时间周期为参数的择时


第五种:K线波幅出场

如下图所示:13

如上图所示该出场算法基于K线间的差值,核心就是在初始仓位建立一个止损线后,根据差值大小来进行跟踪止盈止损,他不同于第一种的百分比跟踪止盈止损,百分比参数是固定的、死的,需要人为的去优化修改。然而根据K线波幅进行跟踪可以达到大波幅较快的跟踪,小波幅较小的跟踪。

K线波幅逻辑:

1、进场后建立一个以ATR自适应波动的止损线

2、根据K线波幅差值,乘以控制系数加以K线初始止损线,随着行情演绎形成跟踪止盈止损。


代码实例:14


代码释义:

    StopAtr = TrueRange(真实波幅)的Length周期的平均,实际求得就是ATR

  如果 持仓 等于 1

  {

  如果 开仓K线周期数 等于 0

  {

  Stopprice = 最低价 – StopATR * FirstBarMultp系数

}

如果 开仓K线周期数 > 0

{

  如果 收盘价 > 前一个收盘价

{

  Range = 收盘价 – 前一个收盘价

  Stopprice = Stopprice + Acceleration(系数) * range

}

否则

{

  Stopprice = Stopprice前一个

}

}

}


K线波幅出场总结:

    1、属于紧密型跟踪止盈止损出场策略,大家可根据进场策略或品种进行具体问题具体分析。

    2、可以其他出场策略进行组合,形成减仓的策略组合。

第六种:VWAP出场

如图所示:15

黄色线为VWAP(成交量加权均线)出场线。

VWAP出场策略逻辑:

1、进场设置初始止损,这是一个百分比值

2、逐个K成交量乘以初始止损线,滚动计算求和

3、2中数据占比成交量滚动求和


代码实例:16

代码释义:(核心计算)

  如果 有持仓

  {

  (多头)

Vwapprice = Entprice(实际就是逐个LowAfterEntry) *(1-Longshort_stop * 0.001)

(空头)

Vwapprice = Entprice(实际就是逐个HighAfterEntry) *(1+Longshort_stop * 0.001)

Wi = 前一个K成交量

Wisum = 前一个K成交量 + Wisum(等同于Wisum +=Wi)

Vwap = (Wi * Vwapprice)+Vwap (等同于 Vwap += Wi+ Vwapprice)

Vwapline = Vwap / Wisum

Vwapline 即是止盈止损线

}

Vwap成交量加权平均线,是以某当个K线成交量占比某一段行情K线成交量占比为权重系数的一种算法均线,实际应用中,本人加入了加速的算法置于其中,在这里作为思路拓展就不展开说了。

目前VWAP是一个很好的普适性出场策略,但并不是组合最好的。



第七种:三档跟踪法


如图所示:17

18

19


三档跟踪法逻辑:

就是根据当前不同的盈利幅度,跟踪止盈线会分别采用不同的加速系数。以求将整个波段都吃掉。核心是盈利幅度和止盈的敏感度是成反比的。具体请看代码


代码实例:20

 

代码释意:(核心三级部分)

  如果 收盘价>前一个收盘价 且 最高价 > 前一个最高价

  {

  如果 初始止损线stopprice < 开仓价

  {

  Range = 收盘价 – 前一个收盘价

  Stopprice = stopprice + Acceleration * range(Acceleration是一个系数)

  }

  如果 stopprice >= 进场价 且 利润 << span=""> N倍ATR

  {

  Stopprice = soptprice + (Accelaeration – 0.3 )*range(系数越来越小,也就越来越不敏感,权重低了吗)

}

  如果 利润 > N倍ATR

  {

  Stopprice = soptprice + (Accelaeration – 0.5 )*range(系数更小,也更不敏感,权重更低了吗)

}


}


总述


8个出场策略,是目前市面上传统CTA中用的比较多的,各有特色,也各有相同点,他们之间并没有谁肯定比谁好,谁肯定不如谁的的说法。核心是看什么进场策略用什么样的出场策略组合。当然了,肯定还有更多的出场策略,在这里我会继续搜寻新的出场思路作为文章的后续补充。


更多精彩内容和策略源码在松鼠宽客俱乐部哦!


本策略仅作学习交流使用,实盘交易盈亏投资者个人负责。




End


算法策略专辑:

7.【算法策略】 | MACD跨周期短线交易策略开发(股指+商品双版)

6.【算法策略】基于残差动量的横截面期货交易策略

5.【算法策略】商品统计套利之趋势套利策略

4.【算法策略】傅里叶滤波结合跨周期波段模型

3.【日内模型】TBquant信号回测版本+python历史回测版源码

2.【日内模型】第二版本基于orderflow的盘口策略(完整源码)

1.【日内模型】基于orderflow的盘口策略开发帖

量化视频专辑:

视频教程 | 手把手系列之"Aberration"策略的优化与升级

视频教程 | 手把手系列之"震荡过滤"突破策略的优化与实现

量化研究专栏:

量化研究 | 来聊一下量化交易的人工干预、参数失效、筛选品种

量化研究 | 残差动量策略刻画与构建(二)

量化研究 | 残差动量策略刻画与构建(一)

量化研究 | 主连复权算法大揭秘[含公式算法]

量化研究 | 策略在指数与主连复权的差异化分析(三)

量化研究 | 策略在指数与主连复权的差异化分析(二)

量化研究 | 策略在指数与主连复权的差异化分析(一)

精品自动交易策略库(近期更新):
【SF28】| 股指“三缺一”策略,2多1空组合方式

【SF27】 | 如何开发一个日内交易模型

【SF26】| 适用于商品+股指的枢轴点趋势策略
【SF25】|日内交易策略开发(一)黄金日内交易模型

【SF24】| 海龟交易策略的“宽窄”改进版

【SF23】| 朴实无华的Dual Thrust策略长期保持正期望收益
【SF22】| 来给你的交易策略加一个"变速箱",五挡起步那种

【SF21】| 利用PSY指标,我们来开发一个短线模型?

【SF20】| 来聊聊平仓离场的方法,如何构建高效,灵活,可靠的出场策略?

【SF19】| 基于VWAP(成交量加权平均价格)开发Alpha均线增强策略

【SF18】| MACD顶底背离+动态区间交易模型源码(技术贴)

【SF17】| 均线波动差构建交易策略

【SF16】| "凹凸"均线形态交易策略源码(技术帖)

【SF15】| 波峰波谷交易策略结合ER降噪过滤

【SF14】| Supertrend“超级趋势线”指标魔改升级(源码)
【SF13】| 实盘策略解密“小品种,小资金”在跑策略源码!

【SF12】| 全新波动率算法,自适应区间+波动率择时!

【SF11】| 成交量来确定阻力支撑点,基于Volume Profile构建交易策略

【SF10】| 如何构建一个胜率超过60%的短线螺纹策略(开发教程)

【SF09】| 资金流向交易策略源码,绩效突出,适应性兼容性强,5分钟交易模型;
【SF08】| 经典KD指标另类使用有奇效,股指商品双版本策略


分享