二重因数平均逆転追跡戦略

作者: リン・ハーンチャオチャン開催日:2023年12月19日 11:09:20
タグ:

img

概要

この戦略は定量取引の分野における二要素平均逆転追跡戦略に属します. 123逆転戦略と2つの要因によるケルトナーチャネル戦略を統合し,逆転信号を発見し,低価格で購入し,高価格で販売するという取引アイデアを実現することを目的としています.

原則

この戦略は2つのサブ戦略から構成される.最初のサブ戦略は123逆転戦略である.前2日の取引日の閉値の変化を計算し,ストキャスト指標を組み合わせることで,市場が逆転点にあるかどうかを判断する.特に,閉値が2日連続で上昇し,ストキャスト指標が50を下回ると購入信号が発行される.閉値が2日連続で低下し,ストキャスト指標が50を超えると販売信号が発行される.

2つ目のサブ戦略は,ケルトナーチャネル戦略である.この戦略は,最も最近のn取引日間の典型的な価格移動平均値と変動幅を計算する.価格が上方または下部レールに近づくと,逆取引信号が発行される.価格が下部レール以下であれば,ショート;上部レール以上であれば,ロング.

最後に,2つのサブ戦略のシグナル方向を判断することによって,戦略は最終位置シグナルを計算します. 2つのサブ戦略のシグナルが一貫している場合,実際の取引オーダーが発行されます.そうでなければ,2つの要因検証の目的を達成するために取引は行われません.

利点分析

この二要素平均逆転追跡戦略の最大の利点は,市場が逆転するときの機会を把握し,低価格で購入し,高価格で販売するという取引のアイデアを実現できるということです.同時に,二要素確認メカニズムは誤った信号を一定程度削減し,信号の質を改善することができます.

具体的には,123逆転戦略におけるストカストティック指標のパラメータ設定は比較的保守的で,振動する市場で誤った逆転を効果的にフィルタリングすることができます.そして,Keltnerチャネルがボリンジャー帯を追跡するというアイデアは,価格が上下線を突破したときの逆転機会も把握できます.両者は互いを補完して不必要な取引を削減し,したがってより高い勝利率を得ることができます.

リスク分析

この戦略の主なリスクは,逆転信号のタイミングが決定的である.継続的な誤った逆転が発生するか,逆転信号のタイミングが正しく選択されていない場合,完全なトレンドを維持できず,その結果最終的なリターンに影響を与えます.

さらに,二要素戦略は,単要素戦略よりもパラメータ選択と最適化においてより困難である.両サブ戦略のパラメータの包括的なテストと評価が必要である.そうでなければ失敗も非常に可能性が高い.

最後に,リバース・トレーディング自体はリスク・リターン比が不均衡である.不正常な市場環境は簡単に清算につながる可能性がある.これは厳格なストップ・ロストによって避ける必要があります.

オプティマイゼーションの方向性

上記のリスク分析によると,戦略は以下の側面で最適化できる.

  1. 逆転指標パラメータの異なる設定をテストして,より高い故障容量とより少ない偽信号の組み合わせを見つける
  2. より正確に逆転をキャプチャする値を見つけるために,異なるサイクル長さのパラメータ値を試す
  3. ストップロスのモジュールを追加して,取引毎の最大損失を厳格に制御します.
  4. 異なる保持期間の影響をテストし,戦略論理により適した出口点を探す
  5. オープンポジションの数を増やしたり,ポジション制御モジュールを追加して,リスク/リターン比をより合理的にします.

概要

典型的な二要素平均逆転追跡戦略として,123逆転とケルトナーチャネルサブ戦略を統合することで,この戦略は市場の逆転点で低価格で購入し高価格で販売するタイミングをより正確に把握することを目指しています.適切なパラメータ最適化とリスク管理により,そのような戦略は比較的かなりのアルファを得ることができます.しかし,トレーダーは依然として逆転取引の特性に注意を払い,異常な市場状況によって引き起こされる損失の拡大を防ぐ必要があります.


/*backtest
start: 2023-11-18 00:00:00
end: 2023-12-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 09/12/2020
// This is combo strategies for get a cumulative signal. 
//
// First strategy
// This System was created from the Book "How I Tripled My Money In The 
// Futures Market" by Ulf Jensen, Page 183. This is reverse type of strategies.
// The strategy buys at market, if close price is higher than the previous close 
// during 2 days and the meaning of 9-days Stochastic Slow Oscillator is lower than 50. 
// The strategy sells at market, if close price is lower than the previous close price 
// during 2 days and the meaning of 9-days Stochastic Fast Oscillator is higher than 50.
//
// Second strategy
// The Keltner Channel, a classic indicator 
// of technical analysis developed by Chester Keltner in 1960. 
// The indicator is a bit like Bollinger Bands and Envelopes.
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
Reversal123(Length, KSmoothing, DLength, Level) =>
    vFast = sma(stoch(close, high, low, Length), KSmoothing) 
    vSlow = sma(vFast, DLength)
    pos = 0.0
    pos := iff(close[2] < close[1] and close > close[1] and vFast < vSlow and vFast > Level, 1,
	         iff(close[2] > close[1] and close < close[1] and vFast > vSlow and vFast < Level, -1, nz(pos[1], 0))) 
	pos

KeltnerChn(nPeriod) =>
    pos = 0.0
    xPrice = sma(hlc3, nPeriod)
    xMove = sma(high - low, nPeriod)
    reverse = input(false, title="Trade reverse")
    xUpper = xPrice + xMove
    xLower = xPrice - xMove
    pos := iff(close < xLower, -1,
             iff(close > xUpper, 1, nz(pos[1], 0))) 
    pos

strategy(title="Combo Backtest 123 Reversal & Keltner Channel", shorttitle="Combo", overlay = true)
Length = input(14, minval=1)
KSmoothing = input(1, minval=1)
DLength = input(3, minval=1)
Level = input(50, minval=1)
//-------------------------
nPeriod = input(title="Period", defval=10, minval=1)
reverse = input(false, title="Trade reverse")
posReversal123 = Reversal123(Length, KSmoothing, DLength, Level)
posKeltnerChn = KeltnerChn(nPeriod)
pos = iff(posReversal123 == 1 and posKeltnerChn == 1 , 1,
	   iff(posReversal123 == -1 and posKeltnerChn == -1, -1, 0)) 
possig = iff(reverse and pos == 1, -1,
          iff(reverse and pos == -1 , 1, pos))	   
if (possig == 1) 
    strategy.entry("Long", strategy.long)
if (possig == -1)
    strategy.entry("Short", strategy.short)	 
if (possig == 0) 
    strategy.close_all()
barcolor(possig == -1 ? #b50404: possig == 1 ? #079605 : #0536b3 )

もっと