反転と相対的な強さに基づく複合定量戦略


作成日: 2023-12-13 17:17:10 最終変更日: 2023-12-13 17:17:10
コピー: 0 クリック数: 369
1
フォロー
1212
フォロワー

反転と相対的な強さに基づく複合定量戦略

概要

この戦略は,最初にUlf Jensenの著書”How I Triple My Money in the Futures Market”の第183ページで提唱された逆転戦略と相対強度指標を組み合わせて,より強力な信号を得るために組み合わせられた.この組み合わせ戦略は,逆転と相対強度の組み合わせによる量化戦略と呼ばれる.

この戦略の主な構想は,複数の因子を同時に使用して判断し,反転因子と比較相対強さの2つの信号を組み合わせて,両者が同時に信号を発したときに購入または売却するだけで,戦略の安定性を高めることである.

戦略原則

第1部は逆転戦略である。この戦略は,次の条件で多行する.近日2日の閉盘価格が連続して上昇し,9日のストキャスティック・スローラインが50以下である。平置条件は,近日2日の閉盘価格が連続して下落し,9日のストキャスティック・スローラインが50以上である。

第2部は,相対強度指標である.この指標は,対象株と指標のN日閉盘価格の変化率の移動平均を計算し,事前に設定された買入帯,売り帯,ポジション帯と比較する.

この組み合わせ戦略は,2つの部分の信号を同時に判断し,両方が同じ信号を発した場合にのみ,対応する買入または出札操作を行う.

優位分析

この戦略は,反転因子と相対強度因子を組み合わせて,両者の優位性を発揮することができる.反転戦略は,短期的な極限点を捉えることができる;相対強度戦略は,大都市の主なトレンドを把握することができる.両者は同時に信号を発信し,信号の信頼性を高め,ノイズによる誤信号の一部をフィルターすることができる.

また,ストキャスティック指標は,超買い超売り区分指標として,反転点をよりよく判断することができる.移動平均などのトレンド指標を使用する組み合わせも,比較的に成熟した組み合わせ戦略を形成することができる.

リスク分析

逆転策の最大のリスクは,市場が逆転するタイミングを判断できず,損失が発生した後に逆転運動が継続される場合である.このとき,相対強度指標が作用し,大きな傾向が変化しているかどうかを判断することができる.

相対強度戦略のリスクは,指標パラメータが正しく設定されず,誤った信号が多く発生することにある.この場合,反転戦略はフィルターとして作用し,不要な取引を減らすことができる.

最適化の方向

この戦略は以下の点で最適化できます.

  1. より多くの反転因子をテストし,より優れた反転戦略を探します. 現在使用されているのは,単純なN日新高/新低統計戦略だけです.

  2. 相対強度指標のパラメータをテスト・最適化して,最適なパラメータの組み合わせを見つけます.現在のパラメータ設定は主観的で,最適ではないかもしれません.

  3. ストップを増加させる戦略. この戦略には現在,ストップが設定されていない. 合理的なストップを増加させることで,損失のリスクを制御することができる.

  4. 異なる指標のインデックスをテストして,ターゲット株との相対的な強さを計算して,最もマッチするインデックスを探すことができます.

要約する

この戦略は,反転因子と相対強度因子を組み合わせて取引し,両者の優位性を利用して信号品質を向上させることができる,比較的成熟した組合せ戦略である.この戦略の最適化スペースはまだ広大であり,パラメータ最適化,止損戦略,および戦略組合せ方式の調整により,よりよい効果も得ることができる.

ストラテジーソースコード
/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 30/10/2019
// 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
// Comparative Relative Strength Strategy for ES
//
// 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

CRS(a, b, len, BuyBand, SellBand, CloseBand) =>
    pos = 0.0
    as = security(a, timeframe.period, close) 
    bs = security(b, timeframe.period, close) 
    nRes = sma(as/bs, len)
    pos := iff(nRes > BuyBand, 1,
	         iff(nRes < SellBand, -1,
	          iff(pos[1] == 1 and nRes < CloseBand, 0,
    	       iff(pos[1] == -1 and nRes > CloseBand, 0, nz(pos[1], 0)))))
    pos

strategy(title="Combo Backtest 123 Reversal & Comparative Relative Strength", shorttitle="Combo", overlay = true)
Length = input(14, minval=1)
KSmoothing = input(1, minval=1)
DLength = input(3, minval=1)
Level = input(50, minval=1)
//-------------------------
a = syminfo.tickerid 
b = input("BTC_USDT:swap", type=input.symbol) 
LengthCRS = input(10) 
BuyBand = input(0.9988, step = 0.0001)
SellBand = input(0.9960, step = 0.0001)
CloseBand = input(0.9975, step = 0.0001)
reverse = input(false, title="Trade reverse")
posReversal123 = Reversal123(Length, KSmoothing, DLength, Level)
posCRS = CRS(a, b, LengthCRS, BuyBand, SellBand, CloseBand)
pos = iff(posReversal123 == 1 and posCRS == 1 , 1,
	   iff(posReversal123 == -1 and posCRS == -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 )