안녕하세요~ 꽁냥이에요. 이번 포스팅에서는 Pandas에서 단순 이동 평균값을 계산하는 방법에 대해서 알아보려고 합니다. 주식하시는 분들은 아시겠지만 차트를 보실 때 이동 평균선을 같이 보실 텐데요. 이동 평균선이라는 것이 결국 주가의 단순 이동 평균값을 계산하는 것이므로 이번 포스팅에서 그 방법을 숙지하시면 이러한 이동 평균선들도 시각화할 수 있습니다.
여기서 다루는 내용은 다음과 같습니다.
1. 단순 이동 평균이란?
먼저 (이미 알고계시겠지만) 단순 이동 평균의 정의를 잠깐 알아보고 가려고 합니다.
데이터(특히 시계열 데이터) $y_1, y_2, \ldots, y_n$이 있다고 했을 때 $t(m\leq t\leq n )$시점에서의 $m$차 단순 이동 평균은 다음과 같이 계산됩니다.
$$\hat{y}_{t} = \sum_{k=1}^{m}y_{t-k+1}/m$$
단순 이동 평균을 계산하는 이유는 시계열을 좀 더 매끄럽게 하여 변동성이 심해서 트렌드가 눈에 안 보이는 시계열로부터 전체적인 트렌드를 시각적으로 보기 위함입니다.
2. Pandas 단순 이동 평균 계산하기
여기서는 주가 데이터를 이용하여 단순 이동 평균을 계산하려고 합니다. 따라서 주가 데이터를 좀 더 수월하게 가져오기 위하여 pandas-datareader 모듈을 사용합니다. 해당 모듈이 설치 안되신 분들은 pip 명령어를 통해 설치해주세요(버전은 0.10.0 이어야 애플 주가가 문제없이 조회됩니다). pandas-datareader를 통한 주식(주가) 데이터 조회 방법은 여기를 참고해주세요.
pip install pandas-datareader
먼저 2021년도 애플 주가 데이터를 불러옵니다.
import pandas_datareader as pdr
from datetime import datetime
start_date = datetime(2021,1,1)
end_date = datetime(2021,12,31)
df = pdr.DataReader('AAPL', 'yahoo', start_date, end_date)
## 또는 pdr.get_data_yahoo('AAPL', start_date, end_date)
여기서는 종가(Close 칼럼)를 기준으로 5차 단순 이동 평균을 계산하겠습니다. 아래 코드는 애플 종가의 5차 단순 이동 평균을 계산한 것입니다. rolling을 이용하면 되는데 이때 window 인자에 차수를 넣어주고요. 평균을 계산해야 하기 때문에 뒤에 mean을 붙여줍니다.
moving_average = df['Close'].rolling(window=5).mean()
코드를 실행하면 앞 4개는 NaN으로 나타나는데요. 이는 5차 단순 이동 평균을 계산하기 위해 적어도 앞에 5개 데이터가 있어야 하기 때문입니다.
3. 주가 데이터를 이용하여 이동 평균선 그려보기.
이번엔 추가적으로 주가와 함께 이동 평균선을 그려보도록 하겠습니다.
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10,6))
fig.set_facecolor('white')
plt.plot(df.index, df.Close, color='k', label='stock_price')
plt.plot(moving_average.index, moving_average, color='red', label='moving_average')
plt.legend()
plt.title('Apple Stock Price',fontsize=15)
plt.show()
실제로 주식 어플에서 보는 것과 같은 차트 분위기가 느껴집니다.
이번 포스팅에서는 단순 이동 평균의 기본적인 개념과 Pandas에서 rolling.mean을 이용하여 계산하는 방법을 알아보았습니다. 이 부분은 주식 데이터를 분석하는 분들에게는 아주 유용하므로 꼭 알아두시길 바랍니다. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다.
'데이터 분석 > 데이터 전처리' 카테고리의 다른 글
[Pandas] 26. shift를 이용하여 칼럼 값이 바뀌는 지점(행) 찾기 (400) | 2022.05.20 |
---|---|
[Numpy] 결측치(NaN, missing)를 포함한 두 배열의 상관계수(correlation) 구하기 (with ma.corrcoef) (378) | 2022.05.12 |
[Pandas] pandas-datareader를 이용하여 주식(주가) 데이터 가져오기! (398) | 2022.05.11 |
[pandas] 판다스 고급 Tip! Groupby에 복잡한 집계(조건부 집계 등) 함수 적용하기 (397) | 2022.04.27 |
[Pandas] 25. 데이터(칼럼, 열) 변환 하기 (feat. columns, dtype, map, apply) (423) | 2022.04.16 |
댓글