부드러운 감자 이야기
파인 스크립트로 나만의 전략 만들기 (볼린저 밴드) 본문
안녕하세요 감자입니다!
오늘 포스팅할 것은 볼린저 밴드인데요
볼린저 밴드는 변동성을 나타내는 지표로써 수렴과 발산으로 변동성을 파악할 수 있는 지표입니다.
볼린저 밴드는 이동평균선과 종가를 기준으로 상하단은 표준편차 값으로 밴드가 형성되어 있습니다.
수렴의 경우에는 볼린저 밴드 폭이 좁아지고 있을 때를 말하며,
발산의 경우에는 볼린저 밴드 폭이 넓어지고 있을 때를 말합니다.
또한 주가가 볼린저 밴드를 찢으며 나오는 발산은 그 방향 대로 가려는 성질이 있으며, 밴드를 지속적으로 돌파하며, 진행하는 모멘텀이 있습니다. 다만 볼린저 밴드 안에 주가가 계속해서 상단을 돌파하지 못하는 시점이 오는데
이 경우는 위험하다고 볼 수 있습니다.
반대의 경우도 마찬가지!
정리하자면,
볼린저 밴드의 수렴(스퀴즈) = 변동성 감소 > 상하단의 밴드 단타, 방향성이 나올 징조
볼린저 밴드의 발산(확장) = 변동성 증가 > 추세에 따라 돌파 또는 이탈 이후 이동평균선 눌림 진입 전략 용이
Tip ) 자신만의 장기 이동평균선 또는 추세를 알 수 있는 도구로 파악 한 뒤 상승추세면 볼린저 밴드 하단, 하락 추세면 볼린저 밴드 상단에 진입하기 좋다. (상 하단의 밴드를 활용하는 회귀 전략 응용 가능)
각설하고,
지난번 포스팅에서 함수로 볼린저 밴드를 만들어 본다고 했는데
우선적으로 트레이딩 뷰의 등록된 볼린저 밴드의 코드를 보여드리겠습니다.
볼린저 밴드의 기본 코드 (트레이딩 뷰에 내장 되어 있는 코드)
//@version=4
study(title="볼린저 밴드", overlay=true)
length = input(20, minval=1)
src = input(close, title="종가")
mult = input(2.0, minval=0.001, maxval=50, title="표준편차 곱")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(basis, "중심선", color=#FF6D00, offset = offset)
p1 = plot(upper, "상단 밴드", color=#2962FF, offset = offset)
p2 = plot(lower, "하단 밴드", color=#2962FF, offset = offset)
fill(p1, p2, title = "배경", color=color.rgb(33, 150, 243, 95))
위의 코드를 해석 해 보자면 지난번에 배운 이동 평균선에 stdev( ) 함수를 활용하여 만들게 됩니다.
stdev(종가,기간) 즉, 종가와 기간으로 표준편차를 구성하는 함수라고 볼 수 있겠습니다.
들어가는 코드 구성은 이동평균선의 코드, 표준편차, 표준편차의 곱, 상단 하단 밴드로 구성됩니다.
자, 기존에 있는 이 볼린저 밴드 코드를 변형한 함수로도 코드를 만들어 보도록 하겠습니다.
우선, 파인 스크립트 내의 볼린저 밴드의 공식은
"bb(series, length, mult)"
여기서의 series는 소스를 의미하며, 여기서는 종가를 의미합니다.
length는 기간을 의미하며, 볼린저 밴드의 기본 기간인 20이 활용됩니다.
mult는 곱을 의미하며, 표준편차 값의 곱을 의미합니다.
따라서,
bb(종가,기간,곱)으로 이해하시면 되겠습니다.
먼저 볼린저 밴드는 두 가지의 변형된 코드도 가능한데, 배열로 만드는 함수와 자체 함수를 만들 수도 있습니다.
먼저 배열 코드부터 만들어 봅시다!
//@version=4
study(title="볼린저 밴드", overlay=true)
[middle, upper, lower] = bb(close,20,2) // 볼린저 밴드의 핵심 요소를 [ ] 안에 각각 넣는다
// middle = sma(종가,기간)
// upper = middle + dev
// lower = middle - dev
// * dev = 곱 * 표준편차
plot(middle,color=color.orange) // 볼린저 밴드 이동평균선
b1=plot(upper,color=color.teal) // 상단 밴드
b2=plot(lower,color=color.teal) // 하단 밴드
fill(b1,b2,color=color.teal) // 각 출력 범위 배경
// 여기서의 plot 앞에 b1,b2 변수는 배경 함수 요소로 활용
// 상하단의 범위를 배경으로 사용
이제 자체 함수 코드입니다.
//@version=4
study(title="볼린저 밴드", overlay=true)
f_bb(src,length,mult) =>
float basis = sma(src,length)
float dev = mult * stdev(src,length)
[basis, basis + dev, basis - dev]
[middle, upper, lower] = f_bb(close,20,2)
plot(middle,color=color.orange)
b1=plot(upper,color=color.teal)
b2=plot(lower,color=color.teal)
fill(b1,b2,color=color.teal)
// 설명
// f_bb(종가,기간,곱) => 여기서 " => " 는 마치 자바스크립트의 function( )과 비슷한 성격을 가지고 있습니다.
// float = 이미지를 어떻게 띄워서 텍스트와 함께 배치할 것인가에 대한 속성, 변수 앞에 종종 쓰인다.
// basis = 이동평균선
// dev = 곱 * 표준편차
// [ ] = 배열
// 표준편차의 이동평균선 양수 값은 상단, 음수 값은 하단
// 동일한 새로운 배열을 만들고 그 배열 안에 위의 함수를 넣는다
// 여기서 주의할 점, 함수의 배열과 새로 만든 배열의 개수는 동일해야 한다.
// 함수 => 이후 스페이스 4번 또는 Tab을 활용하여 코드를 작성하도록 한다. 맞추지 않으면 에러 발생...
기본, 배열, 함수로 만들어 보는 볼린저 밴드는 여기서 끝이며,
이제 스퀴즈로 넘어가겠습니다.
마지막입니다!
주가의 방향성이 나오기 전 볼린저 밴드는 밴드의 수렴 또는 스퀴즈를 통해 추세가 터지기 전이라는 것을 암시할 수 있는데 그에 대한 시그널을 만들어 보도록 하겠습니다.
저는 볼린저 밴드 지표를 볼 때 스퀴즈 시그널을 유용하게 쓰고 있습니다.
먼저, 코드를 만들 재료를 가져와야겠죠?
일명 스퀴즈 시그널의 구성은 볼린저 밴드만 단독으로 코드를 짜는 것이 아닌 비슷한 성질을 가지고 있는
켈트너 채널이라는 지표, 노이즈를 제거하기 위한 일종의 필터 역할인
Commodity Channel Index(이하 cci 지표)와 함께 사용됩니다.
공통된 특징으로는 모두 지표에 밴드 속성이 들어가 있습니다.
켈트너 채널과 cci는 추후 포스팅하도록 하며, 시작하도록 하겠습니다.
keltPrd = 20 // 켈트너 채널 기간
keltFactor = 1.5 // 켈트너 채널 밴드 곱
cciPeriod = 50 // cci 기간
BandsDeviations = 2.0 // 볼린저 밴드 표준편차
BandsPeriod = 20 // 밴드 기간
CCI = cci(close, cciPeriod) // cci 보조지표의 함수, 노이즈를 제거하기 위한 일종의 필터 활용
diff_ = atr(keltPrd) * keltFactor
// 켈트너 채널 연산, 속성, 위의 atr( )는 tr이라는 변동성의 값을 평균화하여 선으로 표현하는 지표이며,
// average true range 줄여서 atr은 변동성을 측정하여 위험도를 체크할 때 주로 쓰입니다.
std = stdev(close, BandsPeriod) // 밴드의 표준편차
bbs = BandsDeviations * std / diff_
// 볼린저 밴드 표준편차와 밴드의 표준편차를 누적시킨 후 켈트너 채널 속성을 나눔 (이하, 전체 값)
res1 = bbs < 1 and CCI > 0 // 전체 값보다 1이 크고 cci가 0보다 큰 경우
res2 = bbs < 1 and CCI <= 0 // 전체 값보다 1이 크고 cci가 0보다 작거나 같은 경우
res_color = res1 ? color.new(color.black,90) : na
res2_color = res2 ? color.new(color.black,90) : na
// 색상 color.new( )란 색상 함수로 color.new(색상,투명도)로 사용됩니다.
squeeze = res1 or res2 ? color.new(color.black,90) : na
bgcolor(color = squeeze ,title="스퀴즈")
스퀴즈 지표의 경우는 어려운 말이 많으므로, 처음 접하시는 분들이라면
추후 포스팅할 예정이니, 따라 하시는 분들은 일단 복사하셔서 사용하시면 되겠습니다.
오늘은 이것으로 포스팅을 마치며, 오타 및 잘못된 설명의 경우는 알려 주시면 수정하도록 하겠습니다.
또한 새로운 아이디어가 있다면 알려주시면 참고하여 포스팅도 해 보도록 하겠습니다.
감사합니다. =)
'매매전략 코딩일지' 카테고리의 다른 글
파인 스크립트로 나만의 전략 만들기 (이동 평균선 만들기 2) (0) | 2021.07.20 |
---|---|
파인 스크립트로 나만의 전략 만들기 (이동 평균선 만들기) (0) | 2021.07.15 |
파인 스크립트로 나만의 전략 만들기 (트레이딩 뷰 가입하기) (0) | 2021.07.15 |
트레이딩 뷰로 파인 스크립트를 활용한 매매전략 일지 시작 (0) | 2021.07.15 |