가상화폐 투자자 가이드

트레이딩 뷰 퀵스타트 (2) - 전략 작성

Q42 2022. 3. 3. 10:22

지난 글에서 트레이딩 뷰의 기초적인 부분을 설명하고 지표를 작성해 보았습니다:

https://quant42.tistory.com/137

 

트레이딩 뷰 퀵스타트 (1) - 지표 작성

트레이딩 뷰는 시장 분석, 토론, 거래를 위한 금융 플랫폼으로 금융 거래에 필요한 차트를 위시한 거래 툴, 소셜네트워크 및 커뮤니티 기능, 여러 금융 정보와 지표를 모은 데

blog.quantro.kr

 

이번에는 트레이딩 뷰의 전략을 작성하고 백테스트하는 과정을 살펴보겠습니다.

 

실행 과정은 다음 영상을 참고하시기 바랍니다:

https://youtu.be/FG4Ve9TWJTg

전략  작성 기초

전략 작성을 위한 최소한의 예제로 다음 코드를 살펴보겠습니다:

//@version=5
strategy("First Strategy", overlay=true, scale=scale.none)

// 0시 정각에 매수 실행
if hour == 0 and minute == 0			
    strategy.entry("position", strategy.long, 1)

// 12시 정각에 포지션이 존재하면 매도 실행
if hour == 12 and minute == 0 and strategy.position_size != 0 
    strategy.close("position")

plot(strategy.equity)

 

 

참고로 파인 스크립트 매뉴얼에 hour, minute 등의 내장 변수와 strategy(), strategy.entry() 와 같은 내장 함수에 대한 설명이 있으니 상세 설명은 해당 링크를 참고하시고, 간략히 설명하겠습니다:

  • strategy() : 스크립트가 전략임을 명시합니다. 전략 이름은 "Samplest Strategy" 고 화면에 겹쳐서 출력합니다(이전 포스트 참조).이 함수를 호출하면 에뮬레이터가 내부적으로 실행되어 전략을 시뮬레이션하고 그 결과를 [ Strategy Tester ] 탭에서 보여줍니다.
  • hour, minute : 봉의 시간과 분을 나타내는 수열 변수입니다. 각각 hour[0] , minute[0] 와 같습니다. 
  • strategy.entry('position', strategy.long, 1) : id가 'position' 인 1 비트코인 매수 주문을 실행합니다. 
  • strategy.entry('position') : id가 'position' 인 주문을 청산합니다. 현재 포지션이 롱 1 비트코인이므로 숏 1 비트코인 주문이 나간다고 보면 됩니다.
  • plot(strategy.equity) : 해당 봉에서의 전체 평가 금액(초기 자본 + 총 거래 손익 + 현재 포지션의 손익)을 출력합니다. strategy(overlay=true) 로 선언되어 있으므로 가격 차트와 함께 표시되는데, 이 때 단위가 다르기 때문에 화면 배율이 잘 맞지 않습니다. 이에 따라 scale=scale.none 옵션을 명시해서 가격 차트와의 의존성을 없애 주면 배율이 잘 맞습니다.

위 코드를 입력하고 [Add to Chart] 를 실행하면 [ Pine Editor ] 탭이 [ Strategy Tester ] 탭으로 바뀌면서 백테스트 결과를 보여줍니다 :

 

그림 1. First Strategy 실행 결과

 

그림 1. 은 위 코드의 실행 결과 화면입니다. 총 421 번의 매매 동안 승률은 48.69%, 손실은 -37.9% 가 발생한 것을 확인할 수 있습니다. 참고로 트레이딩 뷰는 initial_capital 로 초기 자본금을 설정하지 않으면 100,000 원에서 시작하기 때문에, 수천만원에 이르는 비트코인을 1개씩 매매하면 자본금 자체가 음수가 되어 버린다. 이에 따라 strategy(initial_capital=100000000) 으로 세팅해서 초기 자본금을 1억으로 설정했다.

 

변동성 돌파 전략 작성

 

전략 개요

 

이제 좀더 현실적인 예로써, 변동성 돌파 전략을 작성해 보겠습니다. 변동성 돌파 전략에 대한 자세한 내용은 systrader79 님의 블로그를 참고하시기 바랍니다.

 

실전 투자 전략 (48) - 변동성 돌파 전략의 핵심 원리 (1)

 이번 포스팅에서는 이전에 간단히 다룬 바 있는 변동성 돌파 단기 전략의 핵심 원리를 좀 더 상세히 다뤄보겠습니다. 소개할 내용은 systemtradersuccess.com에 소개된 시스템 트레이더 Thomas Niesendal

stock79.tistory.com

 

먼저 변동성 돌파 전략의 로직은 다음과 같습니다:

  1. 전일 일봉 기준 range(고가 - 저가) 계산
  2. 당일 장중 가격 > 당일 시가 + (전일 range 값 * k) 일 때 매수. 이 때 k 는 노이즈 비율로 0-1 사이의 값.
  3. 익일 시가 매도

이 때 주식 시장과 달리 가상화폐 시장은 24시간 오픈되어 있으므로 봉의 기준이 애매한 면이 있는데, 여기서는 자정을 기준으로 하겠습니다.

 

여기서 작성된 전체 코드는 다음 링크를 참고하면 됩니다:

https://gist.github.com/quantro-kr/cf4bae6f0af67a362f2da149d46b391d

 

변동성돌파전략.pine

GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

이제 주요 구현 내용을 살펴보겠습니다.

 

전일 Range 계산

트레이딩뷰는 현재의 봉을 기준으로 모든 연산이 이루어지므로 먼저 자정으로부터 몇 번째 봉인지 계산해야 합니다.

// 현재의 타임프레임을 분단위로 얻어옴. 예를 들어 1시간인 경우 180.
period=str.tonumber(timeframe.period)
// 하루의 봉 개수
daily_bars=math.floor(24*60/period)
// 자정~현재까지의 봉 개수
offset=math.floor(hour*60/period)+math.floor(minute/period)

이제 전일 range 를 계산할 수 있습니다.

// 전일 저가,고가의 값을 전일 마지막 봉의 값으로 할당
_high = high[offset+1]
_low = low[offset+1]

// (마지막 봉-1) 번째 봉부터 전일 첫번째 봉까지 루프를 돌면서 고가와 저가의 값을 계산
for i=offset+2 to offset+bars_day
    _high:=math.max(_high, high[i])
    _low:=math.min(_low, low[i])
    
// range = 전일 일봉 기준 (고가 - 저가)
_range=_high-_low

 

매매

매수는 현재 포지션이 없고, 현재의 종가가 시가 + range * k 보다 크면 진입합니다.

if strategy.position_size == 0 and close > open[offset]+_range*k
	strategy.entry("position", strategy.long, 1)

 

매도는 현재 포지션이 있고, 자정이 되면 청산합니다.

if strategy.position_size != 0 and hour == 0 and minute == 0
    strategy.close("position")

 

위 전략을 타임프레임, k 값, 매수 갯수 등을 변경해 보면서 적절한 지점을 찾아봅니다.

타임프레임 1h, k=0.5 , 매수 단위 1 일 때의 백테스트 결과는 다음과 같습니다:

 

다음에는 알림(Alert)에 대해 다루겠습니다.