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

Автор:Чао Чжан, Дата: 2023-11-17 17:14:36
Тэги:

Обзор

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

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

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

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

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

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

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

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

  2. По сравнению с фиксированным периодом MA, адаптивный MA может фильтровать больше шума и уменьшать многие ложные сигналы.

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

  4. Этот адаптивный метод может упростить всю торговую систему без ручной оптимизации параметров.

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

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

Для этой стратегии также существуют некоторые риски:

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

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

  3. Риск обратного тренда. Обратный тренд после входа в тренд необходимо своевременно переключить, иначе он может привести к потерям. Стоп-лосс следует установить для контроля потери.

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

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

Направления к улучшению

Некоторые направления для улучшения этой адаптивной стратегии МС:

  1. Добавить проверку прорыва тренда через последовательные прорывы для фильтрации ложных прорывов.

  2. Увеличьте стратегию стоп-лосса, стоп-лосса, когда цена перемещается обратно на другую сторону MA.

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

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

  5. Расширить на другие показатели, такие как адаптивная стратегия золотого креста, адаптивные полосы Боллинджера и т.д.

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

Резюме

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

[/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)


Больше