본문 바로가기

ELECTRONICS INVESTMENT

프로그램 투자


Quant

Python

Macroeconomics

Book


퀀트

주식 보조지표 프로그램_MACD,스토캐스틱,MFI,RSI,볼린저밴드 (파이썬)

반응형

주식투자에 있어서, 많은 보조지표들이 있습니다.

 

"주식의 차트를 보지 않는 것은, 의사들이 MRI나 X-RAY를 보지 않는다는 것이다."

 

위대한 투자자 중 한명인, '윌리엄 오닐'이 한 말입니다.

 

 

가치투자를 한다고 해서 차트가 무시되어도 된다는 의미가 아닙니다.

 

종목이 아무리 좋아 보인다고 한들, 차트의 증명이 되어야 매수를 진행하여야 합니다.

 

 

오늘은 차트를 해석함에 있어서, 사용되는 보조지표들을 알아보고, 파이썬으로 구축하는 과정을 알아보겠습니다.

 

주기적으로 보조지표들을 네이버 블로그에 업데이트할 예정입니다.

(블로그 링크는 글 하단에 남겨두겠습니다)


파이썬 보조지표 그래프
보조지표 그래프

결과물은 위의 사진과 같습니다.

 

맨 위의 차트에는 주가의 (시,고,저,종)이 담겨있는 캔들차트와,

 

20, 60, 200의 이동평균선, 볼린저 밴드의 정보를 알 수 있습니다.

 

 

그 아래로는 거래량, MACD, 스토캐스틱, MFI, RSI 지표들입니다.

반응형

우선, 파이썬을 활용해서 차트를 그리기 위해서는 주가 정보 데이터가 필요합니다.

 

파이썬의 pykrx api 를 활용해서 주가 정보를 가져오면 됩니다.

 

start_date = datetime(a,b,c)
end_date = datetime(a2,b2,c2)

if len(stock_name)==4:
    df=stock.get_index_ohlcv_by_date(start_date,end_date,stock_name)
else:
    df=stock.get_market_ohlcv_by_date(start_date,end_date,stock_name)

df = df.rename(columns = {'시가' : 'Open', '고가' : 'High','저가' : 'Low', '종가' : 'Close','거래량' : 'Volume'})
df=df.reset_index()
df['Date']=df['날짜'].apply(lambda x: datetime.strftime(x,'%Y-%m-%d'))

 

위처럼 코드를 구성한 이유는, 시장 지수 data (코스피, 코스닥, 반도체 지수 등)는 4개의 숫자로 이루어져 있지만, 종목 data들은 6자리(삼성전자 005930)로 이루어져 있기 때문입니다.

 

그리고 차트를 그릴때 주말 부분은 비워지는 현상을 해결하기 위해서 새로운 Date라는 열을 만들어 줬습니다.

 


1) 볼린저 밴드 (Bollinger band)

 

맨 위의 차트에서 두개의 초록선이 밴드를 이루고 있는 모습을 확인할 수 있습니다.

 

이는 "볼린저 밴드 (Bollinger band)"라고 하며,

 

주가가 +-2 만큼의 표준편차 이내에서 움직인다는 것을 전제합니다.

(자세한 해설은 수학시간이 아니니 생략하겠습니다..)

 

즉, 95%의 확률로 다음 주가가 밴드 내에 위치할 것을 의미합니다.

 

 

df['MA20'] = df['Close'].rolling(20).mean()
df['stddev']=df['Close'].rolling(20).std()
df['upper'] = df['MA20'] + 2*df['stddev'] # 상단밴드
df['lower'] = df['MA20'] - 2*df['stddev'] # 하단밴드
df['PB'] = (df['Close'] - df['lower']) / (df['upper'] - df['lower'])

 

여기서 PB란 주가가 볼린저 밴드 어디에 위치하는지를 표시하는 지표입니다.

 

만약 PB의 값이 1이면 종가가 상단밴드에 위치했다는 뜻이고, 중간이면 0.5, 하단이면 0을 의미합니다.

 

 

2) MACD (Moving Average Convergence and Divergence)

 

MACD 지표는 단기 이동평균선과 장기 이동평균선의 수렴과 확산을 표시해 줍니다.

 

단기와 장기의 이동평균선은 수렴과 확산을 반복하는 성질을 가지고 있습니다.

 

보통 장기 차트를 분석할 때 사용하며, 중장기적으로 상승추세인지 하락추세인지 파악이 가능합니다.

 

즉, (단기 이동평균선- 장기 이동평균선)=MACD

 

이때, MACD를 평균 내는 MACD Signal 지표를 만들어서 상대적으로 가격변화에 늦게 반응하는 신호선을 하나 만듭니다.

 

이 둘의 차이로 매수가 강해지는지, 매도가 강해지고 있는지 파악이 가능합니다.

 

 

df['MACD']=df['MA30']-df['MA60']#평균선 단위는 평소 매매 단위대로 변경 가능
df['MACD_Signal']=df['MACD'].rolling(45).mean()
df['MACD_Oscil']=df['MACD']-df['MACD_Signal']

 

저는 30일선과 60일선의 차이로 구현하였습니다. (중기적인 흐름을 파악하기 위해서)

이는 추후 언제든 변경되어 네이버 블로그에 기재될 수 있습니다.

 

