본문 바로가기
  • "Backtest, backtest, backtest." - Martin Schwartz
[백테스팅] 소개

[백테스팅 도구] [트레이딩뷰] 가짜 전략 확인 - security() 함수 barmerge.lookahead_on

by Eirene 2022. 12. 16.
반응형

[백테스팅 도구] [트레이딩뷰] 가짜 전략 확인 - security() 함수 barmerge.lookahead_on
[백테스팅 도구] [트레이딩뷰] 가짜 전략 확인 - security() 함수 barmerge.lookahead_on

트레이딩뷰에서 제공하는 전략 이용 시, 가짜 전략 확인 필요

트레이딩뷰 전략테스터는 쉽게 투자 전략에 대해 백테스팅을 할 수 있을 뿐만 아니라, 트레이딩뷰 자체적으로 제작하거나 사용자가 제작한 전략을 제공하기 때문에 다양한 전략을 테스트해 볼 수 있습니다. 하지만, 제공되는 전략 중에 백테스팅 시에는 높은 수익률을 산출 하지만 실제 실시간으로 적용 시에는 수익이 발생되지 않은 가짜 전략이 존재합니다.

 

그중에서 대표적인 이유 중 하나는 security() 함수에서 barmerge.lookahead_on 옵션이 적용된 경우입니다.

 

자세한 트레이딩뷰와 파인 스크립트 관련 정보는 아래 WikiDocs에 있는 온라인북 참고 바랍니다.
[도서] : 트레이딩뷰 파인 스크립트 개발 : 기술적 지표, 신호, 전략, 백테스팅
 

트레이딩뷰 파인 스크립트 개발: 기술적 지표, 신호, 전략, 백테스팅

이 책는 트레이딩뷰(TradingView) 플랫폼에서 사용되는 프로그래밍 언어인 파인 스크립트(Pine Script)를 배우고 숙달하기 위한 궁극적인 가이드입니다. 이 포괄적인 …

wikidocs.net

 

5) 리페인팅 방지

[TOC] 파인 스크립트에서의 리페인팅 개념과 트레이딩 전략에 미치는 영향, 그리고 더 신뢰할 수 있는 결과를 얻기 위해 리페인팅을 방지하는 방법을 살펴볼 것입니다. ## …

wikidocs.net

 

파인스크립트 security() 함수 - barmerge.lookahead_on 모드

security() 함수는 현재 차트에서 설정된 심볼이 아닌 다른 심볼이나 다른 타임 프레임의 데이터를 가져옵니다. 

request.security(symbol, timeframe, expression, gaps, lookahead, 
        ignore_invalid_symbol, currency) 
   → <type of `expression`>

인자는 아래와 같습니다.

  • symbol (simple string) 데이터를 요청할 심볼입니다. 
  • timeframe (simple string) 요청된 데이터의 타임프레임입니다. 
  • expression (variable, function, array or matrix of series int/float/bool/string/color, or a tuple of these) 해당 타임프레임에서 요청할 값 종류 (예를 들어 종가의 경우 "close")입니다.
  • gaps (input barmerge_gaps) barmerge.gaps_on을 사용하면 함수의 콘텍스트에서 처음 사용할 수 있을 때만 현재 차트 표시줄에 값이 나타납니다. 그렇지 않으면 na가 반환됩니다(따라서 "갭"이 발생함). barmerge.gaps_off를 사용하면 na값을 피하면서, 반환된 최신 알려진 값으로 간격이 채워집니다. 기본값은 barmerge.gaps_off입니다.
  • lookahead (input barmerge_lookahead) 히스토리 바에서, 타임프레임 내부 데이터를 리턴합니다.
    • 쓸 수 있는 값: barmerge.lookahead_onbarmerge.lookahead_off입니다.
    • `close [1]` 에서처럼 `expression` 아규먼트를 상쇄하지 않고, 차트보다 더 높은 타임프레임에서 barmerge.lookahead_on를 쓰게 되면 스크립트에서 나중에 리크가 일어날 수 있습니다. 
      • 예를 들어 차트가 1시간 봉으로 설정하고, 현재 시간이 오후 1시인데 security(syminfo.tickerid, "1D", close, lookahred=barmerge.lookahead_on) 요청하면, 리턴 값이 금일 종가인 밤 12시의 값을 리턴합니다.
      • 이는 현재 콘텍스트에서의 실제 `close` 프라이스가 알려지기 앞서 그 값을 리턴하게 되기 때문입니다. 유저 매뉴얼에 나와 있는 리페인팅 설명에 따라 이는 잘못된 결과를 내게 됩니다.
    • Pine Script™ v3부터 디폴트는 barmerge.lookahead_off입니다. v1 및 v2에서 디폴트는 barmerge.lookahead_on입니다.
  • ignore_invalid_symbol (input bool) 지정된 심볼을 찾을 수 없는 경우 함수의 동작을 결정합니다.
  • currency (simple string) 통화 단위 (openhighlowclose 등)입니다.
 
