移動平均に基づくモメンタム戦略


作成日: 2024-01-23 10:38:18 最終変更日: 2024-01-23 10:38:18
コピー: 0 クリック数: 519
1
フォロー
1617
フォロワー

移動平均に基づくモメンタム戦略

概要

この戦略は,移動平均に基づいた動量戦略である.これは,異なる周期の単純な移動平均を計算し,その交差状況を比較して取引信号を生成する.具体的には,短期移動平均の上を長期移動平均を横切るとき,買入信号を生成する.短期移動平均の下を長期移動平均を横切るとき,売り信号を生成する.

戦略原則

この戦略の核心的な論理は,動量効果,すなわち株式価格のトレンドの持続性に基づいている.移動平均は,株式価格の変化のトレンドを効果的に反映し,短期移動平均の上部に長期移動平均を穿越すると,株式価格が上昇傾向に入ることを示す.逆に,短期移動平均の下部に長期移動平均を穿越すると,株式価格が下部傾向に入ることを示す.この戦略は,この原理に基づいて取引信号を生成する.

具体的には,戦略で13日単調移動平均と34日単調移動平均が定義されている.この2つの移動平均を毎日の閉盘価格で計算した後,その値の大きさの関係が比較されている.もし13日線を34日線に突破すると,買入シグナルが生じ,株価が上昇傾向に入ると,多頭ポジションを確立すべきである.もし13日線を下に34日線を突破すると,売り出シグナルが生じ,株価が下降傾向に入ると,売り出すべきである.

戦略的優位性

この戦略の最大の利点は,単純で分かりやすく,容易に実施できる点にある.移動平均は,最も基本的で最もよく使用される技術指標の1つであり,その原理は単純で,理解しやすく,適用しやすい点にある.移動平均の組み合わせ信号は,長期の実践によって有効であることが証明されている点もある.

また,この戦略のパラメータ設定は柔軟であり,異なる品種や市場環境に応じて調整することができる.例えば,移動平均の周期パラメータを変更することができ,その結果戦略の感性を調整することができる.これは,戦略の最適化および調整のためのスペースを提供します.

リスク分析

この戦略の最大のリスクは,誤信号が多く発生し,波動的な市場で套入される可能性にある.価格が大きく揺れると,移動平均は頻繁に交差し,誤信号が発生する可能性がある.このとき,移動平均周期パラメータを調整して,いくつかのノイズをフィルターする必要があります.

また,市場が大きく逆転すると,戦略の止損点が突破され,大きな損失が生じることがあります.これは,止損戦略を最適化し,適切な止損幅を緩めることを必要とします.

最適化の方向

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

  1. 移動平均の周期パラメータを最適化して,異なる品種と市場環境下でのパラメータの最適な組み合わせを見つける

  2. 他の技術指標のフィルター (MACD,KDなど) を加え,震動状況で誤信号を避ける

  3. ストップ・ストップ戦略を最適化して動的に調整し,ストップ・ストップを保証しながら,ストップ・ストップポイントが突破される可能性が高いことを避ける

  4. ポジション管理機構の強化,例えば固定投入量,ポジション比率など,単一取引リスクの制御

要約する

この戦略は,非常に古典的な移動平均クロスストラテジーであり,短期および長期の移動平均の関係を計算し比較することで,買入および売却の信号を生成する.この戦略の優点は,単純で分かりやすいこと,パラメータが柔軟で,初心者向けに学ぶことであり,その欠点は,信号が十分に安定しないこと,波動的な市場では容易に切り替えられることである.適切な最適化によって,依然として非常に実用的な量化戦略になることができる.

ストラテジーソースコード
/*backtest
start: 2023-01-16 00:00:00
end: 2024-01-22 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
// TODO: update strategy name
strategy("{STRATEGY NAME}", overlay=true)

// === TA LOGIC ===

//
//
// TODO: PUT YOUR TA LOGIC HERE
LONG_SIGNAL_BOOLEAN = crossover(sma(close, 13), sma(close, 34))
SHORT_SIGNAL_BOOLEAN = crossunder(sma(close, 12), sma(close, 21))

// === INPUT BACKTEST DATE RANGE ===
enableShorts = input(false, title="Enable short entries?")

FromMonth = input(defval = 5, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 18, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2017)
ToMonth   = input(defval = 9, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2018, title = "To Year", minval = 2017)

start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true // create function "within window of time"

// === STRATEGY BUY / SELL ENTRIES ===

// TODO: update the placeholder LONG_SIGNAL_BOOLEAN and SHORT_SIGNAL_BOOLEAN to signal
// long and short entries
buy() => window() and LONG_SIGNAL_BOOLEAN
sell() => window() and SHORT_SIGNAL_BOOLEAN

if buy()
    strategy.entry("Long", strategy.long, comment="Long")

if sell()
    if (enableShorts)
        strategy.entry("Short", strategy.short, comment="Short")
    else
        strategy.close("Long")

// === BACKTESTING: EXIT strategy ===
sl_inp = input(10, title='Stop Loss %', type=float)/100
tp_inp = input(30, title='Take Profit %', type=float)/100

stop_level = strategy.position_avg_price * (1 - sl_inp)
take_level = strategy.position_avg_price * (1 + tp_inp)

strategy.exit("Stop Loss/Profit", "Long", stop=stop_level, limit=take_level)