平均逆転封筒 移動平均戦略

作者: リン・ハーンチャオチャン, 日付: 2023-12-04 16:12:39
タグ:

img

概要

平均逆転封筒移動平均戦略 (Mean Reverssion Envelope Moving Average Strategy) は,移動平均をベースとした平均逆転取引戦略である. 基本計算としてダブル指数移動平均 (DEMA) を用いて,その上下にもいくつかの封筒を追加する. 価格が封筒帯に触ると,方向性に基づいて長または短ポジションを開く. 価格が移動平均に戻ると,すべてのポジションを閉じる.

戦略の論理

この戦略は,最近の価格変化により敏感な移動平均値であるダブル指数関数移動平均値 (DEMA) をベース指標として使用する.DEMAの上下には,いくつかの価格帯が追加されエンベロープゾーンを形成する.エンベロープの範囲はユーザーによって設定され,各帯の間には固定した百分比間隔がある.

価格が上昇して上層封筒帯に近づくと,戦略はショートポジションを開く.価格が下がって下層封筒帯に達すると,ロングポジションを開く.新しい価格帯に触れるたびに新しいポジションを追加する.価格が移動平均に近づくと,すべてのポジションは閉鎖される.

この戦略は,過剰な価格変動を封筒帯で捉え,逆転から利益を得ることで,低価格で購入し高価格で販売することを目指している.ビットコインのような暗号通貨のような明らかな平均逆転傾向のある市場サイクルに適合する.

利点

  • トレンド逆転を捉えるため,短期的な価格変動に敏感である,ダブル指数関数移動平均を使用します.
  • 移動平均を囲む封筒帯は 価格逆転を正確に捉えることができます
  • 資本効率を最大限に活用して バッチでポジションを開設する
  • 市場変化に適応するために 利益を得てすぐに方向を変えてください
  • パラメータは自由に最適化できます

リスク

  • 市場動向から利益を得られない
  • 不適切なパラメータが過剰な取引を引き起こす可能性があります
  • 比較的安定した市場が必要で 極めて不安定な環境には適していません
  • 狭すぎた封筒は 入場を妨げるかもしれない

リスクは,敏感性を高めるためにエンベロープ範囲を適切に拡大し,異なる市場サイクルに合わせて移動平均の長さを調整することによって軽減できます.

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

戦略は以下の側面で最適化できます.

  1. 異なる移動平均アルゴリズムをテストします

  2. 移動平均長度パラメータを調整して,短期変動に適した調整を行う.

  3. 異なるパーセント設定をテストして封筒パラメータを最適化します.

  4. シングルトレード損失を制限するために,ストップ・ロスの方法 (トレーリング・ストップ・ロスのような) を追加します.

  5. 非合理的な市場への無効なエントリーを避けるために,他の指標とフィルタリング条件を追加します.

結論

平均回転封筒移動平均戦略は,移動平均を中心に価格チャネルを構築することによって,平均回転機会を効果的に捉える.パラメータ調整を通じて異なる市場環境に柔軟に適応することができる.比較的低い取引コストと高い収益性により,これは推奨される定量的な取引戦略である.


