複数の指標に基づいたクロスサイクル仲裁戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-29 11:10:33
タグ:

img

概要

この戦略は,3つの異なる技術指標の組み合わせを使用して,低リスクの過剰収益を達成するために,異なる時間枠における価格動向を把握するクロスサイクル・アービタージ戦略を構築します.

戦略の論理

この戦略で使用される3つの技術指標は,ケルトナーチャネル (KC),ボラティリティストップ (Vstop),ウィリアムズアライガター (WAE) である.ケルトナーチャネルは,価格がチャネル範囲の外にあるかどうかを決定するために使用され,したがって取引信号を生成する.ボラティリティストップは,不要なストップ損失を減らす一方でストップ損失を確保するためにストップ損失ポジションを動的に調整するために使用される.ウィリアムズアライガター指標は,価格が強い傾向にあるかどうかを決定するために使用される.具体的には:

  1. 価格がケルトナー・チャネル上線線よりも高くなった場合,それは上昇信号とみなされます.価格がケルトナー・チャネル下線よりも低くなった場合,それは下線信号とみなされます.

  2. 波動ストップは,価格波動性とチャネル幅に基づいてストップ損失ポジションを設定します.過剰に保守的なストップ損失ポジションを避けながらストップ損失を確保するために動的に調整できます.

  3. ウィリアムズアライガター指標は,MACDとボリンジャー帯のチャネル幅を計算して価格が強い上昇傾向か下落傾向にあるかを判断します.

これらの3つの指標を組み合わせることで,異なる時間枠の信号が相互検証されます.これは誤判の可能性を軽減し,最適化された戦略論理を構築します.

利点分析

この戦略の最大の利点は,複数の指標の組み合わせによってもたらされる正確な取引シグナルである. 3つの指標は異なる時間枠で動作し,相互にクロスバリディートし,誤判の可能性を効果的に軽減し,シグナルの正確性を向上させることができる. さらに,変動ストップ設定は動的で,リスクをさらに制御するためにリアルタイム波動性に応じてストップ損失ポジションを調整することができます.

単一指標戦略と比較して,この組み合わせた戦略はより正確で効率的な取引信号を提供することができます.同時に,3つの指標は複数のタイムフレーム内で取引判断を形成するために一緒に働きます.これは非常に科学的で合理的な論理設計であり,学ぶ価値があります.

リスク分析

この戦略の主なリスクは,不適切なパラメータ設定がオーバーフィッティングを引き起こす可能性があることです.この3つの指標は合計8つのパラメータを持っています.不適切な設定が戦略に悪影響を及ぼす可能性があります.また,指標間の重量関係も適切に設定する必要があります.そうでなければ,信号は互いに中和し,無効になり得ます.

これらのリスクを軽減するために,パラメータ設定中に異なる市場環境への適応性が完全に考慮され,バックテスト分析を通じて最適なパラメータ組み合わせを調整する必要があります.また,取引信号が効果的に起動できるように,指標間の重みを適切に調整してください.連続した損失が発生した場合,損失を制御するためにポジションサイズを減らすことを検討してください.

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

この戦略の最適化領域は主に2つの側面に焦点を当てています:パラメータ調整とストップ損失戦略の改善.具体的には,以下の側面を考慮することができます:

  1. 指標パラメータをより科学的に選択し,パラメータの組み合わせを最適化する.アルゴリズムは,リターン最大化とリスク最小化などの目標で最適なパラメータを見つけるために使用することができます.

  2. ストップ・ロスの戦略を改善し,不要なストップ・ロスをさらに削減し,ストップ・ロスを確保し,それによって勝利率を向上させる.例えば,ストップ・ロスの信号としてより多くの指標を組み込むか,ストップ・ロスのポジションの漸進的な引き下げを設定する.

  3. 誤判率を減らすために指標と取引シグナル判断の論理間の重みを最適化する.より安定し信頼性の高い判断ルールを構築するためにより多くの価格行動特性を導入することができます.

  4. 自動パラメータ最適化を実現するために 機械学習モデルを導入しようとします あるいは戦略評価と改善のために ディープ・リフォーム・ラーニング・プログラミングを使用します

概要

この戦略は,ケルトナーチャネル,ボラティリティストップおよびウィリアムズアライゲーターの組み合わせを通じてクロスサイクルアービトラージシステムを構築する.マルチインジケーターの組み合わせは信号の正確性を向上させ,ダイナミックストップ損失のリスクを制御する.しかし,パラメータ設定と最適化には改善の余地がある.全体として,この戦略は強力な科学性があり,さらなる研究と適用に値する.


