볼린저 밴드 반전 매매 기법
Bollinger Band Reversals 매매기법
볼린저 밴드 반전 매매기법
볼린저 밴드 반전 Reversals 매매기법은 주가가 반전되는 지점을 찾아 매수/매도하는 매매기법이다.
- 매수 타이밍 : 주가가 하단밴드를 여러차례 태그하는 과정에서 강세 지표가 발생할 때 매수
- 매도 타이밍 : 주가가 상단밴드를 여러차례 태그하는 과정에서 약세 지표를 발생할 때 매도
존 볼린저(볼린저 밴드 창시자)는 일중강도율(Intraday Intensity)와 매집 분산율(AD%)를 기술적 지표를 예로 든다.
하지만 증권데이터 분석에서는 매도/매수 조건 일관성을 위해 일중 강도율(II% : Intraday Intensity)만 사용한다.
- 매수 : 주가가 하단밴드 부근에서 W형 패턴을 나타내고, 강세 지표가 확증될 때 매수
(%b가 0.05보다 작고 ii%가 0보다 크면 매수)
- 매도 : 주가가 상단밴드 부근에서 일련의 주가 태그가 일어나며, 약세 지표가 확증될 때 매도
(%b가 0.95보다 작고 ii%가 0보다 작으면 매수)
일중강도 II : Intraday Intensity
일중강도는 데이빗 보스티언이 개발한 거래량 지표로, 거래 범위에서 종가의 위치를 토대로 주식 종목의 자금흐름을 설명한다.
일중강도는 장이 끝나는 시간에 트레이더들의 움직임을 나타낸다.
- 1 : 종가가 거래 범위 천정권에 형성되면 1
- 0 : 종가가 거래범위 중간에서 형성되면 0
- (-1) : 종가가 거래범위 바닥권에서 형성되면 -1로 나타낸다.
일중강도와 일중강도율을 구하는 식은 아래와 같다.
삼성전자 일중 강도율 구하기
위 차트에서 3번째 표시된 그래프가 일중 강도율을 나타내는데
일중 강도율은 기관 블록 거래자의 활동을 추적할 목적으로 사용되는 지표이다.
존 볼린저는 일종 강도율을 볼린저 밴드를 확증하는 도구로 사용하는데, 주가가 하단 볼린저 밴드에 닿을 때 일중 강도율이 플러스(+)면 매수, 주가가 상단 볼린저 밴드에 닿을 때 일중 강도율이 마이너스(-)이면 매도하라 조언한다.
# 볼린저 밴드 - 네이버 증권 종가
# 모듈경로 지정
import sys
sys.path.append(r'C:\Users\kwonk\Downloads\개인 프로젝트\juno1412-1\증권데이터분석\DB_API')
# 라이브러리 설정
import matplotlib.pyplot as plt
import Analyzer
# NAVER 주가 종가 가져오기
mk = Analyzer.MarketDB()
df = mk.get_daily_price('삼성전자', '2022-07-01')
# 볼린저 밴드 구하기
# 1. 종가평균, 표준편차, 상단밴드, 하단밴드,%b 을 구한다.
df['MA20'] = df['close'].rolling(window=20).mean()
df['stddev'] = df['close'].rolling(window=20).std()
df['upper'] = df['MA20'] + (df['stddev'] * 2)
df['lower'] = df['MA20'] - (df['stddev'] * 2)
df['PB'] = (df['close'] + df['lower']) / (df['upper'] + df['lower'])
# 2. 삼성전자의 종가, 고가, 저가, 거래량으로 일중강도 II를 구한다.
df['II'] = (2*df['close'] - df['high'] - df['low']) / (df['high'] - df['low']) * df['volume']
# 3. 21일간 일중강도 II 합을 21일간 거래량 합으로 나누어 일중강도 II%를 구한다.
df['IIP21'] = df['II'].rolling(window=21).sum() / df['volume'].rolling(window=21).sum() * 100
# Nan 값 제거
df = df.dropna()
# 볼린저 밴드 그래프 그리기
plt.figure(figsize=(9, 9))
plt.subplot(3, 1, 1)
plt.title('Samsung Electronics Bollinger Band(30 day, 2 std)')
plt.plot(df.index, df['close'], color='#0000ff', label='Close')
plt.plot(df.index, df['upper'], 'r--', label = 'Upper band')
plt.plot(df.index, df['MA20'], 'k--', label='Moving average 20')
plt.plot(df.index, df['lower'], 'c--', label = 'Lower band')
plt.fill_between(df.index, df['upper'], df['lower'], color='0.9')
plt.legend(loc='best')
# subplot - 볼린저 밴드 밴드폭 그래프 그리기
plt.subplot(3, 1, 2)
plt.plot(df.index, df['PB'], 'b', label='%B')
plt.grid(True)
plt.legend(loc='best')
# 4. 3행 1열에 3번째 grid에 일중 강도율을 구한다.
plt.subplot(3, 1, 3)
# 5. 녹색 실선으로 21일 일중 강도율을 표시한다.
plt.bar(df.index, df['IIP21'], color='g', label='II 21day')
plt.grid(True)
plt.legend(loc='best')
plt.show()
삼성전자 반전매매 기법 구현하기
반전 매매 기법은 볼린저 밴드의 %b 지표와 거래량 지표인 일중강도율 II%를 사용해서 구한다.
# 볼린저 밴드 - 네이버 증권 종가
# 모듈경로 지정
import sys
sys.path.append(r'C:\Users\kwonk\Downloads\개인 프로젝트\juno1412-1\증권데이터분석\DB_API')
# 라이브러리 설정
import matplotlib.pyplot as plt
import Analyzer
# NAVER 주가 종가 가져오기
mk = Analyzer.MarketDB()
df = mk.get_daily_price('삼성전자', '2022-07-01')
# 볼린저 밴드 구하기
# 1. 종가평균, 표준편차, 상단밴드, 하단밴드,%b 을 구한다.
df['MA20'] = df['close'].rolling(window=20).mean()
df['stddev'] = df['close'].rolling(window=20).std()
df['upper'] = df['MA20'] + (df['stddev'] * 2)
df['lower'] = df['MA20'] - (df['stddev'] * 2)
df['PB'] = (df['close'] + df['lower']) / (df['upper'] + df['lower'])
# 2. 삼성전자의 종가, 고가, 저가, 거래량으로 일중강도 II를 구한다.
df['II'] = (2*df['close'] - df['high'] - df['low']) / (df['high'] - df['low']) * df['volume']
# 3. 21일간 일중강도 II 합을 21일간 거래량 합으로 나누어 일중강도 II%를 구한다.
df['IIP21'] = df['II'].rolling(window=21).sum()/df['volume'].rolling(window=21).sum()*100
# Nan 값 제거
df = df.dropna()
# 볼린저 밴드 그래프 그리기
plt.figure(figsize=(9, 9))
plt.subplot(3, 1, 1)
plt.title('Samsung Electronics Bollinger Band(30 day, 2 std)')
plt.plot(df.index, df['close'], color='#0000ff', label='Close')
plt.plot(df.index, df['upper'], 'r--', label = 'Upper band')
plt.plot(df.index, df['MA20'], 'k--', label='Moving average 20')
plt.plot(df.index, df['lower'], 'c--', label = 'Lower band')
plt.fill_between(df.index, df['upper'], df['lower'], color='0.9')
for i in range(0, len(df.close)):
# 4. %b가 0.05보다 작고, 21일 기준 II%가 0보다 크면 매수시점을 빨간색 삼각형으로 표시한다.
if df.PB.values[i] < 0.05 and df.IIP21.values[i] > 0:
plt.plot(df.index.value[i], df.close.values[i], 'r')
# 5. %b가 0.96보다 크고, 21일 기준 II%가 0보다 작으면 매수시점을 파란색 삼각형으로 표시한다.
elif df.PB.values[i] > 0.95 and df.IIP21.values[i] < 0:
plt.plot(df.index.values[i], df.close.values[i], 'bv')
plt.legend(loc='best')
# subplot - 볼린저 밴드 밴드폭 그래프 그리기
plt.subplot(3, 1, 2)
plt.plot(df.index, df['PB'], 'b', label='%B')
plt.grid(True)
plt.legend(loc='best')
# 6. 3행 1열에 3번째 grid에 일중 강도율을 구한다.
plt.subplot(3, 1, 3)
plt.bar(df.index, df['IIP21'], color='g', label='II% 21day')
for i in range(0, len(df.close)):
# 7. 세 번째 일중 강도율 그래프에서 매수 시점을 빨간색 삼각형으로 표시한다.
if df.PB.values[i] < 0.05 and df.IIP21.values[i] > 0:
plt.plot(df.index.values[i], 0, 'r^')
# 8. 세 번째 일중 강도율 그래프에서 매도 시점을 파란색 삼각형으로 표시한다.
elif df.PB.values[i] > 0.95 and df.IIP21.values[i] < 0:
plt.plot(df.index.values[i], 0, 'bv')
plt.grid(True)
plt.legend(loc='best')
plt.show()
참고도서
http://www.yes24.com/Product/Goods/90578506
https://github.com/INVESTAR/StockAnalysisInPython
'python > 금융데이터분석' 카테고리의 다른 글
python 증권데이터 분석 - 삼중창 매매 시스템 (0) | 2023.01.04 |
---|---|
python 증권데이터 분석 - 심리투자 법칙(이동평균선, 지수 이동평균, MACD) (0) | 2022.12.31 |
python 증권데이터 분석 - 볼린저 밴드 추세 추종 매매기법 (0) | 2022.12.30 |
python 증권데이터 분석 - 볼린저 밴드 지표 python구현 (0) | 2022.12.28 |
python 증권데이터 분석 - 샤프지수, 포트폴리오 최적화 python구현 (0) | 2022.12.27 |
댓글