변혁적인 삶

[AI | 데이터분석] 2. 추세 기반 지표(MA, MACD, ADX) 본문

AI

[AI | 데이터분석] 2. 추세 기반 지표(MA, MACD, ADX)

revolutionarylife 2024. 11. 19. 09:00
반응형

📊 [AI | 데이터분석] 2. 추세 기반 지표(MA, MACD, ADX)

목차

  • 1. 이동평균선 (MA)
  • 2. MACD
  • 3. ADX

1. 이동평균선 (Moving Average, MA)

이동평균선(MA)은 가격의 평균 값을 계산하여 시장의 전반적인 추세를 확인하는 데 사용됩니다.

두 가지 주요 유형인 단순 이동평균선(SMA)과 지수 이동평균선(EMA)이 있습니다.

1.1 단순 이동평균선 (SMA)

SMA는 지정된 기간 동안의 평균 값을 단순히 계산합니다.

예를 들어, 20일간의 SMA는 지난 20일 동안의 종가 평균입니다.

# SMA 계산
df["sma_20"] = df["close"].rolling(window=20).mean()

# SMA 출력 예시
print(df[["close", "sma_20"]].tail())

출력 예시:

   close    sma_20
95 57300.0  57250.5
96 57350.0  57260.3
97 57400.0  57280.0
98 57320.0  57290.3
99 57300.0  57310.0

1.2 지수 이동평균선 (EMA)

지수 이동평균선(EMA, Exponential Moving Average)은 최근 데이터에 더 많은 가중치를 부여하여 이동평균선을 계산하는 방법입니다.

단순 이동평균선(SMA)은 모든 데이터에 동일한 가중치를 부여하는 반면, EMA는 가중 변수(Weighting Factor)를 사용해 최근 데이터의 영향을 더 크게 반영합니다.

어차피 저희는 pandasewm함수를 이용하여 EMA를 간편히 계산하기에 깊게 설명할 필요는 없으나, 이해를 돕기 위해 EMA 계산 과정을 설명드리겠습니다.

1.2.1 EMA 계산 과정

1. 가중 변수 계산

  • EMA는 일정 기간을 기준으로 가중 변수를 계산합니다.
  • 가중 변수는 다음 공식으로 정의됩니다.

  • 예를 들어, 20일 EMA의 가중 변수는 다음과 같습니다.

2. EMA 초기값 설정

  • EMA는 계산을 시작하기 위해 초기값을 설정해야 합니다.
  • 일반적으로 첫 번째 EMA 값은 단순 이동평균(SMA)로 시작합니다:

EMA 초기값 =  N일의 SMA 

3.EMA 업데이트

  • 이후 값은 다음 공식을 통해 점진적으로 계산됩니다:

  • : 현재 EMA 값
  • 가격ₜ: 현재 종가
  • EMAₜ-1: 이전 EMA 값
  • 가중 변수: 최근 값에 부여할 가중치

1.2.2 계산 예시

close 데이터(종가)가 아래와 같다고 가정

Day  Close
1    100
2    102
3    104
4    106
5    108
...

초기값 (첫 20일 SMA): SMA = (100 + 102 + ... + 118) / 20

Day 21 이후 EMA 계산

EMA_21 = Close_21 × 0.0952 + EMA_20 × (1 - 0.0952)
EMA_22 = Close_22 × 0.0952 + EMA_21 × (1 - 0.0952)

아래 코드는 pandasewm 함수와 mean 함수를 이용하여 20일 EMA를 계산하는 코드입니다.

# EMA 계산
df["ema_20"] = df["close"].ewm(span=20, adjust=False).mean()

# EMA 출력 예시
print(df[["close", "ema_20"]].tail())

출력 예시:

   close    ema_20
95 57300.0  57255.2
96 57350.0  57265.8
97 57400.0  57285.4
98 57320.0  57292.8
99 57300.0  57296.5

2. MACD (Moving Average Convergence Divergence)

MACD는 이동평균선(MA)을 활용하여 시장의 추세모멘텀을 동시에 분석할 수 있는 대표적인 지표입니다.
특히 단기(빠른) 이동평균선과 장기(느린) 이동평균선 간의 차이를 활용하며, 추가로 Signal선을 계산하여 매매 신호를 포착합니다.

2.1 MACD 공식

MACD Line (MACD 선):

  • MACD는 기본적으로 단기 12일 EMA(12)와 장기 26일 EMA(26)를 사용합니다.

MACD = EMA(단기) - EMA(장기)

Signal Line (Signal 선):

  • MACD선의 9일 지수 이동 평균선을 추가로 계산하여 매매 신호를 생성합니다.

Signal = EMA(9)(MACD )

MACD Histogram (히스토그램):

  • MACD 선과 Signal 선 간의 차이를 나타내는 막대그래프.

히스토그램 = MACD - Signal 

import pandas as pd

# 샘플 데이터
data = {"close": [100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120]}
df = pd.DataFrame(data)

# 단기 EMA(12)와 장기 EMA(26) 계산
df["ema_12"] = df["close"].ewm(span=12, adjust=False).mean()
df["ema_26"] = df["close"].ewm(span=26, adjust=False).mean()

# MACD 선 계산
df["macd"] = df["ema_12"] - df["ema_26"]

# Signal 선 계산
df["signal"] = df["macd"].ewm(span=9, adjust=False).mean()

# 히스토그램 계산
df["histogram"] = df["macd"] - df["signal"]

# 결과 출력
print(df)

