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

python 증권데이터 분석 - 볼린저 밴드 추세 추종 매매기법

by orangecode 2022. 12. 30.
728x90
볼린저 밴드 매매기법

 

볼린저 밴드의 지표인 %b 값밴드폭이 무엇인지 다시 한번 리마인드 해보자

 

- %b : 볼린저 밴드 어딘가에 주가가 위치해있는지를 나타내는 지표, 주가와 연계하여 트레이딩 시스템을 구축할 때 필요한 핵심 수단으로 활용할 수 있다.

 

- 밴드폭 : 밴드의 너비를 수치로 나타낼 수 있으며, 추세의 시작과 끝을 포착하는 역할한다.

 

볼린저 밴드와 함께 사용되는 지표는 모멘텀, 추세, 거래량, 과매수/과매도, 심리 등 거래량 지표들이 많이 사용된다.

 

 

범주별 기술적 지표

범주 기술적 지표
모멘텀 변화율, 스토캐스틱
추세 선형회귀, MACD
거래량 일중강도, 매집/분산, 현금흐름지표, 거래량가중 MACD
과매수/과매도 CCI, RSI
심리 여론조사선, 풋-콜 비율

 

 

볼린저 밴드를 개발한 존 볼린저는 볼린저 밴드 매매기법으로 변동성 돌파, 추세 추종,  반전  3 가지 매매기법을 제시했다.

 

실제로 3가지 매매 기법을 적용해보고 투자자 스스로에게 가장 잘 맞는 방법을 사용하라고 존 볼린저는 말했다.

 

변동성 돌파 매매기법은 주가의 상단 밴드가 상향 돌파할 때 매수하고, 주가가 하단 밴드를 하향 이탈 할 때 공매도 하는 방법을 말한다. 하지만 개인 투자자가 공매도를 하기 위해서는 신용공여라는 방법으로 공매도를 할 수 있는데, 일반 투자자가 시도하기 힘들기 때문에 추세 추종과 반전 매매기법을 구현해보았다.

 

 

 

 

볼린저밴드 추세 추종 매매기법

추세 추종(Trend Following) 매매기법은 상승 추세에 매수하고 하락 추세에 매도하는 매매기법이다.

 

상승/하락 추세는 %b 지표, 현금흐름지표(MFI), 일중강도(II) 같은 거래량 관련 지표를 이용해서 확증이 이루어진 경우에 매수/매도를 실행하는 타이밍을 구하는 겁니다.

 

- 매수 : 주가가 상단밴드에 접근하며, 지표가 강세를 확증할 때문 매수

- 매도 : 주가가 하단밴드에 접근하며, 지표가 약세를 확증할 때만 매도

 

 

MFI(Money Flow Index, 현금흐름지표)

 

MFI 현금흐름 지표란 중심가격에 현금흐름(Money Flow)를 곱한 값을 말한다.

MFI는 가격과 거래량의 동시 분석이 가능하므로 상대적으로 신뢰도가 더 높은 지표로 볼 수 있다.

 

중심 가격(Typical Price)이란 일정기간의 고가, 저가, 종가를 합한 뒤 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('NAVER', '2022-07-01')

# 볼린저 밴드 구하기
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)

# 30일 기준 현금흐름 구하기
# 1. 종가 구하기 : 고가, 저가, 종가의 합을 3으로 나누기
df['PB'] = (df['close'] + df['lower']) / (df['upper'] + df['lower'])
df['TP'] = (df['high'] + df['low'] + df['close']) / 3
df['PMF'] = 0 # 긍정적 현금흐름
df['NMF'] = 0 # 부정적 현금흐름

# 2. range함수로 마지막 값을 포함하지 않으므로 0 ~ -2까지 반복한다.
for i in range(len(df.close) -1):
    if df.TP.values[i] < df.TP.values[i+1]:

        # 3. i번째 중심가격보다 i+1 번째 중심가격이 높으면, i+1번재 중심가격과 i+1번째 거래량의 곱을 i+1번째 긍정적 현금흐름에 저장한다
        df.PMF.values[i+1] = df.TP.values[i+1] * df.volume.values[i+1]
        df.NMF.values[i+1] = 0

    else:
        df.NMF.values[i+1] = df.TP.values[i+1] * df.volume.values[i+1]
        df.PMF.values[i+1] = 0

# 4. 30일 동안의 긍정적 현금흐름 합을 부정적 현금흐름의 합을 나눈 결과를 MFR(현금흐름 비율)에 저장한다.
df['MFR'] = df.PMF.rolling(window=30).sum() / df.NMF.rolling(window=30).sum()

# 5. 30일 기준으로 현금흐름 지수를 계산한 결과를 MFI30에 저장한다.
df['MFI30'] = 100 - 100 / (1 + df['MFR'])



# 볼린저밴드 밴드폭 구하기
df['BandWidth'] = (df['close'] - df['lower']) / df['MA20'] * 100
df = df[19:]

# 볼린저 밴드 그래프 그리기
plt.figure(figsize=(9, 8))
plt.subplot(2, 1, 1)
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(len(df.close)):
    # 6. %b가 0.8보다 크고 30일 기준 MFI가 80보다크면, 매수시점을 빨간색 삼각형으로 표시한다.
    if df.PB.values[i] > 0.8 and df.MFI30.values[i] > 80:
        plt.plot(df.index.values[i], df.close.values[i], 'r^')
    
    # 7. %b가 0.2보다 작고 30일 기준 MFI가 20보다작으면, 매도시점을 파란색 삼각형으로 표시한다.
    elif df.PB.values[i] < 0.2 and df.MFI30.values[i] < 20:
        plt.plot(df.index.values[i], df.close.values[i], 'bv')  

plt.title('NAVER Bollinger Band(30 day, 2 std)')
plt.legend(loc='best')

# subplot - 볼린저 밴드 밴드폭 그래프 그리기
plt.subplot(2, 1, 2)
# 8.MFI와 비교할 수 있게 %b를 그대로 표시하지 않고 100을 곱해 푸른색 실선으로 표시한다.
plt.plot(df.index, df['PB'] * 100, 'b', label='%B X 100')

# 9. 30일 기준 MFI를 녹색의 점선으로 표기한다.
plt.plot(df.index, df['MFI30'] * 100, 'g--', label='%B X 100')

# 10. Y축 눈금을 -20부터 120까지 20단위로 표시한다.
plt.yticks([-20, 0, 20, 40, 60, 80, 100, 120])
for i in range(len(df.close)):
    if df.PB.values[i] > 0.8 and df.MFI30.values[i] > 80:
        plt.plot(df.index.values[i], df.close.values[i], 'r^')
    elif df.PB.values[i] < 0.2 and df.MFI30.values[i] < 20:
        plt.plot(df.index.values[i], df.close.values[i], 'bv')  
plt.grid(True)
plt.legend(loc='best')
plt.show()

 

728x90

 

 

참고도서

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

 

 

 

반응형

댓글