유평선 회귀 거래 전략

저자:차오장, 날짜: 2023-10-25 10:58:02
태그:

均线回归交易策略

개요

유평선 회귀 거래 전략은 주식의 선형 회귀선과 선형 회귀선의 교차점을 계산하여 구매 및 판매 신호를 결정한다. 이 전략은 유평선과 선형 회귀 분석을 결합하여 주가의 추세를 고려하고 통계적 특성을 고려하여 주가의 전환점을 효과적으로 판단하여 낮은 구매 및 판매를 달성한다.

전략적 원칙

이 전략은 먼저 n일 주가의 선형 회전선과 m일 평균선을 계산한다. 선형 회전선은 주가의 장기 통계 추세를 반영하고, 평균선은 주가의 단기 움직임을 반영한다.

평선 상의 직선적 회귀선은 상승세가 증가하는 것을 나타내고 구매 신호를 생성한다. 평선 아래의 직선적 회귀선은 상승세가 희박한 것을 나타내고 판매 신호를 생성한다.

특히, 전략은 다음과 같은 몇 가지 단계를 통해 거래 신호를 판단합니다.

  1. n일 주식 가격의 선형 회귀선을 계산합니다.

  2. 선형 회전선의 m일 간단한 이동 평균 LRMA를 계산

  3. 주식 가격을 계산하는 m일 지수 이동 평균자책자

  4. 롱엔트리 (longEntry) 는 롱엔트리 (longEntry) 를 통해 롱엔트리 (longEntry) 를 통과할 때 구매 신호를 생성합니다.

  5. 에마가 lrMA를 통과하면 파는 신호가 생성됩니다.

  6. 또한 큰 시장 판단과 결합하여 큰 시장이 황금시장일 때만 신호를 구입하는 것을 고려합니다.

  7. 신호에 따라 구매 및 판매 거래를 수행합니다.

평행선과 회귀선의 교차점으로 구매 시기를 결정함으로써, 가짜 브레이크를 효과적으로 필터링하고 반전 지점을 포착하여 낮은 구매를 달성할 수 있다.

전략적 장점

  • 회귀선은 장기적인 경향을 나타내고, 평균선은 단기적인 움직임을 나타냅니다. 이중 지표가 결합되어 구매점을 정확하게 판단 할 수 있습니다.
  • 회전선 계산은 간단하고 쉽게 수행됩니다.
  • 큰 판정을 통해 불리한 거래 신호를 필터링할 수 있습니다.
  • 구매 및 판매 전략을 조정할 수 있습니다.
  • 더 많은 돈을 벌 수 있는 더 낮은 구매와 판매를 달성합니다

전략적 위험

  • 주가가 크게 변할 때 평균선과 회귀선이 자주 교차하여 잘못된 신호를 일으킬 수 있습니다.
  • 시장의 판단이 정확하지 않을 때 구매 시기를 잘못 판단합니다.
  • 잘못된 매개 변수 설정도 전략 효과에 영향을 줄 수 있습니다.
  • 거래의 빈도, 거래 비용이 높습니다

주의가 필요한 매개 변수 조정, 적당하게 평균선과 회귀선 주기 매개 변수를 확대하여 거래 빈도를 낮추기; 합리적으로 중지 손실 전략을 설정하여 위험을 제어하기; 큰 판정을 최적화하고 정확도를 향상시키는 규칙.

전략 최적화

이 전략은 다음과 같은 몇 가지 측면에서 최적화 될 수 있습니다:

  1. 유평선 지표 최적화: 주식에게 가장 적합한 유평선을 찾기 위해 가중화 이동 평균과 같은 다른 유형의 유평선을 시도하십시오.

  2. 회전선 최적화: 회전선 계산 주기를 조정하여 주식의 장기 트렌드를 가장 잘 반영하는 주기 매개 변수를 찾습니다.

  3. 대판 판단 최적화: 다양한 대판 판단 지표를 테스트하여 전략에 가장 적합한 대판 신호를 찾습니다.

  4. 매개 변수 최적화: 다양한 매개 변수 조합을 반복적으로 재검토하여 최적의 매개 변수 구성을 찾는다.

  5. 스톱손실 전략 최적화: 다른 스톱손실 방법을 테스트하고, 위험을 제어하기 위해 최적의 스톱손실 논리를 설정한다.

  6. 트랜잭션 비용 최적화: 다른 트랜잭션 처리 요금 모형에 따라 트랜잭션 주파수를 조정하여 트랜잭션 비용을 줄입니다.

