简易通道突破策略的实现与优化

发布时间:2022-12-27 14:49 作者: 周杨 投资咨询资格号Z0015971 阅读次数:

摘 要

  通道型策略无论是在主观技术分析,还是在程序化、量化交易层面运用都非常广泛。这类策略相比较于传统的指标类策略有比较明显的优势,就是信号的及时性,一旦价格达到条件就会立刻产生信号,迅速对盘面的形势给出反馈,帮助投资者判断价格方向。但是在通道型策略,特别是通道突破策略实际运行的过程中,同样会存在一些问题,最常见的就是回测中偷价对于实际绩效的影响。

  鉴于以上的特点与优劣势,本文将以高低点通道突破策略为基础,介绍简易通道突破策略的实现和优化。
  风险提示:文中涉及代码、逻辑仅供交流与演示。

一、通道突破策略思路

(一)通道型策略
  通道即通过标的价格高低点来界定价格运行的大体区间,当价格处于区间之中,我们可以视为正常的价格波动。
  在价格运行区间被定义之后,便有了相应的策略。一般情况下依据价格运行区间形成的策略有两种,第一种是在区间之中高抛低吸(如图1所示),这类策略一般会定义一条中轨线,中轨线即价值的中枢位置。当价格严重偏离中轨线,并接近上轨时,我们认为此时价格偏离中枢水平,且有向下回归需求;当价格接近下轨时,则反之。这种是利用了价值回归的心理预期,在震荡行情中实用性较好。

  第二种是通道突破型策略,这类策略以上边界和下边界作为压力和支撑参考,当价格上破上边界时,我们认为打破强压力位,即将开启一轮上涨走势;当价格下破下边界时,我们认为打破强支撑位,即将开启一轮下跌走势。由于大多数趋势性行情都是以突破开始,因此通道突破型策略善于捕捉趋势性行情机会。本文给大家演示的就是通道突破型策略。
(二)高低点通道突破策略思路
  其实很多程序化策略是由主观交易中的经典策略演变而来。日常我们在做主观交易中,常以前期某一高点或低点作为目标位或防守位,这一高低点要具备标志性,如图3所示,此低点是一个重要的中长期支撑位置,当价格下破时,价格已经来到所有均线下方,均线呈现空头发散,此时行情疲软态势尽显。当然仅凭“突破中长期低点”这一条,我们并不能把盘面所有的信息都得以反馈,但是可以以其作为标志性的信号点。
   由此,我们即可将这个信号点进行程序化。首先,突破型策略可能偏追踪趋势,因此我们可以把统计高低点的周期适当放大,先以40周期作为参考。当价格上破40周期内最高点时,做多。当价格下破40周期内最低点时,做空。

二、高低点突破策略实现
(一)策略入场
  当价格上破40周期最高价时做多,当价格下破40周期最低价时做空。首先我们需要定义中长期最高价和最低价。注意这里有一个问题,因为我们是突破策略,因此这个最高价和最低价的选择要一定选择前一根K线的价格,如果是当根K线的最高、低价,那么突破将永远无法实现。以最高价向上突破为例,假如当前K线最高价上破上轨道(即40周期最高价)时,此时相应的上轨道也会因为当前K线最高价的更新而更新,因此盘面不存在突破行为,只是上轨道相应的上移。所以我们定义如下:
Hiline=Highest(H[1],40);   Loline=Lowest(L[1],40);
  有了这两个价格,我们就可以先实现入场逻辑。为了先让策略能够实现起来,我们暂不去考虑太多细节性问题,突破时的价格和入场的价格暂且按照收盘价计算。即:
  If(Close>Hiline) {Buy(1,Close);}
  If(Close<Loline) {Sellshort(1,Close);}
(二)策略离场
  较为传统简单的策略,即持有多单时,当达到空单入场条件时,平多开空;持有空单时,当达到多单入场条件时,平空开多。此时即与入场条件相反。即:
  If(Close>Hiline ) {Buytocover(1,Close);}
  If(Close<Loline) {Sell(1,Close);}
