본문 바로가기
데이터과학/데이터 분석 실습

이동평균선과 RSI를 이용한 알고리즘 투자전략 (feat. 파이썬)

by 경성현 2020. 12. 25.
이 글은 교육적인 목적으로 작성되었습니다. 투자 조언으로 받아 들여서는 안되며, 투자는 본인의 재량에 따라 하십시오.

주식 시장의 기술 지표란?

주식 시장의 기술 지표란 주식 가격의 추이 또는 회사의 재무 데이터를 해석하여 미래의 가격 변동을 예측하는데 사용되는 일종의 참고 자료라고 할 수 있습니다. 주식 시장의 기술 지표는 투자자가 보유하고 있는 종목을 매도 할 타이밍인지? 아니면, 새로운 종목을 매수 할 타이밍인지? 등을 결정하는데 참고로 활용할 수 있습니다.

기본적인 기술 지표

단순 이동 평균(Simple Moving Average, SMA) : 단순 이동 평균선은 "이평선"이라고도 불리며, 현재 주가의 트렌드가 계속 될지 또는 하락 추세를 반전하는 계기가 될지 여부를 판단하는데 도움이 될 수있는 기술적 추세 지표입니다. 단순 이동 평균선을 약간 변형한 것으로 지수 이동 평균선이 있는데, 이는 최근의 주가 흐름에 더 많은 가중치를 둔 이평선 이라고 할 수 있습니다.

지수 이동 평균(Exponential Moving Average, EMA) : 지수 이동 평균선은 가장 최근 데이터에 더 큰 가중치와 중요성을 부여하는 이동 평균입니다. 다른 이동 평균과 마찬가지로 이 기술 추세 지표는 과거 평균값과의 교차 및 다이버전스를 하는 시점을 기반으로 매수 및 매도 타이밍을 결정하는데 활용할 수 있습니다.

이동 평균 수렴 발산(Moving Average Convergence Divergence, MACD) : 이동 평균 수렴 발산선은 주식 가격의 두가지 이동 평균선 간의 관계를 보여주는 추세 추종 모멘텀 지표입니다. 이동 평균 수렴 발산선은 12일 지수 이동 평균선에서 26일 지수 이동 평균선을 뺀 값으로 계산됩니다.

상대적 강도 지수(Relative Strength Index, RSI): 상대적 강도 지수는 주식 또는 기타 자산 가격의 과매수 또는 과매도 상태를 평가하기 위한 방법으로 최근 가격 변화의 규모를 측정하기 위한 기술 분석에 사용되는 모멘텀 지표입니다. 

지표를 이용한 몇 가지 거래 전략

이동 평균 교차점(Moving Average Crossover): 주식 시장 기술 분석에서 이동 평균 교차점은 두 이동 평균이 서로 교차 하는 시점을 의미합니다. 이중 이동 평균 교차 거래 전략이란 단기 이동 평균이 장기 이동 평균 위로 r교차할 때 매수(또는 장기 보유) 신호를 나타내고 장기 이동 평균선이 단기 이동 평균선 위로 교차하면 매도(또는 단기 보유)를 알라는 신호를 나타냅니다. 이번 글에서는 이중 단순 이동 평균 교차 전략과 3가지 지수 이동 평균 교차 전략을 파이썬으로 프로그래밍하는 방법을 소개해 드리겠습니다.

매수 신호: 단기 이동 평균선 > 장기 이동 평균선
매도 신호: 단기 이동 평균선 < 장기 이동 평균선

 

3개의 지수 이동 평균선을 이용하는 교차 전략: 다양한 길이의 3가지(Short, Middle, Long) 지수 이동 평균을 사용하는 거래 방법입니다. 이 전략은 Middle의 이동 평균선이 Long 이동 평균을 넘어서고 Short 이동 평균이 Middle 이동 평균을 넘어갈 때를 매수 타이밍이라고 합니다. 또한, 이 전략에서 Short 이동 평균이 Middle 이동 평균 아래로 교차하는 경우를 매도 타이밍이라고 합니다.

매수 신호: Middle > Long
매도 신호: Short > Middle

 

이동 평균 수렴/발산 (Moving Average Convergence/Divergence, MACD) 크로스 오버 : 이동 평균 수렴/발산의 줄임말인 MACD는 주가의 기술적 분석에 사용되는 거래 지표 중 한가지입니다. MACD 지표가 신호선을 교차하면 이는 주가의 모멘텀을 받으며 변화할 것임을 의미합니다. 예를 들어 MACD 지표가 신호선보다 크면 이는 강세 크로스 오버로 간주되어 매수하기 좋은 시점을 나타내며, MACD 지표가 신호선보다 작으면 약세 크로스 오버로 간주되어 매도하기에 좋은 시점을 나타냅니다.

매수 신호: 이동 평균 수림/발산 > 신호선
매도 신호: 이동 평균 수렴/발산 > 신호선

상대적 강도 지수(Relative Strength Index, RSI): RSI는 주식이 과매수인지 과매도인지를 결정하기 위해 사용되는 기술 지표입니다. RSI를 계산하기 위해 분석에 사용되는 기간은 일반적으로 14일입니다. RSI는 (70 및 30), (80 및 20) 및 (90 및 10)와 같이 표시된 높은 수준값과 낮은 수준 값을 함께 표시하며, 0에서 100까지의 범위를 갖습니다. 높은 수준이 높고 낮은 수준이 낮을수록 가격 모멘텀 이동이 더 강함을 나타냅니다. 예를 들어 RSI는 70을 초과하면 과매 수로 간주되고 30 미만에서는 과매도 된 것으로 간주됩니다. 50의 RSI 값은 중립 상태를 나타냅니다.

