1 분 소요

Rolling & EWM 실습: NVDA 주가 데이터

지난번에 정리한 Pandas 기본 연산에 이어서, 이번엔 rolling()을 실제 데이터에 적용해봤다. 마침 Kaggle에 엔비디아(NVDA) 주가 데이터가 있길래 이걸로 이동평균선을 직접 만들어봤다.


1. 데이터 로드

Kaggle의 NVIDIA 일일 주가 데이터(NVIDIA_STOCK.csv)를 사용했다. 수정 종가(Adj Close) 기준으로 분석 진행.

import pandas as pd

df = pd.read_csv('NVIDIA_STOCK.csv', index_col='Date', parse_dates=True)
adj_close = df['Adj Close']

2. 이동평균선(SMA) 구하기

주가는 일간 변동이 심해서 그대로 보면 추세 파악이 어렵다. rolling()으로 특정 기간 평균을 구하면 노이즈가 줄어들어서 흐름이 보인다.

5일 / 20일 이동평균

# 5일 이동평균 (단기)
sma5 = adj_close.rolling(window=5).mean()

# 20일 이동평균 (중기)
sma20 = adj_close.rolling(window=20).mean()

window=20이면 현재 행 포함 과거 20개 데이터의 평균을 계산한다.


3. 파라미터 활용: min_periods, center

실제로 돌려보니까 파라미터 설정에 따라 결과가 꽤 달라졌다.

min_periods: 초반 NaN 문제 해결

window=20이면 처음 19개 행은 데이터가 부족해서 NaN이 된다. min_periods를 설정하면 최소 몇 개부터 계산할지 정할 수 있다.

# 데이터 1개부터 계산 시작
sma20_filled = adj_close.rolling(window=20, min_periods=1).mean()

초기 데이터 손실 없이 전체 구간을 채울 수 있어서 유용하다.

center: 후행성 줄이기

기본값은 현재 시점 기준 과거 데이터만 보는데, center=True로 하면 현재를 중심으로 앞뒤 데이터를 같이 본다.

# 현재 시점 기준 전후 데이터 평균
sma20_centered = adj_close.rolling(window=20, center=True).mean()

실제로 차트에 그려보니 center=True 쪽이 추세 전환점이 더 제때 잡히더라. 후행성(lagging) 문제가 좀 줄어든다.


4. 지수가중이동평균(EWM)

rolling()은 윈도우 내 모든 데이터를 동일하게 취급한다. 근데 주가 분석에서는 “최근 데이터가 더 중요하다”는 관점이 있다. 이럴 때 ewm()을 쓴다.

ewm 기본 사용법

최근 데이터에 높은 가중치, 오래된 데이터는 가중치가 지수적으로 감소한다.

# span=20: 20일 기준 지수가중평균
ewm20 = adj_close.ewm(span=20).mean()

rolling vs ewm

  • 반응 속도: ewm이 최근 변동에 더 민감하게 반응한다. 추세 전환이 빠를 때 유리하다.
  • NaN 처리: rolling은 윈도우가 다 차야 계산되는데, ewm은 데이터 1개부터 바로 계산 가능하다. min_periods 설정 없이도 초반 손실이 적다.

실제로 그려보니 rolling(20)보다 ewm(span=20)이 최근 상승세를 더 밀착해서 따라간다.


정리

이동평균 계산하는 두 가지 방법을 정리하면:

  • rolling(): 윈도우 내 균등 가중. 안정적인 추세 확인용.
  • ewm(): 최근 데이터 가중. 변화에 민감하게 반응해야 할 때.

실제 주가 데이터에 둘 다 적용해보니까 차이가 확실히 느껴진다. 상황에 따라 골라 쓰면 될 듯.

다음엔 정렬(sort) 관련 내용 정리할 예정.


데이터 출처: Kaggle - NVIDIA Stock Data

댓글남기기