듀얼 팩터 양적 거래 전략


생성 날짜: 2023-12-07 15:11:37 마지막으로 수정됨: 2023-12-07 15:11:37
복사: 0 클릭수: 609
avatar of ChaoZhang ChaoZhang
1
집중하다
1619
수행원

듀얼 팩터 양적 거래 전략

개요

이 전략은 123 반전과 양수 흔들림 지표의 두 인자를 결합하여 양인자 구동의 정량 거래를 구현합니다. 이 전략은 단기 반전 기회를 포착하면서 더 장기적인 추세를 식별하여 낮은 위험 과잉 수익을 달성 할 수 있습니다.

전략 원칙

첫 번째 부분은 123 역전 전략이다. 이 전략은 2 일 동안의 종결 가격 역전 특성을 사용하여 매도점을 판단한다. 종결 가격이 2 일 연속으로 상승하고 느린 K 선이 50 미만으로 되면, 과장된 것으로 간주되어 매도점을 생성한다. 종결 가격이 2 일 연속으로 하락하고 빠른 K 선이 50 미만으로 되면, 역전으로 간주되어 매도점을 생성한다.

두 번째 부분은 양수 흔들림 지표 전략이다. 이 지표는 지정된 가격 범위 내에서 현재 가격에 가장 가까운 양수를 계산하고 현재 가격과의 차이를 출력한다. 양수는 현재 가격이 양수 상한에 가까운 것을 나타내고, 음수는 현재 가격이 양수 하한에 가까운 것을 나타낸다.

두 가지 전략의 거래 신호 결합 원칙은 동방향 신호의 경우 실제 거래 신호를 생성하고, 이방향 신호의 경우 일시적으로 포지션을 열지 않는다.

우위 분석

이 전략은 이중적 인 요소를 결합하여 단기 반향 효과를 고려하고 장기적인 추세 특성을 고려하여 여러 관점에서 시장을 판단하여 전략의 위험 저항력을 향상시킵니다.

단일 모멘텀 전략에 비해, 이 전략은 갑작스러운 사건이 가격의 단기 점프를 일으킨 경우, 반전 인자를 이용해서 적시에 스톱도 또는 반전 포지션을 개시하여, 인트라데이 리스크를 효과적으로 제어할 수 있다.

단일 반전 전략에 비해, 이 전략은 양수 흔들림 지표를 도입하여 트렌드 방향을 판단하여, 빈번한 반전 거래가 오버 트레이딩을 초래하는 것을 피할 수 있다.

위험 분석

이 전략의 가장 큰 위험은 두 가지 요소 사이에 신호 충돌이 있을 때입니다. 123 반전이 과매매 과매매 신호를 표시하여 반전 신호를 생성하고, 양수 흔들림 지표가 여전히 추세에 있음을 표시하면, 직접 반전 거래가 손실을 초래할 수 있습니다.

이 위험을 제어하기 위해, 전략에 추가적인 판단 논리가 추가되어, 2 인자 신호가 동향될 때만 실제 거래 신호를 생성한다. 그러나 이것은 또한 일부 거래 기회를 놓칠 수 있다.

최적화 방향

  1. 스토카스틱 지표 변수를 최적화하여 특정 지표에 적합한 역전 변수 조합을 찾습니다.

  2. 질적 진동 지표의 용량 차도 비율 변수를 최적화하여 노이즈 거래를 줄이십시오.

  3. 단방향 손실 확산을 막기 위한 손실 차단 전략을 강화

  4. 포지션 관리 모듈을 추가하여 다른 시장 환경에 따라 포지션을 조정합니다.

  5. 기계 학습 모델에 2 인자 신호 신뢰성을 추가하여 신호 충돌 가능성을 낮춘다.

요약하다

이 전략은 성공적으로 단기 반전 인자와 장기 경향 인자를 결합하여 낮은 위험의 정량 거래를 구현한다. 이중 인자 필터링 노이즈 거래를 효과적으로 활용하고 추가 판단 논리 제어 위험을 설정하는 것은 평평한 수익의 실전 전략이다. 후속으로는 지속적인 매개 변수 최적화 및 기능 확장으로 전략이 실제 시장 특성에 더 적합하도록 한다.