출력 예시:

    close     ema_12     ema_26      macd    signal  histogram
0    100  100.000000  100.000000  0.000000  0.000000   0.000000
1    102  100.307692  100.148148  0.159544  0.031909   0.127635
2    104  100.801120  100.438243  0.362877  0.092556   0.270320
3    106  101.457281  100.856708  0.600573  0.179606   0.420967
4    108  102.257953  101.393247  0.864706  0.296113   0.568593
5    110  103.187823  102.037267  1.150556  0.435594   0.714962
6    112  104.234994  102.778938  1.456056  0.592113   0.863943
7    114  105.390898  103.608232  1.782666  0.760460   1.022206
8    116  106.648059  104.515942  2.132117  0.936319   1.195798
9    118  108.000077  105.493712  2.506365  1.116091   1.390274
10   120  109.441470  106.533990  2.907480  1.296603   1.610877

2.2 MACD 해석

  1. MACD 선과 Signal 선의 교차
    • 골든 크로스: MACD 선이 Signal 선을 상향 돌파 → 매수 신호.
    • 데드 크로스: MACD 선이 Signal 선을 하향 돌파 → 매도 신호.
  2. 히스토그램
    • 히스토그램이 양수(+)이면 상승 모멘텀이 강함.
    • 히스토그램이 음수(-)이면 하락 모멘텀이 강함.
    • 히스토그램이 0에 가까워질수록 추세 전환 가능성을 나타냄.

3. ADX (Average Directional Index)

3.1 ADX의 구성 요소

ADX는 시장의 추세 강도를 측정하는 지표로, 다음과 같은 구성 요소를 포함합니다:

  • +DI (Positive Directional Index): 상승 추세 강도를 나타냅니다. 특정 기간 동안의 고점 변화량을 기반으로 계산됩니다.
  • -DI (Negative Directional Index): 하락 추세 강도를 나타냅니다. 특정 기간 동안의 저점 변화량을 기반으로 계산됩니다.
  • ADX (Average Directional Index): +DI와 -DI 간의 차이를 활용해 추세의 강도를 측정하며, 0~100 사이의 값을 가집니다.

3.2 ADX 계산 과정

ADX는 다음 단계를 통해 계산됩니다:

  1. True Range (TR): 현재 고점, 저점, 그리고 이전 종가 간의 최대 범위를 계산합니다.
    TR = max(고점 - 저점, |고점 - 이전 종가|, |저점 - 이전 종가|)
  2. +DM과 -DM: 고점과 저점의 변화량을 계산하여 양수 값만 사용합니다.
    +DM = max(현재 고점 - 이전 고점, 0)
    -DM = max(이전 저점 - 현재 저점, 0)
  3. +DI와 -DI 계산: 특정 기간 동안 +DM과 -DM의 합을 TR의 합으로 나눠 계산합니다.
    +DI = (+DM 합 / TR 합) × 100
    -DI = (-DM 합 / TR 합) × 100
  4. DX (Directional Movement Index): +DI와 -DI의 차이를 기반으로 DX를 계산합니다.
    DX = |(+DI - -DI)| / (+DI + -DI) × 100
  5. ADX 계산: 특정 기간 동안의 DX 값을 평균 내어 ADX를 계산합니다.
    ADX = n일 동안의 DX의 이동평균

3.3 Python 코드로 ADX 계산

Python의 talib 라이브러리를 활용하면 ADX를 간단히 계산할 수 있습니다:

import pandas as pd
import talib

# 샘플 데이터
data = {
    "high": [120, 122, 121, 124, 126, 125, 127, 130, 129, 131],
    "low": [118, 119, 120, 122, 124, 123, 125, 128, 127, 130],
    "close": [119, 121, 120, 123, 125, 124, 126, 129, 128, 130],
}
df = pd.DataFrame(data)

# ADX 계산 (14일 기준)
df["adx"] = talib.ADX(df["high"], df["low"], df["close"], timeperiod=14)

# +DI와 -DI 계산
df["+di"] = talib.PLUS_DI(df["high"], df["low"], df["close"], timeperiod=14)
df["-di"] = talib.MINUS_DI(df["high"], df["low"], df["close"], timeperiod=14)

print(df)

3.4 ADX 출력 예시

   high  low  close       adx       +di       -di
0   120  118    119       NaN       NaN       NaN
1   122  119    121       NaN       NaN       NaN
2   121  120    120       NaN       NaN       NaN
3   124  122    123       NaN       NaN       NaN
4   126  124    125       NaN       NaN       NaN
5   125  123    124       NaN       NaN       NaN
6   127  125    126       NaN       NaN       NaN
7   130  128    129       NaN       NaN       NaN
8   129  127    128       NaN       NaN       NaN
9   131  130    130  23.4567   30.1234   15.6789

3.5 ADX 해석

  • ADX 값이 20 이하: 약한 추세. 시장이 횡보 상태일 가능성이 높음.
  • ADX 값이 20~40: 강한 추세. 상승 또는 하락 방향이 명확.
  • ADX 값이 40 이상: 매우 강한 추세. 극단적인 상승 또는 하락.

마무리

2부에서는 추세 기반 지표인 이동평균선(MA), MACD, ADX를 이해하고, 계산하는 방법을 배웠습니다. 이러한 지표는 시장의 흐름을 파악하는 데 중요한 역할을 합니다. 다음 3부에서는 모멘텀 기반 지표를 다뤄보겠습니다. 🚀

반응형