Квадратная стратегия торговли сигналами

Автор:Чао Чжан, Дата: 23 сентября 2023 года 15:40:57
Тэги:

Обзор

Эта стратегия приспосабливает квадратическую кривую к высоким/низким точкам баров, чтобы генерировать торговые сигналы, когда цена пробивается через установленные линии.

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

Ключевыми компонентами и правилами являются:

  1. Приспособление кривой в высоких/низких точках с использованием квадратной регрессии.

  2. Купить сигнал, когда ближайший перерыв выше верхней полосы.

  3. Продай сигнал, когда ближайший разрыв ниже нижней полосы.

  4. N периодов проверки для предотвращения ложных сбоев.

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

Стратегия пытается определить ключевые цены математически и торговать прорывами, типичной системой прорыва.

Преимущества

По сравнению с другими системами прорыва основными преимуществами являются:

  1. Математическое соответствие более объективно, чем субъективное суждение.

  2. Новый подход, объединяющий технический анализ и статистические модели.

  3. Многопериодная проверка позволяет избежать ложных сбоев.

  4. Обратное тестирование может оптимизировать выход и период ожидания.

  5. Легко внедряется с гибкими настройками.

  6. Модель обновляется автоматически без ручного вмешательства.

  7. Может проверять прочность параметров на продукты и временные рамки.

  8. Возможность дальнейшей оптимизации с помощью машинного обучения.

  9. В целом новый подход с исследовательской ценностью.

Риски

Однако риски заключаются:

  1. Производительность монтажа зависит от настройки параметров, риска перенастройки.

  2. Установленные линии задерживаются, не могут полностью избежать потерь.

  3. Нет подтверждения объема, риск попасть в ловушку.

  4. Статистический арбитраж является проблемой для стойкой альфы.

  5. Ограниченный период обратного тестирования, необходимо проверить прочность.

  6. Приспособимость к различным рынкам требует проверки.

  7. Фиксированный размер не имеет динамической настройки.

  8. Нужна строгая оценка соотношения вознаграждения/риска.

Усовершенствования

На основе анализа улучшения могут включать:

  1. Проверка надежности параметров в различных рыночных режимах.

  2. Добавьте индикаторы подтверждения объема.

  3. Оптимизировать логику входа/выхода для сигналов более высокого качества.

  4. Построение динамических моделей размеров позиций.

  5. Включайте остановки для ограничения потерь.

  6. Оптимизировать стратегии управления рисками.

  7. Подтверждение обратного теста.

  8. Оценить стабильность на многих рынках.

  9. Используйте машинное обучение для оптимизации модели.

Заключение

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


/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

strategy(title = " Strategy Quadratic Semaphore ",
         shorttitle = "SQS",
         overlay = true,
         precision = 8,
         calc_on_order_fills = true,
         calc_on_every_tick = true,
         backtest_fill_limits_assumption = 0,
         default_qty_type = strategy.fixed,
         default_qty_value = 2,
         initial_capital = 10000,
         pyramiding=5,
         currency = currency.USD,
         linktoseries = true)

//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

backTestSectionFrom = input(title = "═══════════════ From ═══════════════", defval = true, type = input.bool)

FromMonth         = input(defval = 1, title = "Month", minval = 1)
FromDay           = input(defval = 1, title = "Day", minval = 1)
FromYear          = input(defval = 2019, title = "Year", minval = 2014)

backTestSectionTo = input(title = "════════════════ To ════════════════", defval = true, type = input.bool)
ToMonth           = input(defval = 31, title = "Month", minval = 1)
ToDay             = input(defval = 12, title = "Day", minval = 1)
ToYear            = input(defval = 9999, title = "Year", minval = 2014)

Config            = input(title = "══════════════ Config ══════════════", defval = true, type = input.bool)
p = input(6)
length = input(30)
//
backTestPeriod() => (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59))
//
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

x1 = bar_index
x2 = sqrt(x1)
y = high
//
S11 = sum(x2,length) - sqrt(sum(x1,length)) / length  
S12 = sum(x1*x2,length) - (sum(x1,length) * sum(x2,length)) / length  
S22 = sum(sqrt(x2),length) - sqrt(sum(x2,length)) / length            
Sy1 = sum (y*x1,length) - (sum(y,length) * sum(x1,length)) / length   
Sy2 = sum (y*x2,length) - (sum(y,length) * sum(x2,length)) / length   
//
max1 = sma(x1,length) 
max2 = sma(x2,length)
may = sma(y,length)
b2 = ((Sy1 * S22) - (Sy2*S12))/(S22*S11 - sqrt(S12))
b3 = ((Sy2 * S11) - (Sy1 * S12))/(S22 * S11 - sqrt(S12))
b1 = may - b2*max1 - b3*max2
qr = b1 + b2*x1 + b3*x2
//
yl = low
//
Sy1l = sum(yl*x1,length) - (sum(yl,length) * sum(x1,length)) / length  
Sy2l = sum(yl*x2,length) - (sum(yl,length) * sum(x2,length)) / length  
//
mayl = sma(yl,length)
b2l = ((Sy1l * S22) - (Sy2l*S12))/(S22*S11 - sqrt(S12))
b3l = ((Sy2l * S11) - (Sy1l * S12))/(S22 * S11 - sqrt(S12))
b1l = mayl - b2l*max1 - b3l*max2
qrl = b1l + b2l*x1 + b3l*x2
//
period = round(p/2)+1
hh = qr[period]
ll = qrl[period]
countH = 0
countL = 0
buy=0
sell=0
//
for i = 1 to period-1
    if qr[i]<hh
        countH:=countH+1
    if qrl[i]>ll
        countL:=countL+1

for i = period+1 to p+1
    if qr[i]<hh
        countH:=countH+1
    if qrl[i]>ll
        countL:=countL+1

if countH==p
    pivotH = high[period]
    buy := 1
    
if countL==p
    pivotL = low[period]
    sell := 1
//    
plotshape(buy == 1 , text='💣', style=shape.arrowup, location=location.belowbar, color=#32CD32, textcolor=color.white, offset=0, transp=0,size=size.auto)
plotshape(sell == 1 , text='🔨', style=shape.arrowdown, location=location.abovebar, color=#FF0000, textcolor=color.white, offset=0, transp=0,size=size.auto)
//

if (backTestPeriod())
    strategy.entry("long", true, 1, when = buy == 1)
    strategy.entry("short", false, 1, when = sell == 1) 


Больше