動向平均のクロスオーバーに基づく戦略をフォローする傾向

作者: リン・ハーンチャオチャン,日付: 2024-01-31 15:17:31
タグ:

img

概要

この戦略は,異なる種類の移動平均値 (Simple Moving Average SMA,Exponential Moving Average EMA,Hull Moving Average HMA,Weighted Moving Average VWMA) を計算し,それらの間のクロスオーバーポイントを検知して,市場のトレンドを決定し,それをフォローすることで取引信号を生成する.短期MMAが下から長期MMAを横切るときに購入信号を生成し,逆のクロスオーバーが起こるときに販売信号を生成する.

戦略の論理

この戦略の主な考え方は,二つの移動平均を比較することによって市場傾向を判断することである.具体的には,入力パラメータを通じて異なる種類と長さの2つのMAを構成することを可能にする.最初のMAは主要な傾向を表すより長い期間を持ち,第2MAは現在の短期トレンドのための短い期間を有する.

短期MAが長期MAを下から横切ると,短期トレンドが強化され,市場は上昇傾向に入っていることを示します.したがって,このクロスオーバーポイントで購入信号が生成されます.逆に,短期MAが長期MAを下に横切ると,短期トレンドが弱まり,市場は下向きに逆転していることを示します.したがって,販売信号が生成されます.

この戦略は,そのようなMAクロスオーバーを検出することで,市場のトレンドに従って取引する.

利点

  • 主要な傾向を決定するために,古典的で実践的なMAクロスオーバー方法を使用します.
  • 柔軟性を確保する,様々なMAタイプの組み合わせをサポートします
  • シンプルで明快な論理 分かりやすく自動化できます
  • 設定可能なパラメータは,異なる市場条件に適応する

リスク分析

  • MAは遅延効果があり,価格アクションが既に起こったとき,ターニングポイントまたはその近くにシグナルが来る可能性があります.
  • 傾向判断は不正確で,不必要な損失が生じる可能性があります
  • 結果は,異なるMAパラメータ設定によって大きく異なります.

解決策:

  • より良い感受性のために,より短い MA 期間を使用します.
  • 間違えを避けるため,クロス検証のための他のフィルターを追加する
  • パラメータ最適化方法 例えば ブルートフォース,機械学習,遺伝子アルゴリズム
  • 制御位置のサイズ設定とストップ損失を適切に

改善 の 方向

  • 精度を高めるためにフィルターとして他の指標を追加
  • 市場状況の変化に基づいてMAパラメータを自動的に調整する
  • 自動パラメータ最適化のために機械学習を利用する
  • ストップ・ロスの戦略を磨く

結論

この戦略は,主要なトレンド検出のためにMAクロスオーバーを使用するというクラシックなアイデアに基づいています.柔軟なMA組み合わせにより,実装が簡単で,アルゴリズム取引自動化に適しています.全体的には,かなり実用的です.しかし,パラメータチューニング,追加のフィルターなど,パフォーマンスをさらに改善するための強化に余地があります.


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

//@version=3
//study(title="MA Crossover Strategy", overlay = true)
strategy("MA Crossover Strategy", overlay=true)
src = input(close, title="Source")

price = request.security(syminfo.tickerid, timeframe.period, src)
ma1 = input(25, title="1st MA Length")
type1 = input("HMA", "1st MA Type", options=["SMA", "EMA", "HMA", "VWMA"])

ma2 = input(7, title="2nd MA Length")
type2 = input("HMA", "2nd MA Type", options=["SMA", "EMA", "HMA", "VWMA"])

f_hma(_src, _length)=>
    _return = wma((2*wma(_src, _length/2))-wma(_src, _length), round(sqrt(_length)))

price1 = if (type1 == "SMA")
    sma(price, ma1)
else
    if (type1 == "EMA")
        ema(price, ma1)
    else
        if (type1 == "VWMA")
            vwma(price, ma1)
        else
            f_hma(price, ma1)
    
price2 = if (type2 == "SMA")
    sma(price, ma2)
else
    if (type2 == "EMA")
        ema(price, ma2)
    else
        if (type2 == "VWMA")
            vwma(price, ma2)
        else
            f_hma(price, ma2)


//plot(series=price, style=line,  title="Price", color=black, linewidth=1, transp=0)
plot(series=price1, style=line,  title="1st MA", color=blue, linewidth=2, transp=0)
plot(series=price2, style=line, title="2nd MA", color=green, linewidth=2, transp=0)


longCondition = crossover(price1, price2)
if (longCondition)
    strategy.entry("Long", strategy.long)

shortCondition = crossunder(price1, price2)
if (shortCondition)
    strategy.entry("Short", strategy.short)


もっと