資源の読み込みに... 荷物...

SMAクロスオーバー・ロング・ショート戦略,ピーク・ドラウダウン制御と自動終了

作者: リン・ハーンチャオチャン, 日時: 2024-07-29 14:16:58
タグ:SMA

img

概要

この戦略は,シンプル・ムービング・アベア (SMA) のクロスオーバー・シグナルとピーク・ドラウダウン・コントロールを組み合わせたロング・ショート・トレーディング・システムである. 戦略のピーク・ドラウダウンを同時にモニターしながら,ロング・ショート・トレーディング・シグナルを生成するために14期および28期SMAのクロスオーバーを使用する. ドラウダウンが事前に設定された値を超えると,戦略は自動的に取引を停止する. さらに,戦略には,トレーダーが戦略のリスク特性をよりよく理解するのに役立つ詳細なピークから底までサイクルの分析機能が含まれています.

戦略原則

  1. 貿易信号生成:

    • 長期信号は,14期SMAが28期SMAを超えると生成される.
    • 短信号は,14期間のSMAが28期間のSMAを下回ると生成されます.
  2. ピーク抽出制御:

    • ストラテジーの株式曲線をリアルタイムで追跡し,歴史的な高点 (ピーク) を記録します.
    • 流動資本がピークを下回ると,引き下げ状態に入り,最低点 (底辺) を記録する.
    • 引き上げ率は以下のように計算されます: (ピーク - トロー) /ピーク * 100%.
    • 引き上げ率は,既定の最大引き上げ限界を超えると,戦略は新しいポジションの開設を停止します.
  3. ピークからサイクルまで分析:

    • 最低抽出パーセントを設定して,有効なピークから底辺までのサイクルを定義する.
    • 完了した有効サイクルごとに,サイクル番号,以前の実行率,利用率,終了時間を記録する.
    • 戦略の過去の業績を簡単に見直すための表形式を表示する分析結果です.

戦略 の 利点

  1. トレンドフォローとリスクコントロールを組み合わせます SMAクロスオーバー戦略は,典型的なトレンドフォロー方法であり,ピークドラウダウン制御はリスク管理の追加の層を提供します.この組み合わせは,市場のトレンドを把握しながら下向きリスクを効果的に制御することができます.

  2. 高度な適応性 最大抽出率と最小抽出率のパラメータ化により,戦略は異なる市場環境と個人のリスク優先順位に柔軟に調整できます.

  3. 透明性のあるリスク指標 ピークから底までサイクルの分析は,詳細な履歴的な引き下げ情報を提供し,トレーダーは戦略のリスク特性を直感的に理解し,より情報に基づいた取引決定に役立ちます.

  4. 自動リスク管理: 引き上げが既定しきい値を超えると,戦略は自動的に取引を停止します.このメカニズムは,不利な市場状況下で継続的な損失を効果的に防ぐことができます.

  5. 総合的な性能分析 従来のバックテストメトリックに加えて,戦略は,戦略のパフォーマンスの詳細な分析を容易にする,ランアップパーセント,引き上げパーセント,時間情報を含む,ピークから底までサイクルの詳細なデータを提供します.

戦略リスク

  1. 歴史的データへの過度な依存: SMAクロスオーバー戦略は,過去の価格データに基づいているため,急速に変化する市場ではゆっくり反応し,誤った信号を引き起こす可能性があります.

  2. 頻繁に取引する 振動する市場では,SMAは頻繁に交差し,過剰な取引と高い取引コストを引き起こす可能性があります.

  3. 大量の引き上げの可能性: 最大の引き上げ規制にもかかわらず,深刻な市場変動の際に一度の大幅な引き下げは,依然として重大な損失をもたらす可能性があります.

  4. パラメータ感度: 戦略のパフォーマンスは,SMA期間と引き上げ限界値の選択に大きく依存する.パラメータの設定が正しくない場合,不適正な結果をもたらす可能性があります.

  5. 失敗 する 機会 取引が停止すると,市場逆転によってもたらされた機会を逃す可能性があります.

戦略の最適化方向

  1. 動的パラメータ調整を導入する: 市場変動に基づいて,SMA期間と引き上げ限界を動的に調整し,異なる市場環境に適応することを検討する.

  2. 追加の市場フィルター: RSIやボリュームなどの他の技術指標や基本的要因を組み込み,潜在的な誤った信号をフィルタリングします.

  3. 段階的な入国と退出を実施する: "すべてか何も"ではなく,段階的なポジション構築と閉鎖を実施し,単一の決定のリスクを減らす.

  4. 利潤のメカニズムを追加します 引き下げ制御に加えて 収益を固定し 総利益率を向上させる ダイナミックな利益引き上げ機能を追加します

  5. お金 の 管理 を 最適 に する リスク管理の改善のために,口座の大きさと市場の変動に基づいて動的ポジションサイズを導入する.

  6. 機械学習アルゴリズムを導入する: マシン・ラーニング技術を使用して,パラメータ選択と信号生成プロセスを最適化し,戦略の適応性と精度を向上させる.

結論

