Обратное тестирование и оптимизация стратегии RSI

Автор:Чао Чжан, Дата: 2023-11-10 11:59:40
Тэги:

img

Обзор

Эта стратегия основана на индикаторе RSI (индекс относительной силы) для определения условий перекупления и перепродажи. Она занимает контртендные позиции, когда RSI достигает уровня перекупления или перепродажи, чтобы купить низко и продать высоко. Стратегия проста и эффективна, извлекая выгоду из краткосрочных сценариев перекупления и перепродажи на рынке.

Логика стратегии

Стратегия использует индикатор RSI исключительно в качестве входного сигнала. Она длится, когда RSI пересекает ниже низкой точки (по умолчанию 20), и становится короткой, когда RSI пересекает выше высокой точки (по умолчанию 80). Она торгует фиксированной суммой каждый раз (по умолчанию 100 долларов) и нацелена на 1% прибыли независимо от рыночных условий. Если потеря достигает 3%, она останавливается. Чтобы контролировать частоту торговли, стратегия прекращает торговлю на 24 бара после проигрышной торговли.

Основная логика такова:

  1. Использовать ИСО для определения перекупленности/перепроданности
  2. Продолжайте, когда RSI пересекается ниже 20
  3. Пройдите короткий, когда RSI пересекает 80
  4. Торговля фиксирована на $100 каждый раз
  5. Приобретение прибыли или остановка убытков для закрытия
  6. В случае убытка, приостановить торговлю на 24 бара

Как мы можем видеть, стратегия очень проста и механична. В ней практически нет места для оптимизации параметров. Она исключительно использует математические свойства RSI, чтобы занять позиции против тренда вокруг регионов перекупленности / перепроданности.

Анализ преимуществ

Главным преимуществом этой стратегии является простота и эффективность.

  1. Использует один индикатор RSI, не требует сложного технического анализа.
  2. Полностью механическая система, свободная от эмоционального вмешательства.
  3. Прибыль от краткосрочного отклонения без прогнозирования направления рынка.
  4. Риск управляется с помощью стоп-лосса/приобретения прибыли.

Он также внедряет коэффициенты стоп-лосс / take profit для блокировки прибыли и контроля рисков, а также приостановки торговли для снижения частоты.

Анализ рисков

Основными рисками этой стратегии являются:

  1. Невозможно получить прибыль на сильно развивающемся рынке. RSI может оставаться в зоне перекупа/перепродажи в течение длительного периода, когда тенденция сохраняется.

  2. Слишком широкий стоп-лосс может привести к чрезмерным потерям.

  3. Высокая частота торговли может привести к чрезмерной торговле после выигрыша.

  4. Концентрация рисков на 100 долларов должна быть оптимизирована до процента капитала.

Руководство по оптимизации

На основе анализа стратегия может быть улучшена следующими способами:

  1. Добавьте трендовый фильтр, такой как MA, чтобы приостановить торговлю, когда тенденция неясна.

  2. Оптимизируйте соотношение стоп-лосс/стоп-лосс/стоп-лосс.

  3. Ограничить частоту торгов, например, максимум 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)

Больше