Resample#

Resample 은 시간데이터를 다른 시간 단위로 변경하고 싶을 때 활용합니다. 예를 들면, 초 단위 데이터를 일단위 혹은 월단위 데이터로 변경 할 수 있습니다. 연습을 위하여 시간 레벨의 데이터가 필요합니다. 시간레벨 데이터는 FinanceDataReader 패키지에서 제공하는 일봉 데이터를 활용하겠습니다. FinanceDataReader 는 이승준님이 금융자료 분석을 하시는 분들을 위하여 만들어 주신 정말 유용한 패키지입니다. 자세한 내용은 아래 링크에 설명이 되어 있습니다. https://financedata.github.io/posts/finance-data-reader-users-guide.html 또한, 이승준님이 Pycon 에서 엑셀에 비하여 파이썬의 장점에 대하여 강연하시는 내용이 유투브에 있습니다. https://www.youtube.com/watch?v=w7Q_eKN5r-I

FinanceDataReader#

FinanceDataReader 를 import 합니다. DataReader 함수에 종목코드, 시작일, 종료일을 인수로 넣어주면 아래와 같이 일봉데이터를 리턴합니다. 출력해보면 Date 가 index 로 되어 있음을 알 수 있습니다.

import FinanceDataReader as fdr

code = '005930' # 삼성전자
stock_data = fdr.DataReader(code, start='2021-01-03', end='2021-12-31') 

stock_data.head().style.set_table_attributes('style="font-size: 12px"') # head 메소드는 처음 5 row 만 출력합니다.
  Open High Low Close Volume Change
Date            
2021-01-04 00:00:00 81000 84400 80200 83000 38655276 0.024691
2021-01-05 00:00:00 81600 83900 81600 83900 35335669 0.010843
2021-01-06 00:00:00 83300 84500 82100 82200 42089013 -0.020262
2021-01-07 00:00:00 82800 84200 82700 82900 32644642 0.008516
2021-01-08 00:00:00 83300 90000 83000 88800 59013307 0.071170

각 월별 종가의 평균, 최대값, 최소값을 알아봅니다. 월별로 요약하면 index 에는 월의 마지막 날짜가 되는 것을 유의하세요. head 메소드로 출력을 5 열로 제한합니다. pd.options 로 소숫점 이하는 보이지 않도록 합니다. 시간이 index 가 되어 있을 때 resample 이 가능합니다.
import pandas as pd
pd.options.display.float_format = '{:,.0f}'.format
stock_data.resample('M')['Close'].agg(['mean','max','min']).head().style.set_table_attributes('style="font-size: 12px"') # 처음 5개만 출력
  mean max min
Date      
2021-01-31 00:00:00 86565.000000 91000 82000
2021-02-28 00:00:00 83127.777778 85300 81600
2021-03-31 00:00:00 82072.727273 84000 80900
2021-04-30 00:00:00 83586.363636 86000 81500
2021-05-31 00:00:00 80521.052632 83200 78500

주별로 요약할 수 도 있습니다. 이번에는 resample(‘W’) 라고 해 줍니다. Resample 이 정말 유용한 기능이라는 것을 직감하셨을 것으로 생각합니다. 역시 한 주(월요일 ~ 일요일)의 마지막날이 Index 로 들어가 있습니다. 디폴트는 일요일입니다.

pd.options.display.float_format = '{:,.0f}'.format
stock_data.resample('W')['Close'].agg(['mean','max','min']).head().style.set_table_attributes('style="font-size: 12px"')
  mean max min
Date      
2021-01-10 00:00:00 84160.000000 88800 82200
2021-01-17 00:00:00 89800.000000 91000 88000
2021-01-24 00:00:00 86820.000000 88100 85000
2021-01-31 00:00:00 85480.000000 89400 82000
2021-02-07 00:00:00 83600.000000 84600 82500