백테스트-주가 정보 기간별 집계(DataFrame.resample)

 안녕하세요, 백테스트 실습 두 번째 포스팅입니다. 지난 포스팅에서 종목의 주가 데이터를 가져오는 방법을 알아보았습니다. 오늘 포스팅에서는 수익률, MDD 등 다양한 정보를 분석하기 전에 분석하기 쉽게 기간 별로 집계하는 방법에 대해 알아보겠습니다. 이를 위해서 DataFrame의 resample이라는 함수를 활용할 예정입니다.

 

참고)

 

pandas.DataFrame.resample — pandas 1.2.2 documentation

Which side of bin interval is closed. The default is ‘left’ for all frequency offsets except for ‘M’, ‘A’, ‘Q’, ‘BM’, ‘BA’, ‘BQ’, and ‘W’ which all have a default of ‘right’. Which bin edge label to label bucket with. Th

pandas.pydata.org

 DataFrame.resample 의 전체 기능을 확인하기 위해서는 위의 참고 링크를 확인해주세요. 그러나 저희가 사용할 기능은 한정적이기 때문에, 굳이 위의 참고 문서를 이해하지 않아도 됩니다. (기본적으로 파이썬 언어나, Pandas 라이브러리를 활용할 수는 있어야겠죠😉)

 

 기본적으로 퀀트 투자를 백테스트 할 때에는 리밸런싱을 하는 주기 별로 확인합니다. 리밸런싱 주기는 월별, 분기별, 연도별 등이 될 수 있겠죠. 지금까지 제가 올렸던 동적 자산 배분 전략은 대부분이 월별 리밸런싱을 기준으로 했었죠. 소스코드를 보면서 주기별로 어떻게 주가 데이터를 집계할 수 있는지 확인해보겠습니다.

 

 지난 시간 주가 데이터를 불러왔을 때 결과물인 DataFrame을 출력해보면 아래와 같이 데이터를 확인할 수 있습니다. 일별로 전체 데이터를 가지고 있죠. 하지만 보통 월별, 분기별, 연도별 리밸런싱을 진행하기 때문에 굳이 전체 데이터를 가지고 있을 필요가 없습니다.

 

 

 일별로 주가가 어떻게 변하든 저희는 매월 마지막 종가 데이터만 알면 수익률과 MDD 등 다양한 정보를 확인할 수 있기 때문이죠.

 

 예를 들어, 삼성전자의 주가가 아래와 같이 변했다고 가정해봅시다.

3월 31일 : 80,000원

4월 7일 : 85,000원

4월 14일 : 83,500원

4월 21일 : 87,000원

4월 28일 : 88,000원 

 

 이 때 우리는 매달의 마지막 종가(80,000원, 88,000원)만 알아도 4월 한달동안 주가가 10% 올랐다는 사실을 확인할 수 있습니다. 그렇기 때문에 일별로 있는 주가 데이터가 전체는 필요없고 매 월말 데이터만 있으면 됩니다.

 

아래 소스코드가 DataFrame을 기간별로 집계해서 다양한 정보를 확인할 수 있는 코드입니다.

# DataFrame을 특정 기간으로 집계해서 마지막 데이터만 조회
df_LAA.resample(rule='1M').last()
df_LAA.resample(rule='1Q').last()
df_LAA.resample(rule='1Y').last()

 

 rule='1M'에서 1M(1개월) 부분에는 여러 데이터가 들어갈 수 있습니다. 1M은 1개월, 1Q는 1분기(3개월), 1Y는 1년(12개월) 단위로 데이터를 집계해서 마지막 데이터(last)를 보여줍니다.

 

 last() 부분도 first(첫번째 값), sum(합계), mean(평균) 등 다양한 함수로 바꾸어서 사용할 수 있습니다. 다양한 함수들을 적용해보고 분석에 활용하시면 됩니다.

 

위의 소스코드로 실행한 결과는 아래와 같습니다.

 

월별 마지막 종가 데이터

 

 

 

분기별 마지막 종가 데이터

 

 

 

연도별 마지막 종가 데이터

 

 

 기간 별로 필요한 주가 데이터만 남김으로써 실제로 분석할 데이터는 모두 준비가 완료되었습니다. 다음 포스팅부터 실제로 우리가 필요로 하는 수익률, MDD 등의 정보를 어떻게 분석할 수 있는지 확인해보겠습니다. 다음 포스팅도 기대해주세요 : ) 

 


공감댓글, 공유는 큰 힘이 됩니다!

도움이 되셨다면 널리널리 알려주세요😉

 

 

 

 

댓글()