사용 예 코드는 아래와 같습니다.
//@version=5
indicator("Simple `request.security()` calls")

// Returns 1D close of the current symbol.
forecast_close = request.security("AAPL", "1H", close)
plot(dailyClose)

current_close = request.security("AAPL", "1D", close, barmerge.gaps_off, barmerge.lookahead_on))
plot(aaplClose)

if current_close < current_close
     strategy.entry("BUY", ...)

위 코드는 1 시간 봉의 종가가 그날의 종가보다 낮으면 매수하는 전략이 됩니다. 실질적으로는 말도 안 되는 전략이며, 실시간에서는 동작이 이상하게 발생될 수 있습니다.

 

가짜 수익률 사례

여기에서는 하이킨 아시(Heikin Ashi) 기법과 지수 이동평균(EMA)을 조합한 기법인 Heikin Ashi Double EMA Strategy [Krypt] 전략에 사례를 보여 드리도록 하겠습니다. 백테스트는 솔라나(SOLUSDT@Binance) 5분 봉으로 하도록 하겠습니다. 기간은 2022년 11월 7일부터 12월 16일까지 입니다.

Heikin Ashi Double EMA Strategy [Krypt] 전략 - 백테스트 조건
Heikin Ashi Double EMA Strategy [Krypt] 전략 - 백테스트 조건
Heikin Ashi Double EMA Strategy [Krypt] 전략 - 입력 속성

 

1. secruity() 함수의 barmerge.lookahead_on 적용 경우 : +50,013.74% 수익

아래 실행 화면처럼 수익이 1달 조금 넘는 기간 동안 +50,013.74%나 됩니다. 승률이 71.64%로 엄청납니다.

Heikin Ashi Double EMA Strategy [Krypt] 전략 - barmerge.lookahead_on
Heikin Ashi Double EMA Strategy [Krypt] 전략 -&nbsp;barmerge.lookahead_on

 

2. secruity() 함수의 barmerge.lookahead_off 경우 : -30.85% 손실

하지만, 실제로 lookahead_off를 실행하면 손실이 -30.85%나 발행됩니다.

Heikin Ashi Double EMA Strategy [Krypt] 전략 - barmerge.lookahead_off
Heikin Ashi Double EMA Strategy [Krypt] 전략 -&nbsp;barmerge.lookahead_off

이 이유는 아래 소스를 보시면,

ha_t = ticker.heikinashi(syminfo.tickerid)
ha_close = request.security(ha_t, res, logtransform ? math.log(close) : close, 
		barmerge.gaps_off, barmerge.lookahead_on)
mha_close = request.security(ha_t, res1, logtransform ? math.log(close) : close, 
		barmerge.gaps_off, barmerge.lookahead_on)

barmerge.lookahead_on으로 되어 있습니다.

 

이는 트레이딩뷰 리페인팅 현상인데 여기 링크 확인 부탁 드립니다.

 

트레이딩뷰 전략테스터 이용 시,
Repaint를 발생시키는 security() 함수의 barmerge.lookahead_on 기반 전략은 
실제 적용 시 큰 손실을 가져올 수 있으니 유의해야 합니다.
728x90
반응형

댓글