Стратегия изменения динамической тенденции

Автор:Чао Чжан, Дата: 2023-12-13 16:52:34
Тэги:

img

Обзор

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

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

  1. Расчет линейной регрессии цены акций на основе объема торговли для получения прогнозируемой цены
  2. Расчет скользящих средних при различных условиях
  3. Сгенерировать сигнал покупки, когда прогнозируемая цена пересекает скользящую среднюю вверх
  4. Сгенерировать сигнал продажи, когда прогнозируемая цена пересекает скользящую среднюю вниз
  5. Включить индикатор MACD для определения сроков изменения тренда

Сочетание вышеперечисленных сигналов с множественным подтверждением предотвращает ложные прорывы и повышает точность.

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

  • Использование линейной регрессии для прогнозирования ценовой тенденции, повышение точности сигнала
  • Зафиксировать изменение тренда с помощью движущихся средних
  • Регрессия, основанная на объеме торговли, имеет лучшее экономическое значение
  • Многократное подтверждение MACD и т.д. уменьшает ложные сигналы

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

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

Руководство по оптимизации

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

Заключение

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


/*backtest
start: 2023-12-05 00:00:00
end: 2023-12-12 00:00:00
period: 1m
basePeriod: 1m
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/
// © stocktechbot
//@version=5
strategy("Linear Cross", overlay=true, margin_long=100, margin_short=0)

//Linear Regression

vol = volume

// Function to calculate linear regression
linregs(y, x, len) =>
    ybar = math.sum(y, len)/len
    xbar = math.sum(x, len)/len
    b = math.sum((x - xbar)*(y - ybar),len)/math.sum((x - xbar)*(x - xbar),len)
    a = ybar - b*xbar
    [a, b]

// Historical stock price data
price = close

// Length of linear regression
len = input(defval = 21, title = 'Strategy Length')
linearlen=input(defval = 9, title = 'Linear Lookback')
[a, b] = linregs(price, vol, len)

// Calculate linear regression for stock price based on volume
//eps = request.earnings(syminfo.ticker, earnings.actual)
//MA For double confirmation

out = ta.sma(close, 200)
outf = ta.sma(close, 50)
outn = ta.sma(close, 90)
outt = ta.sma(close, 21)
outthree = ta.sma(close, 9)

// Predicted stock price based on volume
predicted_price = a + b*vol

// Check if predicted price is between open and close
is_between = open < predicted_price and predicted_price < close

//MACD
//[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)

// Plot predicted stock price
plot(predicted_price, color=color.rgb(65, 59, 150), linewidth=2, title="Predicted Price")
plot(ta.sma(predicted_price,linearlen), color=color.rgb(199, 43, 64), linewidth=2, title="MA Predicted Price")
//offset = input.int(title="Offset", defval=0, minval=-500, maxval=500)
plot(out, color=color.blue, title="MA200")
[macdLine, signalLine, histLine] = ta.macd(predicted_price, 12, 26, 9)

//BUY Signal

longCondition=false
mafentry =ta.sma(close, 50) > ta.sma(close, 90)
//matentry = ta.sma(close, 21) > ta.sma(close, 50)
matwohun = close > ta.sma(close, 200)
twohunraise = ta.rising(out, 2)
twentyrise = ta.rising(outt, 2)
macdrise = ta.rising(macdLine,2)
macdlong = ta.crossover(predicted_price, ta.wma(predicted_price,linearlen))  and (signalLine < macdLine)
if macdlong and macdrise
    longCondition := true

if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)
//Sell Signal
lastEntryPrice = strategy.opentrades.entry_price(strategy.opentrades - 1)
daysSinceEntry = len
daysSinceEntry := int((time - strategy.opentrades.entry_time(strategy.opentrades - 1)) / (24 * 60 * 60 * 1000))
percentageChange = (close - lastEntryPrice) / lastEntryPrice * 100
//trailChange = (ta.highest(close,daysSinceEntry) - close) / close * 100

//label.new(bar_index, high, color=color.black, textcolor=color.white,text=str.tostring(int(trailChange)))
shortCondition=false
mafexit =ta.sma(close, 50) < ta.sma(close, 90)
matexit = ta.sma(close, 21) < ta.sma(close, 50)
matwohund = close < ta.sma(close, 200)
twohunfall = ta.falling(out, 3)
twentyfall = ta.falling(outt, 2)
shortmafall = ta.falling(outthree, 1)
macdfall = ta.falling(macdLine,1)
macdsell = macdLine < signalLine
if macdfall and macdsell and (macdLine < signalLine) and ta.falling(low,2)
    shortCondition := true

if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)




Больше