移動平均値に基づく多期取引戦略

作者: リン・ハーンチャオチャン, 日付: 2023-12-26 10:13:34
タグ:

img

概要

この戦略は,3つの指標 - 移動平均値,ボリンジャーバンド,および多期株取引のための相対強度指数 (RSI) を組み合わせます. 購入時に高速および遅い移動平均値,50未満のRSI,BBの中間帯の下の閉値のクロスオーバーを考慮します. 70を超えるRSI,販売時にBB上部帯上の閉値を考慮します.

戦略の論理

戦略は主に3つの指標を使用して意思決定を行う.第一に,MACD指標は,高速および遅い移動平均から構成される.スローライン上の高速線のクロスオーバーは購入信号を生成する.第二に,中,上,下帯を持つボリンジャー帯.下帯近くの価格はスイング低点での購入機会を提供し,上帯近くの価格はスイング高点での販売機会を提供します.最後に,RSIは価格行動の速度と変化の速度を反映し,潜在的なスイング高点とスイング低点を識別します.

特に,戦略はまず,スロー・ムービング・メアリーの上を快速移動平均が横断することを要求し,購入を示唆する上昇傾向の強化を示唆する.また,価格が過売りレベルにある可能性を示し,購入機会を提示するRSIを50以下に要求する.さらに,BB中間帯の下の閉値が必要であり,価格スイングが低く,良いエントリーポイントを示唆する.

RSIが70を超えると,価格が過買いレベルにあり,上昇傾向の勢いが低下していることを示し,利益を得るために適しています.また,閉じる価格がBB上位帯を超えると,利益を得るために適した引き戻しリスクが高くなることを示します.

利点

この戦略は,移動平均値,ボリンジャー帯,RSIの強みを組み合わせて,より正確にエントリーとアウトプートのポイントを決定します.主な利点は:

  1. 移動平均は価格上昇傾向の勢いを決定する. BBの中間帯は,入場のためのスイングローを特定する. RSIは価格ピークで購入することを避ける. これら3つは,価格上昇傾向中に比較的理想的な購入機会を提供します.

  2. RSIとBBの上帯の組み合わせは,過買い条件を避けるために利益を得るために価格変動の高さを把握します.

  3. 多期評価により 利益の最大化のために タイムフレームの間の取引機会を把握できます

  4. 論理的な取引ルールにより 戦略は中長期投資で容易に理解できます

リスク

決定の正確性を向上させる指標を組み合わせているにもかかわらず,主要なリスクは存在します.

  1. パラメータ設定リスク 指標のパラメータは経験的な調整が必要です 適切な調整が戦略のパフォーマンスに影響します

  2. 牛市場には適しています.熊市場では,価格の急落がストップ損失を無効にします.

  3. ポートフォリオにも関わらず単一株リスクは残っています.資産の投資を多様化する必要があります.

  4. 取引頻度が過剰である可能性がある.最適なパラメータ設定は,取引頻度が高くなり,取引コストや税金が高くなる可能性があります.

解決策:

  1. バックテストに基づいてパラメータを調整し,適切な信号周波数を得る.

  2. 移動平均周期を 適度なエントリー頻度に調整し 損失を最小限に抑える

  3. 投資を多額の資産に分散させ 単一株のリスクを最小限に抑える

  4. 取引頻度を減らすために 買い物と利益を得る基準を適度に緩和する.

増進 の 機会

さらに最適化できる余地があります

  1. 購入の量を増やし 意思決定の正確さを向上させるため ボラントなどのフィルターを追加します

  2. ポジションのサイズを市場状況に基づいて動的にサイズするモジュールを組み込む.

  3. ディープラーニングアルゴリズムを利用して 大規模なデータセットのトレーニングを通じて パラメータを自動調整します

  4. 判決の適用範囲を拡大するために,より多くの期限を導入する.

結論

