定量的取引戦略: 二重移動平均ブレイクスルー戦略


作成日: 2024-02-21 14:28:28 最終変更日: 2024-02-21 14:28:28
コピー: 0 クリック数: 669
1
フォロー
1617
フォロワー

定量的取引戦略: 二重移動平均ブレイクスルー戦略

概要

この戦略は,量化取引戦略の双均線突破戦略と呼ばれています.この戦略の主な考えは,迅速な移動平均と遅い移動平均の交差信号を利用して,価格の動向の判断を実現し,その後,買入と売却の決定を行うことです.

戦略原則

この戦略の核心指標は,急速な移動平均と遅い移動平均である.戦略は,価格の傾向を判断するために急速な移動平均と遅い移動平均の交差関係を利用し,購入と販売の決定を制定する.

具体的には,急速移動平均のパラメータは24周期,ゆっくり移動平均のパラメータは100周期に設定されている. 急速移動平均が下からゆっくり移動平均を交差すると,価格が上昇傾向に入ると,戦略は買入シグナルを発信する. 急速移動平均が上から下からゆっくり移動平均を交差すると,価格が下方傾向に入ると,戦略は販売シグナルを発信する.

価格の動向の変化を把握し,購入や売却の意思決定を助けるために,速やかに移動平均の交差点を判断します.

戦略的優位性

この戦略の利点は以下の通りです.

  1. 原則はわかりやすく,実行しやすい。双均線交差は最も基本的な技術指標の1つであり,理解しやすく,適用しやすい。

  2. パラメータは調整可能で,適応性が高い. 急速移動平均と遅い移動平均のパラメータは,実際の状況に応じて調整することができ,戦略をより柔軟にすることができる.

  3. トレンドの変化を捉える能力が強い。双均線交差はしばしば価格が収束からトレンドへの転換点を捉えるために使用される。

  4. 振動を効果的にフィルターして,無効取引を減らす.双均線は振動区間を識別するために使用され,振動中に繰り返しポジション開設を避ける.

戦略リスク

この戦略にはいくつかのリスクがあります.

  1. 双均線交差信号は遅延する可能性がある。双均線がトレンド追跡指標として,交差信号はしばしば一定周期遅延する。これはある程度の機会コストを引き起こす可能性がある。

  2. 振動的な市場では偽信号が生じやすい.双平線が最適のシナリオは,価格が明らかな傾向がある場合である.しかし,振動的な状況では,頻繁に偽信号が生じやすい.

  3. パラメータを正しく設定しない場合,戦略のパフォーマンスに影響を与える. 平均線を正しく設定しない場合,トレンドの交差を捉えるための感度に影響を与える.

対応方法:

  1. 均線周期を適切に短縮し,交差信号の感度を増やす.

  2. 波動率または取引量指標を加え,波動性のある市場での無効取引を減らすためにフィルタリングを行う.

  3. パラメータ最適化,最適のパラメータ組合せを探す. 機械学習などの方法を追加して自動最適化.

戦略最適化の方向性

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

  1. シンプルな移動平均の代わりに,線形加重移動平均などのより高度な移動平均技術指標を使用し,指標の追跡および予測能力を向上させる.

  2. 交差量指標,波動率指標などの補助指標を追加し,共同フィルタリングを行い,無効信号を減らす.

  3. 速慢平均線参数を最適化し,参数適応性を向上させる. 機械学習,ランダム最適化などの方法を採用して最適な参数を探す.

  4. 戦略の導入後,単一損失を制御するためにストップ・ロスを設計し,移動ストップを設定できます.同時に,十分な利益を得ることを保証するために,利益最適化技術を追加します.

  5. ディープラーニングなどの新しい技術により,より複雑な価格パターンを識別し,より優れた結果を得るために,均線交差の購入と販売の決定を補助することができます.

要約する

この戦略は,全体的に比較して古典的でシンプルで,双均線指標に基づいて価格トレンドを判断し,価格が震動からトレンドに転換する機会を検出する. 思想の明快さ,シンプルな実用性が優れ,トレンド性行動を追跡するのに適している. しかし,信号遅延などの欠陥もある. これは,パラメータの調整と最適化によって戦略の安定性と取引効率を向上させる必要がある.

ストラテジーソースコード
/*backtest
start: 2024-01-21 00:00:00
end: 2024-02-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Pine Script Tutorial Example Strategy 1', overlay=true, initial_capital=100000, default_qty_value=100, default_qty_type=strategy.percent_of_equity)

//OBV
src = close
obv = ta.cum(math.sign(ta.change(src)) * volume)
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)
typeMA = input.string(title = "Method", defval = "SMA", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="Smoothing")
smoothingLength = input.int(title = "Length", defval = 20, minval = 1, maxval = 100, group="Smoothing")
Limit = input.float(title = "Limit", defval = 1, minval = 0.1, maxval = 10, group="Smoothing")
smoothingLine_ma = ma(obv,smoothingLength, typeMA)
obv_diff = (obv-smoothingLine_ma)*100/obv

//PVT
var cumVolp = 0.
cumVolp += nz(volume)
if barstate.islast and cumVolp == 0
    runtime.error("No volume is provided by the data vendor.")
srcp = close
vt = ta.cum(ta.change(srcp)/srcp[1]*volume)
smoothingLine_map = ma(vt,smoothingLength, typeMA)
pvt_diff = (vt-smoothingLine_map)*100/vt

// plot(obv_diff+close+100 ,title="OBV_DIFF", color = color.rgb(255, 118, 54))
// plot(pvt_diff+close+80 ,title="PVT_DIFF", color = color.rgb(223, 61, 255))

indicator = (pvt_diff+obv_diff)/2
goLongCondition1 = ta.crossover(indicator,Limit)
timePeriod = time >= timestamp(syminfo.timezone, 2023,1, 1, 0, 0)  // Backtesting Time
notInTrade = strategy.position_size <= 0
if goLongCondition1 and timePeriod and notInTrade
    stopLoss = low * 0.99 // -2%
    takeProfit = high * 1.05 // +5%
    strategy.entry('long', strategy.long )
    strategy.exit('exit', 'long', stop=stopLoss, limit=takeProfit)






// fastEMA = ta.ema(close, 24)
// slowEMA = ta.ema(close, 100)
// goLongCondition1 = ta.crossover(fastEMA, slowEMA)
// timePeriod = time >= timestamp(syminfo.timezone, 2018, 12, 15, 0, 0)
// notInTrade = strategy.position_size <= 0
// if goLongCondition1 and timePeriod and notInTrade
//     stopLoss = low * 0.97
//     takeProfit = high * 1.12
//     strategy.entry('long', strategy.long)
//     strategy.exit('exit', 'long', stop=stopLoss, limit=takeProfit)
// plot(fastEMA, color=color.new(color.blue, 0))
// plot(slowEMA, color=color.new(color.yellow, 0))