Количественная стратегия адаптивного скользящего среднего


Дата создания: 2023-11-17 17:14:36 Последнее изменение: 2023-11-17 17:14:36
Копировать: 0 Количество просмотров: 713
1
Подписаться
1617
Подписчики

Количественная стратегия адаптивного скользящего среднего

Обзор

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

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

Эта стратегия использует адаптивную скользящую среднюю как торговый сигнал. Сначала вычисляется простая скользящая средняя за заданный период (start), затем тестируется комбинация параметров вокруг CMA, чтобы определить, какая комбинация CMA-линий наименее часто соприкасается с объектами K-линий и теневой линией.

В частности, стратегия будет тестировать CMA-линии после циклов CMA плюс 1 ((CMA_P1) и минус 1 ((CMA_M1) количество раз, когда статистические линии и теневые линии касаются их. Если число касаний CMA меньше, чем CMA_P1 и CMA_M1, то сохраняется текущий цикл CMA; если число касаний CMA_P1 меньше, то цикл CMA плюс 1; если число касаний CMA_M1 меньше, то цикл CMA минус 1. Таким образом, можно найти относительно гладкий CMA в качестве сигнальной линии.

Когда цена снизу вверх нарушает CMA, создается сигнал купить; когда цена снизу вверх нарушает CMA, создается сигнал продать.

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

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

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

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

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

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

  5. Расширяемость. Идея стратегии может быть распространена на другие показатели, чтобы разработать стратегии, такие как адаптация к лентам Брин, адаптация к KD.

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

Однако есть некоторые риски, о которых следует помнить:

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

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

  3. Риск обратного тренда. Возвращение после входа в трендовый рынок требует своевременного переключения направления, в противном случае это может привести к убыткам.

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

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

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

В этом случае вы можете оптимизировать свою стратегию, используя:

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

  2. Добавление стратегии стоп-лосса, когда цена возвращается на другую сторону движущейся средней.

  3. Добавление фильтрации опционов, чтобы избежать ошибочных сигналов в рынке опционов.

  4. Введение оценочных показателей для ограничения на корректировку параметров, таких как IC, LIC, SIC и т. Д., Чтобы избежать чрезмерной оптимизации параметров.

  5. Расширить на другие показатели, разработать адаптированную стратегию Gold Fork Dead Fork, адаптированную стратегию Brin Belt и т. Д.

  6. Оптимизация методов расчета скользящих средних с использованием сглаженных скользящих средних, таких как скользящие средние с использованием взвешенных скользящих средних, скользящие средние с использованием показателей.

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

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

||

Overview

This strategy is based on moving average, can automatically adjust parameters, and is suitable for wavy markets at high timeframes. It can automatically find the optimal parameter combination and generate trading signals when price breaks through the moving average line.

Strategy Logic

This strategy uses an adaptive moving average as trading signal. First it calculates the simple moving average (CMA) of the specified period (start). Then it tests the CMA parameters around the period, judging which combination has the least touches by candlestick body and wick. Finally it uses the CMA with the least touches as the signal line.

Specifically, the strategy tests the CMA with period plus 1 (CMA_P1) and minus 1 (CMA_M1), counts the number of touches by body and wick. If CMA has less touches than CMA_P1 and CMA_M1, then keep the current period; if CMA_P1 has less touches, then increase the period by 1; if CMA_M1 has less touches, then decrease the period by 1. This finds a relatively smooth CMA as the signal line.

When price breaks through CMA upward, a buy signal is generated; when price breaks through CMA downward, a sell signal is generated.

Advantage Analysis

This adaptive moving average strategy has the following advantages:

  1. Automatically find optimal parameters. No need to manually select moving average period, the strategy will test different periods and find the optimum.

  2. Reduce false signals. Compared with fixed period MA, the adaptive MA can filter out more noise and reduce many false signals.

  3. Adapt to market changes. When market switches from range-bound to trending, the MA period will automatically increase to generate signals; when market switches from trending to range-bound, the MA period will automatically decrease. So the strategy can dynamically adapt to market changes.

  4. Simplify trading system. This adaptive method can simplify the whole trading system without manual parameter optimization.

  5. Good scalability. The concept can be applied to other indicators like adaptive Bollinger Bands, adaptive KD etc.

Risk Analysis

There are also some risks to note for this strategy:

  1. Call option risk. When market has a call option pattern, the candle body may fail to break the MA line, resulting in wrong signals. Filter conditions need to be added to reduce such risk.

  2. Failed breakout risk. MA breakout does not always continuation, some failed breakouts may occur. Breakout validation is needed to ensure high success rate.

  3. Trend reversal risk. Trend reversal after entering the trend needs to be switched timely, otherwise it may cause losses. Stop loss should be set to control the loss.

  4. Parameter optimization risk. Adaptive adjusted parameters may fall into local optimization, resulting in redundant MAs. Model evaluation methods need to be introduced to avoid this problem.

  5. Overfitting risk. Excessive parameter tuning may lead to overfitting and lose the model generalization ability. Prolonged verification in different market environments is needed, not just rely on backtest results.

Improvement Directions

Some directions to improve this adaptive MA strategy:

  1. Add trend breakout validation via consecutive breakouts to filter false breakouts.

  2. Increase stop loss strategy, stop loss when price moves back to the other side of MA.

  3. Add option filter to avoid wrong signals when call option appears.

  4. Introduce evaluation metrics like IC, LIC, SIC etc. to constrain parameter tuning and prevent overfitting.

  5. Expand to other indicators like adaptive golden cross strategy, adaptive Bollinger Bands etc.

  6. Optimize MA calculation by using weighted MA, exponential MA etc. to get smoother MA.

Summary

This strategy generates trading signals by adaptively adjusting the MA period to find optimal parameters. Compared with fixed parameters, it can reduce many false signals and adapt to market changes. But we also need to watch out for potential risks, and do verification and walk-forward optimization before applying it in live trading for steady profits.

[/trans]

Исходный код стратегии
/*backtest
start: 2022-11-10 00:00:00
end: 2023-11-16 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/
// © fondDealer96636

//@version=5

strategy('Automatic Moving Average', overlay=true, max_bars_back=201, pyramiding=0, currency=currency.USD, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000)

// input
start = 20
lookback = input(20, "Sensitivity", tooltip="Low (High Sensitivity), High (Low Sensitivity).\n\nAdjust according to timeframe and asset.")
smoothing = input(3, "Smoothing")
source = input(close, "Source")
startYear = input(2020, "Start year")
resp = 1

in_date_range = time >= timestamp(syminfo.timezone, startYear, 1, 1, 0, 0)

// global
var ix = -1
var mal = array.new_int(0)


// functions
avg(source, len) =>
    sum = 0.0
    for i = 0 to len-1
        sum += source[i]
    sum/len

bull = close > open

wick_touch(x) =>
    bull ? ((close <= x and x <= high) or (low <= x and x <= open)) : ((open <= x and x <= high) or (low <= x and x <= close))

body_touch(x) =>
    bull ? (open < x and x < close) : (close < x and x < open)

touches(t) =>
    touches = 0
    for i = 0 to lookback-1
        touches += t[i] ? 1 : 0
    touches


// local
ix := ix+1
prev_mal = ix >= 1 ? array.get(mal, ix-1) : start

cma = avg(source, prev_mal)
cma_p1 = avg(source, prev_mal+1)
cma_m1 = avg(source, prev_mal-1)

d = touches(wick_touch(cma))
d_p1 = touches(wick_touch(cma_p1))
d_m1 = touches(wick_touch(cma_m1))

d_b = touches(body_touch(cma))
d_p1_b = touches(body_touch(cma_p1))
d_m1_b = touches(body_touch(cma_m1))

any_body_touch = d_b > 0 or d_p1_b > 0 or d_m1_b > 0
no_wick_touch = d <= 0 and d_p1 <= 0 and d_m1 <= 0
wick_maximized = d >= d_p1 and d >= d_m1 ? prev_mal : (d_p1 >= d and d_p1 >= d_m1 ? prev_mal+resp : (d_m1 >= d and d_m1 >= d_p1 ? prev_mal-resp : na))

up = cma > cma[1]
down = cma < cma[1]
against_trend = (up and close < cma) or (down and close > cma)

new_mal = no_wick_touch or against_trend ? prev_mal-resp : (any_body_touch ? prev_mal+resp : wick_maximized)
next_mal = na(new_mal) ? prev_mal : new_mal

array.push(mal, next_mal < 2 ? 2 : (next_mal > 200 ? 200 : next_mal))


// graph
scma = ta.ema(cma, smoothing)

uptrend = scma > scma[1]
downtrend = scma < scma[1]

plot(scma, "Automatic MA", color=uptrend ? color.green : color.red)

uptrending = close > scma and uptrend
downtrending = close < scma and downtrend

defy = not uptrending and not downtrending
defy_cross = defy and body_touch(scma)

barcolor(uptrending ? color.lime : (downtrending ? color.red : (defy_cross ? color.black : color.white)))


// strategy
change_to_uptrend = uptrending and downtrend[1]
change_to_downtrend = downtrending and uptrend[1]

long = in_date_range and change_to_uptrend
short = in_date_range and change_to_downtrend

if long
    strategy.entry("Long", strategy.long)
if short
    strategy.entry("Short", strategy.short)