戦略は,明確な,理解しやすい論理があり,誤った信号を減らすためにシネージインジケーターを持っています.さらなるパラメータ調整とインジケーターを追加することで,安定性と決定精度を向上させ続けることができます.中長期投資および定量取引に適しています.しかし,市場リスクを完全に排除する戦略はありません.適切なポジションサイズとストップ損失レベルは常に必要です.


/*backtest
start: 2023-11-25 00:00:00
end: 2023-12-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//
//@author Alorse
//@version=4
strategy("MACD + BB + RSI [Alorse]", shorttitle="BB + MACD + RSI [Alorse]", overlay=true, pyramiding=0, currency=currency.USD, default_qty_type=strategy.percent_of_equity, initial_capital=1000, default_qty_value=20, commission_type=strategy.commission.percent, commission_value=0.01) 

txtVer = "1.0.1"
version = input(title="Version", type=input.string, defval=txtVer, options=[txtVer], tooltip="This is informational only, nothing will change.")
src = input(title="Source", type=input.source, defval=close)

// MACD
fast_length = input(title="Fast Length", type=input.integer, defval=12, group="MACD")
slow_length = input(title="Slow Length", type=input.integer, defval=26, group="MACD")
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9, group="MACD")
sma_source = input(title="Oscillator MA Type", type=input.string, defval="EMA", options=["SMA", "EMA"], group="MACD")
sma_signal = input(title="Signal Line MA Type", type=input.string, defval="EMA", options=["SMA", "EMA"], group="MACD")
fast_ma = sma_source == "SMA" ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source == "SMA" ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? sma(macd, signal_length) : ema(macd, signal_length)

// Bollinger Bands
bbGroup = "Bollindger Bands"
length = input(20, title="Length", group=bbGroup)
mult = input(2.0, title="StdDev", minval=0.001, maxval=5, group=bbGroup)

basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev

// RSI
rsiGroup = "RSI"
lenRSI = input(14, title="Length", minval=1, group=rsiGroup)
// lessThan = input(50, title="Less than", minval=1 , maxval=100, group=rsiGroup)
RSI = rsi(src, lenRSI)

// Strategy Conditions
buy = crossover(macd, signal) and RSI < 50 and close < basis
sell = RSI > 70 and close > upper


// Stop Loss
slGroup = "Stop Loss"
useSL = input(false, title="╔══════   Enable   ══════╗", group=slGroup, tooltip="If you are using this strategy for Scalping or Futures market, we do not recommend using Stop Loss.")
SLbased = input(title="Based on", type=input.string, defval="Percent", options=["ATR", "Percent"], group=slGroup, tooltip="ATR: Average True Range\nPercent: eg. 5%.")
multiATR = input(10.0, title="ATR   Mult", type=input.float, group=slGroup, inline="atr")
lengthATR = input(14, title="Length", type=input.integer, group=slGroup, inline="atr")
SLPercent = input(10, title="Percent", type=input.float, group=slGroup) * 0.01

longStop = 0.0
shortStop = 0.0

if SLbased == "ATR"
    longStop := valuewhen(buy, low, 0) - (valuewhen(buy, rma(tr(true), lengthATR), 0) * multiATR)
    longStopPrev = nz(longStop[1], longStop)
    longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop

    shortStop := (valuewhen(sell, rma(tr(true), lengthATR), 0) * multiATR) + valuewhen(sell, high, 0)
    shortStopPrev = nz(shortStop[1], shortStop)
    shortStop := close[1] > shortStopPrev ? max(shortStop, shortStopPrev) : shortStop
if SLbased == "Percent"
    longStop  := strategy.position_avg_price * (1 - SLPercent)
    shortStop := strategy.position_avg_price * (1 + SLPercent)

strategy.entry("Long", true, when=buy)
strategy.close("Long", when=sell, comment="Exit")

if useSL
    strategy.exit("Stop Loss", "Long", stop=longStop)


もっと