Масштабированная нормализованная векторная стратегия с функциями активации, вер.4

Автор:Чао Чжан, Дата: 2024-01-22 09:02:30
Тэги:

img

Обзор

Это улучшение стратегии drkhodakarami, в основном добавляя функции активации для повышения производительности стратегии. Стратегия рассчитывает скорость изменения на рынке на основе разницы во времени и определяет длинные и короткие сигналы на основе пороговых значений.

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

  1. Вычислить процентное изменение цены х закрытия по установленному временному диапазону
  2. Передать x в функцию активации, чтобы получить обработанную последовательность p
  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)


Больше