이 전략은 선형 회귀 통로의 상하 궤도를 활용하여 쌍 표준 차치 설정과 결합하여 가격 돌파 후에 포지션을 개설하여 포지션을 구축합니다. 또한 통로의 중선의 교차를 평점 포지션 신호로 사용하여 수익 후 정지합니다.
이 전략의 핵심 논리는 선형 회귀 통로의 상하 궤도와 중선에 기반한다. 구체적인 계산 과정은 다음과 같다:
가격을 계산하는 선형 회귀값 linreg, 그리고 다음 주기의 선형 회귀값 linreg_p
선형 회귀 값에 따라 계산된 선형 회귀 선의 기울기 slope와 절단 거리의 intercept
회귀선에 대한 가격의 편차를 계산합니다.
오차의 배수 dev를 설정하여, 상반도, 하반도 오차량을 얻습니다.
가격이 하위 궤도에서 상향으로 돌파되면 구매 신호를 설정합니다.
가격이 상단에서 아래로 돌파 할 때 sell 신호를 설정합니다.
가격의 통로 중선에서 반전되면, 정지 신호를 exit
구매 신호, 판매 신호 및 정지 신호에 따라 거래 논리 설정
이 전략의 가장 큰 장점은 선형 회귀 통로에서 반영된 가격의 중·장기 경향을 이용한다는 것이다. 구체적으로 다음과 같은 몇 가지 측면으로 나타난다:
선형 회귀 통로의 상하 궤도는 가격 변동의 정상적인 범위를 효과적으로 반영할 수 있으며, 통로의 범위를 사용하여 거래 신호를 설정하여 잘못된 신호를 줄일 수 있습니다.
중선 교차는 정지 신호로, 수익을 최대한 잠금할 수 있으며, 수익 이후 계속 반전되는 손실을 피할 수 있다.
선형 회귀 통제 도구는 약간의 지연성을 가지고 있으며, 단기 시장 소음을 효과적으로 제거하여 거래 신호를 더 신뢰할 수 있습니다.
이 전략은 적은 매개 변수, 쉽게 구현할 수 있으며, 양적 거래의 알고리즘화에 적합하다.
이 전략에는 다음과 같은 위험도 있습니다.
선형 회귀 통로는 지연성이 있으며, 단기간에 급격한 변화 후의 경향을 놓칠 수 있다. 통로 주기를 적절히 단축하고, 매개 변수를 최적화할 수 있다.
오차배수가 잘못 설정되어도 잘못된 신호가 발생한다. 퓨터스틱 최적화 파라미터를 결합할 수 있다.
파격 신호만 기준으로, 충격 손실이 더 많이 발생할 수 있다. 다른 지표와 결합하여 파동을 가하는 것을 고려할 수 있다.
특정 곡선 적합의 위험이 있습니다. 다른 통로 지표와 결합하거나 다른 데이터 소스를 테스트하는 것이 고려 될 수 있습니다.
이 전략은 다음의 몇 가지 측면에서 최적화될 수 있습니다.
선형 회귀 통로의 길이를 최적화하고, 지연성과 반응 민감성을 균형 잡는다.
오차 배수를 최적화하고, 위험을 최대한 제어하는 전제하에서 신호 품질을 향상시킨다.
다른 지표를 추가하여 신호 필터링을 수행하여 전략 승률을 높인다. 예를 들어 EMA, KDJ 등이다.
ATR 중지, 추적 중지 등.
다양한 데이터 소스가 전략에 미치는 영향을 테스트한다. 예를 들어 복권 데이터, 지수 데이터 등을 사용한다.
시장 환경 ((多空頭市場) 과 결합하여 동적으로 조정하는 파라미터 또는 신호 무게。
이 전략은 전체적으로 선형 회귀 통로를 신호 지표로 사용하는 획기적인 시스템이다. 전략 아이디어는 명확하고 이해하기 쉽고, 파라미터가 적고, 실장 구현에 어려움이 없다. 그러나 시장 환경의 동성에 따라 파라미터를 최적화하고, 다른 지표와 결합하여 신호 필터링을 수행하는 것이 전략의 성공의 핵심이다. 지속적인 테스트와 최적화를 통해, 이 전략은 안정적으로 수익성있는 계량화 시스템이 될 수 있다.
/*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)