본문 바로가기
  • Rising Moon
개발로 돈 벌기/파이썬 금융 데이터 분석

파이썬으로 야후 파이낸스(yfinance)에서 금융 데이터 가져오기

by 라이징문 2022. 8. 2.

yfinance 라이브러리를 활용해
주식, 환율, 지수부터 암호화폐까지
다양한 금융 데이터를 가져와보자.
가져온 데이터의 구조를 알아보고
더 보기 좋게 만들어보자.
판다스로 데이터프레임을 가볍게 다뤄볼 수 있다.

1. yfinance 라이브러리

1-1. yfinance는 무엇인가?

야후 포털 사이트는 현재 구시대의 유물 취급을 받는다.

하지만 그 일부 미디어인 야후 파이낸스는

세계 최대 규모의 비지니스 뉴스 플랫폼으로 살아남았다.

웹사이트와 앱으로 무료 주식 시세, 최신 뉴스, 포트폴리오 관리 등

다양한 기능을 제공하고 있다.

또한, 금융 데이터 API를 통해 무료로 시세 데이터를 제공하고 있다.

 

금융 데이터 API란 원하는 금융 데이터를 요청하면

그에 맞는 응답 데이터를 보내주는 것이라 생각하면 된다.

2017년경 API 제공이 중단되었던 적이 있는데

그 사이 동일한 기능을 제공하는 다른 서비스들이 많이 생겨났었다.

하지만 2019년도에 다시 돌아오며

가장 많이 쓰이는 무료 금융 데이터 API 자리를 유지하고 있다.

 

우리는 파이썬을 사용해서 그 요청과 응답을 수행해야 하는데,

야후 파이낸스의 API를 파이썬으로 사용 가능하도록 만든 것이

yfinance 라이브러리이다.

 

yfinance가 많이 쓰인다고 단점이 없는 것은 아니다.

야후 파이낸스에서 공식적으로 개발하거나 지원하는 것이 아니기 때문에

갑자기 사용이 막힌다거나 일부 기능이 제한될 가능성도 존재한다.

 

하지만 현재 우리가 하려는 분석에는 충분하다.

다양한 자산군의 가격 데이터를 기간과 주기에 따라 신뢰성있게 제공하고 있으며,

워낙 인지도가 높기에 수 많은 예시와 레퍼런스를 찾기도 편하다.

또한 yfinance 사용에 익숙해지면 다른 Tool을 배우는 것도 어렵지 않다.

 

만약 어떤 이유에서든지 지금 yfinance를 쓰고 싶지 않다면

아래 링크를 참고하거나,

free stock market api 같은 키워드로 구글 검색을 해보자.

 

- 참고링크: 5가지 금융 데이터 API에 관하여 (영문)

1-2. 어떻게 설치할까?

# 필수 요구 사항
Python >= 2.7, 3.4+
Pandas (tested to work with >=0.23.1)
Numpy >= 1.11.1
requests >= 2.14.2
lxml >= 4.5.1

# 설치 명령어
$ pip install yfinance --upgrade --no-cache-dir

# 설치 확인 및 버전 체크 명령어
$ pip show yfinance

# 결과
Name: yfinance
Version: 0.1.74
Summary: Download market data from Yahoo! Finance API
Home-page: https://github.com/ranaroussi/yfinance
Author: Ran Aroussi
Author-email: ran@aroussi.com
License: Apache
Location: /Users/username/miniconda3/envs/ta/lib/python3.10/site-packages
Requires: lxml, multitasking, numpy, pandas, requests
Required-by:

 

만약 설치가 안된다면 필수 요구 사항을 먼저 확인하자.

나는 miniconda 가상 환경을 만들었는데

각자 본인의 파이썬 가상 환경을 확인하고

요구 사항을 충족하는지 알아보면 된다.

 


2. 금융 데이터 가져와서 저장하기

이후의 파이썬 코드는 모두 주피터 노트북(랩) 환경에서 실행하였다.

2-1. 삼성전자 데이터 가져오기

# 1. 라이브러리 불러오기
import pandas as pd
import yfinance as yf

# 2. 가져올 데이터 기간 지정
start = "2019-01-01"
end = "2022-08-01"

