가우스 오류 함수에 기초한 양적 거래 전략의 분석

저자:차오장, 날짜: 2024-01-19 14:28:03
태그:

img

전반적인 설명

이 전략은 가격 변화를 측정하기 위해 가우스 오류 함수로 계산된 P-신호 지표에 기반한 양적 거래 전략입니다. P-신호를 사용하여 가격 추세와 입출점의 전환점을 결정합니다.

전략 논리

이 전략의 핵심 지표는 P-신호입니다. P-신호의 계산 공식은:

fPSignal(ser, int) =>
    nStDev = stdev(ser, int) 
    nSma = sma(ser, int)
    fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)

여기 ser는 가격 시리즈를 나타내고 int는 nPoints라는 매개 변수를 나타냅니다. 이것은 되돌아볼 바의 수입니다. 이 공식은 세 부분으로 구성됩니다.

  1. nStDev는 가격의 표준편차입니다.
  2. nSma는 가격의 단순한 이동 평균입니다.
  3. fErf는 가우스 오류 함수입니다.

전체 공식의 의미는 가격의 이동 평균을 가격의 표준편차로 나누고, 그 다음 표준화를 위해 sqrt(2) 로 나누고, 마지막으로 가우스 오류 함수로 (-1, 1) 범위에 매핑하는 것입니다. 즉, 가격 변동이 평균보다 크다면 P 신호는 1에 가깝습니다. 가격 변동이 평균보다 작다면 P 신호는 -1에 가깝습니다.

이 전략은 P 신호의 값과 그 변화의 기호를 입력 및 출구를 결정하기 위해 사용합니다.

strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)

strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)  

P-신호가 0보다 작고 양으로 바뀌면 긴 위치로 이동합니다. P-신호가 0보다 크고 음으로 바뀌면 포지션을 닫습니다.

장점

이 전략의 장점은 다음과 같습니다.

  1. 가우스 오류 함수를 사용하여 가격 분포에 적합합니다. 가우스 오류 함수는 대부분의 금융 시간 시리즈 분포와 일치하는 정상적인 분포에 매우 잘 적합합니다.
  2. 가격 표준편차에 의해 매개 변수를 자동으로 조정합니다. 이것은 다른 시장 조건에서 전략을 더 견고하게 만듭니다.
  3. P-신호는 트렌드 추적 및 평균 역전의 장점을 결합합니다. 가격 변동 트렌드와 역전 지점을 모두 고려하여 트렌드 거래와 역전 거래에서 기회를 잡는 데 도움이됩니다.

위험성

이 전략에는 몇 가지 위험도 있습니다.

  1. 높은 주파수 거래 위험. 전형적인 높은 주파수 거래 전략으로서 더 많은 거래를 생성하여 더 높은 거래 비용과 미끄러짐 위험을 초래할 수 있습니다.
  2. 시장에서 낮은 성능. P-신호는 가격이 명확한 추세 또는 패턴이 없을 때 많은 잘못된 신호를 생성 할 수 있습니다.
  3. 어려운 매개 변수 최적화. 여러 매개 변수 사이의 복잡한 관계는 매개 변수 최적화를 도전으로 만듭니다.

이러한 위험을 줄이기 위해 몇 가지 조치가 고려 될 수 있습니다. 무역 빈도를 줄이기 위해 필터를 추가하고 매개 변수 조합을 최적화하고 거래 비용을 설정하고 실시간 테스트 및 적합한 제품을 선택하십시오.

강화

더 발전할 수 있는 공간이 있습니다.

  1. 잘못된 신호를 피하기 위해 필터를 추가합니다. 예를 들어, 그리고/또는 다른 표시기와 함께 약간의 소음을 필터링합니다.
  2. 매개 변수 조합을 최적화 합니다. 안정성을 향상시키기 위해 다른 제품과 시간 프레임에 걸쳐 n포인트의 크기를 조정합니다.
  3. 동적 매개 변수를 고려합니다. 시장 변동성에 따라 n포인트를 적응적으로 조정하면 안정성을 향상시킬 수 있습니다.
  4. 머신러닝 방법을 적용하고 AI 알고리즘을 사용하여 매개 변수, 필터 및 크로스 제품 타이밍 최적화

결론

결론적으로, 이 전략의 핵심 아이디어는 혁신적인, 가우스 함수와 자동 조정 매개 변수를 맞는 가격 분포입니다. 그러나 높은 주파수 거래 전략으로, 특히 높은 주파수 거래 전략으로 라이브 거래에서 안정적인 수익성 이전에 위험 통제 및 매개 변수 조정에 대한 추가 테스트 및 최적화가 필요합니다.


/*backtest
start: 2023-01-12 00:00:00
end: 2024-01-18 00:00:00
period: 1d
basePeriod: 1h
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/
// P-Signal Strategy © Kharevsky
// @version=4
// **********************************************************************************************************
strategy("P-Signal Strategy", precision = 3)
// Parameters and const of P-Signal.
nPoints = input(title = "Number of Bars", type = input.integer, defval = 9, minval = 4, maxval = 100, group = "Parameters of observation.")
int nIntr = nPoints - 1
// Horner's method for the error (Gauss) & P-Signal functions.
fErf(x) =>
    nT = 1.0/(1.0 + 0.5*abs(x))
    nAns = 1.0 - nT*exp(-x*x - 1.26551223 + 
     nT*( 1.00002368 + nT*( 0.37409196 + nT*( 0.09678418 + 
     nT*(-0.18628806 + nT*( 0.27886807 + nT*(-1.13520398 + 
     nT*( 1.48851587 + nT*(-0.82215223 + nT*( 0.17087277 ))))))))))
    x >= 0 ? nAns : -nAns
fPSignal(ser, int) => 
    nStDev = stdev(ser, int)
    nSma = sma(ser, int)
    fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
// Strat.
float nPSignal = sma(fPSignal(change(ohlc4), nIntr), nIntr)
float ndPSignal = sign(nPSignal[0] - nPSignal[1])
strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)
strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)
// Plotting. 
hline(+1.0, color = color.new(color.orange,70), linestyle = hline.style_dotted)
hline(-1.0, color = color.new(color.orange,70), linestyle = hline.style_dotted)
plot(nPSignal, color = color.blue, style = plot.style_line)
plot(strategy.position_size, color = color.white, style = plot.style_cross)
// Alerts.
if(strategy.position_size[0] > strategy.position_size[1])
    alert("P-Signal strategy opened the long position: " + syminfo.tickerid + " " + timeframe.period, alert.freq_once_per_bar)
if(strategy.position_size[0] < strategy.position_size[1])
    alert("P-Signal strategy closed the long position: " + syminfo.tickerid + " " + timeframe.period, alert.freq_once_per_bar)
// The end.

더 많은