python/금융데이터분석

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

orangecode 2022. 12. 31. 06:33
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

 

반응형