# 3. 가져올 티커(심볼) 지정 - 삼성전자 심볼 예시
symbol = "005930.KS"

# 4. 데이터 불러오기
df = yf.download(symbol, start, end)
# 결과
[*********************100%***********************]  8 of 8 completed

 

1. 사용할 라이브러리를 불러온다.

편하게 줄임말로 사용하기 위해 as pd, as yf를 덧붙였다.

따라서 코드에 쓰이는 pd는 pandas를 뜻하고,

yf는 조금전 설치한 yfinance를 의미한다.

 

2. 가져올 금융 데이터의 기간을 지정한다.

2019년도부터 1년 7개월간 데이터를 가져온다.

 

3. 가져올 금융 데이터의 심볼(티커)을 지정한다.

심볼 혹은 티커란 시장에서 특정 자산을 지칭하는 줄임말이다.

정확하게는 티커 심볼(Ticker symbol)이라고 부르는 게 정확하지만,

보통 심볼 또는 티커라고 사용한다.

"005930.KS" 는 삼성전자의 심볼이다.

원하는 자산의 심볼을 찾는 방법은 구글링 혹은 야후 파이낸스 검색을 추천한다.

(플랫폼마다 심볼의 차이가 있는 경우도 있다.)

 

4. 지정한 기간만큼 심볼 데이터 불러오기

yf 의 download 메서드를 사용했다.

df는 dataframe의 줄임말이며 판다스에서 다룰 수 있는 자료형이다.

일종의 예시이자 관례처럼 변수명을 사용한 것이다.

결과로 다운로드 수행 완료 표시를 볼 수 있다.

 

이제 불러온 데이터를 보자.

# 변수에 담긴 데이터 확인하기
df

# 결과
	Open	High	Low	Close	Adj Close	Volume
Date						
2019-01-02	39400.0	39400.0	38550.0	38750.0	34936.312500	7847664
2019-01-03	38300.0	38550.0	37450.0	37600.0	33899.496094	12471493
2019-01-04	37450.0	37600.0	36850.0	37450.0	33764.261719	14108958
2019-01-07	38000.0	38900.0	37800.0	38750.0	34936.312500	12748997
2019-01-08	38000.0	39200.0	37950.0	38100.0	34350.289062	12756554
...	...	...	...	...	...	...
2022-07-25	60900.0	61900.0	60800.0	61100.0	61100.000000	9193681
2022-07-26	60800.0	61900.0	60800.0	61700.0	61700.000000	6597211
2022-07-27	61300.0	61900.0	61200.0	61800.0	61800.000000	7320997
2022-07-28	62300.0	62600.0	61600.0	61900.0	61900.000000	10745302
2022-07-29	62400.0	62600.0	61300.0	61400.0	61400.000000	15093120
882 rows × 6 columns

왼쪽 Date를 보면 1월 2일부터 날짜가 시작된다.

2019년 1월 1일부터 날짜를 지정했지만

주식시장이 열리지 않은 날은 데이터가 없기 때문에 나오지 않는다.

따라서 1년 7개월간 모든 날짜수에서 휴장일 수만큼 데이터가 빠져있다.

 

가장 윗줄을 보면 6가지 용어가 있다.

순서대로

시가(Open), 최고가(High), 최저가(Low), 종가(Close), 수정 종가(Adj Close), 거래량(Volume)이다.

자세히 보면 수정 종가가 종가와 항상 일치하지 않는다.

수정 종가가 존재한다는 것은 배당주식의 경우라고 보면 된다.

배당금을 소급 적용한 가격으로 주식 분할, 배당 등에 영향을 받는다.

따라서 실제 주식 가치 분석을 위해선 수정 종가를 활용하는 것이 맞다.

하지만 현재는 분석 방법에 주안점을 두고 따로 고려하진 않겠다.

 

다음은 전체적인 데이터 정보를 살펴보자

# 데이터프레임 자료형의 정보 보기
df.info()

