본문 바로가기
백테스트를 위한 파이썬

FinanceDataReader에서 주가 데이터 연산하기

by 바이너리 퀀트 2023. 12. 4.

 

 

아래와 같은 코드를 사용하여 주가 데이터를 획득할 수 있습니다.

사용한 라이브러리는 FinanceDataReader입니다.

 

import FinanceDataReader as fdr
price_df = fdr.DataReader("005930", '2009-09-16', '2018-03-21')
price_df.head()

 

 

그리고 005930 코드를 사용하여 삼성전자 주가 데이터를 획득할 수 있습니다.

획득한 데이터의 형태는 DataFrame입니다.

2009년 9월 16일부터 2018년 3월 21일까지의 데이터를 획득할 수 있습니다.

 

 

 

 

 

 

그럼 FinanceDataReader에서 제공해 주는 삼성전자의 전체 데이터를 구하고 싶을 때는 코드만 인자값으로 전달하면 됩니다.

 

import FinanceDataReader as fdr
price_df = fdr.DataReader("005930")
price_df

 

 

결괏값을 보니 1999년 8월 17일 데이터부터 구할 수 있는 것을 확인할 수 있습니다.

 

 

 

그럼 우선 첫 번째 Row값을 Series로 가져오려고 할 때는 어떻게 하면 될 것 같나요?

iloc을 이용하는 방법을 사용하면 됩니다.

 

price_df.iloc[0]

 

 

DataFrame의 0번째  Row값을 Series로 가져온 것을 확인할 수 있습니다.

 

 

그럼 DataFrame과 Series 간의 연산을 해보려고 합니다.

 

(price_df - price_df.iloc[0]).head()

 

이때 중요한 원칙이 있습니다. DataFrame은 Columns를 기준으로 계산하며 Series는 Index를 기준으로 계산을 합니다.

 

그럼 price_df의 Columns는 [Open, High, Low, Close, Volume Change]입니다.

그리고 Series의 Index도 [Open, High, Low, Close, Volume Change]입니다.

 

따라서 계산 시에 문제없이 브로드캐스팅되어 row마다 Series 데이터로 빼준 것을 확인할 수 있습니다.

 

 

 

 

 

그럼 이번에는 아래와 같은 연산을 해보면 어떻게 될까요?

 

(price_df - price_df['Open']).head()

 

price_df ['Open']은 index가 Date이고 값은 Open 값을 가지고 있는 Series입니다.

따라서 price_df의 Columns와 price_df ['Open']의 index값이 일치하지 않으므로 제대로 된 연산을 할 수 없습니다.

 

 

 

그럼 DataFrame과 DataFrame 간의 계산을 한번 살펴봅시다.

 

price_df - price_df[['Open', 'Low']].iloc[:2].head()

 

 

price_df[['Open', 'Low']]. iloc [:2]는 아래와 같은 DataFrame입니다.

 

 

여기서는 해당하는 index와 Columns에 포개어져서 계산이 되고 나머지는 NaN값을 갖게 되는 것을 확인할 수 있습니다.

 

 

댓글