エルス平滑化ストキャスティックRSI戦略


作成日: 2024-01-26 15:58:48 最終変更日: 2024-01-26 15:58:48
コピー: 0 クリック数: 777
1
フォロー
1617
フォロワー

エルス平滑化ストキャスティックRSI戦略

概要

この戦略の主な考えは,ランダムな相対的に強い指数 (Stochastic RSI) を処理するために,エーラーズ (Ehlers) 超滑らかな (SuperSmoother) フィルターを使用して,多くの偽信号をフィルタリングして,より信頼できる取引信号を得ることです.基本的な原則は,ランダムな相対的に強い弱い指数を計算し,それからエーラーズ (Ehlers) 超滑らかな (SuperSmoother) フィルターを使用して,それを平ら化して処理し,最後に,その移動平均線と交差して多空化することです.

戦略原則

この戦略は,日誌の閉盤価格のRSIを計算し,RSIをベースにストキャスティック指標を計算します.これは典型的な相対的に強いインデックス指標です. 偽の信号をフィルターするために,エルス超平滑フィルターを使用してストキャスティックRSIを処理し,最後にストキャスティックRSI線は,移動平均線と黄金の交差を多行して,死交差を空にする.

優位分析

この戦略の最大の利点は,エルス超スムーズフィルターを使用することで,多くの偽信号を効果的にフィルターし,取引信号をより信頼性のあるものにすることができます.さらに,ストキャスティックRSI指標は,それ自体が非常に優れた突破性およびトレンド追跡能力を有しています.

リスク分析

この戦略の主なリスクは,市場が大きく揺れるとき,誤ったシグナルが生じやすいことである.価格がより狭い範囲で大きく波動するとき,ストキャスティックRSI指標は,多くの上下の偽シグナルを生じさせ,このとき,エルス超平滑のフィルターの効果も割引される.また,いくつかの激しい状況では,指標の落後性も一定のリスクをもたらす可能性がある.

これらのリスクを軽減するために,ストキャスティック指標周期を拡大したり,滑らかさを小さくしたりなど,パラメータを適切に調整して,偽信号をさらにフィルターすることができます.また,他の指標または形態との組み合わせを考慮して,複数のフィルタリング条件を形成し,誤信号がもたらすリスクを回避することもできます.

最適化の方向

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

  1. 最適化パラメータ設定。ストキャスティックRSI指標の長さ,平滑常数などのパラメータを細かくテストして,最適なパラメータの組み合わせを見つける。

  2. 利潤をロックし,撤回を低減するために,移動ストップまたは単一のストップを設定できます.

  3. 他の指標または形態の組み合わせ. 多重フィルタリング条件を形成し,リスクをさらに減らすために,波動率指標,移動平均などの組み合わせを検討することができます.

  4. 大周期分析の結果に応じてポジションを調整する.より高い時間周期のトレンド分析の結果に応じて,動的に取引毎のポジションサイズを調整することができる.

要約する

この戦略は,まず,ストキャスティックRSI指標を計算し,次に,エルス超滑らかなフィルターを使用して処理し,最後に,自身の移動平均と取引信号を形成し,トレンドの正しい判断を実現する.戦略の優点は,指標とフィルターの組み合わせを使用することにある.偽信号を効果的にフィルターして,高い確率の取引機会を得ることができます.リスクは,主にパラメータ設定の不適切さと止損機構の欠如から生じる.パラメータ最適化,止損追加,パッケージ最適化などの手段によって,戦略の安定性と収益レベルをさらに向上させることができます.

ストラテジーソースコード
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("ES Stoch RSI Strategy [krypt]", overlay=true, calc_on_order_fills=true, calc_on_every_tick=true, initial_capital=10000, currency='USD')

