본문 바로가기
Fintech

[금융] 퀀트투자 / 이동평균선(MA) / 지수이동평균선(EMA)

by Istj_eff 2022. 10. 6.
💡 퀀트투자란?
증권사나 기업에서 제공하는 모든 객관적인 수치 지표를 가지고 수학적, 통계적 기법을 활용해 투자 종목을 발굴하는 투자 방법

주식투자 시 종목을 분석하는데 분석은 크게 두가지로 나뉜다.

  1. 기본적 분석 주식(종목)의 내재가치(Fundamental)을 분석
  2. 기술적 분석 이동평균선, MACD, RSI 등 여러 지표를 바탕으로 하는 분석

 

1. 이동평균선(Moving Average)

: 주식시장이나 파생상품시장에서 기술적 분석을 할 때 쓰이는 기본 도구 중 하나.

  • 거래액, 매매 대금, 생산량 등의 예측에 다양한 예측에 사용
  • 목적 : 과거의 평균적 수치에서 현상을 파악(주로 추세)하여 현재의 매매와 미래의 예측에 접목할 수 돕는 것
  • 주식시장은 주말을 제외한 5일간 매매가 이루어 진다.
    • 5일 이평선은 1주일간의 주가의 흐름 파악, 20일 이평선은 1달간의 주가의 흐름 파악, 240일 이평선은 약 1년간의 주가의 흐름을 파악하는 지표이다.
    • 5일, 20일 이평선은 주로 '단기'매매에 이용되며, 60일, 120일 이평선은 ‘중장기’ 매매에 이용된다.

 

2. 이동평균선 종류 (단순/지수/가중)

2-1. 단순 이평선 (SMA ; Simple Moving Average)

: 일반적으로 생각하는 평균과 같다. 몇 개의 데이터를 이용해서 평균을 구하느냐가 변수인데, N개의 데이터를 이용하면 N이동평균이라고 한다. N개의 종가를 모두 더한 다음 N으로 나누는 방식이다.

단순이평선(SMA)이 자주 쓰이지만 지수평균(EMA), 가중평균(WMA) 등을 사용하는 경우도 있다.

 

ex) 60일 이평선이라고 하면 60일간의 종가를 모두 더한 후 60으로 나누어 그 점을 계속해서 이어둔 것이 60일 이동평균선이다.

 

 

2-2. 지수 이평선 (EMA ; Exponential Moving Average)

: 단순이평선을 계산할때 마지막 날짜에 비중을 더 두고 계산하는 것

ex) 5일 이평선을 계산할때 마지막 날짜의 주가 변동폭에 더 가산을 해서 계산
      5거래일 간의 주가의 합 + 마지막 날 주가 가중 / 5

  • 장점
    • 단순, 가중 이평선보다 더 현재를 잘 반영한다.
    • 단기 변동성을 파악할 때 좋다.

 

 

2-3. 가중 이평선 (WMA ; Weighted Moving Average)

: 현재의 값, 데이터에 더 가중치를 두고 과거의 값에는 보다 적은 가중치를 두어, 현재의 추세를 더욱 잘 반영하도록 표현한 이동평균선으로 단순 이평선의 단점을 보완한 기법이다.

 

가중 이평선은 기간에 따른 가중치를 달리하여 이동평균을 구하는 것으로 가중치를 부여하는 방법에 따라 여러 가지로 분류 될 수 있으나 보통 선형 가중 이동평균(Linearly WMA)이 사용된다.

 

  • 장점
    • 현재에 가까운 데이터를 가중치를 높여 더 현실적이다.
    • 지지선, 저항선으로 구분 할 수 있다.
  • 단점
    • 특정 기간 내의 가격 데이터만이 포함되었다. 새로운 가격 데이터가 처음 이동평균에 추가될때 반응하고, 가장 오래된 가격 데이터가 새로운 이동평균 계산에서 제외될때 한번 더 반응해서 이동평균값이 두번 반응한다. 세력의 특성을 곡해하는 문제가 생긴다.
    • 거래량이 포함되지 않았다.

 

3. 이동평균선 매매기법

3-1. 골든크로스 : 단기이동평균선이 장기이동평균선을 뚫고 상승하는 것. 매수신호

ex) 20일 이평선이 60일 이평선을 뚫고 상승하는 경우

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3-2. 데드크로스 : 단기이동평균선이 장기이동평균선을 뚫고 하락하는 것. 매도신호

 

ex) 20일 이평선이 60일 이평선을 뚫고 하락하고있다면 앞으로 주가가 계속 하락할 가능성이 높다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3-3. 단기, 중기, 장기 이평선이 정배열 일때. 매수신호

 

