본문 바로가기

Python/Investment

Python으로 주식 이동평균선 차트 그리기

반응형

Python으로 주식 이동평균선 차트 그리기

이번 포스트에서는 Python을 사용하여 이동평균에 대해서 알아보고 주식 차트에서의 이동평균선을 그려보는 시간을 가져보려 한다.
주식 시장에서 이동평균선은 주가의 추세를 확인해 볼 수 있는 중요한 도구인데, Python으로 어떻게 구현할 수 있는지 한번 알아보자.

목차

이동평균(Moving Average)이란?

이동평균은 일정 기간 동안의 데이터를 평균하여 추세를 파악하는 통계적 기법이다.
이는 시계열 데이터의 임의의 변동성을 완화하거나 숨겨진 패턴을 드러내는 데 도움을 준다.
이동평균은 '단순 이동평균', '가중 이동평균', '지수 이동평균' 등 다양한 방법으로 계산될 수 있다.

✔ 단순 이동평균(SMA)은 주어진 기간 동안의 값들을 단순히 더하고, 그 개수로 나누어 계산한다.
✔ 가중 이동평균(WMA)은 최근의 데이터에 더 많은 가중치를 부여하여 이동평균을 계산한다.
✔ 지수 이동평균(EMA)은 가중치가 지수적으로 감소하는 방식을 사용하여 이동평균을 계산한다.

이동평균은 금융(예: 주가 분석), 경제(예: GDP 추적), 연구 등 다양한 분야에서 널리 사용된다.
이 방법을 사용하면 데이터의 장기적인 추세를 보다 명확하게 볼 수 있으며, 단기적인 변동이나 노이즈를 줄일 수 있다.

Pandas rolling method

Pandas의 rolling 메소드는 시계열 데이터를 다루는 데 매우 유용한 도구이다.
이 메소드를 사용하면 시계열 데이터의 이동 윈도우(moving window)에 대한 연산을 수행할 수 있다.
이동 윈도우란 특정 기간의 데이터 그룹을 말하며, 이 기간은 사용자가 설정할 수 있다.
기본 문법은 아래와 같다.

DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)

✔ window : 이동 윈도우의 크기를 결정하는 정수.

✔ min_periods : 각 윈도우에서 요구되는 최소한의 관측치 수.
만약 이 값보다 적은 관측치가 있으면 결과는 NA가 된다.

✔ center : Boolean 값으로, True로 설정하면 윈도우를 중심으로 데이터를 사용한다.

✔ win_type : 윈도우의 형태를 지정하는 문자열.
형태는 아래 리스트 중에 사용 가능하며, 이 중 어떤 윈도우 형태를 사용할지는 사용자의 분석 목표에 따라 달라진다.

  • boxcar
  • triang
  • blackman
  • hamming
  • bartlett
  • parzen
  • bohman
  • blackmanharris
  • nuttall
  • barthann
  • kaiser (beta를 필요로 함)
  • gaussian (std를 필요로 함)
  • general_gaussian (power, width를 필요로 함)
  • slepian (width를 필요로 함)

✔ on : 이동 윈도우를 적용할 열을 지정하는 문자열.

이 메소드를 호출한 후에는, 평균(mean), 합(sum), 최대(max), 최소(min) 등의 통계적 연산을 적용할 수 있다.
예를 들어, df.rolling(window=3).mean()은 각 윈도우에 대한 평균을 계산하고, 이 결과는 이동 평균(moving average)이 된다.

이동평균선(Moving average line)이란?

주식 시장에서의 이동평균선은 일정 기간 동안의 평균을 계산하여, 그래프로 그려진 주식의 가격 흐름을 매끄럽게 만드는 기법이다.
이는 가격 변동의 잡음을 제거하고, 추세를 더 명확하게 파악할 수 있도록 돕는다.
즉, 일정 기간 평균주가와 비교해 현재의 주가는 어디에 위치해 있으며 어떻게 대응해야 할지에 대한 판단을 도와주는 도구이다.

이동평균선에 대한 자세한 설명이 필요하다면 아래 포스트로 확인 부탁드린다.

이동평균선 차트 생성

그럼 이제 Pandas rolling을 활용해서 이동평균선 차트를 생성해보겠다.
샘플 데이터는 아래와 같으며, 데이터는 날짜(date)와 시가(open), 고가(high), 저가(low), 종가(close)로 구성되어 있다.
여기서 종가 기준으로만 5일, 20일, 60일선 차트를 그려보자.


샘플 데이터


import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('../TEST.csv')
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')

데이터프레임 생성을 위해 pandas를, 차트를 그리기 위한 matplotlib를 임포트 해주었으며, TEST.csv로 저장된 데이터를 pandas의 read_csv로 불러왔다.
그 후 date 컬럼의 데이터를 datetime을 사용해 날짜 형식의 데이터로 변환 후 index로 설정해주었다.


데이터 불러오기


# 이동 평균선 계산
df['MA5'] = df['close'].rolling(window=5).mean()
df['MA20'] = df['close'].rolling(window=20).mean()
df['MA60'] = df['close'].rolling(window=60).mean()

데이터를 불러온 뒤 pandas의 rolling method를 사용하여 5일, 20일, 60일의 이동평균을 구해서 데이터프레임에 각각 MA5, MA20, MA60의 컬럼을 추가해준다.


5일, 20일, 60일 이동평균


# 차트 그리기
plt.figure(figsize=(14, 7))

plt.plot(df.index, df['close'], label='close', color='gray')
plt.plot(df.index, df['MA5'], label='5-day moving average', color='red')
plt.plot(df.index, df['MA20'], label='20-day moving average', color='yellow')
plt.plot(df.index, df['MA60'], label='60-day moving average', color='green')

plt.title('Stock closing price and Moving average line')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()

plt.show()

그 후 종가(close), 5일 이동평균(MA5), 20일 이동평균(MA20), 60일 이동평균(MA60) 컬럼을 matplotlib를 사용하여 차트를 그려보았다.
결과는 아래와 같다.



차트의 흐름을 보면 전반적으로 상승추세인 모습을 보여주는데, 가장 최근의 종가가 20일 이동평균선 아래로 내려갔으며, 5일 이동평균선도 20일선을 데드크로스를 할 수도 있는 위치에 있는 것으로 보인다.

이렇게 pandas rolling method를 사용하여 주식의 이동평균선 차트를 생성하는 방법에 대해 알아보았다.
rolling method 덕분에 어렵지 않게 구할 수 있었고, 차트도 matplotlib의 기본적인 사용법 정도만 알면 쉽게 생성할 수 있는 것 같다.

커피 한 잔으로
저를 응원해주세요!
반응형

loading