デュアルファクターリバーサルトラッキング戦略


作成日: 2023-12-19 11:09:20 最終変更日: 2023-12-19 11:09:20
コピー: 2 クリック数: 545
1
フォロー
1621
フォロワー

デュアルファクターリバーサルトラッキング戦略

概要

この戦略は,量化取引の分野における二因子逆転追跡戦略の1つである. 123の逆転戦略とケルトナー通路戦略の2つの要因を統合し,逆転信号を発見し,低価格で高い価格で取引することを目指す.

戦略原則

この戦略は2つの子戦略で構成されている.最初の子戦略は123反転戦略で,前2取引日の閉盘価格の変化を計算して,ストキャスティック指数と組み合わせて,市場が反転点にあるかどうかを判断する.具体的には,閉盘価格が2日連続で上昇し,ストキャスティック指数が50を下回ると,買入シグナルを発信し,閉盘価格が2日連続で下落し,ストキャスティック指数が50を超えると,売りシグナルを発信する.

2つ目の子戦略は,Keltner通道戦略である.この戦略は,最近のn取引日間の典型的な価格平均線と波動範囲を計算し,価格が上下軌道に近づくと,反転取引信号を発信する.価格が下下軌道を下回ると見空し,上上軌道上になると見多すぎる.

最後に,この戦略は2つの子戦略の信号方向を判断して,最終的な保有信号を計算する. 2つの子戦略の信号が一致するときに,真の取引指示を発行し,そうでなければ取引は行われず,二要素検証の目的を達成する.

優位分析

この二因子反転追跡戦略の最大の優点は,市場が反転する時に機会を把握し,低価格で高価格で売る取引方法を実現できることです.同時に,二因子確認機構により,偽信号を一定程度に削減し,信号の質を向上させることができます.

具体的には,123反転戦略のストキャスティック指数パラメータ設定は,より保守的で,揺れ動いている状況下での偽反転を効果的にフィルターできます.ケルトナー通路はブリン帯の思考を追跡し,また,軌道上下突破時に反転の機会を掴むことができます.両者は,相互に配合して使用され,不要な取引を減らすことができ,その結果,より高い勝率を得ることができます.

リスク分析

この戦略の主なリスクは,反転シグナルが発生するタイミングの選択が非常に重要であることです. 連続した偽反転が発生した場合,または反転シグナルが発生するタイミングのノードの選択が不適切であれば,完全なトレンドを保持することができません.その結果,最終的な利益に影響します.

さらに,二要素戦略は単一戦略に比べてパラメータ選択と最適化の難しさが大きい.二つの子戦略のパラメータを全面的にテストして評価する必要がある.そうでなければ失敗するのも容易である.

最後に,反転取引自体は,利回り率が異なることが多いため,異常な状況に遭遇すると,ポジション破綻することが容易である.これは,厳格な止損によって回避する必要がある.

最適化の方向

リスク分析により,この戦略は以下の点で最適化できます.

  1. 異なる反転指数パラメータ設定をテストし,より高い容認率とより少ない偽信号の組み合わせを見つけます.
  2. 異なる周期の長さのパラメータを試し,より正確な値を反転して捉える
  3. ストップ・ロスのモジュールを追加し,単一取引の最大損失を厳格に管理する
  4. 異なるポジション保持時間の効果をテストし,戦略の論理に最も適合する出口を見つけます.
  5. ポジション開設数やポジション制御モジュールを増やすことで,利益率を合理化します.

要約する

この戦略は,典型的な二要素逆転追跡戦略として,123逆転とケルトナー通路の2つの子戦略を統合することによって,市場の逆転点において,安値と高値のタイミングをより正確に把握することを目的としています.パラメータの最適化とリスクの制御が置かれた場合,この戦略は,相当な余剰利益を得ることができます.しかし,トレーダーは,逆転取引の特殊性を注意して,異常な状況による損失拡大を防ぐ必要があります.

ストラテジーソースコード
/*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 )