볼린저 밴드 매매기법
볼린저 밴드의 지표인 %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()
참고도서
http://www.yes24.com/Product/Goods/90578506
https://github.com/INVESTAR/StockAnalysisInPython
'python > 금융데이터분석' 카테고리의 다른 글
python 증권데이터 분석 - 심리투자 법칙(이동평균선, 지수 이동평균, MACD) (0) | 2022.12.31 |
---|---|
python 증권데이터 분석 - 볼린저 밴드 반전 매매기법 (0) | 2022.12.31 |
python 증권데이터 분석 - 볼린저 밴드 지표 python구현 (0) | 2022.12.28 |
python 증권데이터 분석 - 샤프지수, 포트폴리오 최적화 python구현 (0) | 2022.12.27 |
python 증권데이터 분석 - 현대 포트폴리오 이론, 효율적 투자선 python 구현 (1) | 2022.12.26 |
댓글