Количественная стратегия следования за трендом, основанная на импульсе


Дата создания: 2024-01-19 15:29:35 Последнее изменение: 2024-01-19 15:29:35
Копировать: 2 Количество просмотров: 618
1
Подписаться
1617
Подписчики

Количественная стратегия следования за трендом, основанная на импульсе

Обзор

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

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

  1. Вычислить ценовые показатели на линии Ахи-К на различных уровнях циклов. Это является основой для последующего расчета динамической энергии.

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

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

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

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

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

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

Кроме того, данные, на которых основана стратегия, исходят исключительно из K-линий Пейдж-Ахи. Такая специальная K-линия сама по себе позволяет уменьшить проблему чрезмерной зависимости от циклов присоединения. Таким образом, стабильность стратегии будет лучше, чем у других стратегий K-линий.

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

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

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

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

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

Мы можем продолжить оптимизацию этой стратегии в следующих аспектах:

  1. Сама линия K-A может быть оптимизирована, например, с помощью изменения весовой конфигурации.

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

  3. Внедрение более высоких частот, таких как ежедневные и ежеминутные данные, повышает оперативность стратегии.

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

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

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

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

Исходный код стратегии
/*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 Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © FrancoPassuello

//@version=5
strategy("Heiken Ashi ADM", overlay=true)
haClose = (open + high + low + close) / 4
// prevHaOpen = line.new(na, na, na, na, width = 1)
haOpen = (open[1] + close[1]) / 2
// line.set_xy1(prevHaOpen, bar_index[1], nz(haOpen[1]))
// line.set_xy2(prevHaOpen, bar_index, haClose[1])


[monopen, _1monopen, _2monopen, _3monopen, _4monopen, _5monopen, _6monopen] = request.security(syminfo.tickerid, "M", [haOpen, haOpen[1], haOpen[2], haOpen[3], haOpen[4], haOpen[5], haOpen[6]] , barmerge.gaps_off, barmerge.lookahead_on)
[monclose, _1monclose, _3monclose, _6monclose] = request.security(syminfo.tickerid, "M", [haClose, haClose[1], haClose[3], haClose[6]] , barmerge.gaps_off, barmerge.lookahead_on)
[dayclose1, _21dayclose, _63dayclose, _126dayclose, dayclose] = request.security(syminfo.tickerid, "1D", [haClose[1], haClose[21], haClose[63], haClose[126], haClose], barmerge.gaps_off, barmerge.lookahead_on)
[dayopen1, _21dayopen, _63dayopen, _126dayopen] = request.security(syminfo.tickerid, "1D", [haOpen[1], haOpen[21], haOpen[63], haOpen[126]], barmerge.gaps_off, barmerge.lookahead_on)


get_rate_of_return(price1, price2) =>
    return_ = (price1/price2 -1)*100
    return_

m0 = get_rate_of_return(monclose, monopen)
m1 = get_rate_of_return(_1monclose, _1monopen)
m2 = get_rate_of_return(monclose, _2monopen)
m3 = get_rate_of_return(_1monclose, _3monopen)
m4 = get_rate_of_return(monclose, _4monopen)
m5 = get_rate_of_return(monclose, _5monopen)
m6 = get_rate_of_return(_1monclose, _6monopen)
MS = (m1 + m3 + m6)/100
CS = (m0 + m2 + m5)/100

d1 = get_rate_of_return(dayclose1, _21dayopen)
d2 = get_rate_of_return(dayclose1, _63dayopen)
d3 = get_rate_of_return(dayclose1, _126dayopen)
DS = (d1 + d2 + d3)/100

//Last (DAILY)
lastd_s_avg1 = DS/3

lastd_Approximate1 = dayclose1*(1-lastd_s_avg1)

last_approx1_d21 = lastd_Approximate1 / _21dayopen-1
last_approx1_d63 = lastd_Approximate1 / _63dayopen-1
last_approx1_d126 = lastd_Approximate1 / _126dayopen-1

lastd_s_avg2 = (last_approx1_d21 + last_approx1_d63 + last_approx1_d126) / 3
lastd_approximate2 = (dayclose1)*(1-(lastd_s_avg1 + lastd_s_avg2))
lastd_price = lastd_approximate2

//plot(lastd_price,color = color.rgb(255, 255, 255, 14), title = "Last momentum threshold")

//Last

last_s_avg1 = MS/3

last_Approximate1 = _1monclose*(1-last_s_avg1)

last_approx1_m1 = last_Approximate1 / _1monopen-1
last_approx1_m3 = last_Approximate1 / _3monopen-1
last_approx1_m6 = last_Approximate1 / _6monopen-1

last_s_avg2 = (last_approx1_m1 + last_approx1_m3 + last_approx1_m6) / 3
last_approximate2 = (_1monclose)*(1-(last_s_avg1 + last_s_avg2))
last_price = last_approximate2
Scoring_price = _1monclose*(1-CS)

plot(last_price,color = color.rgb(255, 255, 255, 14), title = "Last momentum threshold")
//plot(Scoring_price,color = color.rgb(234, 0, 255, 14), title = "Last momentum threshold")

//Long based on month close and being the first trade of the month.

var int lastClosedMonth = -1
limit_longCondition = _1monclose > last_approximate2 and (lastClosedMonth == -1 or month(time) != lastClosedMonth)

// Long based on day close and being the first trade of the month.
limit_Dlongcondition = dayclose1 > lastd_approximate2 and (lastClosedMonth == -1 or month(time) != lastClosedMonth)

// Close trade based on day close

DCloseLongCondition = dayclose1<lastd_approximate2

//Old standard Trading rules
longCondition = _1monclose > Scoring_price
MCloseLongCondition = _1monclose<Scoring_price
shortCondition = CS < 0

if (longCondition)
    strategy.entry("Long", strategy.long)


if (strategy.position_size > 0 and MCloseLongCondition)
    strategy.close("Long")
    lastClosedMonth := month(time)