この戦略は,最初にUlf Jensenの著書”How I Triple My Money in the Futures Market”の第183ページで提唱された逆転戦略と相対強度指標を組み合わせて,より強力な信号を得るために組み合わせられた.この組み合わせ戦略は,逆転と相対強度の組み合わせによる量化戦略と呼ばれる.
この戦略の主な構想は,複数の因子を同時に使用して判断し,反転因子と比較相対強さの2つの信号を組み合わせて,両者が同時に信号を発したときに購入または売却するだけで,戦略の安定性を高めることである.
第1部は逆転戦略である。この戦略は,次の条件で多行する.近日2日の閉盘価格が連続して上昇し,9日のストキャスティック・スローラインが50以下である。平置条件は,近日2日の閉盘価格が連続して下落し,9日のストキャスティック・スローラインが50以上である。
第2部は,相対強度指標である.この指標は,対象株と指標のN日閉盘価格の変化率の移動平均を計算し,事前に設定された買入帯,売り帯,ポジション帯と比較する.
この組み合わせ戦略は,2つの部分の信号を同時に判断し,両方が同じ信号を発した場合にのみ,対応する買入または出札操作を行う.
この戦略は,反転因子と相対強度因子を組み合わせて,両者の優位性を発揮することができる.反転戦略は,短期的な極限点を捉えることができる;相対強度戦略は,大都市の主なトレンドを把握することができる.両者は同時に信号を発信し,信号の信頼性を高め,ノイズによる誤信号の一部をフィルターすることができる.
また,ストキャスティック指標は,超買い超売り区分指標として,反転点をよりよく判断することができる.移動平均などのトレンド指標を使用する組み合わせも,比較的に成熟した組み合わせ戦略を形成することができる.
逆転策の最大のリスクは,市場が逆転するタイミングを判断できず,損失が発生した後に逆転運動が継続される場合である.このとき,相対強度指標が作用し,大きな傾向が変化しているかどうかを判断することができる.
相対強度戦略のリスクは,指標パラメータが正しく設定されず,誤った信号が多く発生することにある.この場合,反転戦略はフィルターとして作用し,不要な取引を減らすことができる.
この戦略は以下の点で最適化できます.
より多くの反転因子をテストし,より優れた反転戦略を探します. 現在使用されているのは,単純なN日新高/新低統計戦略だけです.
相対強度指標のパラメータをテスト・最適化して,最適なパラメータの組み合わせを見つけます.現在のパラメータ設定は主観的で,最適ではないかもしれません.
ストップを増加させる戦略. この戦略には現在,ストップが設定されていない. 合理的なストップを増加させることで,損失のリスクを制御することができる.
異なる指標のインデックスをテストして,ターゲット株との相対的な強さを計算して,最もマッチするインデックスを探すことができます.
この戦略は,反転因子と相対強度因子を組み合わせて取引し,両者の優位性を利用して信号品質を向上させることができる,比較的成熟した組合せ戦略である.この戦略の最適化スペースはまだ広大であり,パラメータ最適化,止損戦略,および戦略組合せ方式の調整により,よりよい効果も得ることができる.
/*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 )