/*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=4
strategy("QuarryLake", overlay=true)  ///Ultilized modified full kelly for this strategy = 36%

///Keltner channel///
nPeriod = input(title="Keltner Period", type=input.integer, defval=200, minval=1)
Mult = input(title="Keltner Mult", type=input.integer, defval=5, minval=1)
xPrice = ema(hlc3, nPeriod)
xMove = ema(high - low, nPeriod)
xMoveMult = xMove * Mult
xUpper = xPrice + xMoveMult
xLower = xPrice - xMoveMult

// plot(xPrice, color=red, title="KSmid")
p1 = plot(xUpper, color=color.white, title="KSup")
p2 = plot(xLower, color=color.white, title="KSdn")
fill(p1, p2, color=close > xUpper ? color.green : close < xLower ? color.red : color.white)

kclongcondition = close > xUpper
kcshortcondition = close < xLower
kccloselongcondition = crossunder(close, xUpper)
kccloseshortcondition = crossover(close, xLower)

///Volatility Stop///
length = input(title="Vstop length", type=input.integer, defval=3, minval=1)
mult1 = 1.5

atr_ = atr(length)
max1 = 0.0
min1 = 0.0
is_uptrend_prev = false
stop = 0.0
vstop_prev = 0.0
vstop1 = 0.0
is_uptrend = false
is_trend_changed = false
max_ = 0.0
min_ = 0.0
vstop = 0.0
max1 := max(nz(max_[1]), close)
min1 := min(nz(min_[1]), close)
is_uptrend_prev := nz(is_uptrend[1], true)
stop := is_uptrend_prev ? max1 - mult1 * atr_ : min1 + mult1 * atr_
vstop_prev := nz(vstop[1])
vstop1 := is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop)
is_uptrend := close - vstop1 >= 0
is_trend_changed := is_uptrend != is_uptrend_prev
max_ := is_trend_changed ? close : max1
min_ := is_trend_changed ? close : min1
vstop := is_trend_changed ? is_uptrend ? max_ - mult1 * atr_ : min_ + mult1 * atr_ : 
   vstop1

plot(vstop, color=is_uptrend ? color.green : color.red, style=plot.style_line, linewidth=1)

vstoplongcondition = close > vstop
vstoplongclosecondition = crossunder(close, vstop)
vstopshortcondition = close < vstop
vstopshortclosecondition = crossover(close, vstop)

///Waddah Attar Explosion///
sensitivity = input(150, title="Sensitivity")
fastLength = input(20, title="FastEMA Length")
slowLength = input(40, title="SlowEMA Length")
channelLength = input(20, title="BB Channel Length")
mult = input(2.0, title="BB Stdev Multiplier")
DEAD_ZONE = nz(rma(tr(true), 100)) * 3.7
calc_macd(source, fastLength, slowLength) =>
    fastMA = ema(source, fastLength)
    slowMA = ema(source, slowLength)
    fastMA - slowMA
calc_BBUpper(source, length, mult) =>
    basis = sma(source, length)
    dev = mult * stdev(source, length)
    basis + dev
calc_BBLower(source, length, mult) =>
    basis = sma(source, length)
    dev = mult * stdev(source, length)
    basis - dev
t1 = (calc_macd(close, fastLength, slowLength) - 
   calc_macd(close[1], fastLength, slowLength)) * sensitivity
t2 = (calc_macd(close[2], fastLength, slowLength) - 
   calc_macd(close[3], fastLength, slowLength)) * sensitivity
e1 = calc_BBUpper(close, channelLength, mult) - 
   calc_BBLower(close, channelLength, mult)
trendUp = t1 >= 0 ? t1 : 0
trendDown = t1 < 0 ? -1 * t1 : 0

waelongcondition = trendUp and trendUp > DEAD_ZONE and trendUp > e1
waeshortcondition = trendDown and trendDown > DEAD_ZONE and trendDown > e1

///Long Entry///
longcondition = kclongcondition and vstoplongcondition and waelongcondition
if longcondition
    strategy.entry("Long", strategy.long)

///Long exit///
closeconditionlong = kccloselongcondition or vstoplongclosecondition
if closeconditionlong
    strategy.close("Long")

///Short Entry///
shortcondition = kcshortcondition and vstopshortcondition and waeshortcondition
if shortcondition
    strategy.entry("Short", strategy.short)

///Short exit///
closeconditionshort = kccloseshortcondition or vstopshortclosecondition
if closeconditionshort
    strategy.close("Short")

///Free Hong Kong, the revolution of our time///


もっと