移動平均と偏差指標による複数期間の取引戦略


作成日: 2023-12-26 10:13:34 最終変更日: 2023-12-26 10:13:34
コピー: 0 クリック数: 575
1
フォロー
1623
フォロワー

移動平均と偏差指標による複数期間の取引戦略

概要

この戦略は,移動平均線,ブリン帯,相対的に強い指標の3つの指標を組み合わせて,多周期的な株式取引を行う.それは,購入するときに,同時に,速い移動平均線にゆっくりとした移動平均線を穿越する,相対的に強い指標が50未満と,閉店価格がブリン帯の中央軌道より低い3つの条件を考慮する.売る時には,相対的に強い指標が70以上と,閉店価格がブリン帯上軌道より高い2つの条件を考慮する.

戦略原則

この戦略は主に3つの指標を用いて判断する.一つ目は,MACD指標で,それは,速く,ゆっくりと2つの異なる周期の移動平均から構成され,速線が遅線を横切るときに買入信号を生成する.第二の指標は,ブリン帯で,それは,中軌,上軌,下軌の3つの線から構成されている.価格が下軌に近づくときの振動的な谷部を買入点とし,価格が上軌に近づくときの損失を止める必要のあるピークである.第三の指標は,証券価格の動きの速度と変化の程度を反映するRSIであり,買入点と谷部からの売り出しのピークを見つけることができる.

具体的な取引では,この戦略は,まず,急速な移動平均線にゆっくりとした移動平均線を横断することを要求し,株価の上昇勢いが強化されたことを示す,購入することができる.同時に,RSIが50を下回ることを要求し,株価が超売り領域にある可能性があることを示す,購入のタイミングに入ることができる.さらに,閉盘価格がブリン帯の中央軌道より低いことを要求し,株価が谷部にあることを示す,購入の良いエントリーポイントでもある.

ストップとストップの面で,RSIが70を超えると,株価が超買い領域にある可能性を示し,上向きの勢いが弱まっていることを示すので,ストップを考慮すべきである.また,閉盘価格がブリン帯線上線より高い場合でも,株価が過高である可能性を示し,反転のリスクがあり,適切なストップをすべきである.

戦略的優位性

この戦略は,移動平均,ブリン帯,およびRSIの3つの指標の優位性を利用し,購入と販売のタイミングをより正確に判断することができます.具体的には以下の優位性があります.

  1. 移動平均線は株価の上昇勢いを判断し,ブリン帯中線は株価の谷部での買いポイントを見つけ,RSIは株価の買い高点を防ぐ.この3つの組み合わせは,株価の上昇中期においてよりよい買いタイミングを決定することができる.

  2. RSIとブリンが合わさると,株価のピークをうまく把握し,過買を回避し,急落を止めることができます.

  3. 多周期的判断により,さまざまなレベルの取引機会を捉え,利益の余地を増やすことができます.

  4. この戦略の取引ロジックはシンプルでわかりやすく,中長期投資に適しています.

戦略リスク

この戦略は複数の指標の判断を統合し,取引決定の正確性を高めていますが,以下の主要なリスクがあります.

  1. パラメータ設定のリスク 移動平均,ブリン帯,RSIのパラメータは,実際の状況に合わせて調整する必要があります.パラメータを正しく設定しなければ,取引の効果に影響を与えます.

  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)