매수 신호: RSI = 30 또는 그 이하
매도 신호: RSI = 70 또는 그 이상

 


 

파이썬을 이용한 기술지표 계산

파이썬을 이용해서 위에서 설명한 4가지 기술지표를 계산해 보겠습니다. 우선 분석이 필요한 라이브러리를 Import 하겠습니다.

import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')

이제 예시 데이터를 야후에서 다운로드 받오겠습니다. 2020년에 미국 주식시장을 뜨겁게 했던 종목 중에 하나인 테슬라(NYSE: TSLA)의 최근 1년 데이터를 예제로 사용하겠습니다. 야후 파이낸스를 통해 데이터를 가져오겠습니다. 혹시 관련 라이브러리가 없는 분은 아래 명령어로 라이브러리를 설치해 주시기 바랍니다.

! pip install yfinance

주식 데이터 가져오기

import yfinance as yf
df = yf.download('TSLA', start="2019-12-01", end="2020-11-30")
df['Date'] = df.index
df.head()

테슬라(NYSE: TSLA) 주가 데이터 샘플

이제 위에서 설명했던 이동 평균선을 계산하는 함수들을 먼저 만들어 보겠습니다. 함수를 만든 후에, 해당 함수를 이용해서 매수/매도 타이밍을 찾는 부분을 설명 드릴께요.

단순 이동 평균(SMA)과 지수 이동 평균(EMA)을 계산하는 함수

단순 이동 평균을 계산할때는 보통 30일 평균 값으로 계산하고, 지수 이동 평균을 계산할때는 보통 20일 평균 값으로 계산합니다.

# 단순 이동 평균(Simple Moving Average, SMA)
def SMA(data, period=30, column='Close'):
  return data[column].rolling(window=period).mean()

# 지수 이동 평균(Exponential Moving Average, EMA)
def EMA(data, period=20, column='Close'):
  return data[column].ewm(span=period, adjust=False).mean()

 

이동 평균 수렴/발산을 계산하는 함수(MACD)

이동 평균 수렴/발산에서 단기 지수 이동 평균은 12일 평균값으로 계산하고, 장기 지수 이동 평균은 26일 평균값으로 하며, 신호선의 경우는 9일 평균값으로 계산합니다.

def MACD(data, period_long=26, period_short=12, period_signal=9, column='Close'):

  # 단기 지수 이평선 계산 (AKA Fast moving average)
  ShortEMA = EMA(data, period_short, column=column)

  # 장기 지수 이평선 계산 (AKA Slow moving average)
  LongEMA = EMA(data, period_long, column=column)

  # 이동 평균 수렴/발산 계산 
  data['MACD'] = ShortEMA - LongEMA

  # 신호선 계산 
  data['Signal_Line'] = EMA(data, period_signal, column='MACD')

 return data

 

상대적 강도 지수를 계산하는 함수(RSI)

상대적 강도 지수(Relative Strength Index, RSI)는 보통 14일 동안의 데이터를 사용하여 계산합니다.

def RSI(data, period = 14, column = 'Close'):
  delta = data[column].diff(1)
  delta = delta.dropna() # or delta[1:]

  up =  delta.copy()  # delta 값 복사
  down = delta.copy() # delta 값 복사
  up[up < 0] = 0 
  down[down > 0] = 0 
  data['up'] = up
  data['down'] = down

  AVG_Gain = SMA(data, period, column='up')
  AVG_Loss = abs(SMA(data, period, column='down'))
  RS = AVG_Gain / AVG_Loss

  RSI = 100.0 - (100.0/ (1.0 + RS))
  data['RSI'] = RSI

  return data

 

각 이동 평균값을 DataFrame에 추가하기

df = MACD(df, period_long=26, period_short=12, period_signal=9)
df = RSI(df, period=14)
df['SMA'] = SMA(df, period=30)
df['EMA'] = EMA(df, period=20)
df.tail()

 

이동 평균 수렴/발산과 신호선 시각화

column_list = ['MACD','Signal_Line']
df[column_list].plot(figsize=(12.2,6.4)) #Plot the data
plt.title('MACD for TSLA')
plt.ylabel('USD Price ($)')

 

단순 이동 평균선과 주가 데이터 시각화

column_list = ['SMA','Close']
df[column_list].plot(figsize=(12.2,6.4)) #Plot the data
plt.title('SMA for TSLA')
plt.ylabel('USD Price ($)')

 

지수 이동 평균선과 주가 데이터 시각화

column_list = ['EMA','Close']
df[column_list].plot(figsize=(12.2,6.4)) #Plot the data
plt.title('EMA for TSLA')
plt.ylabel('USD Price ($)')

 

상대적 강도 지수(RSI) 시각화

상대적 강도지수가 70이상이면 매도 타이밍이고, 30이하이면 매수 타이밍입니다.

column_list = ['RSI']
df[column_list].plot(figsize=(12.2,6.4)) #Plot the data
plt.title('RSI for TSLA')
plt.ylabel('USD Price ($)')

지금까지 설명해 드린 방법으로 자신만의 거래 전략을 만들어 보세요! 하나의 차트에 대해서 한가지 지표만으로 매수 또는 매도 타이밍을 잡는 것보다는 다양한 지표를 살펴보고, 여러 지표들이 어떤 방향성을 갖는지 비교/확인하면서 자신만의 거래 전략을 세워보는 것을 권장합니다.

참고) 이 글은 randerson112358의 Stock Market Technical Indicators를 각색하여 한글로 번역한 글입을 밝힙니다. 원문은 링크를 통해서 확인하실 수 있습니다.