価格クロスオーバーとSMAをベースにした量的な取引戦略

作者: リン・ハーンチャオチャン,日付: 2024-02-22 17時34分09秒
タグ:

img

概要

この戦略は,SMAとの価格クロスオーバーに基づく定量取引戦略と呼ばれる.主に異なる期間のSMAを計算し,SMAとの価格クロスオーバーを追跡することによって取引信号を生成する.価格がSMAを上向きに突破すると,購入信号を誘発する.価格がSMAを下向きに突破すると,販売信号を誘発する.

戦略の論理

この戦略の主な論理は,21日間のシンプル・ムービング・メアディア (SMA) で価格クロスオーバーを追跡することです.一方,一般的な傾向を決定するために50日間のSMAと200日間のSMAも計算します.

具体的には,この戦略は,与えられた日付範囲内で価格を閉じることを要求し,入力期間に基づいて異なるSMAを計算します.価格が21日間のSMAを上向きに突破した場合,購入信号を設定します.価格が21日間のSMAを下向きに突破した場合,販売信号を設定します.

SMAを計算し,クロスオーバーを決定するだけでなく,戦略は現在のポジションも追跡する. 購入信号トリガー時にポジションを入力し,セール信号トリガー時にポジションをフラット化する. このように,SMAクロスオーバーに基づく自動取引システムを実現する.

利点分析

この戦略の最大の利点は,シンプルで理解し,実装しやすいことです.SMAは一般的に使用される技術指標であり,SMAクロスオーバーは最も一般的な取引シグナルの一つです.この種の指標クロスオーバー戦略は,自動取引のための異なる株式と時間帯に簡単に適用できます.

また,この戦略はSMAパラメータを調整することで最適化できるという利点もあります.例えば,SMA期間を組み合わせてテストして,特定の株に最適なものを見つけることができます.また,確認と最適化のための他の指標を追加することで戦略を改善することができます.

リスク と 解決策

この戦略の最大のリスクは,指標ベースの戦略が過剰な誤った信号を生む傾向にあることである.例えば,価格は,範囲限定期間に頻繁にSMAをクロスオーバーし,不必要な取引を引き起こす可能性がある.

一般的な解決策は,ストップ・ロスを設定,パラメータをチューニング,またはフィルター条件を追加するなどである.例えば,リスクを制限するために最大損失比を設定したり,より安定したパラメータを見つけるためにSMA期間を調整したり,他の指標を使用していくつかの取引信号をフィルターすることができます.

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

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

  1. 最適のSMAパラメータの組み合わせをテストして選択します.最良の期間を見つけるために異なるSMA長さをバックテストします.

  2. RSI,MACD などなどのフィルターシグナル確認のための他の指標を追加します.これは偽のシグナルをフィルターするのに役立ちます.

  3. ストップ・ロスのロジックを組み込む.リスクをよりよく制御するために最大許容可能な損失またはトラッキング・ストップを設定する.

  4. 入場タイミングを最適化する.SMAクロスオーバーを厳格に追うのではなく,主要なブレイクアウトの周りに入場することを検討する.

  5. 複合戦略をテストし,トレンドフォローなどの他の戦略と組み合わせます.

結論

この戦略は,単純なSMAクロスオーバー信号で自動取引を実現する. 利点は理解し,実装しやすい. 欠点は過剰な信号であり,ウィップソーに易い. パラメータ調節,フィルター,ストップ損失などを追加することで改善することができます. 戦略は基本的な枠組みを提供します. より多くのコンポーネントを組み込むことでそれを豊かにすることができます.


/*backtest
start: 2023-02-15 00:00:00
end: 2024-02-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Price Cross Above/Below SMA Strategy", shorttitle="Tressy Strat", overlay=true)

// Define start and end year inputs
start_year = input.int(2022, title="Start Year")
end_year = input.int(2022, title="End Year")

// Define start and end month inputs
start_month = input.int(1, title="Start Month", minval=1, maxval=12)
end_month = input.int(12, title="End Month", minval=1, maxval=12)

// Define SMA length inputs
sma_length = input.int(21, title="SMA Length")
sma_length_50 = input.int(50, title="50 SMA Length")
sma_length_200 = input.int(200, title="200 SMA Length")

// Filter data within the specified date range
filter_condition = true
filtered_close = request.security(syminfo.tickerid, "D", close[0], lookahead=barmerge.lookahead_on)

// Define SMAs using the input lengths
sma = ta.sma(filtered_close, sma_length)
sma_50 = ta.sma(filtered_close, sma_length_50)
sma_200 = ta.sma(filtered_close, sma_length_200)

// Initialize position
var bool in_position = false

// Condition for a price cross above SMA within the date range
cross_above = filter_condition and ta.crossover(filtered_close, sma)

// Condition for a price cross below SMA within the date range
cross_below = filter_condition and ta.crossunder(filtered_close, sma)

// Buy condition
if cross_above
    in_position := true

// Sell condition
if cross_below
    in_position := false

// Strategy entry and exit
if cross_above
    strategy.entry("Buy", strategy.long)
if cross_below
    strategy.close("Buy")

// Plot the SMAs on the chart
plot(sma, color=color.blue, title="21 SMA")
plot(sma_50, color=color.red, title="50 SMA")
plot(sma_200, color=color.orange, title="200 SMA")

// Plot the Buy and Sell signals with "tiny" size
plotshape(cross_above, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.tiny, title="Buy Signal")
plotshape(cross_below, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny, title="Sell Signal")


もっと