이 몇 가지 요소를 최적화하면 전략의 안정성과 수익률을 더욱 향상시킬 수 있습니다.

요약

이 유선 회귀 거래 전략은 유선 분석과 선형 회귀 분석을 통합하여 주식 가격 전환점을 효과적으로 식별하고, 하부 구매 및 판매를 안내하는 장점이 있다. 이 전략은 간편하고 신뢰할 수 있으며 중장선 선택 주식 거래에 적합하다. 매개 변수 최적화와 위험 통제로 전략 안정성을 더욱 향상시킬 수 있다. 이 전략은 주식 시장 분석에 실용적인 기술 거래 방안을 제공한다.


/*backtest
start: 2022-10-18 00:00:00
end: 2023-10-24 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/
// © lazy_capitalist

//@version=5
strategy('Linear Regression MA', overlay=true, initial_capital=10000)
datesGroup = "Date Info"
startMonth = input.int(defval = 1,    title = "Start Month",  minval = 1, maxval = 12,  group=datesGroup)
startDay   = input.int(defval = 1,    title = "Start Day",    minval = 1, maxval = 31,  group=datesGroup)
startYear  = input.int(defval = 2022, title = "Start Year",   minval = 1970,            group=datesGroup)

averagesGroup = "Averages"
lrLineInput     = input.int(title="Linear Regression Line",   defval=55, minval = 1, group=averagesGroup)
lrMAInput       = input.int(title="Linear Regression MA",     defval=55, minval = 1, group=averagesGroup)
emaInput        = input.int(title="EMA Length",               defval=55, minval = 1, group=averagesGroup)


tradesGroup = "Execute Trades"
executeLongInput    = input.bool(title="Execute Long Trades",       defval=true)
executeShortInput   = input.bool(title="Execute Short Trades",      defval=true)
executeStopLoss     = input.bool(title="Execute Stop Loss",         defval=true)

fourHrSMAExpr       = ta.sma(close, 200)
fourHrMA            = request.security(symbol=syminfo.tickerid, timeframe="240", expression=fourHrSMAExpr)

bullish             = close > fourHrMA ? true : false


maxProfitInput              = input.float(  title="Max Profit (%)",         defval=10.0,    minval=0.0)   * 0.01
stopLossPercentageInput     = input.float(  title="Stop Loss (%)",          defval=1.75,    minval=0.0)   * 0.01

start       = timestamp(startYear, startMonth, startDay, 00, 00)            // backtest start  window
window()    => time >= start ? true : false                              // create function "within window of time"
showDate    = input(defval = true, title = "Show Date Range")

lrLine = ta.linreg(close, lrLineInput, 0)
lrMA   = ta.sma(lrLine, lrMAInput)
ema     = ta.ema(close, emaInput)

longEntry   = ema   < lrMA
longExit    = lrMA  < ema

shortEntry  = lrMA  < ema
shortExit   = ema   < lrMA


maxProfitLong   = strategy.opentrades.entry_price(0) * (1 + maxProfitInput)
maxProfitShort  = strategy.opentrades.entry_price(0) * (1 - maxProfitInput)

stopLossPriceShort  = strategy.position_avg_price * (1 + stopLossPercentageInput)
stopLossPriceLong   = strategy.position_avg_price * (1 - stopLossPercentageInput)

if(executeLongInput and bullish)
    strategy.entry( id="long_entry", direction=strategy.long,   when=longEntry and window(),    qty=10,  comment="long_entry")
    strategy.close( id="long_entry", when=longExit,     comment="long_exit")
    // strategy.close( id="long_entry", when=maxProfitLong <= close, comment="long_exit_mp")
    
if(executeShortInput and not bullish)
    strategy.entry( id="short_entry", direction=strategy.short,   when=shortEntry and window(),    qty=10,  comment="short_entry")
    strategy.close( id="short_entry", when=shortExit,     comment="short_exit")
    // strategy.close( id="short_entry", when=maxProfitShort <= close, comment="short_exit_mp")

if(strategy.position_size > 0 and executeStopLoss)
    strategy.exit(  id="long_entry",        stop=stopLossPriceLong,             comment="exit_long_SL")
    strategy.exit(  id="short_entry",       stop=stopLossPriceShort,            comment="exit_short_SL")
    
// plot(series=lrLine,     color=color.green)
plot(series=lrMA,       color=color.red)
plot(series=ema,        color=color.blue)


더 많은 내용