Parabolic SAR 과 비슷한 변동성에 대하여 손절을 잡아주는 Volatility Stop (이하 VS) 입니다. 이번 포스팅에서는 VS 를 구성하는 식들을 해체해 볼 것이며, 어떤 식으로 사용이 가능할 지에 대한 부가적인 설명을 해보겠습니다! Parabolic SAR 과 Keltner Channel 과 비슷한 면이 있으며, ATR 값을 활용하여 손절을 설정하기에 세 개의 포스팅을 읽고 오시는 것을 추천드립니다! :)
https://www.steemcoinpan.com/sct/@roostermine/20-atr
https://www.steemcoinpan.com/sct/@roostermine/25-keltner-channels-i
https://www.steemcoinpan.com/sct/@roostermine/26-keltner-channels-ii
https://www.steemcoinpan.com/sct/@roostermine/31-parabolic-sar-i
https://www.steemcoinpan.com/sct/@roostermine/32-parabolic-sar-ii
https://www.steemcoinpan.com/sct/@roostermine/33-parabolic-sar-iii
가장 먼저 VS 가 어떻게 생긴 친구냐 부터 살펴보겠습니다. 바로 이전 포스팅에서 배우신 SAR 과 비슷하게, 상승 추세에서는 가격의 하단에 점으로, 하락 추세에서는 가격의 상단에 점으로 "손절 및 익절" 선을 표기하는 보조지표 입니다.
메커니즘도 동일하게 가격의 종가가 VS 를 터치할 때마다, 추세가 전환 되었다고 표기되어, 터치할 때마다 위아래로 전환되게 됩니다. 직관적으로는 SAR 보다도 민감한 지표이기에, 다른 진입의 기준이 필요한 것으로 보입니다.
일단... 계산식은 생각보다 단순해 보이긴 하는데, 변수를 일부로 복잡하게 쓴건지... 일단 변수 부터 정리를 하고 시작해보죠!
CL: Closing Price = 종가
MULT : TR 의 계수
TR : True Range = 캔들의 크기 (고가 - 저가 의 절대값) , TR 의 경우 트레이딩뷰에서 제공하는 VS 에서는 TR 들의 평균값인 ATR 을 이용하고 있으며, 저도 ATR 값으로 계산해볼 것 입니다.
VSTOP.1 : Volatility Stop Value on Previous Bar = 이전 캔들의 VS 값.
MaxCL : Maximum Closing Price since UP Trend Began = 추세가 시작된 이후 (VS 가 뒤집히고 나서) 가장 큰 종가
MinCL : Minumum Closing Price since Down Trend Began = MaxCl 과 반대로 추세가 시작된 이후 (VS 가 뒤집히고 나서) 가장 작은 종가
추세의 전환은 VS 값을 종가로 넘어가면, 전환됩니다.
위 처럼 종가로 이전에 형성되었던 VS 값을 돌파하면, 추세의 전환으로 해석되어, 손절 선이 다시 가격의 아래에 나오기 시작합니다.
상승 추세일 경우 (가격이 VS 를 상승 돌파했을 경우)
VSTOP = CL - MULT * TR
위와 같은 공식을 따릅니다. 종가에서 현재 캔들의 크기를 뜻하는 TR 에 계수를 곱한 값을 빼줍니다. 위와 같은 작업을 함으로써, 현재 추세가 가지고 있는 변동성을 현재 가격을 뜻하는 종가에서 빼줌으로써, 켈트너 채널과 동일한 값으로 첫 번째 VS 를 표현하게 됩니다.
VSTOP = MAX(VSTOP.1, MaxCL - MULT * TR)
추세가 진행될 경우 이전 캔들의 VS 값과 가장 높은 고점에서 TR 값을 계수를 곱한 값을 빼준 값 중 큰 값을 사용하게 됩니다. 즉, 고점을 "높일" 경우 저점이 올라가게 되죠. 또한, 변동성에 대한 항이 있어, 고점을 높이지 않아도 변동성이 작아졌다면 이전 캔들의 TR 보다 현재 캔들의 TR 값이 작아졌기에, 손절 선이 높아지는 현상이 나타납니다.
위와 같이 가격의 종가가 높아지지 않을 경우에는, 이전 캔들의 VS 값을 사용하게 됩니다.
바로 이전 포스팅에서 배우신 SAR 과 또 비슷한 내용입니다. SAR 의 경우에서는 고점을 높일 경우 손절선이 올라가는 속도를 가속화 시키는 반면, VS 에서는 손절 가격 자체를 올립니다.
또 SAR 의 경우는 저점 또는 고점으로 선을 돌파하면 추세가 전환되는 반면, VS 는 종가로 선을 돌파해야 추세가 전환됩니다.
반대로 하락 추세일 때 (VS 값을 하락 돌파했을 때) 동일 한 계산을 반대로하면 됩니다.
VSTOP = CL + MULT * TR
현재 종가에 TR 에 계수를 곱한 값을 더하여, 현재 종가 + 변동성을 합한 값을 표현합니다.
현재 가격에 변동성 만큼 곱함으로써, 발생할 수 있는 노이즈에 손절이 되지 않게되죠.
VSTOP = MIN(VSTOP.1, MinCL + MULT * TR)
동일하기 이전 캔들의 VS 값과 추세가 전환된 이후 가장 작은 저점을 넣은 값을 비교하여, 둘 중 작은 값을 선택하여 표현합니다. 저점을 낮추면, 손절 선이 낮아지게되죠~
가격을 비교하는 부분이 상당히 있어, 트레이딩뷰에 다른 트레이더가 올려둔 코드로 사용해보겠습니다.
length = input(20)
mult = input(2)
atr_ = atr(length)
max1 = max(nz(max_[1]), close)
min1 = min(nz(min_[1]), close)
is_uptrend_prev = nz(is_uptrend[1], true)
stop = is_uptrend_prev ? max1 - mult * atr_ : min1 + mult * atr_
vstop_prev = nz(vstop[1])
vstop1 = is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop)
is_uptrend = close - vstop1 >= 0
is_trend_changed = is_uptrend != is_uptrend_prev
max_ = is_trend_changed ? close : max1
min_ = is_trend_changed ? close : min1
vstop = is_trend_changed ? is_uptrend ? max_ - mult * atr_ : min_ + mult * atr_ : vstop1
plot(vstop, color = is_uptrend ? green : red, style=cross, linewidth=2)
https://www.tradingview.com/script/oRK5JwIm-Volatility-Stop/
length = input(20)
mult = input(2)
atr_ = atr(length)
가장 먼저 쉬운, 변수들을 정리하고, ATR 을 정의합니다. 계수는 2로 설정했고, ATR 에 대한 주기는 20 으로 설정했군요!
max1 = max(nz(max_[1]), close)
min1 = min(nz(min_[1]), close)
현재 종가와 이전 캔들까지의 최고가를 비교하는 구문과, 현재 종가와 이전 캔들까지의 최저가를 비교하는 구문 입니다. max 와 min 함수는 말 그대로 두 변수를 비교하여 가장 큰 값 또는 가장 작은 값을 나타냅니다.
그리고 저번에 한 번 등장했던 nz() 함수는 "만약 이전 값이 없으면 0 으로 해! " 라는 뜻 입니다. 만약 특정 상품이 상장되자마자, 첫 번째 캔들이라면 없는 것과 현재 종가를 비교할 수 없기에, 0 과 현재 종가를 비교하라는 의미 입니다!
is_uptrend_prev = nz(is_uptrend[1], true)
엇! 근데 nz() 안에 두 개의 변수가 들어갔습니다. 이럴 때는 어떻게 하는가 했더니~
nz(x,y) 라고 가정하면, 만약 x 값이 존재하지 않으면 y 값을 사용해라! 라는 뜻 입니다. 위 코드에서는 nz(is_uptrend[1],true) 라고 썼으니 이전 캔들의 is_uptrend 가 존재하지 않으면, true 값으로 사용해라! 라는 뜻 입니다. 그리고 옳바른 숫자라면 이전 추세에 대한 값으로 돌아가라! 즉, 만약 이전에 상승 추세였다면, 현재에도 상승 추세이며, 이전에 하락 추세였다면, 현재에도 하락 추세이다. 연속성을 나타내는 함수 같습니다.
stop = is_uptrend_prev ? max1 - mult * atr_ : min1 + mult * atr_
vstop_prev = nz(vstop[1])
vstop1 = is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop)
손절에 조건절을 달았네요! 만약 is_uptrend_prev 값이 맞다면 (이전 추세가 상승이라면) 손절 선을 아래에 만들고 (상승 추세), 아니라면 손절선을 위에 형성해라 (하락 추세)!
그리고 이전 손절 선값을 vstop_prev (이전 캔들의 VS 값) 으로 정의하고, 또 nz 를 사용하였네요.
vstop1 은 손절을 올릴지말지에 대해서 비교하는 구문이 나옵니다. vstop_prev 은 만약 상승 추세라면 이전 VS 값과, 현재 VS 값을 비교하여 큰 값을 선택하고 , 아니라면 (하락 추세라면) 이전 VS 값과 현재 VS 값을 비교하여 작은 값을 선택합니다.
is_uptrend = close - vstop1 >= 0
is_trend_changed = is_uptrend != is_uptrend_prev
이제 추세가 전환될지 안될지에 대한 값을 정의하는 구간 입니다.
만약 (종가 빼기 VS) 가 0보다 크거나 같다면 상승 추세 입니다. 좀 헷갈리게 썼는데 그냥 종가가 VS (손절선) 위에 있으면 상승 추세라는 것이죠.
그리고 현재 추세가 이전 추세와 일치하지 않는다면 (!= 는 아니면 이라는 뜻!) is_trend_changed = 추세가 전환되었다는 변수가 true 로 변하게 됩니다.
max_ = is_trend_changed ? close : max1
min_ = is_trend_changed ? close : min1
vstop = is_trend_changed ? is_uptrend ? max_ - mult * atr_ : min_ + mult * atr_ : vstop1
만약 추세가 전환 되었다면, max_ 값을 종가로, 아니라면 max1 값 (이전 max 값; 위에 나와있습니다!) 을 사용합니다. min_ 도 똑같이 만약 추세가 전환되었다면 종가를, 아니라면 min1값 (이전 min값; 역시 위에서 설명했습니다!) 을 사용합니다.
그리고 VS 값을 모든 조건절을 붙여 설명하면,
만약 추세가 전환되었고, 상승 추세라면 (max_ - mult * atr_) 값을 사용하고
만약 추세가 전환되었고, 하락 추세라면 (min_ + mult * atr_) 값을 사용하고
만약 추세가 전환되지 않았다면, (vstop1)
값을 사용해라! 라는 내용을 복잡하게 한줄로 표현했습니다.... :)
다음 시간에는 Volatility Stop 보조지표를 사용하여 전략을 만드는 방법으로 찾아뵙도록 하겠습니다!
질문, 댓글, 팔로우는 감사합니다!
새로운 아이디어, 종목 추천 등은 언제나 환영입니다!