긴 단선 회귀 교차 전략 (Long-Short Linear Regression Crossover Strategy) 은 선형 회귀 모델을 사용하여 주식의 미래의 가격 움직임을 예측하는 기술 분석 전략이다. 전략의 기본 원리는 주식 가격 움직임이 종종 특정 선형 추세를 따르고 있으며 가격의 선형 회귀를 계산함으로써 미래의 가격을 예측할 수 있다. 예측된 가격이 현재 가격 이상으로 넘어가면 전략은 길게 이동하고, 아래로 넘어가면 위치에서 빠져 나간다.
이 전략은 먼저 일정 기간 동안 주식 가격의 선형 회귀를 계산한다. 선형 회귀는 시간의 흐름에 따라 변화하는 가격의 경향을 나타내는 최소 제곱 방법을 사용하여 직선에 맞는다. 그 다음 전략은 예측된 가격 라인과 차트에 있는 현재 가격을 그래프로 나타낸다.
전략은 두 가지 신호를 정의합니다.
긴 신호가 나타나면 전략은 긴 포지션을 열고 짧은 신호가 나타나면 포지션을 닫습니다.
전략의 핵심 단계는 다음과 같습니다.
긴 짧은 선형 회귀 크로스오버 전략은 다음과 같은 장점을 가지고 있습니다.
많은 장점에도 불구하고, 긴 짧은 선형 회귀 교차 전략은 또한 몇 가지 위험을 가지고 있습니다:
롱 쇼트 라인리어 레그레션 크로스오버 전략은 선형 회귀와 현재 가격의 예측 가격 비교를 기반으로 거래 신호를 생성합니다. 전략의 논리는 간단하고 명확하며 가격의 선형 트렌드를 파악하고 다양한 시장 조건에 적용 할 수 있습니다. 동시에 전략은 구현하고 최적화하기가 쉽고 매개 변수를 유연하게 조정하고 다른 지표와 결합하여 위험 제어 모듈을 추가 할 수 있습니다. 전략의 성능을 지속적으로 향상시키기 위해. 그러나 전략에는 추세 인식의 부정확, 부적 매개 변수 설정 및 역사적 데이터의 과잉과 같은 위험이 있으므로 실용적인 응용에서 주의가 필요합니다. 전반적으로, 롱 쇼트 라인리어 레그레션 크로스오버 전략은 추가 탐구 및 최적화에 가치가있는 간단하고 효과적인 수치적 거래 전략입니다.
/*backtest start: 2024-02-25 00:00:00 end: 2024-03-26 00:00:00 period: 3h basePeriod: 15m 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/ // © stocktechbot //@version=5 strategy("Linear Cross", overlay=true, margin_long=100, margin_short=0) //Linear Regression vol = volume // Function to calculate linear regression linregs(y, x, len) => ybar = math.sum(y, len)/len xbar = math.sum(x, len)/len b = math.sum((x - xbar)*(y - ybar),len)/math.sum((x - xbar)*(x - xbar),len) a = ybar - b*xbar [a, b] // Historical stock price data price = close // Length of linear regression len = input(defval = 21, title = 'Strategy Length') linearlen=input(defval = 9, title = 'Linear Lookback') [a, b] = linregs(price, vol, len) // Calculate linear regression for stock price based on volume //eps = request.earnings(syminfo.ticker, earnings.actual) //MA For double confirmation out = ta.sma(close, 200) outf = ta.sma(close, 50) outn = ta.sma(close, 90) outt = ta.sma(close, 21) outthree = ta.sma(close, 9) // Predicted stock price based on volume predicted_price = a + b*vol // Check if predicted price is between open and close is_between = open < predicted_price and predicted_price < close //MACD //[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9) // Plot predicted stock price plot(predicted_price, color=color.rgb(65, 59, 150), linewidth=2, title="Predicted Price") plot(ta.sma(predicted_price,linearlen), color=color.rgb(199, 43, 64), linewidth=2, title="MA Predicted Price") //offset = input.int(title="Offset", defval=0, minval=-500, maxval=500) plot(out, color=color.blue, title="MA200") [macdLine, signalLine, histLine] = ta.macd(predicted_price, 12, 26, 9) //BUY Signal longCondition=false mafentry =ta.sma(close, 50) > ta.sma(close, 90) //matentry = ta.sma(close, 21) > ta.sma(close, 50) matwohun = close > ta.sma(close, 200) twohunraise = ta.rising(out, 2) twentyrise = ta.rising(outt, 2) macdrise = ta.rising(macdLine,2) macdlong = ta.crossover(predicted_price, ta.wma(predicted_price,linearlen)) and (signalLine < macdLine) if macdlong and macdrise longCondition := true if (longCondition) strategy.entry("My Long Entry Id", strategy.long) //Sell Signal lastEntryPrice = strategy.opentrades.entry_price(strategy.opentrades - 1) daysSinceEntry = len daysSinceEntry := int((time - strategy.opentrades.entry_time(strategy.opentrades - 1)) / (24 * 60 * 60 * 1000)) percentageChange = (close - lastEntryPrice) / lastEntryPrice * 100 //trailChange = (ta.highest(close,daysSinceEntry) - close) / close * 100 //label.new(bar_index, high, color=color.black, textcolor=color.white,text=str.tostring(int(trailChange))) shortCondition=false mafexit =ta.sma(close, 50) < ta.sma(close, 90) matexit = ta.sma(close, 21) < ta.sma(close, 50) matwohund = close < ta.sma(close, 200) twohunfall = ta.falling(out, 3) twentyfall = ta.falling(outt, 2) shortmafall = ta.falling(outthree, 1) macdfall = ta.falling(macdLine,1) macdsell = macdLine < signalLine if macdfall and macdsell and (macdLine < signalLine) and ta.falling(low,2) shortCondition := true if (shortCondition) strategy.entry("My Short Entry Id", strategy.short)