3-4. 단기, 중기, 장기 이평선이 역배열 일때. 매도신호

 

3-5.저항선을 뚫을 경우. 매수신호

      지지선이 뚫릴 경우. 매도신호

 


3. 지수이동평균선 (EMA)

: Exponential Moving Average

단순 이동평균은 각 거래일의 종가에 동일한 가중치를 사용하는것과 달리 지수이동평균은 최근 데이터에 더 높은 가중치를 부여한다.

 

💡 EMA(i) = k * price(i) + (1-k) * EMA(i-1)
  • price는 현재 가격(종가)이며 EMA(0)는 price(0)
  • k=2/(N+1)로 N은 이동평균의 탭 수

 

ex) 3일 지수이동평균에서는 N이 3으로 k는 0.5 3일 지수이동평균이 계산되는 과정

 

 

 

 

 

 

 

3-1. 판다스 ewm함수로 지수이동평균 계산

  • com : 질량중심 값으로 평활계수를 계산합니다. [ a = 1(1+com) ]
  • span : 계산 기간으로 평활계수를 계산합니다. [ a = 2/(span+1) ]
  • halflife : 반감기를 이용하여 평활계수를 계산합니다. [ a= e^(-ln(2) / halflife) ]
  • alpha : 평활계수를 직접 입력합니다. [ 0 < a ≤ 1 ]
  • min_periods : 계산을위한 최소 기간입니다.
  • adjust : 상대적 가중치의 불균형을 해소하기위해 조정계수로 나눌지의 여부입니다. 대체로 값이 많을수록 adjust를 하는것이 유리합니다.
  • ignore_na : 가중치를 계산할때 누락값을 무시할지 여부
import pyupbit
import pandas as pd

pd.set_option('display.float_format', lambda x: '%.1f' % x)
df = pyupbit.get_ohlcv("KRW-BTC")
df['close'].ewm(span=9, adjust=False).mean() # 지수이동평균은 기본값으로 9일 사용
# OUT
2021-09-01 09:00:00   56455000.0
2021-09-02 09:00:00   56595000.0
2021-09-03 09:00:00   56832600.0
2021-09-04 09:00:00   57031480.0
2021-09-05 09:00:00   57467584.0
                         ...    
2022-03-15 09:00:00   48759109.9
2022-03-16 09:00:00   49085087.9
2022-03-17 09:00:00   49281870.4
2022-03-18 09:00:00   49579496.3
2022-03-19 09:00:00   49851797.0
Name: close, Length: 200, dtype: float64

min_periods=N을 사용한 경우 처음 N-1개의 데이터에는 지수이동평균이 계산되지 않고 NaN으로 채워지게 된다.

 

 

3-2. 판다스 rolling 함수로 단순,지수이동평균 계산

  • windows : 사용을 위한 필수값으로 데이터의 개수(int) 또는 offset(시간, string 형식)을 입력해야 한다. 필수 파라미터
    • offset은 datetime 형식의 인덱스를 가진 dataframe과 함께 사용됨
  • min_periods : 값을 표시하는 최소 구성원의 수 또는 기간(offset)을 의미한다. (아래 'SMA'에서 처음 4개의 데이터가NaN으로 표시된 이유가 바로 이것) 별도로 규정하지 않는다면, windows 값과 동일한 값으로 규정된다. 필수 파라미터
  • center : index를 중앙값의 index로 잡을지, 최 우측값의 index로 잡을지 정할 수있다.
  • win_type : 집단의 구성원은 기본적으로 동일한 비중이며, 이의 변경이 가능하다.
  • on : 집단(window)을 이동(rolling)하는 기준의 기본은 데이터프레임의 index이지만, 다른 컬럼으로 지정할 수 있다.
  • axis : window 설정 및 이동 방향을 가로 또는 세로로 바꿀 수 있다.
import pandas as pd
raw = [10,20,30,40,50,60,70,80,90,10]
df = pd.DataFrame(raw, columns=['B'])

# 이동평균 추가해보기
# SMA: 단순이동평균(5일) 추가하기
df['SMA'] = df['value'].rolling(window=5).mean() 

# EMA: 지수이동평균(5일) 추가하기
df['EMA'] = df['value'].ewm(span=5, min_periods=5).mean()
# OUT DF
	 value   SMA    EMA  
0   10     NaN     NaN
1   20     NaN     NaN    
2   30     NaN     NaN    
3   40     NaN     NaN   
4   50    30.0   37.582938     
5   60    40.0   45.774436     
6   70    50.0   54.351627     
7   80    60.0   63.248216     
8   90    70.0   72.403630     
9   10    62.0   51.235330

 

 

 

 

댓글