Estratégia do Índice de Vigor Relativo Estocástico de Ehlers Fisher

Autora:ChaoZhang, Data: 22-12-2023 12:04:23
Tags:

img

Resumo

Esta estratégia baseia-se no indicador Ehlers Fisher Stochastic Relative Vigor Index proposto por John Ehlers em seu livro Cybernetic Analysis for Stocks and Futures.

Estratégia lógica

A estratégia primeiro calcula o preço de fechamento - preço de abertura, que é o corpo do veículo. Em seguida, calcula o preço alto - preço baixo, que é a sombra do veículo. Tomando a soma e a média dessas duas partes, respectivamente, obtém o impulso do estoque. Em seguida, dividindo o impulso com a volatilidade do estoque, obtém o Índice de Vigor Relativo (RVI).

Em seguida, a fórmula de Ehlers Fisher é aplicada ao RVI para obter o valor do sinal. Ele vai longo quando o sinal atravessa o gatilho e vai curto quando o sinal atravessa abaixo do gatilho.

Análise das vantagens

Esta estratégia integra as características de momentum e o indicador estocástico de ações, que podem determinar efetivamente a força relativa no mercado. O design do indicador Ehlers Fisher pode reduzir o impacto do ruído e gerar sinais comerciais relativamente confiáveis.

Em comparação com o uso de um único indicador de momento ou indicador estocástico, esta estratégia combina indicadores e modelos organicamente, o que pode melhorar a qualidade dos sinais.

Análise de riscos

Esta estratégia baseia-se principalmente no indicador Ehlers Fisher. Quando há mudanças drásticas no mercado, os parâmetros do indicador precisam ser otimizados para se adaptar ao novo ambiente.

Além disso, há algum grau de risco de ajuste de curva intrínseco na própria estratégia. Se o ambiente de mercado em backtesting e negociação ao vivo mudar muito, o desempenho da estratégia pode desviar-se em grande parte. Neste caso, os parâmetros da estratégia precisam ser ajustados e as regras de negociação exigem otimização para se adequar às novas condições do mercado.

Orientações de otimização

Esta estratégia pode ser melhorada nos seguintes aspectos:

  1. Otimizar os parâmetros do indicador Ehlers Fisher para uma maior sensibilidade ou filtragem de ruído.

  2. Modele o indicador com algoritmos de aprendizado de máquina como LSTM para gerar sinais de negociação mais confiáveis.

  3. Incorporar indicadores de volatilidade do mercado como o ATR para ajustar dinamicamente a distância de stop loss.

  4. Adicionar apoio a modelos multifatores, combinando outros indicadores técnicos e fundamentais para melhorar a qualidade do sinal.

  5. Otimizar a lógica de posições abertas/fechadas com critérios dinâmicos de entrada/saída.

Conclusão

Esta estratégia utiliza o indicador Ehlers Fisher Stochastic RVI para determinar a tendência e a força do mercado e define mecanismos razoáveis de stop loss para controlar os riscos. Em comparação com indicadores únicos, esta estratégia combina múltiplos indicadores e modelos organicamente, o que pode filtrar o ruído e fornecer sinais de alta qualidade.


/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Ehlers Fisher Stochastic Relative Vigor Index Strategy", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, commission_type = strategy.commission.percent, commission_value = 0.1)
p = input(10, title = "Length")
FisherStoch(src, len) =>
    val1 = stoch(src, src, src, len) / 100
    val2 = (4 * val1 + 3 * val1[1] + 2 * val1[2] + val1[3]) / 10
    FisherStoch = 0.5 * log((1 + 1.98 * (val2 - 0.5)) / (1 - 1.98 * (val2 - 0.5))) / 2.64

CO = close - open
HL = high - low

value1 = (CO + 2 * CO[1] + 2 * CO[2] + CO[3]) / 6
value2 = (HL + 2 * HL[1] + 2 * HL[2] + HL[3]) / 6

num = sum(value1, p)
denom = sum(value2, p)

RVI = denom != 0 ? num / denom : 0

signal = FisherStoch(RVI, p)
trigger = signal[1]
oppositeTrade = input(true)
barsSinceEntry = 0
barsSinceEntry := nz(barsSinceEntry[1]) + 1
if strategy.position_size == 0
    barsSinceEntry := 0
if ((crossover(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossunder(signal, trigger))) and abs(signal) > 2 / 2.64
    strategy.entry("Long", strategy.long)
    barsSinceEntry := 0
if ((crossunder(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossover(signal, trigger))) and abs(signal) > 2 / 2.64
    strategy.entry("Short", strategy.short)
    barsSinceEntry := 0
if strategy.openprofit < 0 and barsSinceEntry > 8
    strategy.close_all()
    barsSinceEntry := 0
    
hline(0, title="ZeroLine", color=gray) 
signalPlot = plot(signal, title = "Signal", color = blue)
triggerPlot = plot(trigger, title = "Trigger", color = green)
fill(signalPlot, triggerPlot, color = signal < trigger ? red : lime, transp = 50)

Mais.