Многофакторная стратегия

Автор:Чао Чжан, Дата: 2023-10-31 15:45:39
Тэги:

多因子策略

Обзор

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

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

Многофакторная стратегия моделируется на основе следующих факторов:

  • Частично в стратегии колебаний используются случайные индикаторы для определения времени покупки и продажи. В частности, случайный индикатор %K сигнализирует покупку, когда линия %D проходит через линию %D из зоны перепродажи; сигнал продажи, когда линия %K проходит через линию %D из зоны перепродажи.

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

  • Часть стратегии прорыва отслеживает, прорывается ли цена в пределах максимальной или минимальной цены за указанный период; покупается, когда цена превышает максимум; продается, когда цена ниже минимальной цены.

  • В сочетании с индикатором ADX для определения силы тренда, участвовать в трендовой торговле можно только тогда, когда тренд достаточно силен.

  • Установление линий остановки и линий остановки, установление разумного соотношения остановки и остановки.

В целом, многофакторные стратегии следуют следующей логике:

  1. Когда ADX больше установленного порога, а тренд считается достаточно сильным, начинается реализация трендовой стратегии; когда ADX меньше порога, считается в балансе, тогда реализуется только шок-стратегия.

  2. В трендовом рынке, когда СМА быстро пересекает медленную линию золота, покупают открытую позицию, а когда разрыв заканчивается, выживают.

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

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

  5. Установка стоп-лосс-стоп-линий оптимизирует прибыль.

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

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

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

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

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

  4. В результате, если учесть интенсивность тренда, то можно уменьшить убытки.

  5. В сочетании с несколькими показателями можно сформировать более сильные торговые сигналы.

  6. Высокие комбинации параметров могут быть получены с помощью оптимизации параметров.

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

Помимо того, что многофакторные стратегии несут определенные риски, в основном они включают:

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

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

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

  4. ADX задерживается и может пропустить поворотный момент.

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

Для решения этих рисков можно оптимизировать следующие пункты:

  1. Проверка стабильности различных факторов в исторических данных, выбор стабильного фактора.

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

  3. Установка разумной линии остановки для контроля максимального отступления.

  4. В связи с этим, в связи с тем, что мы не знаем, что делать, мы не знаем, что делать, но мы знаем, что делать.

  5. Оптимизируйте стратегию остановки потерь, чтобы избежать чрезмерных потерь.

Оптимизация

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

  1. Проверить больше типов факторов, чтобы найти лучшую комбинацию.

2.采用机器学习方法寻找最优策略权重。

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

4.可以测试不同持仓时间下的收益情况。

5.可以考虑动态调整止损线。如盈利后可适当放宽止损范围。

6. Может быть введено больше фильтрационных условий, таких как увеличение объема трафика, чтобы улучшить качество сигнала.

7.ADX指标可以考虑优化参数或替换为更先进的趋势判断指标。

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

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


/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// strategy("Strategy_1", shorttitle="Strategy1",overlay=true ,pyramiding = 12, initial_capital=25000, currency='EUR', commission_type = strategy.commission.cash_per_order, commission_value = 3, default_qty_type = strategy.percent_of_equity, default_qty_value = 20)
	
// Revision:        1
// Author:          Jonas

// === INPUT ===
    //   > BACKTEST RANGE <
FromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
FromDay = input(defval=1, title="From Day", minval=1, maxval=31)
FromYear = input(defval=2017, title="From Year", minval=2010)
ToMonth = input(defval=1, title="To Month", minval=1, maxval=12)
ToDay = input(defval=1, title="To Day", minval=1, maxval=31)
ToYear = input(defval=9999, title="To Year", minval=2010)

    //   > STRATEGY SETTINGS <
bolOS = input(defval = false, type=input.bool, title="Oscillating Strategy")
bolTS = input(defval = true, type=input.bool, title="Trend Strategy")
bolBO = input(defval = false, type=input.bool, title="Breakout Strategy")

strStrategy = input(defval = "Long", type=input.string, title="Trade Strategy",options = ["Long", "Short","Long & Short"])

flStopLoss = input(defval = 2.0, title="Stop Loss %", type=input.float)/100
flTakeProfit = input(defval = 4.0, title="Take Profit %", type=input.float)/100

    //   > SMA <

fastMA = input(defval=8, type=input.integer, title="FastMA length", minval=1, step=1)
slowMA = input(defval=21, type=input.integer, title="SlowMA length", minval=1, step=1)

    //  > ADX <
