RSI戦略のバックテストと最適化


作成日: 2023-11-10 11:59:40 最終変更日: 2023-11-10 11:59:40
コピー: 1 クリック数: 858
1
フォロー
1617
フォロワー

RSI戦略のバックテストと最適化

概要

この戦略は,相対的に強い指数 ((RSI) の指標に基づいて,オーバーバイオーバーセルの判断を行う. RSIがオーバーバイオーバーセール領域に到達すると,反転ポジションを確立し,低価格オーバーセルの目的を達成する. 戦略はシンプルで効率的で,市場の短期的なオーバーバイオーバーセルの現象を捕捉して利益を得る.

戦略原則

この戦略は,ポジション構築のシグナルとしてRSI指標のみを使用する.RSIが設定された低い値 (デフォルト20) を越えたときに多めに,RSIが設定された高い値 (デフォルト80) を越えたときに空いてください.取引毎に固定資金 (デフォルト100ドル) があり,どのような状況であっても,利益1%を追求した後で止まります.損失が3%に達した場合は止まります.取引頻度を制御するために,戦略は,損失の後に取引を停止する24根K線も設定されています.

この戦略の核心的な論理は,

  1. RSIで 超買いと超売りを判断する
  2. RSIは20時以降に
  3. RSIは80で空いている.
  4. 100ドルで開設しました
  5. ストップオフまたはストップオフ後の平仓
  6. 負債の場合は,次のK線で24K線を停止し,取引をしない.

この戦略は非常にシンプルで,パラメータの最適化にはほとんど余地がないことがわかります.これは,RSI指標の数学的な特性を純粋に利用し,超買い超売り領域で逆転ポジションを立て,反転利得を得ます.

優位分析

この戦略の最大の利点は,単純で効率的であることです.

  1. 単一のRSIを使用し,複雑な技術分析を必要としません.
  2. 完全に機械的な取引システムであり,個人の感情に影響を受けない.
  3. 短期的な市場偏差の数学的な特性を利用して利益を得るために,市場動向を予測する必要はありません.
  4. 資金管理規範,リスク管理のためのストップ・ストップ・メカニズム

さらに,戦略は,利益とリスクを制御するためにストップ・ストップ・レッセンスを設定し,取引頻度を減らすために取引停止メカニズムを設定します.これは,戦略が最小限のリスクで安定した利益を得ることを可能にします.

リスク分析

この戦略の主なリスクは以下のものです.

  1. 傾向が非常に強い場合,RSIは長期にわたって超買いまたは超売り領域にあり,反転のチャンスはほとんどなく,この戦略は利益を得ることが困難になります.

  2. 止損設定が大きすぎると損失が拡大する可能性があります.現在の止損は3%で,1-2%に調整する必要があるかもしれません.

  3. 取引頻度が高すぎると利潤を得やすく,その後もポジションを建設し,ポジション開設頻度を適切に制御すべきである.

  4. 固定資産は100ドルで開設されても過度なリスクが集中し,資金の割合として最適化する必要があります.

最適化の方向

上記の分析から,この戦略は以下のような点で最適化できる:

  1. トレンド判定指標のMAを追加し,トレンドが不明な場合は取引を一時停止する.

  2. ストップ・ストップの比率を最適化して,ストップ・ストップの調整を1-2%に合理化し,ストップ・ストップを浮動ストップとして設定することができる.

  3. ポジション開設の頻度制限を増加させ,例えば,特定の時間内に1-2回しか開設することが許されない.

  4. 固定資金の100ドルを 資金のパーセントに変更します. 例えば”%。

  5. RSI周期,超買超売領域などのパラメータの組み合わせを最適化します.

  6. ポジションコントロールを増加させ,初期資本を増加させるときは,単一取引資金を増加させない.

上記のポイントを最適化することで,取引リスクを効果的に軽減し,戦略の安定性と信頼性を向上させることができます.

要約する

この戦略は,全体的に非常に単純で直接で,RSI指標によって超買い超売り判断により短期反転利得を得る.利点は,単純で高効率で,予測する必要なく,取引ロジックは明確で,容易に追及・検証できる.しかし,トレンドの状況に対処するのは難しいかもしれない.一定の損失のリスクがある.トレンド判断,パラメータ設定の最適化,ポジションの制御などの方法を導入することにより,戦略の安定性と収益性をさらに高めることができる.この戦略のアイデアは新鮮で,実際の取引価値があり,合理的な適用があればよりよい効果を得ることができる.

ストラテジーソースコード
/*backtest
start: 2023-11-02 00:00:00
end: 2023-11-09 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("rsi超买超卖_回测用", overlay=false, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash)
open_pos = input.int(50000, title = "每次开单资金(usdt)")
rsi_period = input.int(14, title = "rsi周期")
rsi_line      = input.float(20.0,      title='RSI触发线',      step=0.05)
stop_rsi_top_line = input.float(70, title = "顶部rsi止损线")
stop_rsi_bottom_line = input.float(30, title = "底部rsi止损线")
stop_loss_perc = input.float(0.03, title = "止损线")
stop_profit = input.float(0.01, title = "止盈")
loss_stop_trade_k = input.int(24, title = "亏损后x根K线不做交易")


rsiParam = ta.rsi(close, rsi_period)

var int failedTimes = 0
var bool stopTrade = false

// plot(rsiParam)

if stopTrade
    failedTimes += 1
    if failedTimes == loss_stop_trade_k
        failedTimes := 0
        stopTrade := false



// 获取当前持仓方向
checkCurrentPosition() =>
    strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0

curPosition = checkCurrentPosition()

// 当前持仓成本价
position_avg_price = strategy.position_avg_price


// 当前持单, 触达反向的rsi线,清仓
if curPosition > 0 and rsiParam >= stop_rsi_top_line
    strategy.close_all(comment = "closebuy")

if curPosition < 0 and rsiParam <= stop_rsi_bottom_line
    strategy.close_all(comment = "closesell")


// 止盈止损清仓
if curPosition > 0
    // if (position_avg_price - close) / close >= stop_loss_perc
    //     // 止损
    //     strategy.close_all(comment = "closebuy")
    //     stopTrade := true
    if (close - position_avg_price) / position_avg_price >= stop_profit
        // 止盈
        strategy.close_all(comment = "closebuy")



if curPosition < 0
    // if (close - position_avg_price) / position_avg_price >= stop_loss_perc
    //     // 止损
    //     strategy.close_all(comment = "closesell")
    //     stopTrade := true

    if (position_avg_price - close) / close >= stop_profit
        // 止盈
        strategy.close_all(comment = "closesell")


a = strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1)

if bar_index == a and strategy.closedtrades.profit(strategy.closedtrades - 1) < 0
    stopTrade := true

var float openPrice = 0.0



if rsiParam <= rsi_line and stopTrade == false
	strategy.entry("long", strategy.long, open_pos / close, comment = "long")
    if curPosition == 0
        openPrice := close
    strategy.exit("long_stop", "long", limit = openPrice * (1+stop_profit), stop=openPrice * (1-stop_loss_perc), comment = "closebuy")

if rsiParam >= 100 - rsi_line and stopTrade == false
    strategy.entry("short", strategy.short, open_pos / close, comment = "short")
    if curPosition == 0
        openPrice := close
    strategy.exit("short_stop", "short", limit = openPrice * (1-stop_profit), stop=openPrice * (1+stop_loss_perc), comment = "closesell")




plot(failedTimes)