Стратегия масштабируемой нормализованной векторной торговли с оптимизацией функции активации


Дата создания: 2024-01-22 09:02:30 Последнее изменение: 2024-01-22 09:02:30
Копировать: 0 Количество просмотров: 578
1
Подписаться
1617
Подписчики

Стратегия масштабируемой нормализованной векторной торговли с оптимизацией функции активации

Обзор

Эта стратегия является улучшением стратегии drkhodakarami по масштабированию и унификации векторов, в основном добавляя функцию активации, чтобы повысить производительность стратегии. Стратегия использует разницу во времени, чтобы рассчитать изменение рыночных курсов, и делает больше пустых сигналов с помощью приостановки. Кроме того, стратегия вводит функции активации swish, ReLU и step, которые могут сглаживать последовательность дифференциации и повышать точность оценки сигналов.

Стратегический принцип

  1. Вычислить процентное изменение цены закрытия на установленной временной оси
  2. передать x в функцию активации и получить обработанную последовательность
  3. Положительная отрицательная граница th, когда p выше th, и пустая при прохождении -th
  4. Отключить переключение, чтобы избежать ложных сигналов

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

  1. Введение функции активации, которая фильтрует шум и улучшает качество сигналов.
  2. Добавлена логика открытия и закрытия позиций для автоматической торговли.
  3. Добавление пространства для настройки параметров для большего количества рынков
  4. Отличный визуальный дизайн, интуитивно отражающий торговые сигналы

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

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

Решение проблемы:

  1. Настройка параметров для поиска оптимальных значений
  2. Попробуйте различные функции активации, чтобы найти наиболее подходящий.
  3. Добавление перепланировки логики обнаружения для подтверждения эффективности сигнала

Направление оптимизации

  1. Увеличение адаптивной отметки
  2. Оптимизация параметров функции активации
  3. Включение автоматической логики остановки убытков
  4. Вместе с другими факторами фильтрации

Подвести итог

Эта стратегия основана на drkhodakarami, внедряет функцию активации для повышения производительности, расширяет пространство для оптимизации параметров, чтобы лучше адаптироваться к изменениям на рынке. При этом отличный визуальный дизайн, интуитивно отражающий торговые возможности. Впоследствии можно продолжить оптимизацию функции активации с установкой порога, а также добавить логику остановки с большей фильтрацией сигналов, чтобы получить лучший эффект от стратегии.

Исходный код стратегии
/*backtest
start: 2023-01-15 00:00:00
end: 2024-01-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// author: capissimo
strategy("Scaled Normalized Vector Strategy, ver.4", precision=2, overlay=false)
// This is a modification of my Scaled Normalized Vector Strategy  
// original: Drkhodakarami (https://www.tradingview.com/script/Fxv2xFWe-Normalized-Vector-Strategy-By-Drkhodakarami-Opensource/)

price    = input(close,  "Price Data")
tf       = input(18,     "Timeframe", minval=1, maxval=1440)
thresh   = input(14.,    "Threshold", minval=.1, step=.1) 
div      = input(1000000,"Divisor", options=[1,10,100,1000,10000,100000,1000000,10000000,100000000])
mmx      = input(233,    "Minimax Lookback", options=[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584])
showVol  = input(false,  "Volume")
useold   = input(true,   "Use Old System")
method   = input("Swish", "Activation", options=["Step", "LReLU", "Swish", "None"])

scaleMinimax(X, p, min, max) => 
    hi = highest(X, p), lo = lowest(X, p)
    (max - min) * (X - lo)/(hi - lo) + min

getdiff(prc, tf) =>
    prev  = scaleMinimax((useold ? security(syminfo.tickerid, tostring(tf), prc[1], barmerge.gaps_off, barmerge.lookahead_on) 
                                 : security(syminfo.tickerid, tostring(tf), prc[1])), tf, 0, 1)
    curr  = scaleMinimax((useold ? security(syminfo.tickerid, tostring(tf), hlc3, barmerge.gaps_off, barmerge.lookahead_on)  
                                 : security(syminfo.tickerid, tostring(tf), hlc3)), tf, 0, 1)
    (curr/prev) - 1

relu(x) => max(x, 0)
lrelu(x, alpha) => relu(x) - alpha * relu(-x)
step(x) => x >= 0 ? 1 : -1
log2(x) => log(x) / log(2)
sigmoid(x) => 1 / (1 + exp(-x))
swish(x) => x * sigmoid(x)

f(m) => method==m

vol  = useold ? security(syminfo.tickerid, tostring(tf), volume, barmerge.gaps_off, barmerge.lookahead_on) 
              : security(syminfo.tickerid, tostring(tf), volume)
obv  = cum(change(price) > 0 ? vol : change(price) < 0 ? -vol : 0*vol)
prix = showVol ? obv : price
x    = getdiff(prix, tf)
p    = f("Swish") ? swish(x) : f("Step") ? step(x) : f("LReLU") ? lrelu(x, .8) : x
th   = thresh/div
long = crossover(p, th)
short= crossunder(p, -th)

lime  = color.new(color.lime, 10), fuchsia = color.new(color.fuchsia, 10), 
black = color.new(color.black, 100), gray = color.new(color.gray, 50)
bg    = long ? lime : short ? fuchsia : black
cl    = p > th ? color.green : p < -th ? color.red : color.silver

bgcolor(bg, editable=false)
plot(scaleMinimax(th, mmx, -1, 1), color=lime, editable=false, transp=0)
hline(0, linestyle=hline.style_dotted, title="base line", color=gray, editable=false)
plot(scaleMinimax(-th, mmx, -1, 1), color=fuchsia, editable=false, transp=0)
plot(scaleMinimax(p, mmx, -1, 1), color=cl, style=plot.style_histogram, transp=70, editable=false)
plot(scaleMinimax(p, mmx, -1, 1), color=cl, style=plot.style_linebr, title="prediction", transp=0, editable=false)

strategy.entry("L", true, 1, when=long)
strategy.entry("S", false, 1, when=short)

alertcondition(long, title='Long', message='Long Signal!')
alertcondition(short, title='Short', message='Short Signal!')

//*** Karobein Oscillator
per  = input(8, "Karobein Osc Lookback")

prix2 = ema(price, per)
a = ema(prix2 < prix2[1] ? prix2/prix2[1] : 0, per)
b = ema(prix2 > prix2[1] ? prix2/prix2[1] : 0, per)
c = (prix2/prix2[1])/(prix2/prix2[1] + b)
d = 2*((prix2/prix2[1])/(prix2/prix2[1] + c*a)) - 1

plot(scaleMinimax(d, mmx, -1, 1), color=color.orange, transp=0)