高低ブレイカーバックテスト戦略

作者: リン・ハーンチャオチャン,日付: 2023-11-27 15:37:13
タグ:

img

概要

高低ブレイカーバックテスト戦略 (High Low Breaker Backtest) は,株価が過去の高低を突破するかどうかを判断するために,株価の歴史的高低を活用したトレンドフォロー戦略である.特定の期間における最高価格と最低価格を計算し,現在の期間における価格が最近の期間の最高価格を超えると購入信号を生成し,価格が最近の期間の最低価格を下回ると販売信号を生成する.トレンドフォロー戦略の一種として,株価のいくつかのトレンド特性を捕捉し,ライブ取引の実用的な価値を有する.

戦略の論理

この戦略の主な論理は,一定の数のバー (デフォルト50バー) で最高価格と最低価格を計算することです.最高/最低価格を計算する際に,近価格または実際の高/低価格を使用することができます (デフォルトは高/低価格を使用します).その後,現在のバーの閉値または高価格が最近の最高価格を超えているかどうかをチェックします.もしそうであり,最後の最高価格バーから最低数バー (デフォルト30バー) 以上の数バー (デフォルト30バー) がある場合は,購入信号を生成します.同様に,現在のバーの閉値または低価格が最近の最低価格を破って,最後の最低価格を通過した最低数バー以来,販売信号を生成します.

ストップ・ロスは,ストップ・ロスの価格に達するとストップ・ロスの値に達し,ストップ・ロスの値に達するとストップ・ロスの値に達し,セール・ロジックは同様のものです.

利点分析

この高低ブレーカーバックテスト戦略には以下の利点があります.

  1. 論理は単純で理解し/実行しやすい.
  2. 株価の動向の特徴を把握できます
  3. パラメータを最適化して最適なパラメータの組み合わせを見つけることができます.
  4. ストップ・ロストとテイク・プロフィートの 組み込みで リスクをコントロールします
  5. ビジュアライゼーションはパラメータ調整と結果分析を大幅に容易にする.

リスク分析

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

  1. 多重なフリップフラップ取引や 過度な取引に 傾向がある
  2. 価格の振動時に頻繁にポジションを開設する.
  3. パラメータが正しく設定されていない場合,主要なトレンド機会を逃す.
  4. 価格変動の頻度と規模を考慮しない
  5. 他の指標と信号の検証は行いません

このリスクを軽減するのに 役立つのは次の点です

  1. ストップ・ダスト距離を減らして 待機時間を延長します
  2. 頻繁に入場しないように 参入基準を追加します
  3. パラメータを最適化して 最適な組み合わせを見つけます
  4. フィルター条件を他の指標で追加します.

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

この戦略は以下の方法で改善できます.

  1. より体系的なテストを用いてパラメータ最適化
  2. 他の指標,例えば移動平均値のシグナルフィルターを追加します.
  3. 価格変動を考慮し,ATRを使用してブレイクドローズルを調整する.
  4. トレンドと振動市場を区別してパラメータを調整する.
  5. ポジションのサイズのルールを強化する.例えば,大きな損失の後,新しいポジションを開設するのを止める.

概要

高低ブレイカーバックテスト戦略は,シンプルで実用的なトレンドフォロー戦略である.価格ブレイキング周期的な最高/最低価格に基づいて取引信号を生成する.この戦略には,シンプルさ,トレンドフォロー,パラメータ最適化などの利点があるが,過剰取引や振動する市場に対処できないようなリスクもある.そのパフォーマンスを向上させるために,パラメータ,シグナルフィルター,ポジションサイズ等をさらに最適化することができる.


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

//@version=3
strategy("High/Low Breaker Backtest 1.0", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, max_bars_back=700)

// Strategy Settings
takeProfitPercentageLong = input(.1, title='Take Profit Percentage Long', type=float)/100
stopLossPercentageLong = input(0.15, title='Stop Loss Percentage Long', type=float)/100
takeProfitPercentageShort = input(.1, title='Take Profit Percentage Short', type=float)/100
stopLossPercentageShort = input(0.15, title='Stop Loss Percentage Short', type=float)/100


candlesBack = input(title="Number of candles back",  defval=50)
useHighAndLows =  input(true, title="Use high and lows (uncheck to use close)", defval=true)
lastBarsBackMinimum =  input(title="Number of candles back to ignore for last high/low",  defval=30)
showHighsAndLows = input(true, title="Show high/low lines", defval=true)

getIndexOfLowestInSeries(series, period) => 
    index = 0
    current = series
    for i = 1 to period
        if series[i] <= current
            index := i
            current := series[i]
    index

getIndexOfHighestInSeries(series, period) => 
    index = 0
    current = series
    for i = 1 to period
        if series[i] >= current
            index := i
            current := series[i]
    index

indexOfHighestInRange = getIndexOfHighestInSeries(useHighAndLows ? high : close, candlesBack)
indexOfLowestInRange = getIndexOfLowestInSeries(useHighAndLows ? low : close, candlesBack)

max = useHighAndLows ? high[indexOfHighestInRange] : close[indexOfHighestInRange]
min = useHighAndLows ? low[indexOfLowestInRange] : close[indexOfLowestInRange]

barsSinceLastHigh = indexOfHighestInRange
barsSinceLastLow = indexOfLowestInRange

isNewHigh = (useHighAndLows ? high > max[1] : close > max[1]) and (barsSinceLastHigh[1] + 1 > lastBarsBackMinimum)
isNewLow = (useHighAndLows ? low < min[1] : close < min[1]) and (barsSinceLastLow[1] + 1 > lastBarsBackMinimum)

alertcondition(condition=isNewHigh, title="New High", message="Last High Broken")
alertcondition(condition=isNewLow, title="New Low", message="Last Low Broken")

if high > max 
    max := high
    barsSinceLastHigh := 0

if low < min
    min := low
    barsSinceLastLow := 0 

plot( showHighsAndLows ? max : na, color=red, style=line, title="High", linewidth=3)
plot( showHighsAndLows ? min : na, color=green, style=line, title="Low", linewidth=3)

// Strategy Entry/Exit Logic
goLong =isNewHigh
longStopLevel = strategy.position_avg_price * (1 - stopLossPercentageLong)
longTakeProfitLevel = strategy.position_avg_price * (1 + takeProfitPercentageLong)

goShort = isNewLow
shortStopLevel = strategy.position_avg_price * (1 + stopLossPercentageShort)
shortTakeProfitLevel = strategy.position_avg_price * (1 - takeProfitPercentageShort)

strategy.entry("Long", strategy.long, when=goLong)
strategy.exit("Long Exit", "Long", stop=longStopLevel, limit=longTakeProfitLevel)

strategy.entry("Short", strategy.short, when=goShort)
strategy.exit("Short Exit", "Short", stop=shortStopLevel, limit=shortTakeProfitLevel)
        
plot(goShort ? shortStopLevel : na, color=yellow, style=linebr, linewidth=2)
plot(goShort ? shortTakeProfitLevel : na, color=blue, style=linebr, linewidth=2)
plot(goLong ? longStopLevel : na, color=yellow, style=linebr, linewidth=2)
plot(goLong ? longTakeProfitLevel : na, color=blue, style=linebr, linewidth=2)


もっと