선형 회귀 채널 브레이크업 거래 전략

저자:차오장, 날짜: 2024-02-18 15:00:53
태그:

img

전반적인 설명

이 전략은 선형 회귀 채널의 상단 및 하단 대역을 사용하며, 이중 표준편차와 결합하여 파업 구매 및 판매 신호를 설정하여 가격이 파업할 때 포지션을 설정합니다. 또한 채널의 중간 라인의 교차를 수익을 확보하는 신호로 사용합니다.

전략 논리

이 전략의 핵심 논리는 선형 회귀 채널의 상단, 하단 및 중간 선에 기초합니다. 구체적인 계산 과정은 다음과 같습니다.

  1. 가격의 선형 회귀 값을 계산하고 다음 기간의 선형 회귀 값을 계산합니다.

  2. 선형 회귀 선의 기울기 기울기 및 교차점 교차점을 계산

  3. 회귀 선에 대한 가격의 오차 오차를 계산

  4. 위와 하단의 대역의 오프셋을 얻기 위해 편차의 배수 dev를 설정

  5. 가격이 하부 밴드에서 위로 돌파하면, 구매 신호를 설정 구매

  6. 가격이 상단에서 아래로 돌파되면, 판매 신호를 설정 판매

  7. 가격이 채널의 중간선에서 뒤집어지면, 수익 신호 출구를 설정

  8. 구매, 판매 및 출구 신호에 기반한 거래 논리를 설정

이점 분석

이 전략의 가장 큰 장점은 선형 회귀 채널에 반영 된 중장기 트렌드를 활용한다는 것입니다. 구체적으로:

  1. 상위 및 하위 대역은 가격 변동의 정상적인 범위를 효과적으로 반영 할 수 있습니다. 거래 신호를 설정하는 데 사용하면 잘못된 신호를 줄일 수 있습니다.

  2. 이윤 취득 신호로서의 중간 라인 크로스오버는 이윤을 극대화하고 이윤을 창출한 후 반전으로 인한 손실을 피할 수 있습니다.

  3. 선형 회귀 채널은 약간의 지연을 가지고 있으며, 이는 단기 시장 소음을 효과적으로 필터링하여 거래 신호를 더 신뢰할 수 있습니다.

  4. 이 전략은 몇 가지 매개 변수를 가지고 있으며 알고리즘 거래에 적합하며 구현하기가 쉽습니다.

위험 분석

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

  1. 선형 회귀 채널의 지연은 급격한 단기적 변화 후에 트렌드를 놓칠 수 있습니다. 최적화하기 위해 기간을 단축 할 수 있습니다.

  2. 부적절한 오차 곱셈의 설정 또한 잘못된 신호로 이어질 수 있습니다. 매개 변수는 백테스팅을 통해 최적화 할 수 있습니다.

  3. 외출 신호에만 의존하면 윙사 손실이 발생할 수 있습니다. 신호 필터링에 다른 지표가 사용될 수 있습니다.

  4. 곡선 적응 위험은 있습니다. 다른 채널 지표와 결합하거나 다른 데이터 소스를 테스트하는 것이 도움이 될 수 있습니다.

최적화 방향

이 전략의 주요 최적화 방향:

  1. 라인리어 회귀 채널의 길이를 최적화하여 지연과 감도를 균형 잡습니다.

  2. 신호 품질을 높이고 동시에 위험 통제를 극대화하기 위해 오차 곱셈을 최적화합니다.

  3. 승률을 향상시키기 위해 신호 필터링을 위한 다른 지표를 추가합니다. 예를 들어 EMA, KDJ 등.

  4. ATR 후속 스톱 로스 같은 스톱 로스 메커니즘을 추가합니다.

  5. 전략에 대한 다른 데이터 소스의 영향을 테스트하십시오. 예를 들어 조정 된 종료, 인덱스 데이터 등.

  6. 시장 조건에 따라 매개 변수 또는 신호 무게를 동적으로 조정합니다.

결론

요약하자면, 이것은 선형 회귀 채널을 신호 지표로 사용하는 브레이크아웃 시스템입니다. 전략 논리는 몇 가지 매개 변수와 함께 명확하고 이해하기 쉽고 라이브 트레이딩을 비교적 쉽게 구현 할 수 있습니다. 그러나 변화하는 시장 상황에 따라 매개 변수를 동적으로 최적화하고 신호 필터링을위한 다른 지표를 결합하는 방법은이 전략의 성공의 핵심입니다. 지속적인 테스트와 최적화를 통해이 전략은 안정적인 수익 창출 양적 시스템으로 변할 수 있습니다.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Robotrading
//@version=4

strategy("robotrading linreg", "linreg", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, commission_value = 0.1)

//Settings
source      = input(close)
length      = input(100, minval=1)
offset      = input(0, minval=0)
dev         = input(2.0, "Deviation")
smoothing   = input(1, minval=1)
mtf_val     = input("", "Resolution", input.resolution)
signals     = input("Recent", "Signals Display", options=["Recent", "All"])
goto        = input(0, "End At Bar Index")

//Lin.reg.
cc(x) => x=="Red"?color.red:x=="Lime"?color.lime:x=="Orange"?color.orange:x=="Teal"?color.teal:x=="Yellow"?color.yellow:x=="Black"?color.black:color.white
data(x) => sma(security(syminfo.tickerid, mtf_val!="" ? mtf_val : timeframe.period, x), smoothing)
linreg = data(linreg(source, length, offset))
linreg_p = data(linreg(source, length, offset+1))

//Deviation
x = bar_index
slope = linreg - linreg_p
intercept = linreg - x*slope
deviationSum = 0.0
for i = 0 to length-1
    deviationSum:= deviationSum + pow(source[i]-(slope*(x-i)+intercept), 2)  
deviation = sqrt(deviationSum/(length))
x1 = x-length
x2 = x
y1 = slope*(x-length)+intercept
y2 = linreg

//Cross
dm_current = -deviation*dev + y2
dp_current = deviation*dev + y2
ex_current = (dm_current + dp_current) / 2
buy = crossunder(close, dm_current)
sell = crossover(close, dp_current)
exit = crossover(close, ex_current) or crossunder(close, ex_current)

//Channel
updating = goto <= 0 or x < goto
// if updating
//     line b = line.new(x1, y1, x2, y2, xloc.bar_index, extend.right, color.aqua, width = 3)
//     line.delete(b[1])
//     line dp = line.new(x1, deviation*dev + y1, x2, deviation*dev + y2, xloc.bar_index, extend.right, color.red, width = 3)
//     line.delete(dp[1])
//     line dm = line.new(x1, -deviation*dev + y1, x2, -deviation*dev + y2, xloc.bar_index, extend.right, color.lime, width = 3)
//     line.delete(dm[1])

//Lines
plot(dm_current, color = color.lime)
plot(dp_current, color = color.red)
plot(ex_current)
    
//Trading
if ex_current > 0
    strategy.entry("Long", strategy.long, na, limit = dm_current)
    strategy.entry("Short", strategy.short, na, limit = dp_current)
    strategy.exit("ExitLong", "Long", limit = ex_current)
    strategy.exit("ExitShort", "Short", limit = ex_current)

더 많은