본문 바로가기
python/금융데이터분석

python 증권데이터 분석 - 볼린저 밴드 반전 매매기법

by orangecode 2022. 12. 31.
728x90
볼린저 밴드 반전 매매 기법
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

 

파이썬 증권 데이터 분석 - YES24

투자 기법과 프로그래밍 기술로 자신만의 퀀트 투자 시스템을 완성하라『파이썬 증권 데이터 분석』은 웹 스크레이핑으로 증권 데이터를 주기적으로 자동 수집, 분석, 자동 매매, 예측하는 전

www.yes24.com

https://github.com/INVESTAR/StockAnalysisInPython

 

GitHub - INVESTAR/StockAnalysisInPython

Contribute to INVESTAR/StockAnalysisInPython development by creating an account on GitHub.

github.com

 

반응형

댓글