Динамическая сетка - количественная стратегия торговли, следующая за тенденцией

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

img

Обзор

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

Принцип стратегии

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

  1. Во-первых, определите верхнюю и нижнюю границы сетки и количество линий сетки на основе настроек пользователя.

  2. В пределах определенных границ разделить ценовой диапазон на несколько сеток. Каждая линия сетки соответствует цене покупки или продажи.

  3. Когда цена достигает каждой линии сетки, стратегия проверяет, уже ли удерживается позиция, соответствующая линии сетки. Если нет, она открывает позицию и покупает, если да, то закрывает позицию и продает.

  4. Продавая на относительно высоких позициях и покупая на низких позициях, стратегия может постоянно получать прибыль при колебаниях цен.

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

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

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

Эта стратегия динамической сети имеет следующие преимущества:

  1. Высокая адаптивность: он может адаптироваться к различным рынкам и сортам с помощью параметров, и имеет хорошую адаптивность к колебаниям рынков.

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

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

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

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

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

Хотя эта стратегия имеет очевидные преимущества, она также несет определенные риски:

  1. Риск тренда: если цена прорвется через границу сетки с сильным односторонним трендом, пространство прибыли этой стратегии будет ограничено, и она может столкнуться с большим ретрекшером.

  2. Сложность в оптимизации параметров. Эта стратегия имеет много параметров, включая количество сеток, начальные границы, динамические граничные параметры и т. Д. Различные комбинации параметров оказывают большое влияние на производительность стратегии, и фактическая сложность оптимизации не мала.

  3. Частая торговля: сетевая стратегия - это по сути высокочастотная стратегия с очень частыми открытиями и закрытиями позиций, что означает более высокие затраты на транзакции и потенциальные риски скольжения.

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

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

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

На основе вышеуказанного анализа направления оптимизации этой стратегии включают в себя в основном:

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

  2. Оптимизируйте поиск параметров. Используйте интеллектуальные алгоритмы для оптимизации параметров сетки, таких как генетические алгоритмы, алгоритмы роя частиц и т. Д., Чтобы автоматически найти оптимальную комбинацию параметров и повысить эффективность и качество оптимизации.

  3. Улучшить логику управления рисками. Добавить больше логики управления рисками в стратегию, например, динамически корректировать ширину сетки в зависимости от волатильности цен, установить максимальный порог ретрексейнга для запуска закрытия и т. Д., Чтобы лучше контролировать риски.

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

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

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

Резюме

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

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


/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("(IK) Grid Script", overlay=true, pyramiding=14, close_entries_rule="ANY", default_qty_type=strategy.cash, initial_capital=100.0, currency="USD", commission_type=strategy.commission.percent, commission_value=0.1)
i_autoBounds    = input(group="Grid Bounds", title="Use Auto Bounds?", defval=true, type=input.bool)                             // calculate upper and lower bound of the grid automatically? This will theorhetically be less profitable, but will certainly require less attention
i_boundSrc      = input(group="Grid Bounds", title="(Auto) Bound Source", defval="Hi & Low", options=["Hi & Low", "Average"])     // should bounds of the auto grid be calculated from recent High & Low, or from a Simple Moving Average
i_boundLookback = input(group="Grid Bounds", title="(Auto) Bound Lookback", defval=250, type=input.integer, maxval=500, minval=0) // when calculating auto grid bounds, how far back should we look for a High & Low, or what should the length be of our sma
i_boundDev      = input(group="Grid Bounds", title="(Auto) Bound Deviation", defval=0.10, type=input.float, maxval=1, minval=-1)  // if sourcing auto bounds from High & Low, this percentage will (positive) widen or (negative) narrow the bound limits. If sourcing from Average, this is the deviation (up and down) from the sma, and CANNOT be negative.
i_upperBound    = input(group="Grid Bounds", title="(Manual) Upper Boundry", defval=0.285, type=input.float)                      // for manual grid bounds only. The upperbound price of your grid
i_lowerBound    = input(group="Grid Bounds", title="(Manual) Lower Boundry", defval=0.225, type=input.float)                      // for manual grid bounds only. The lowerbound price of your grid.
i_gridQty       = input(group="Grid Lines",  title="Grid Line Quantity", defval=8, maxval=15, minval=3, type=input.integer)       // how many grid lines are in your grid

f_getGridBounds(_bs, _bl, _bd, _up) =>
    if _bs == "Hi & Low"
        _up ? highest(close, _bl) * (1 + _bd) : lowest(close, _bl)  * (1 - _bd)
    else
        avg = sma(close, _bl)
        _up ? avg * (1 + _bd) : avg * (1 - _bd)

f_buildGrid(_lb, _gw, _gq) =>
    gridArr = array.new_float(0)
    for i=0 to _gq-1
        array.push(gridArr, _lb+(_gw*i))
    gridArr

f_getNearGridLines(_gridArr, _price) =>
    arr = array.new_int(3)
    for i = 0 to array.size(_gridArr)-1
        if array.get(_gridArr, i) > _price
            array.set(arr, 0, i == array.size(_gridArr)-1 ? i : i+1)
            array.set(arr, 1, i == 0 ? i : i-1)
            break
    arr

var upperBound      = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true) : i_upperBound  // upperbound of our grid
var lowerBound      = i_autoBounds ? f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false) : i_lowerBound // lowerbound of our grid
var gridWidth       = (upperBound - lowerBound)/(i_gridQty-1)                                                       // space between lines in our grid
var gridLineArr     = f_buildGrid(lowerBound, gridWidth, i_gridQty)                                                 // an array of prices that correspond to our grid lines
var orderArr        = array.new_bool(i_gridQty, false)                                                              // a boolean array that indicates if there is an open order corresponding to each grid line

var closeLineArr    = f_getNearGridLines(gridLineArr, close)                                                        // for plotting purposes - an array of 2 indices that correspond to grid lines near price
var nearTopGridLine = array.get(closeLineArr, 0)                                                                    // for plotting purposes - the index (in our grid line array) of the closest grid line above current price
var nearBotGridLine = array.get(closeLineArr, 1)                                                                    // for plotting purposes - the index (in our grid line array) of the closest grid line below current price
strategy.initial_capital = 50000
for i = 0 to (array.size(gridLineArr) - 1)
    if close < array.get(gridLineArr, i) and not array.get(orderArr, i) and i < (array.size(gridLineArr) - 1)
        buyId = i
        array.set(orderArr, buyId, true)
        strategy.entry(id=tostring(buyId), long=true, qty=(strategy.initial_capital/(i_gridQty-1))/close, comment="#"+tostring(buyId))
    if close > array.get(gridLineArr, i) and i != 0
        if array.get(orderArr, i-1)
            sellId = i-1
            array.set(orderArr, sellId, false)
            strategy.close(id=tostring(sellId), comment="#"+tostring(sellId))

if i_autoBounds
    upperBound  := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, true)
    lowerBound  := f_getGridBounds(i_boundSrc, i_boundLookback, i_boundDev, false)
    gridWidth   := (upperBound - lowerBound)/(i_gridQty-1)
    gridLineArr := f_buildGrid(lowerBound, gridWidth, i_gridQty)

closeLineArr    := f_getNearGridLines(gridLineArr, close)
nearTopGridLine := array.get(closeLineArr, 0)
nearBotGridLine := array.get(closeLineArr, 1)







Больше