Количественная торговая стратегия, основанная на гауссовой функции ошибок


Дата создания: 2024-01-19 14:28:03 Последнее изменение: 2024-01-19 14:28:03
Копировать: 1 Количество просмотров: 647
1
Подписаться
1617
Подписчики

Количественная торговая стратегия, основанная на гауссовой функции ошибок

Обзор

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

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

Ключевым показателем стратегии является P-Сигнал. Расчетная формула P-Сигнала выглядит следующим образом:

fPSignal(ser, int) => 
    nStDev = stdev(ser, int)
    nSma = sma(ser, int)
    fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)

Здесь ser представляет собой ценовую последовательность, int представляет собой параметр nPoints, то есть смотрите, сколько корней K. Формула состоит из трех частей:

  1. nStDev - стандартная разница цены;
  2. nSma - это простое скользящее среднее цены;
  3. fErf является функцией ошибки Гауса.

В целом формула означает, что движущийся средний ценовой индекс делится на стандартный разрыв цены, затем делится на sqrt ((2)), затем стандартизируется, затем отображается на диапазоне ((-1, 1) с помощью функции ошибки Гауса. То есть, если цена колеблется больше, чем средний, P-сигнал приближается к 1; если цена колеблется меньше, чем средний, P-сигнал приближается к -1.

Стратегия использует числовые значения P-сигнала и их изменение для принятия решений о входе и выходе:

strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)  

strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)

При P-сигнале меньше 0 и изменении на положительное, делается больше; при P-сигнале больше 0 и изменении на отрицательное, делается равновесие.

Стратегические преимущества

Эта стратегия имеет следующие преимущества:

  1. Использование Gaussian Error Function для приспособления к распределению цены. Gaussian Error Function хорошо подходит для нормального распределения, что соответствует характеристикам распределения большинства финансовых временных рядов.
  2. Автоматическая корректировка параметров с использованием стандартной разницы в ценах. Это позволяет более широкому диапазону параметров стратегии и более агрессивно реагировать на изменения рынка.
  3. Индекс P-Signal объединяет преимущества трендовых и реверсивных торгов. Он учитывает как тенденции колебаний цены, так и цены на обратные точки, что помогает в улавливании трендовых торгов и реверсивных торговых возможностей.

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

В этой стратегии также есть некоторые риски, в частности:

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

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

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

В этой стратегии есть место для дальнейшей оптимизации, в основном в направлении:

  1. Добавить условия фильтрации, чтобы избежать ложных сигналов. Например, в сочетании с другими показателями, сделать условия AND или OR, отфильтровать часть шума.
  2. Оптимизация параметров. Корректировка размера nPoints в разных разновидностях и периодах, улучшение стабильности стратегии.
  3. Принимать во внимание динамические параметры. Пусть параметры nPoints будут адаптироваться к колебаниям рынка, что может улучшить неустойчивость стратегии.
  4. В сочетании с методами машинного обучения. Используйте алгоритмы ИИ для оптимизации параметров, условий фильтрации и выбора многообразия.

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

В целом, основная идея стратегии является новой, используя функцию Гауса для приспособления распределения цен и автоматической корректировки диапазона параметров. Однако, как стратегия высокочастотного трейдинга, для стабильной прибыльности в реальном мире требуется дальнейшее тестирование и оптимизация, особенно в области контроля риска и корректировки параметров.

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

// **********************************************************************************************************
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// P-Signal Strategy © Kharevsky
// @version=4
// **********************************************************************************************************
strategy("P-Signal Strategy", precision = 3)
// Parameters and const of P-Signal.
nPoints = input(title = "Number of Bars", type = input.integer, defval = 9, minval = 4, maxval = 100, group = "Parameters of observation.")
int nIntr = nPoints - 1
// Horner's method for the error (Gauss) & P-Signal functions.
fErf(x) =>
    nT = 1.0/(1.0 + 0.5*abs(x))
    nAns = 1.0 - nT*exp(-x*x - 1.26551223 + 
     nT*( 1.00002368 + nT*( 0.37409196 + nT*( 0.09678418 + 
     nT*(-0.18628806 + nT*( 0.27886807 + nT*(-1.13520398 + 
     nT*( 1.48851587 + nT*(-0.82215223 + nT*( 0.17087277 ))))))))))
    x >= 0 ? nAns : -nAns
fPSignal(ser, int) => 
    nStDev = stdev(ser, int)
    nSma = sma(ser, int)
    fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
// Strat.
float nPSignal = sma(fPSignal(change(ohlc4), nIntr), nIntr)
float ndPSignal = sign(nPSignal[0] - nPSignal[1])
strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)
strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)
// Plotting. 
hline(+1.0, color = color.new(color.orange,70), linestyle = hline.style_dotted)
hline(-1.0, color = color.new(color.orange,70), linestyle = hline.style_dotted)
plot(nPSignal, color = color.blue, style = plot.style_line)
plot(strategy.position_size, color = color.white, style = plot.style_cross)
// Alerts.
if(strategy.position_size[0] > strategy.position_size[1])
    alert("P-Signal strategy opened the long position: " + syminfo.tickerid + " " + timeframe.period, alert.freq_once_per_bar)
if(strategy.position_size[0] < strategy.position_size[1])
    alert("P-Signal strategy closed the long position: " + syminfo.tickerid + " " + timeframe.period, alert.freq_once_per_bar)
// The end.