adx_len = input(defval=10, type=input.integer, title="ADX length", minval=1, step=1)
adx_trend = input(defval=30, type=input.integer, title="ADX Tr", minval=1, step=1)
adx_choppy = adx_trend
adx_limit = adx_trend

    //  > TRENDSCORE <
ts_fromIndex = input(title="From", type=input.integer, minval=1, defval=10)
ts_toIndex = input(title="To", type=input.integer, minval=1, defval=14)
ts_src = input(title="Source", type=input.source, defval=close)

    // > Oscillator <
stoch_length = 14
stoch_OverBought = 75
stoch_OverSold = 25
stoch_smoothK = 3
stoch_smoothD = 3

// === BACK TEST RANGE FUNCTION ===
window_start = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
window_finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)  // backtest finish window
window() =>  // create function "within window of time"
    time >= window_start and time <= window_finish ? true : false

//plot(stop_level_Long, title="TEST",color=color.red, style=plot.style_linebr, linewidth=2)
//plot(take_level_Long, color=color.green, style=plot.style_linebr, linewidth=2)

// === ADX ===
adx_up = change(high)
adx_down = -change(low)
adx_trur = rma(tr, adx_len)
adx_plus = fixnan(100 * rma(adx_up > adx_down and adx_up > 0 ? adx_up : 0, adx_len) / adx_trur)
adx_minus = fixnan(100 * rma(adx_down > adx_up and adx_down > 0 ? adx_down : 0, adx_len) / adx_trur)
adx_sum = adx_plus + adx_minus

ADX = 100 * rma(abs(adx_plus - adx_minus) / (adx_sum == 0 ? 1 : adx_sum), adx_len)

//=== TRENDSCORE ===
trendscore(ts_src, ts_fromIndex, ts_toIndex) =>
	ts_sum = 0.0
	for i = ts_fromIndex to ts_toIndex
        ts_sum := ts_sum + (ts_src >= nz(ts_src[i]) ? 1 : -1)
    ts_sum

intTS = trendscore(ts_src, ts_fromIndex, ts_toIndex)
// Long if  TrendDirection = 1, Short if TrendDirection = -1; Indifferent if TrendDirection = 0
intTrendDirection = (intTS > (ts_toIndex-ts_fromIndex)) ? 1 : (intTS < (ts_fromIndex-ts_toIndex)) ? -1 : 0

    //  > TREND CONDITION <
adx_growing = ADX > highest(ADX[1],3)
intTrend = ((ADX >= adx_limit) and (ADX[1] >= adx_limit) and adx_growing) ? intTrendDirection : 0

// === ATR ===
ATR = sma(tr,10)
ATR_100 = ATR /abs(high - low)


// === STOCHASTICS ===

stoch_k = sma(stoch(close, high, low, stoch_length), stoch_smoothK)
stoch_d = sma(stoch_k, stoch_smoothD)

// === FILTER & CONDITIONS ===
    //  > STOCHASTICS <
bolFilter_OS1 = close[1] > hl2[1]



bolSigOsc_long_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossover(stoch_d,stoch_OverSold) and stoch_k > stoch_d) ? true:false
bolSigOsc_short_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossunder(stoch_d,stoch_OverBought) and stoch_k < stoch_d) ? true:false

bolLongOpenOS = bolSigOsc_long_1 and bolFilter_OS1
bolLongCloseOS = bolSigOsc_short_1

bolShortOpenOS = bolSigOsc_short_1 and bolFilter_OS1
bolShortCloseOS = bolSigOsc_long_1

    //  > TREND <

bolFilter_TS1 = close[1] > hl2[1] and open[1] < hl2[1]
bolFilter_TS2 = sma(close,50)>sma(close,50)[10]
bolFilter_TS3 = close[1] < hl2[1] and open[1] > hl2[1]

bolSigTrendLO1 = sma(close, fastMA) > sma(close, slowMA)
bolSigTrendLO2 = close > sma(close,fastMA)
bolSigTrendLO3 = bolSigTrendLO1 and bolSigTrendLO2

bolSigTrendLC1 = sma(close, fastMA) < sma(close, slowMA)
bolSigTrendLC2 = close < sma(close, fastMA)
bolSigTrendLC3 = bolSigTrendLC1 and bolSigTrendLC2

bolSigTrendSO1 = bolSigTrendLC3
bolSigTrendSC1 = bolSigTrendLO1

bolLongOpenTS = bolSigTrendLO3 and bolFilter_TS1
bolLongCloseTS = bolSigTrendLC3 and bolFilter_TS3