(三)模拟回测
  代码实现后,我们将上述代码带入历史行情中运行,看一下实际在历史盘面中展示的效果,如下图4。
  在图中我们已经可以看到相应的信号了,但是实际的运行可能与我们预想的不太一致。我们选取红线框内这一段去分析。首先价格下破下轨道(即前40周期最低价),开空单,符合预期。但是策略不止开了一次空,而是连续开了A、B、C、D四次空单,直到E点价格再次上破上轨道(即前40周期最高价),所有多单离场。前两次A、B因为属于比较早期的下破行为,所以平仓后有盈利空间,C、D已经属于比较迟的突破行为了,这个时候理论上策略不应该再开空单入场。
  简而言之,如果每次开仓是1手,最好是能够在A点直接开仓4手,而不是分A、B、C、D各开1手,从而降低了策略的盈利能力。因此策略有需要改进优化的空间。

三、高低点突破策略优化
(一)开平仓方式
  在第二部分内容中,我们已经提到了一个需要优化的点,即开仓方式,我们需要策略在图4的A点开仓,后面直到E点平仓前都不出现开仓动作。但是A、B、C、D4个点皆为相同条件下判定的入场位置,我们如何去进行区分呢?这个时候我们就需要在入场条件中加入一个状态判定。当持有多单时,不再开多;当持有空单时,不再开空。即在入场条件中判断当前是否有持仓。改进如下:
  If(Marketposition==0 and Close>Hiline) {Buy(1,Close);}
  If(Marketposition==0 and Close<Loline) {Sellshort(1,Close);}
  此时,平仓的方式我们也需要去考虑。在持有多单的情况下,价格下破下轨道时,策略应该平多开空;反之,在持有空单的情况下,价格上破上轨道,策略应该平空开多。改进如下:
  If(Marketposition==-1 and Close>Hiline ) {Buytocover(1,Close);Buy(1,Close);}
  If(Marketposition==1 and Close<Loline) {Sell(1,Close);Sellshort(1,Close);}
(二)价格的选择
1.判定价格的选择
  前面我们在做入场及出场判定的时候,用的是收盘价与最高价、最低价进行对比,其实这样简易的去操作的话,也是会存在问题的,而这个问题的表现是多方面的。
历史回测中数据是从左至右依次运行,每根K线运行一遍,此时因为是历史数据,所以某根K线的价格信息其实都是已知的,换句话说就是在K线开盘时,程序就已经知道了收盘的价格,这显然是不合理的。在程序实际跑回测的过程中,有时候收盘价虽然没能有效突破,但是最高价、最低价却早已突破了。因此,我们判定的时候应该用最高价、最低价与盘面上下轨道进行对比,这样才比较合理。
2.入场和离场价格的选择
  入场和离场价格选择收盘价,其实也是有一定问题的。正如上文所述,回测中每根K线的数据都是已知的,在模拟运行的场景中,假如最高价有效上破上轨道时,以收盘价入场是不和逻辑的,因为此时收盘那一刻的价格还没有出来,这样操作无形的降低了回测中的持仓成本。
  那么面对这样的问题我们改如何解决,首先突破那一瞬间,最合适、最符合逻辑的入场价格是上下轨的价格。但是如果仅仅只用上下轨的价格作为入场价格是否就合理了呢?显然也不是,因为还有一种特殊情况,以上破上轨道做多为例(如图5所示),当开盘价大幅向上跳空,且上破上轨道时,在上破的一瞬间,盘面实际价格为开盘价,此时开盘价大幅大于上轨道位置的价格,如果再以上轨道作为入场价的话,实际是成交不了的,在回测中虽然有信号,但是也无形的降低了持仓的成本。
  面对这个问题,我们需要用开盘价与上轨价、下轨价进行对比来确定入场价、离场价。上破的时候,选择上轨价和开盘价的最大值;下破的时候选择下轨价和开盘价的最小值,此时就能完美解决问题。
  针对上述两个价格的问题,具体更正如下:
  If(Marketposition==0 and High>Hiline) {Buy(1,Max(Open,Hiline));}
  If(Marketposition==0 and Low<Loline) {Sellshort(1,Min(Open,Loline));}