전략 소스 코드
/*backtest
start: 2023-11-29 00:00:00
end: 2023-12-06 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 28/04/2021
// This is combo strategies for get a cumulative signal. 
//
// First strategy
// This System was created from the Book "How I Tripled My Money In The 
// Futures Market" by Ulf Jensen, Page 183. This is reverse type of strategies.
// The strategy buys at market, if close price is higher than the previous close 
// during 2 days and the meaning of 9-days Stochastic Slow Oscillator is lower than 50. 
// The strategy sells at market, if close price is lower than the previous close price 
// during 2 days and the meaning of 9-days Stochastic Fast Oscillator is higher than 50.
//
// Second strategy
// Determining market trends has become a science even though a high number or people 
// still believe it’s a gambling game. Mathematicians, technicians, brokers and investors 
// have worked together in developing quite several indicators to help them better understand 
// and forecast market movements.
//
// Developed by Modulus Financial Engineering Inc., the prime number oscillator indicates the 
// nearest prime number, be it at the top or the bottom of the series, and outlines the 
// difference between that prime number and the respective series.
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
Reversal123(Length, KSmoothing, DLength, Level) =>
    vFast = sma(stoch(close, high, low, Length), KSmoothing) 
    vSlow = sma(vFast, DLength)
    pos = 0.0
    pos := iff(close[2] < close[1] and close > close[1] and vFast < vSlow and vFast > Level, 1,
	         iff(close[2] > close[1] and close < close[1] and vFast > vSlow and vFast < Level, -1, nz(pos[1], 0))) 
	pos

PrimeNumberOscillator(price, percent) =>
    res = 0.0
    res1 = 0.0
    res2 = 0.0
    for j = price to price + (price * percent / 100)
        res1 := j
	    for i = 2 to sqrt(price)
        	res1 := iff(j % i == 0 , 0, j)
            if res1 == 0 
                break
		if res1 > 0 
		    break
    for j = price to price - (price * percent / 100)
        res2 := j
	    for i = 2 to sqrt(price)
        	res2 := iff(j % i == 0 , 0, j)
            if res2 == 0 
                break
		if res2 > 0 
		    break
    res := iff(res1 - price < price - res2,  res1 - price, res2 - price)
    res := iff(res == 0, res[1], res)
    res
    
PNO(percent) =>
    pos = 0.0
    xPNO = PrimeNumberOscillator(close, percent)
    pos:= iff(xPNO > 0, 1,
           iff(xPNO < 0, -1, nz(pos[1], 0))) 
    pos

strategy(title="Combo Backtest 123 Reversal & Prime Number Oscillator", shorttitle="Combo", overlay = true)
line1 = input(true, "---- 123 Reversal ----")
Length = input(14, minval=1)
KSmoothing = input(1, minval=1)
DLength = input(3, minval=1)
Level = input(50, minval=1)
//-------------------------
line2 = input(true, "---- Prime Number Oscillator ----")
percent = input(5, minval=0.01, step = 0.01, title="Tolerance Percentage")
reverse = input(false, title="Trade reverse")
posReversal123 = Reversal123(Length, KSmoothing, DLength, Level)
posPNO = PNO(percent)
pos = iff(posReversal123 == 1 and posPNO == 1 , 1,
	   iff(posReversal123 == -1 and posPNO == -1, -1, 0)) 
possig = iff(reverse and pos == 1, -1,
          iff(reverse and pos == -1 , 1, pos))	   
if (possig == 1 ) 
    strategy.entry("Long", strategy.long)
if (possig == -1 )
    strategy.entry("Short", strategy.short)	 
if (possig == 0) 
    strategy.close_all()
barcolor(possig == -1 ? #b50404: possig == 1 ? #079605 : #0536b3 )