bolShortOpenTS = bolSigTrendSO1 and bolFilter_TS3
bolShortCloseTS = bolLongOpenTS and bolFilter_TS1

plot(sma(close, fastMA), title='FastMA', color=color.green, linewidth=2, style=plot.style_line)  // plot FastMA
plot(sma(close, slowMA), title='SlowMA', color=color.red, linewidth=2, style=plot.style_line)  // plot SlowMA



    //  > BREAKOUT <
flFilter_BS1 = 0.5 * stdev(close,slowMA)[1]
bolFilter_BS2 = volume > sma(volume,slowMA)*1.25

bolSigBreakoutLO1 = close > (highestbars(high,slowMA)[1] + flFilter_BS1)
bolSigBreakoutLC1 = barssince(bolSigBreakoutLO1)==5

bolSigBreakoutSO1 = close < lowestbars(low,slowMA)[1] - flFilter_BS1
bolSigBreakoutSC1 = barssince(bolSigBreakoutSO1)==5


bolLongOpenBO = bolSigBreakoutLO1 and bolFilter_BS2
bolLongCloseBO = bolSigBreakoutLC1

bolShortOpenBO = bolSigBreakoutSO1 and bolFilter_BS2
bolShortCloseBO = bolSigBreakoutSC1

//=== STRATEGIES ENTRIES & EXITS ===
    //  > STOPS & LIMITS <
stop_level_Long = strategy.position_avg_price * (1 - flStopLoss)
take_level_Long = strategy.position_avg_price * (1 + flTakeProfit)
stop_level_Short = strategy.position_avg_price * (1 + flStopLoss)
take_level_Short = strategy.position_avg_price * (1 - flTakeProfit)

    //  > ENTRIES / CLOSES / EXITS <
if window() //only in backtest-window
    if (bolOS == true)
        if (intTrend == 0)
            if(strStrategy == "Long" or strStrategy == "Long & Short")
                strategy.entry("Lng Osc", strategy.long, when=bolLongOpenOS)  // buy long when "within window of time" AND crossover
            if(strStrategy == "Short" or strStrategy == "Long & Short")
                strategy.entry("Short Osc", strategy.short, when=bolShortOpenOS)
        strategy.close("Lng Osc", when=(bolLongCloseOS))
        //strategy.exit("Exit L OS/STD", "Lng Osc", stop = strategy.position_avg_price - 2*stdev(close,10))
        strategy.exit("Exit L OS/%", "Lng Osc", stop=stop_level_Long)
        strategy.close("Short Osc", when=(bolShortCloseOS))
        //strategy.exit("Exit S OS/STD", "Short Osc", stop = strategy.position_avg_price + 2*stdev(strategy.position_avg_price,10))
        strategy.exit("Exit S OS/%", "Short Osc", stop=stop_level_Short)
    if (bolTS == true)
        if (not(intTrend == 0))
            if((strStrategy == "Long") or (strStrategy == "Long & Short"))
                strategy.entry("Lng TD", strategy.long, when=bolLongOpenTS)  // buy long when "within window of time" AND crossover
            if((strStrategy == "Short") or (strStrategy == "Long & Short"))
                strategy.entry("Short TD", strategy.short, when=(bolShortOpenTS and bolTS))  // buy long when "within window of time" AND crossover
        strategy.exit("Exit L TD", "Lng TD", stop=stop_level_Long)
        strategy.close("Lng TD", when=bolLongCloseTS)
        strategy.exit("Exit S TD", "Short TD", stop=stop_level_Short)
        strategy.close("Short TD", when=bolShortCloseTS)
    if (bolBO == true)
        if((strStrategy == "Long") or (strStrategy == "Long & Short"))
            strategy.entry("Lng BO", strategy.long, when=bolLongOpenBO)  // buy long when "within window of time" AND crossover
            strategy.close("Lng BO", when=bolLongCloseBO)
            //strategy.exit("Exit L BO/STD", "Lng BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
            strategy.exit("Exit L BO/2.5%", "Lng BO", stop=stop_level_Long)
        if((strStrategy == "Short") or (strStrategy == "Long & Short"))
            strategy.entry("Short BO", strategy.short, when=bolShortOpenBO)  // buy long when "within window of time" AND crossover
            strategy.close("Short BO", when=bolShortCloseBO)
            //strategy.exit("Exit S BO/STD", "Short BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
            strategy.exit("Exit S BO/%", "Short BO", stop=stop_level_Short)




Больше информации