//Backtest Range
FromMonth = input(defval = 06, title = "From Month", minval = 1)
FromDay   = input(defval = 1, title = "From Day", minval = 1)
FromYear  = input(defval = 2018, title = "From Year", minval = 2014)
ToMonth   = input(defval = 7, title = "To Month", minval = 1)
ToDay     = input(defval = 30, title = "To Day", minval = 1)
ToYear    = input(defval = 2018, title = "To Year", minval = 2014)

PI = 3.14159265359

drop1st(src) =>
    x = na
    x := na(src[1]) ? na : src

xlowest(src, len) =>
    x = src
    for i = 1 to len - 1
        v = src[i]
        if (na(v))
            break
        x := min(x, v)
    x

xhighest(src, len) =>
    x = src
    for i = 1 to len - 1
        v = src[i]
        if (na(v))
            break
        x := max(x, v)
    x

xstoch(c, h, l, len) =>
    xlow = xlowest(l, len)
    xhigh = xhighest(h, len) 
    100 * (c - xlow) / (xhigh - xlow)

Stochastic(c, h, l, length) =>
    rawsig = xstoch(c, h, l, length)
    min(max(rawsig, 0.0), 100.0)

xrma(src, len) =>
    sum = na
    sum := (src + (len - 1) * nz(sum[1], src)) / len

xrsi(src, len) =>
    msig = nz(change(src, 1), 0.0)
    up = xrma(max(msig, 0.0), len)
    dn = xrma(max(-msig, 0.0), len)
    rs = up / dn
    100.0 - 100.0 / (1.0 + rs)

EhlersSuperSmoother(src, lower) =>
	a1 = exp(-PI * sqrt(2) / lower)
	coeff2 = 2 * a1 * cos(sqrt(2) * PI / lower)
	coeff3 = -pow(a1, 2)
	coeff1 = (1 - coeff2 - coeff3) / 2
	filt = na
	filt := nz(coeff1 * (src + nz(src[1], src)) + coeff2 * filt[1] + coeff3 * filt[2], src)

smoothK = input(7, minval=1, title="K")
smoothD = input(2, minval=1, title="D")
lengthRSI = input(10, minval=1, title="RSI Length")
lengthStoch = input(3, minval=1, title="Stochastic Length")
showsignals = input(true, title="Buy/Sell Signals")
src = input(close,  title="Source")

ob = 80
os = 20
midpoint = 50

price = log(drop1st(src))
rsi1 = xrsi(price, lengthRSI)
rawsig = Stochastic(rsi1, rsi1, rsi1, lengthStoch)
sig = EhlersSuperSmoother(rawsig, smoothK)
ma = sma(sig, smoothD)

plot(sig, color=#0094ff, title="K", transp=0)
plot(ma, color=#ff6a00, title="D", transp=0)
lineOB = hline(ob, title="Upper Band", color=#c0c0c0)
lineOS = hline(os, title="Lower Band", color=#c0c0c0)
fill(lineOB, lineOS, color=purple, title="Background")

// Buy/Sell Signals

// use curvature information to filter out some false positives
mm1 = change(change(ma, 1), 1)
mm2 = change(change(ma, 2), 2)
ms1 = change(change(sig, 1), 1)
ms2 = change(change(sig, 2), 2)

sellsignals = showsignals and (mm1 + ms1 < 0 and mm2 + ms2 < 0) and crossunder(sig, ma) and sig[1] > ob
buysignals = showsignals and (mm1 + ms1 > 0 and mm2 + ms2 > 0) and crossover(sig, ma) and sig[1] < os

ploff = 4
plot(buysignals ? sig[1] - ploff : na, style=circles, color=#008fff, linewidth=3, title="Buy Signal", transp=0)
plot(sellsignals ? sig[1] + ploff : na, style=circles, color=#ff0000, linewidth=3, title="Sell Signal", transp=0)

longCondition = buysignals
if (longCondition)
    strategy.entry("L", strategy.long, comment="Long", when=(buysignals))

shortCondition = sellsignals
if (shortCondition)
    strategy.entry("S", strategy.short, comment="Short", when=(sellsignals))