SMAクロスオーバー・ロング・ショート戦略は,ピーク・ドラウダウン制御と自動終了と組み合わせて,トレンドフォローとリスク管理をバランスする定量的な取引システムである. シンプルな移動平均クロスオーバーを通じて市場のトレンドを把握し,ピーク・ドラウダウン制御を使用してダウンサイドリスクを管理する. この戦略のユニークな特徴は,詳細なピークから底までサイクルの分析にあり,トレーダーは戦略のリスク特性を深く理解するためのツールを提供します.

この戦略には,歴史的なデータやパラメータの敏感性への過度に依存など,固有のリスクがあるが,適切な最適化と改善によってその強度と収益性を大幅に向上させることができる.これらは,動的パラメータ調整を導入し,追加の市場フィルターを追加し,スマートなマネーマネジメントを実装することを含む.

この戦略は,トレーダーに良い出発点を提供し,個々の取引目標とリスクの好みを満たすためにさらにカスタマイズされ最適化することができます. 戦略のモジュール式デザインは,他の取引戦略またはリスク管理技術と簡単に統合できるようになり,より複雑で包括的な取引システムの構築の基礎を築きます.


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

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

capital = 10000

//@version=5
strategy(title = "Correct Strategy Peak-Drawdown Cycles [Tradingwhale]", shorttitle = "Peak-Draw [Tradingwhale]", initial_capital = capital, overlay=true, margin_long=100, margin_short=100)

// The code below is from Tradingwhale LLC
/// ==============================================================================
//  Peak-Trough Cycles with Date and Prev. RunUp
// Initialize variables
showTable = input.bool(true, title = "Plot Peak to Bottom Drawdown Cycles table?")
min_trough = input.float(3.0, title = "Define Minimum Drawdown/Trough to Display (%)", minval = 1, maxval = 100, step = 0.5, tooltip = "Peaks and Trough Cycles have to be roped in by either a lookback period or minmimum troughs to show. If you don't then every bar could be a peak or trough/bottom. I've decided to use minimum declines here because lookback seems more arbitrary.")
maxdraw = input.float(40.0, title = "Max Drawdown", minval = 1, maxval = 100, step = 0.5, tooltip = "Define the drawdown level where the srtategy stops executing trades.")

var float equityPeak = na
var float equityTrough = na
var int cycleCount = 0
var bool inDrawdown = false
var float initialCapital = capital
var float prevTrough = initialCapital
var float prevRunUp = na
var bool useLighterGray = true
var int lastYear = na

// Variable to indicate whether the strategy should end
var bool end_strategy = false

// Table to display data
var table resultTable = table.new(position.top_right, 5, 30, bgcolor=#ffffff00, frame_color=#4f4040, frame_width=1)

// Function to convert float to percentage string
f_to_percent(value) =>
    str.tostring(value, "#.##") + "%"

// Function to get month/year string without commas
get_month_year_string() =>
    str.tostring(year) + "/" + str.tostring(month)

// Update the table headers
if (bar_index == 0 and showTable)
    table.cell(resultTable, 0, 0, "Show Min Trough: " + f_to_percent(min_trough), bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 1, 0, "Cycle Count", bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 2, 0, "Prev.RunUp(%)", bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 3, 0, "Drawdown(%)", bgcolor=#a8a8a88f, text_size=size.normal)
    table.cell(resultTable, 4, 0, "Year/Month", bgcolor=#a8a8a88f, text_size=size.normal)

// Track peaks and troughs in equity
if (na(equityPeak) or strategy.equity > equityPeak)
    if (inDrawdown and strategy.equity > equityPeak and not na(equityTrough)) // Confirm end of drawdown cycle
        drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100
        if drawdownPercentage > min_trough
            cycleCount += 1
            prevRunUp := (equityPeak - prevTrough) / prevTrough * 100
            if cycleCount <= 20 and showTable
                currentYear = year
                if na(lastYear) or currentYear != lastYear
                    useLighterGray := not useLighterGray
                    lastYear := currentYear
                rowColor = useLighterGray ? color.new(color.gray, 80) : color.new(color.gray, 50)
                table.cell(resultTable, 1, cycleCount, str.tostring(cycleCount), bgcolor=rowColor, text_size=size.normal)
                table.cell(resultTable, 2, cycleCount, f_to_percent(prevRunUp), bgcolor=rowColor, text_size=size.normal)
                table.cell(resultTable, 3, cycleCount, f_to_percent(drawdownPercentage), bgcolor=rowColor, text_size=size.normal)
                table.cell(resultTable, 4, cycleCount, get_month_year_string(), bgcolor=rowColor, text_size=size.normal)
            prevTrough := equityTrough
    equityPeak := strategy.equity
    equityTrough := na
    inDrawdown := false
else if (strategy.equity < equityPeak)
    equityTrough := na(equityTrough) ? strategy.equity : math.min(equityTrough, strategy.equity)
    inDrawdown := true

// Calculate if the strategy should end
if not na(equityPeak) and not na(equityTrough)
    drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100
    if drawdownPercentage >= maxdraw
        end_strategy := true


// This code below is from Tradingview, but with additions where commented (see below)

longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/
    strategy.entry("My Short Entry Id", strategy.short)



関連性

もっと