# 결과
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 882 entries, 2019-01-02 to 2022-07-29
Data columns (total 6 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   Open       882 non-null    float64
 1   High       882 non-null    float64
 2   Low        882 non-null    float64
 3   Close      882 non-null    float64
 4   Adj Close  882 non-null    float64
 5   Volume     882 non-null    int64  
dtypes: float64(5), int64(1)
memory usage: 48.2 KB

 

전체적인 구성과 정보를 볼 수 있다.

df 라는 데이터프레임 자료는

DatatimeIndex는 882개 이고 위에서 지정한 기간으로 설정되어있다.

총 여섯 개 칼럼으로 이루어져 있고

null은 빈 값 (결측 값)을 의미하기에 non-null은 채워진 값이다.

따라서 채워진 데이터 수는 모두 882개이다.

데이터 타입(Dtype)도 소수점, 정수 등으로 볼 수 있다.

 

2-2. 다양한 자산 데이터 불러오기

테슬라, 카카오, 미국 국채 수익률(10년 물), 원달러 환율, 금,

S&P 500, 다우존스 지수, 비트코인 달러 가격을 가져와 보겠다.

(참고로 지수의 심볼은 ^로 시작한다.)

# 여러 티커 심볼을 지정하기
symbol = ["TSLA", "035720.KS", "^TNX", "KRW=X", "GC=F", "^GSPC", "^DJI", "BTC-USD"]

# df 변수에 데이터 담기
df = yf.download(symbol,start,end)

 

가져온 데이터를 아래에서 천천히 살펴보자.

위의 삼성전자 예시와 어떤 차이가 있는지 찾아보자.

 

df 데이터 보기 (사진)

df 데이터 보기

흠 일단 복잡해 보인다.

심볼이 중복해서 나타나기 때문에 더 헷갈린다.

다른 점은 아래와 같이 정리해볼 수 있다.

 

1. df 의 첫 번째 행에 2018-12-31 데이터가 있다.

원래 기간을 2019-01-01부터 설정했었다.

그 전날 데이터까지 나오는 이유는

타임존(timezone)과 관련이 있다.

국내 주식이 아닌 해외 시세를 불러와서 그런 거다.

일단 시간대가 다르다는 것을 참고만 하고 넘어가자.

 

2. df 에서 NaN 이라는 것이 보인다.

NaN는 표현 불가능을 의미한다.

즉, 빈 값(결측 값)이 존재한다.

왜 그럴까?

비트코인은 24시간 365일 거래된다. 휴장일이 없다.

따라서 비트코인은 모든 날짜에 대한 데이터가 있지만,

다른 것들은 그렇지 않기 때문에 휴장 한 날에는 빈 값이 나타나게 된다.

 

3. df에서 칼럼명이 두 겹(?)이 되었다.

기존 Open, High, Low,,, 한 줄에서

각 심볼명까지 두 겹이 되었다.

이렇듯 여러 개의 기준이 있는 것을 멀티 인덱스라 한다.

인덱스란 개념은 쉽게 말해 "색인" 혹은 "목차"라고 생각하면 된다.

현재 바깥쪽 가격 정보마다 티커 별 정보가 있는 구조이다.

바깥쪽 - Open, High,,,

안쪽 - 035720.KS, BTC-USD

 

 

좀 더 쉽게 구조를 파악하기 위해 df.info()를 살펴보자.

 

df.info() 데이터 보기 (사진)

df.info() 데이터 보기

 

가격 데이터 종류마다 심볼이 각각 존재하고,

비트코인의 비어있지 않은 값이 제일 많으며,

한국 주식과 미국 주식의 데이터 수가 다르다. (휴장일 차이)

 

2-3. 데이터를 파일로 저장하기

이제 마지막으로 가져온 데이터를 저장해보자.

# 데이터 프레임을 csv 파일로 저장하기
df.to_csv("multi_assets.csv")

multi_assets.csv 라는 파일명으로 데이터를 저장했다.

해당 파일이 제대로 저장되었는지 체크하고

어느 경로에 저장되는지 확인해보자.

 

저장할 경로를 따로 지정할 수도 있고

파일명을 바꿀 수도 있지만

우선 저장과 불러오기가 쉽도록 기본 폴더에 두자.

 

다음 글에서는 우리가 저장한 데이터를 다시 불러오고

필요한 부분만 골라내는 방법을 알아보겠다.

댓글