P-Signal 멀티 타임프레임 거래 전략

저자:차오장, 날짜: 2023-11-28 16:32:36
태그:

img

전반적인 설명

P-시그널 멀티 타임프레임 트레이딩 전략은 통계적 원리와 멀티 타임프레임 분석에 기반한 암호화폐 알고리즘 트레이딩 전략이다. 이 전략은 가우스 오류 함수와 P-시그널 지표를 사용하여 비트코인의 일일, 주간 및 월간 차트에 맞게 모델링하고, 거래 변동성을 파악하기 위해 지표의 크로스 상위에서 길게 이동하고, 크로스 하위에서 빠져나간다.

전략 논리

P-신호 전략의 핵심 지표는 P-신호 자체이며, 통계 표준편차와 간단한 이동평균을 결합하여 시장이 정상 분포에 부합하는지 여부를 감지하기 위해 가우스 오류 함수를 사용하여 -1에서 1 범위로 매핑합니다. 구체적인 계산 공식은 다음과 같습니다:

fErf(x) = 1.0 - 1.0/(1.0 + 0.5*abs(x)) * exp(-x*x - 1.26551223 + ...) # Gaussian error function 

fPSignal(ser, n) = fErf((stdev(ser, n) > 0 ? sma(ser, n)/stdev(ser, n)/sqrt(2) : 1)) # P-Signal indicator

이 전략은 비트코인의 일일, 주간 및 월간 시간 프레임에서 P-신호 지표를 계산하고, 지표가 0을 넘어서면 장기화하고, 0을 넘어서면 다시 종료합니다. 지표 값 밸브도 반복 입력을 제어하도록 설정되어 있습니다.

이점 분석

P-신호 전략의 가장 큰 장점은 전략의 안정성을 향상시키기 위해 여러 시간 프레임을 사용하는 것입니다. 일간 차트는 단기 시장 변동을 캡처하고, 주간 및 월간 차트는 잘못된 브레이크오웃을 필터합니다. 동시에 P-신호 지표 자체는 트렌드 움직임의 변동을 증폭시키는 몇 가지 예측 능력을 가지고 있습니다.

단일 타임프레임과 비교하면, 여러 타임프레임은 변동적인 시기에 드라우다운을 제어하기 위해 일일 스톱을 사용할 수 있으며, 범위 시장에서 더 높은 타임프레임을 사용하여 거래 빈도를 줄일 수 있습니다. 전반적으로,이 조합은 절대적 및 상대적 드라우다운을 최소화하면서 이익을 극대화 할 수 있습니다.

위험 분석

P-신호 전략의 가장 큰 위험은 지표 자체가 양 거래자에게 블랙 박스라는 것입니다. 우리는 특정 시장에 대한 이 지표의 적응력을 결정 할 수있는 방법이 없으며 매개 변수의 최적 범위를 결정할 수도 없습니다. 이것은 라이브 거래에서 전략의 저성공으로 이어질 수 있습니다.

또한, 전략 자체는 몇 가지 한계를 가지고 있습니다. 예를 들어, 폭력적인 움직임을 처리 할 수 없다는 것, 지표 크로스오버에서 신호가 뒤떨어지는 것 등이 있습니다. 이 모든 것이 라이브 거래 중에 숨겨진 문제가 될 수 있습니다.

이러한 문제를 해결하기 위해, 우리는 지표 매개 변수를 조정할 수 있습니다, 손실을 중지 최적화, 더 많은 보조 지표를 도입 등. 하지만 전제는 충분히 큰 백테스팅 기간에 걸쳐 안정성을 테스트하는 것입니다.

최적화 방향

P-신호 전략을 최적화하기 위해 몇 가지 방향이 있습니다.

  1. P-신호 지표 매개 변수를 변경: nIntr_D, nIntr_W 및 nIntr_M, 최적의 매개 변수 조합을 찾으십시오

  2. 스톱 손실 방법을 추가: 후속 스톱 손실, 시간 스톱 손실, ATR 스톱 손실 등, 최적 스톱 손실을 찾아

  3. 보조 지표 도입: 특정 시장 조건에 대한 판단을 개선합니다. 예를 들어 동향을 결정하기 위해 MACD를 사용합니다.

  4. 위치 크기를 최적화: 계정 사용 효율에 기반한 동적 위치 크기를 설정

  5. 기계 학습 최적화: 신경망, 유전 알고리즘을 사용하여 글로벌 최적 매개 변수를 찾습니다.

결론

P-시그널 멀티 타임프레임 거래 전략은 전반적으로 매우 유망한 전략 아이디어입니다. 통계적 원리와 기술적 지표를 결합하고 안정성을 향상시키기 위해 멀티 타임프레임 분석을 사용합니다. 광범위한 백테스팅과 최적화를 통해 일부 한계를 해결할 수 있다면 실제 사용 가능한 암호화폐 알고리즘 거래 전략으로 변환하는 것이 완전히 가능합니다.


/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 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
// A good strategy should be able to handle backtesting.
// @version=4
// **********************************************************************************************************
strategy("P-Signal Strategy:", precision = 3, pyramiding = 3)
//
// Parameters and const of P-Signal.
//
nPoints_D = input(title = "Number of D Bars", type = input.integer, defval = 9, minval = 4, maxval = 100, group = "Parameters of observation.")
nPoints_W = input(title = "Number of W Bars", type = input.integer, defval = 4, minval = 4, maxval = 100, group = "Parameters of observation.")
nPoints_M = input(title = "Number of M Bars", type = input.integer, defval = 6, minval = 4, maxval = 100, group = "Parameters of observation.")
int nIntr_D = nPoints_D - 1
int nIntr_W = nPoints_W - 1
int nIntr_M = nPoints_M - 1
bool bDValveOpen = true
bool bWValveOpen = true
bool bMValveOpen = true
// 
// 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)
//
// Signals for the strategy.
//
float nPSignal_D = sma(fPSignal(change(ohlc4), nIntr_D), nIntr_D)
float ndPSignal_D = sign(nPSignal_D[0] - nPSignal_D[1])
//
float nPSignal_W = sma(security(syminfo.tickerid, "W",fPSignal(change(ohlc4), nIntr_W)), nIntr_W)
float ndPSignal_W = sign(nPSignal_W[0] - nPSignal_W[1])
//
float nPSignal_M = sma(security(syminfo.tickerid, "M",fPSignal(change(ohlc4), nIntr_M)), nIntr_M)
float ndPSignal_M = sign(nPSignal_M[0] - nPSignal_M[1])
//
// P-Signal 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_D, color = color.blue, style = plot.style_line)
//
// Multi Frame Strategy 
// ... Day
if(nPSignal_D < 0 and ndPSignal_D > 0 and bDValveOpen)
    strategy.entry("long_D", strategy.long, 1) 
    bDValveOpen := false
if(nPSignal_D > 0 and ndPSignal_D < 0)
    strategy.close("long_D")
    bDValveOpen := true
// ... Week
if(nPSignal_W < 0 and ndPSignal_W > 0 and bWValveOpen)
    strategy.entry("long_W", strategy.long, 1) 
    bWValveOpen := false
if(nPSignal_W > 0 and ndPSignal_W < 0)
    strategy.close("long_W")
    bWValveOpen := true
// ... Month
if(nPSignal_M < 0 and ndPSignal_M > 0 and bMValveOpen)
    strategy.entry("long_M", strategy.long, 1) 
    bMValveOpen := false
if(nPSignal_M > 0 and ndPSignal_M < 0)
    strategy.close("long_M")
    bMValveOpen := true
// The end.

더 많은