위의 차트에서 중심선(0)을 기점으로 위아래가 중요합니다.

 

위의 보라색 막대 차트는 MACD에서 MACD신호선을 뺀 값(히스토그램)입니다.

 

막대 차트가 올라가고 있으면 매수 주가가 최근 강세를 의미하고 매수 타점이 될 수 있습니다.

 

이때, 보라색 봉 차트가 음수이고, 기울기가 상향 반전하는 시점이 최고의 매수시점입니다.

 

즉, 가격은 신저점인데, 히스토그램 값이 사승하고 있으면, 강세 다이버전스.

 

가격이 신저점일 갱신하고 있는데, 히스토그램이 올라와주지 못하면, 단순 하향 추세입니다.

 

 

3) 스토캐스틱 (Stochastics)

 

현재의 가격의 위치가 n일 동안중에서 어느 정도 위치인지를 나타내 주는 지표입니다.

 

보통 14일을 기준으로 많이 활용하며, 70%는 14일간의 거래에서 최저점과 최고점 사이의 70% 지점에 위치한다는 의미입니다.

 

스토캐스틱에는 빠른 선 K와 느린 선 D가 있는데, 느린 선은 K선의 3일 평균으로, 더 확실한 신호를 잡기 위해서 사용합니다.

 

스토캐스틱은 박스권에서는 잘 작동하지만, 추세가 있으면 손실 가능성이 있습니다.

 

보통 20%는 과매도 구간, 80%는 과매수 구간입니다.

 

 

f['ndays_high'] = df['High'].rolling(window=14, min_periods=1).max()    # 14일 중 최고가
df['ndays_low'] = df['Low'].rolling(window=14, min_periods=1).min()      # 14일 중 최저가
df['fast_k'] = (df['Close'] - df['ndays_low']) / (df['ndays_high'] - df['ndays_low']) * 100  # Fast %K 구하기
df['slow_d'] = df['fast_k'].rolling(window=3).mean()    # Slow %D 구하기

 

4) MFI (Money Flow Index)

 

자금흐름지수라고 불리며, 특정 자산으로의 자금 유입 강도를 추정하는 지표입니다.

 

일정 기간 동안의 가격 상승 및 하락을 거래량과 함께 고려하는 지표입니다.

 

보통 볼린저 밴드와 함께 사용되며, 해석하는 방법에 따라 '추세추종', '반전매매'로 활용할 수 있습니다.

 

 

df['TP'] = (df['High'] + df['Low'] + df['Close']) / 3
df['PMF'] = 0
df['NMF'] = 0
for i in range(len(df.Close)-1):
    if df.TP.values[i] < df.TP.values[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
df['MFR'] = (df.PMF.rolling(window=10).sum() /#10일동안의 흐름관찰
    df.NMF.rolling(window=10).sum())
df['MFI10'] = 100 - 100 / (1 + df['MFR'])

 

이때 평균가격=(고가 + 저가 + 종가)/3을 의미합니다.

 

PMF(Positive Money Flow)의 경우 현재가격이 전일 가격보다 상승하였을 경우의 합계입니다.

 

NMF(Negative Money Flow)의 경우 현재가격이 전일 가격 보다 하락하였을 경우의 합계입니다.

 

보통 20%는 과매도 구간, 80%는 과매수 구간입니다.

 

 

5) RSI (Relative Strength Index)

 

상대 강도 지수라고 불리며, MFI와 달리 거래량을 사용하지 않습니다.

 

일정 기간 동안 주가 변동폭 사이에서 상승 압력과 하락 압력을 서로 비교해서 주가의 움직임 강도를 표시합니다.

 

특정기간 동안 상승폭과 하락폭을 합산한 다음, 현재 주가는 상승에 가까운지 하락에 가까운지 판단을 하는 지표입니다.

 

예를 들어 14일의 RSI지표가 70% 이상이면, 14일 동안 매수세가 강해서, 단기 과열 상태임을 의미합니다.

 

추세 전환 시점을 예측하기 좋은 신뢰성 지표입니다.

 

보통 30%는 과매도 구간, 70%는 과매수 구간입니다.

 


 

지금까지 여러 보조지표들을 알아보고, 파이썬으로 구현까지 해봤습니다.

 

하지만 보조지표들을 사용할 땐 하나의 지표를 보고 판단을 내려선 안됩니다.

 

어떠한 지표는 장기추세, 어떠한 지표는 박스권에 적합한 지표입니다.

 

즉, 보조지표들은 다른 여러 보조 지표들과 결합해서 판단을 내려야 합니다.

 

네이버 프리미엄 콘텐츠에서 더욱 자세한 코드와 리뷰를 확인하실 수 있습니다.

 

네이버프리미엄 콘텐츠를 확인해 주세요.

 

떠먹여 주는 퀀트 투자 : 네이버 프리미엄콘텐츠

파이썬 왕초보도 문제없는 실전형 퀀트투자! 초보자의 눈높이에 맞춘 데이터 수집부터, 다양한 전략 테스트까지! 나만의 경제지표 모델, 투자 모델을 관리하는 봇을 만들어보세요.

contents.premium.naver.com

 

성공적인 투자를 기원합니다.

 

 

 

 

반응형