에일러스 피셔 스토카스틱 상대적 활력 지수 전략

저자:차오장, 날짜: 2023-12-22 12:04:23
태그:

img

전반적인 설명

이 전략은 존 Ehlers가 그의 책에서 제안 한 Ehlers Fisher Stochastic Relative Vigor Index 지표에 기반합니다. 이 전략은 Ehlers Fisher 지표를 사용하여 주식의 상대적 강도를 판단하고 입출에 대한 사용자 정의 거래 규칙과 결합합니다.

전략 논리

이 전략은 먼저 촛불의 몸인 폐쇄 가격 - 오픈 가격을 계산한다. 그 다음 촛불의 그림자인 높은 가격 - 낮은 가격을 계산한다. 각각 이 두 부분의 합과 평균을 취함으로써 주식의 추진력을 얻는다. 그 다음 주식의 변동성과 추진력을 나누면서 상대적 힘 지수 (RVI) 를 얻는다.

다음으로, 신호 값을 얻기 위해 Ehlers Fisher 공식은 RVI에 적용됩니다. 신호가 트리거를 넘어서면 길게, 신호가 트리거를 넘어서면 짧게됩니다. 또한, 고정 스톱 손실과 트레일링 스톱 손실은 위험을 제어하기 위해 구현됩니다.

이점 분석

이 전략은 시장의 상대적 강도를 효과적으로 결정할 수 있는 주식의 동력 특성 및 스토카스틱 지표를 통합한다. 에일러스 피셔 지표의 설계는 소음의 영향을 줄이고 비교적 신뢰할 수 있는 거래 신호를 생성할 수 있다. 활력 지수는 주식 자체의 트렌딩 품질과 변동성을 반영하여 동적 지표가 된다.

단일 모멘텀 지표 또는 스토카스틱 지표를 사용하는 것과 비교하면 이 전략은 지표와 모델을 유기적으로 결합하여 신호의 품질을 향상시킬 수 있습니다. 엄격한 스톱 로스 규칙은 또한 수익성을 보장하면서 위험을 제어 할 수 있습니다.

위험 분석

이 전략은 주로 에일러스 피셔 지표에 의존한다. 시장에서 급격한 변화가 있을 때, 지표의 매개 변수는 새로운 환경에 적응하도록 최적화되어야 한다. 매개 변수들이 잘못 설정되면 잘못된 신호 또는 지연 신호를 생성할 수 있다.

또한, 전략 자체에는 어느 정도의 곡선 적응 위험이 내재되어 있다. 백테스팅과 라이브 트레이딩의 시장 환경이 크게 변화할 경우 전략의 성능이 크게 변할 수 있다. 이 경우 전략 매개 변수를 조정해야 하며, 새로운 시장 조건에 맞게 거래 규칙이 최적화되어야 한다.

최적화 방향

이 전략은 다음과 같은 측면에서 더 이상 최적화 될 수 있습니다.

  1. 더 높은 감수성 또는 노이즈 필터링을 위해 Ehlers Fisher 지표의 매개 변수를 최적화하십시오.

  2. 더 신뢰할 수 있는 거래 신호를 생성하기 위해 LSTM와 같은 기계 학습 알고리즘으로 지표를 모델링합니다.

  3. ATR 같은 시장 변동성 지표를 통합하여 스톱 손실 거리를 동적으로 조정합니다.

  4. 신호 품질을 향상시키기 위해 다른 기술 및 기본 지표를 결합하는 다인자 모델에 대한 지원을 추가합니다.

  5. 동적 진입 / 출구 기준으로 오픈 / 클로즈 포지션 논리를 최적화하십시오. 적응 스톱 손실 및 수익 기술을 도입하십시오.

결론

이 전략은 시장 추세와 강도를 결정하기 위해 Ehlers Fisher Stochastic RVI 지표를 활용하고 위험을 제어하기 위해 합리적인 스톱 로스 메커니즘을 설정합니다. 단일 지표와 비교하면 이 전략은 여러 지표와 모델을 유기적으로 결합하여 소음을 필터링하고 고품질 신호를 제공할 수 있습니다. 매개 변수 최적화, 모델 융합, 적응 조정 및 기타 수단으로 전략 성능의 추가 개선이 여전히 가능합니다.


/*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)

더 많은