/*backtest
start: 2022-11-27 00:00:00
end: 2023-12-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Mean Reversion - Envelope Strategy", overlay=true )

// ----------------------- DESCRIPTION -----------------------
// THIS SCRIPT IS A MEAN REVERSION SYSTEM THAT USES A MOVING AVERAGE AS BASE CALCULATION AND A % OF THIS MOVING AVERAGE TO CALCULATE THE ENVELOPE
// BY DEFAULT, THE SYSTEM WILL PLACE LONG ORDERS ON THE MOVING AVERAGE -5% PER ENVELOPE COUNT (5%, 10% AND SO ON...)
// YOU CAN ENABLE THE SHORT ORDERS THAT WILL FOLLOW THE SAME LOGIC ON THE OPPOSITE SIDE
// THE SYSTEM WILL CLOSE EVERY ONGOING TRADE WHEN THE PRICE RETURNS TO THE MEAN

// ---------------------------------------------
// ---------------- SETTINGS -------------------
src = input(close, "Moving Average Source", group = "Moving Average")
ma_window = input.int(5, "Moving Average Window", step = 1, group = "Moving Average")
ma_type = input.string('4. DEMA', "Moving Average Type", options=['1. SMA', '2. EMA', '3. RMA', '4. DEMA'], group = "Moving Average")
enveloppe_step = input.float(0.05, "Delta Per Enveloppe", step = 0.01, group = "Envelope")
envelope_count = input.int(5, "Envelope count", options = [1, 2, 3, 4, 5], group = "Envelope")
use_longs = input.bool(true, 'Use Long Orders ?', group = "Orders") 
use_short = input.bool(false, 'Use Short Orders ?', group = "Orders")


// ---------------------------------------------
// -------------- INDICATORS -------------------
ma_funct() =>
    if(ma_type == '1. SMA') 
        ta.sma(src, ma_window)
    if(ma_type == '2. EMA') 
        ta.ema(src, ma_window)
    if(ma_type == '3. RMA') 
        ta.rma(src, ma_window)
    if(ma_type == '4. DEMA') 
        2 * ta.ema(src, ma_window) - ta.ema(ta.ema(src, ma_window), ma_window)

ma_base = ma_funct()

ma_high_1 = envelope_count > 0 ? ma_base * (1 + enveloppe_step) : na
ma_high_2 = envelope_count > 1 ? ma_base * (1 + enveloppe_step * 2) : na
ma_high_3 = envelope_count > 2 ? ma_base * (1 + enveloppe_step * 3) : na
ma_high_4 = envelope_count > 3 ? ma_base * (1 + enveloppe_step * 4) : na
ma_high_5 = envelope_count > 4 ? ma_base * (1 + enveloppe_step * 5) : na

ma_low_1 = envelope_count > 0 ? ma_base * (1 - enveloppe_step) : na
ma_low_2 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 2) : na
ma_low_3 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 3) : na
ma_low_4 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 4) : na
ma_low_5 = envelope_count > 0 ? ma_base * (1 - enveloppe_step * 5) : na


// ---------------------------------------------
// --------------- STRATEGY --------------------
if use_longs
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('long 1', strategy.long, limit=ma_low_1, qty=(strategy.equity / ma_low_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('long 2', strategy.long, limit=ma_low_2, qty=(strategy.equity / ma_low_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('long 3', strategy.long, limit=ma_low_3, qty=(strategy.equity / ma_low_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('long 4', strategy.long, limit=ma_low_4, qty=(strategy.equity / ma_low_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('long 5', strategy.long, limit=ma_low_5, qty=(strategy.equity / ma_low_5) * (1 / envelope_count))


if use_short
    if envelope_count > 0 and strategy.opentrades < 1
        strategy.entry('short 1', strategy.short, limit=ma_high_1, qty=(strategy.equity / ma_high_1) * (1 / envelope_count))
    if envelope_count > 1 and strategy.opentrades < 2
        strategy.entry('short 2', strategy.short, limit=ma_high_2, qty=(strategy.equity / ma_high_2) * (1 / envelope_count))
    if envelope_count > 2 and strategy.opentrades < 3
        strategy.entry('short 3', strategy.short, limit=ma_high_3, qty=(strategy.equity / ma_high_3) * (1 / envelope_count))
    if envelope_count > 3 and strategy.opentrades < 4
        strategy.entry('short 4', strategy.short, limit=ma_high_4, qty=(strategy.equity / ma_high_4) * (1 / envelope_count))
    if envelope_count > 4 and strategy.opentrades < 5
        strategy.entry('short 5', strategy.short, limit=ma_high_5, qty=(strategy.equity / ma_high_5) * (1 / envelope_count))

strategy.exit('close', limit=ma_base)


// ---------------------------------------------
// ------------------ PLOT ---------------------
ma_base_plot = plot(ma_base, title = "Base MA", color = color.orange, linewidth = 3, offset = 1)

ma_high_1_plot = plot(ma_high_1, title = "MA high 1", color = color.red, offset = 1)
ma_high_2_plot = plot(ma_high_2, title = "MA high 2", color = color.red, offset = 1)
ma_high_3_plot = plot(ma_high_3, title = "MA high 3", color = color.red, offset = 1)
ma_high_4_plot = plot(ma_high_4, title = "MA high 4", color = color.red, offset = 1)
ma_high_5_plot = plot(ma_high_5, title = "MA high 5", color = color.red, offset = 1)

ma_low_1_plot = plot(ma_low_1, title = "MA low 1", color = color.green, offset = 1)
ma_low_2_plot = plot(ma_low_2, title = "MA low 2", color = color.green, offset = 1)
ma_low_3_plot = plot(ma_low_3, title = "MA low 3", color = color.green, offset = 1)
ma_low_4_plot = plot(ma_low_4, title = "MA low 4", color = color.green, offset = 1)
ma_low_5_plot = plot(ma_low_5, title = "MA low 5", color = color.green, offset = 1)


もっと