Estratégia de negociação quantitativa baseada no índice de força relativa


Data de criação: 2024-01-22 10:13:23 última modificação: 2024-01-22 10:13:23
cópia: 7 Cliques: 831
1
focar em
1617
Seguidores

Estratégia de negociação quantitativa baseada no índice de força relativa

Visão geral

A estratégia de choque dinâmico é uma estratégia de negociação quantitativa que combina indicadores de dinâmica aleatória e indicadores relativamente fracos. A estratégia usa indicadores de dinâmica aleatória para determinar as áreas de sobrevenda e sobrevenda do mercado, em conjunto com o indicador RSI rápido para filtrar os sinais e, em seguida, selecionar sinais de negociação mais confiáveis por meio de filtragem física.

Princípio da estratégia

Indicador de dinâmica aleatória

O índice de dinâmica aleatória (SMI) é um indicador técnico comumente usado em negociações quantitativas, que combina os benefícios do índice de dinâmica e do índice de vibração.

Em particular, a fórmula de cálculo do SMI é:

SMI = (Close - (HH + LL)/2)/(0.5*(HH - LL)) * 100

Em que, HH é o preço mais alto nos últimos N dias e LL é o preço mais baixo nos últimos N dias.

Assim, o SMI combina o julgamento de tendências de dinâmica com o julgamento de reversão de oscilações. Quando o SMI é superior a 80, é um excesso de compra, e quando é inferior a 20, é um excesso de venda. A estratégia emite um sinal de negociação na área de supercompra.

RSI rápido

O RSI (Relative Strength Index, em inglês) é um indicador de tendência de sobrevenda e sobrevenda. A estratégia usa um RSI rápido com um período de 7 para avaliar a tendência de sobrevenda e sobrevenda no curto prazo.

Quando o RSI rápido está abaixo de 20 é um oversell e acima de 80 é um oversell. A estratégia emite um sinal de negociação na área de sobrecompra sobre venda.

Filtragem de entidades

A estratégia também adiciona um filtro de entidade, que filtra parte do sinal, calculando o tamanho da entidade de linha K. O sinal de transação é emitido somente quando a entidade de linha K ultrapassa um determinado limite.

Isso pode filtrar alguns sinais falsos e aumentar a confiabilidade do sinal.

Vantagens estratégicas

Portfólio de múltiplos indicadores

A estratégia combina três partes: o indicador de dinâmica aleatória, o indicador RSI rápido e o filtro de entidades. A união de vários indicadores pode melhorar a precisão do sinal e aumentar a robustez da estratégia.

Julgamento de sobrecompra

O indicador de movimento aleatório e o indicador RSI rápido permitem determinar com precisão o estado de sobrecompra e sobrevenda do mercado. A estratégia é abrir posições em áreas de sobrecompra e sobrevenda, seguindo o princípio de compra de baixa e venda de alta.

Transações bidirecionais

A estratégia pode ser executada em ambos os sentidos, com a cabeça em branco e com a cabeça em branco, para maximizar as oportunidades de negociação no mercado.

Controle de Risco

A adição de um filtro físico pode filtrar a maior parte do ruído, evitando que ele seja bloqueado durante a vibração.

Risco estratégico

Risco de comutação multi-espaço

A estratégia de negociação bidirecional, com frequência de trocas de títulos, é um ponto de risco potencial. A lógica de abertura de posição apropriadamente otimizada pode reduzir esse risco.

O risco.

Quando o indicador dá um sinal, pode reunir um grande número de traders de risco em um curto período de tempo, resultando em um risco de reversão do mercado. Este risco pode ser reduzido através da otimização dos parâmetros do indicador.

Risco sistémico de mercado

Em situações extremas, todos os modelos podem falhar. Isso requer o controle de tais riscos por meio de uma configuração de stop loss razoável.

Otimização de Estratégia

Optimização de parâmetros

Pode-se testar diferentes combinações de parâmetros, como o ciclo do SMI, o ciclo do RSI, o limite do filtro da entidade, etc., para encontrar o melhor parâmetro para aumentar a taxa de retorno da estratégia.

Paragem dinâmica

A criação de um mecanismo de stop loss dinâmico baseado no ATR ou na volatilidade permite um melhor controle do risco individual e global.

Aprendizagem automática

A introdução de algoritmos de aprendizagem de máquina para prever o futuro dos valores dos indicadores através de modelos. Isso pode determinar o ponto de inflexão dos indicadores com antecedência, aumentando a prospectividade da estratégia.

Resumir

Em resumo, a estratégia integra indicadores de dinâmica aleatória, indicadores RSI rápidos e filtros reais, permitindo um sistema de julgamento de overbought e oversold mais completo. A combinação de vários indicadores aumenta a precisão do sinal, e o mecanismo de controle de risco e de negociação bidirecional também torna a estratégia mais equilibrada. A estratégia tem chances de obter melhores taxas de retorno com a otimização contínua de parâmetros e modelos.

Código-fonte da estratégia
/*backtest
start: 2023-12-22 00:00:00
end: 2024-01-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.1", shorttitle = "Stochastic str 1.1", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings 
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(5, "SMI Percent K Length")
b = input(3, "SMI Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2017, defval = 2017, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Fast RSI
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
avgrel = ema(ema(rdiff,b),b)
avgdiff = ema(ema(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limit, color = black, title = "Over Bought")
plot(-1 * limit, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMIsignal < -1 * limit and close < open and body and usesmi
dn1 = SMIsignal > limit and close > open and body and usesmi
up2 = fastrsi < 20 and close < open and body and usersi
dn2 = fastrsi > 80 and close > open and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()