移動平均のブレイクアウト戦略

作者: リン・ハーンチャオチャン, 日付: 2023-11-28 13:50:49
タグ:

img

概要

これは移動平均値に基づいたブレークアウト取引戦略である.移動平均値として一定の期間中の平均価格を計算する.価格が移動平均値を突破すると,取引信号が生成される.

戦略の論理

この戦略は主に移動平均指標に基づいている. SMA関数を用い,移動平均値を得るため,期間中の平均閉値を計算する. 最新の閉値が移動平均値を上向きに突破すると,購入信号が生成される. 最新の閉値が移動平均値を下向きに突破すると,販売信号が生成される.

具体的には,移動平均データシーケンスを得るため,戦略内の移動平均のソース (最近の閉値) と長さを定義します.その後,移動平均値を超えると長オーダーを作成し,移動平均値を下回るとショートオーダーを作成します.オーダーを作成した後,また,オーダーが設定された利益率に達するとポジションの一部を閉鎖し,オーダーが既定の利益率に達するとポジション全体を閉鎖します.

利点分析

シンプルで実用的な戦略です.以下の利点があります.

  1. 論理は明確で 分かりやすく パラメータを調整できます
  2. 移動平均値は,市場騒音をフィルターし,トレンドを特定できる一般的に使用され信頼性の高い技術指標です.
  3. 利益とストップ・ロスを同時に設定することで 利益とリスクを制御できます
  4. 簡単なパラメータだけで動作できます 量子入門レベルに適しています

リスク分析

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

  1. 移動平均値は遅れており,短期的な逆転を見逃す可能性があります.
  2. 市場全体的な環境を考慮していないため 罠にかけられる傾向があります
  3. パラメータの最適化は戦略のパフォーマンスに影響を与えません
  4. フィルタリングに他の指標が使用されていないため,いくつかの誤った信号がある可能性があります.

これらのリスクを制御するために フィルタリングのための他の指標を組み合わせ 短期的な市場動向判断を導入したり 最適なパラメータ組み合わせを見つけるために 機械学習方法を使用することで 最適化することができます

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

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

  1. トレーディングシステムを構築し,勝率を改善するために,判断のための他の技術指標を追加します. MACD,KDなどの指標を導入することができます.

  2. ストップ・ロスのメカニズムを追加します. 利益をロックし,より大きな損失を避けるために,ストップ・ロスの遅れまたは時間ベースのストップ・ロスを使用します.

  3. パラメータ最適化を実行する. 最適な組み合わせを見つけるために移動平均期パラメータを変更する. 異なる種類の移動平均値もテストすることができます.

  4. 機械学習の判断力を高め ランダムフォレストやLSTMなどのアルゴリズムを複数の要因と組み合わせて 傾向の方向性を決定します

  5. 入口と出口ロジックを最適化する.トレンドの終わりに近づいているトレンドに対する取引を避けるためにトレンドフィルタリング条件を設定する.段階的な出口ロジックを使用することを検討する.

概要

この移動平均ブレイクアウト戦略は,初心者向け量子取引戦略として非常に適しています. シンプルな論理があり,理解し操作しやすく,いくつかの実用的な効果があります. 同時に,さらなるテストと最適化のために多くの余地があります. より良い量子戦略を開発するために,このベースでより多くの技術指標とモデルを導入することができます.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-22 08:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//  |-- Initialize Strategy Parameters:
strategy( 
     // |-- Strategy Title.
     title='[Tutorial][RS]Working with orders', 
     // |-- if shorttitle is specified, it will overwrite the name on the chart window.
     shorttitle='WwO', 
     // |-- if true it overlays current chart window, otherwise it creates a drawer to display plotting outputs.
     overlay=true, 
     // |-- Strategy unit type for default quantity, possible arguments: (strategy.cash, strategy.fixed, strategy.percent_of_equity)
     default_qty_type=strategy.cash, 
     // |-- Value to use for default trade size
     default_qty_value=1000, 
     // |-- Default Account size 
     initial_capital=100000, 
     // |-- Account Currency parameter
     currency=currency.USD
     )

//  |-- Strategy Profit/loss parameters:
profit = input(defval=5000, title='Take Profit')
loss = input(defval=5000, title='Stop Loss')
ratio = input(defval=2.0, title='Ratio at wich to take out a percentage off the table (take profit / ratio).')
percent = input(defval=50.0, title='Percentage of position to take profit.')
//  |-- Signal Parameters:
//  |
//  |-- Moving Average input source and length parameters.
src = input(defval=close)
length = input(defval=100)
//  |-- Moving Average Data series.
ma = sma(src, length)

//  |-- Condition for triggering a buy(long) order(trade).
if crossover(src, ma)
    //  |-- Create the order.
    strategy.order(id='Buy', long=true)
    //  |-- Issue a exit order to close a percentage of the trade when a specified ratio(take profit / ratio) is reached.
    strategy.exit(id='Buy Half Exit', from_entry='Buy', qty_percent=percent, profit=profit/ratio)
    //  |-- Issue a exit order to close the full position, when take profit or stop loss's are reached.
    strategy.exit(id='Buy Full Exit', from_entry='Buy', qty_percent=100, profit=profit, loss=loss)
if crossunder(src, ma)
    //  |-- Create the order.
    strategy.order(id='Sell', long=false)
    //  |-- Issue a exit order to close a percentage of the trade when a specified ratio(take profit / ratio) is reached.
    strategy.exit(id='Sell Half Exit', from_entry='Sell', qty_percent=percent, profit=profit/ratio)
    //  |-- Issue a exit order to close the full position, when take profit or stop loss's are reached.
    strategy.exit(id='Sell Full Exit', from_entry='Sell Half Exit', qty_percent=100, profit=profit, loss=loss)

//  |-- Output Functions.
plot(series=ma, title='MA', color=black)


もっと