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

作者: リン・ハーンチャオチャン,日付: 2023年11月10日 11:59:40
タグ:

img

概要

この戦略は,過剰購入および過剰販売条件を決定するために,RSI (相対強度指数) 指標に基づいています.RSIが過剰購入または過剰販売レベルに達すると,低価格で購入し高価格で販売するために反トレンドポジションをとります.この戦略は,短期的な過剰購入および過剰販売シナリオから利益を得て,シンプルかつ効果的です.

戦略の論理

この戦略は,RSIインジケーターをエントリー信号としてのみ使用する.RSIが低点 (20のデフォルト) 以下の値を超えるとロングになり,RSIが高点 (80のデフォルト) を超えるとショートする.毎回固定金額 (100のデフォルト) を取引し,市場の状況に関係なく1%の利益を目指す.損失が3%に達すると停止する.取引頻度を制御するために,戦略は負け取引後に24バーで取引を停止する.

基本的な論理は

  1. RSI を使って,買い過ぎ/売過ぎを判断する
  2. RSIが20を下回るとロング
  3. RSIが80を超えるとショート
  4. 取引は毎回100ドル固定
  5. 利益またはストップ損失を収める
  6. 損失の場合,24バーで取引を一時停止

この戦略は,非常にシンプルで機械的なものです.パラメータ最適化のためのスペースはほとんどありません.それは純粋に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)

もっと