(三)仓位的选择
  上述策略开仓手数都是默认的一手,但是在实际运行中,其实手数不一定是只有一手,同时实际运行中手数极有可能是变化的,因为我们需要根据账户的资金规模、风险承受能力、行情波动程度等因素去调整仓位。这里提供两种思路。
1.风险承受能力
  第一种,根据自身的风险承受能力去设置仓位。假设账户资金100W,自己所能承受的最大损失为账户资金2%,在交易计划中设置的止损位置为50个点,交易品种的交易单位为10吨/手。那么符合要求的仓位如何计算?
  一手品种达到止损价格的损失:50元/吨*10吨/手=500元。
  账户所能承受的最大损失金额:100万元*2%=20000元。
  最大的开仓手数:20000/500=40手。
  这种方式是在交易计划中就已经设置好仓位了,属于事先处理。
2.盘面价值波动
  第二种,根据盘面价格波动去调整仓位。这种要计算出盘面的平均价值波动,而平均价值的波动是根据盘面历史价格的平均波动来确定的。如何定义平均价格波动呢?我们可以通过计算统计出一段时间之内,昨收盘价、今最高价、今最低价三者之间两两做差的最大值的平均数来得出。大致计算如下:
  日内波动幅度=Max(|今最高价-昨收盘价|,|今最低价-昨收盘价|,今最高价-今最低价)
  平均波动幅度=日内波动幅度的20周期平均
  平均价值波动=平均波动幅度*交易单位
  有了平均价值波动之后,我们即可通过账户资金规模的一定百分比除以价值波动,得出开仓仓位。这种方式,其实是根据盘面价格的波动实时调整仓位的,价格波动越剧烈,仓位越小;价格波动幅度越平缓,仓位越大。属于事中处理。
  鉴于近期盘面波动较为剧烈,我们在本策略中以第二种方式来处理仓位。

四、策略模拟回测及总结
(一)策略模拟回测
  在经过我们上述几种优化方案处理之后,我们再次对策略进行模拟回测,效果如下图6。
  图6是在玻璃指数上运行的实际回测效果,可以符合我们前期对于策略出场、入场的设计,同时也可以看到我们的仓位也是随着行情而变化的,当波动大的时候,仓位就较轻;当波动小的时候,仓位效应的放大。下图7是策略近两年时间的回测绩效,整体表现中规中矩。

(二)策略总结
  至此一个简易的通道突破策略大体框架就搭建完成了,当然距离上实盘还是需要做出一些调整。比如品种选择、运行周期选择、相关参数调整、止损止盈设置等。这些都需要经过模拟试运行来找到合适的方案。另外有一点也是需要去注意的,任何策略在市场中都不可能长期有效,所以定期的维护策略、更新策略才能更好的适应瞬息万变的市场。


  通道型策略无论是在主观技术分析,还是在程序化、量化交易层面运用都非常广泛。这类策略相比较于传统的指标类策略有比较明显的优势,就是信号的及时性,一旦价格达到条件就会立刻产生信号,迅速对盘面的形势给出反馈,帮助投资者判断价格方向。但是在通道型策略,特别是通道突破策略实际运行的过程中,同样会存在一些问题,最常见的就是回测中偷价对于实际绩效的影响。



徽商期货有限责任公司

投资咨询业务资格

皖证监函字【2013】280号

周杨  量化策略分析

从业资格号:F3047853

投资咨询资格号:Z001597

电话:0551-62826632


【免责申明】本报告所载信息我们认为是由可靠来源取得或编制,徽商期货并不保证报告所载信息或数据的准确性、有效性或完整性。本报告观点不应视为对任何期货商品交易的直接依据。未经徽商期货授权,任何人不得以任何形式将本报告内容全部或部分发布、复制。




0条评论

最新评论
购买须知

价格:
0.00
备注: