주식투자

PR(배당 미고려)과 TR(배당 재투자) 주가 흐름을 그래프로 그려 보자 (FinanceDataReader 모듈 사용) [파이썬 분석 2]

오렌지사과키위 2025. 4. 12. 12:13

지난 글에서 구글 코랩(Colab)을 이용하여 파이썬 클라우드(cloud) 서비스를 사용하는 방법을 대해 간단하게 살펴보았습니다. 코랩이 지원하는 인공지능 코드 생성 기능도 사용해 보았습니다. 정확한 코드는 아니었지만, 하고자 하는 작업을 위한 전반적인 코드 구성을 파악하기에는 유용한 도구였습니다. 지난 글: [파이썬 분석 1] 주가 흐름을 그래프로 그려 보자 (구글 코랩을 써 보자! 인공지능 너도 실수하는구나?)

코랩이 생성한 코드를 보면 주가 데이터를 가져오기 위해 yfinance 모듈을 사용하고 있습니다. 한국인의 경우에는 이보다는 FinanceDataReader 모듈이 더 적합할 수 있습니다.

이 글에서는 FinanceDataReader를 이용하여 주가 데이터를 불러와서 그래프를 그려보는 예를 소개합니다.

공지: 연재를 묶어 보다 이해하기 쉽게 수정 보완한 책을 출간했습니다. 책 소개: 파이썬으로 그려보는 투자 포트폴리오 분석 (정량적 투자 분석을 위한 입문서) 출간에 부쳐 (샘플북 포함)

주의: 이 글은 특정 상품 또는 특정 전략에 대한 추천의 의도가 없습니다. 이 글에서 제시하는 수치는 과거에 그랬다는 기록이지, 앞으로도 그럴 거라는 예상이 아닙니다. 분석 대상, 기간, 방법에 따라 전혀 다른 결과가 나올 수 있습니다. 데이터 수집, 가공, 해석 단계에서 의도하지 않은 오류가 있을 수 있습니다. 일부 설명은 편의상 현재형으로 기술하지만, 데이터 분석에 대한 설명은 모두 과거형으로 이해해야 합니다.

데이터 수집의 어려움

yfinance가 보다 많은 종류의 데이터를 가져올 수 있지만, 국내 주식에 대해서는 FinanceDataReader가 정확도 측면에서 조금 더 유리합니다. 이 연재에서는 개별 종목은 다루지 않기에 각종 재무지표 데이터를 살펴보지 않기 때문이기도 합니다. 참고: 국내 주식에 대한 재무제표 데이터를 획득하는 용도로는 OpenDartReader 모듈이 괜찮습니다.

파이썬 또는 R과 같은 프로그래밍 언어를 이용한 퀀트 투자 입문서를 보면, 상당 부분 데이터를 수집하고 가공, 처리하여 데이터베이스를 구축하는 방법을 소개하고 있습니다. 전반적인 과정인 어떻게 동작하는지 살펴보기에는 도움이 될 수 있지만, 웬만하면 직접 데이터를 구축하는 방법은 권하지 않습니다. 배보다 배꼽이 더 클 수 있기 때문입니다.

유명한 사이트에서 제공하는 데이터라도 오류가 있는 경우가 꽤 있습니다. 특히 웹크롤링(web crawling) 방식으로 데이터를 수집하는 경우, 해당 사이트의 웹페이지 구조가 바뀌면 이에 맞춰 코드를 수정해야 합니다. 상당한 수준의 프로그래밍 실력이 필요할 수도 있으며, 들인 노력에 비해 얻을 수 있는 이득은 크지 않습니다.

진지한 수준으로 데이터를 참고하는 투자를 계획하고 있다면, 무료로 사용할 수 있는 잘 정리된 데이터나 데이터를 가져올 수 있는 모듈을 사용하거나, 비용을 들여서라도 외부 업체를 통해 상대적으로 결함이 적은 데이터를 구해 사용하면서, 투자 전략 개발에 더 신경 쓰는 것이 효율적일 수 있습니다.

데이터는 살펴보면 살펴볼수록 결함이 계속 발견됩니다. 여기에 본인이 직접 데이터 수집부터 데이터베이스 구축까지 담당하면 어디선가 오류가 발생할 가능성도 높아집니다. 업체가 제공하지 않는 데이터에 한해서만 직접 수집하여 처리하는 것이 경제적일 수 있습니다.

FinanceDataReader로 주가 데이터 불러오기

노트에서 셀 결과물 하단에 마우스를 올리면 '+ 코드'라는 버튼이 나타납니다. 이 버튼을 누르면 새로운 코드 셀을 추가할 수 있습니다.

노트에서 코드 셀을 추가하는 버튼이 나타난 화면

새로운 코드 셀을 추가하여 다음과 같이 FinanceDataReader로 SPY 주가를 가져와서 출력하는 코드를 입력합니다.

!pip install -q finance-datareader

import FinanceDataReader as fdr

df = fdr.DataReader('SPY')
df

하나씩 살펴보겠습니다.

!pip install -q finance-datareader

이전 글에서 쓴 yfinance와는 달리 FinanceDataReader는 코랩에 기본 설치되어 있지 않은 모듈입니다. 모듈 설치를 위해 pip 명령을 사용합니다. 느낌표(!)는 코랩 외부에서 실행하라는 뜻입니다. -q (quite) 옵션은 설쳐 과정을 주저리주저리 표시하지 말고 조용히 설치하라는 지시입니다.

import FinanceDataReader as fdr

설치된 FinanceDataReader는 이름이 기니 fdr이라는 별명으로 사용하겠다고 지시합니다.

df = fdr.DataReader('SPY')

SPY 데이터를 불러와서 df 변수에 넣습니다. df는 DataFrame의 약자입니다. DataFrame(데이터프레임)은 파이썬에서 많이 사용하는 테이블 형태의 자료 구조(data structure)입니다. 스프레드시트의 시트라고 보면 됩니다.

df

df를 출력합니다. 이처럼 코드 셀의 마지막에 변수 이름만 적으면, 해당 변수값을 출력합니다. 마지막이 아닌 경우에는 display(df)라고 쓰면 됩니다.

코드를 실행하면 다음과 같은 화면이 나옵니다.

FinanceDataReader로 SPY 주가 데이터를 가져온 결과

코드 아래 결과물이 표로 표시되어 있습니다. df의 내용입니다. 왼쪽에 인덱스(index)로 날짜가 있고, 시가(Open), 고가(High), 저가(Low), 종가(Close), 거래량(Volume), 그리고 수정 종가(Adj Close)가 있습니다.

표 오른쪽에 몇 개의 아이콘이 있습니다. 데이터를 그래프로 보여주거나 검색 등을 할 수 있는 기능을 제공합니다. 표 내용을 복사할 수 있는 기능도 제공합니다. 구글 시트나 마이크로소프트 엑셀과 같은 다른 툴에 데이터를 복사하여 사용할 수 있습니다. 참고: 주가 및 관련 데이터 가져오는 법 (구글 Colab - 파이썬 클라우드 서비스)

주가 그래프 그리기

이제 그래프를 그려보겠습니다. Close 필드는 PR 종가이고, Adj Close는 TR 종가입니다. 두 가격을 한 그래프로 그려 보겠습니다.

방금 작성한 코드 셀 아래에 코드 셀을 추가하고 다음과 같이 입력하여 실행합니다. 실행은 플레이(play) 버튼을 눌러도 되고, 단축키로 Ctrl + Enter를 사용해도 됩니다.

df[['Close', 'Adj Close']].plot()

df와 같은 DataFrame 변수는 행(row) 또는 열(column)로 범위를 지정할 수 있습니다. 여기서는 Close와 Adj Close 두 필드(열)에 대해 선그래프를 그리라고 지시한 것입니다.

SPY의 종가와 수정 종가

필드명을 범례(legend)로 사용한 그래프가 만들어졌습니다.

주가 그래프 세부 조정하기

이제 몇 가지 조정을 해 보겠습니다. 다음과 같이 입력합니다.

import matplotlib.pyplot as plt

df[['Close', 'Adj Close']].plot()

plt.title('Price of SPY')
plt.xlabel('Date')
plt.ylabel('Price in USD')

plt.xticks(rotation=0)

plt.legend(['PR', 'TR'])

plt.grid(True)
plt.show()

추가된 부분을 하나씩 살펴봅니다.

import matplotlib.pyplot as plt

그래프를 그리는 matplotlib.pyplot 모듈을 plt라는 이름으로 사용하겠다고 지시했습니다.

plt.title('Price of SPY')
plt.xlabel('Date')
plt.ylabel('Price in USD')

plt.xticks(rotation=0)

그래프의 제목, x축 이름, y축 이름을 지정하고, x축에 표시되는 눈금에 대한 글자는 기울이지 않도록 설정했습니다.

plt.legend(['PR', 'TR'])

plt.grid(True)
plt.show()

범례를 PR과 TR로 지정하고, 격자를 표시하고, 그래프를 보여줍니다. plt.show()는 그래프를 보여주는 명령이지만, 맨 마지막이라면 생략해도 그래프가 나옵니다.

결과는 다음과 같습니다.

SPY의 종가와 수정 종가

정리하며

구글 코랩에서 FinanceDataReader 모듈로 주가 데이터를 불러와서 그래프로 그리는 방법을 소개하였습니다. FinanceDataReader는 한국인이 투자하는 자산과 관련한 데이터를 가져올 수 있는 괜찮은 모듈 중에 하나입니다

파이썬에 관련 모듈을 적절히 사용하면 투자 관련 기초 데이터를 손쉽게 구할 수 있습니다. 획득한 데이터는 다른 툴에 사용할 목적으로 복사할 수도 있습니다.

파이썬의 그래프 기능은 직관적이면서 세세한 조정이 수월합니다. 다음 편에서 소개하겠지만, 예제로 소개한 선그래프만 하더라도 스프레드시트로는 세부 조정이 어려운 로그 스케일(log scale)로 표현할 때 유용합니다.

참고: 연재와 관련한 질문은 댓글로 남겨주시기 바랍니다. 답변을 드리거나 이후 연재에서 다룰 수 있도록 노력하겠습니다.

참고 서적: 왜 위험한 주식에 투자하라는 걸까? - 장기 투자와 분산 투자에 대한 통계학적 시각

이어지는 글: [파이썬 분석 3] 누적 수익률로 그래프로 그려 보자 (로그 스케일에 수익률을 표현하는 방법)

연재 목록: 자산 배분 분석 방법 책 소개, 연재글 및 사례 모음 [목록]

함께 읽으면 좋은 글 (최신 글)

  1. [파이썬 분석 1] 주가 흐름을 그래프로 그려 보자 (구글 코랩을 써 보자! 인공지능 너도 실수하는구나?)
  2. [중급 14] 레버리지 ETF의 성과는 왜 좋았을까? (민감한 레버리지님과 기준 금리)
  3. [중급 13] 레버리지 배율은 무한정 높여도 될까? (복리 수익률을 평균-분산 그래프에 나타내 보자)
  4. [중급 12] 레버리지는 얼마나 위험할까? (레버리지의 위험을 평균-분산 그래프에 좀 더 현실적으로 표현해 보자)
  5. [중급 11] 투자자는 왜 분석 방법을 공부해야 할까? (평균-분산 그래프를 사용하는 이유)

함께 읽으면 좋은 글 (인기 글)

  1. 챗GPT(ChatGPT)로 사진을 지브리 만화 스타일로 변환하기
  2. 스튜디오 지브리 만화 스타일로 그림 그리기 (구글 제미나이 + ImageFX)
  3. 스튜디오 지브리 만화 스타일로 그림 그리기 (구글 제미나이)
  4.  구글 제미나이(Gemini)를 이용한 그림 생성하기 (vs. 마이크로소프트 이미지 크리에이터의 이미지 생성 AI)
  5. 챗GPT(ChatGPT)로 사진을 지브리 vs 이누야샤 만화 스타일로 변환한 사례 비교 (인물 사진 #3)
도움이 되었다면, 이 글을 친구와 공유하는 건 어떻까요?

facebook twitter kakaoTalk naver band