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

판다스로 주식, 암호화폐 데이터 다듬기

by 라이징문 2022. 8. 2.

이번엔 저장해둔 금융 데이터 중에서
원하는 부분만 골라내는 방법을 알아보자.
yfinance 혹은 크롤링 데이터는
우리가 예상했던 것과 다른 형태인 경우가 많다.
판다스를 활용해 우리가 원하는 형태로 가공하고
특정 데이터를 선별하는 과정을 연습해보자.

 

- 준비된 csv 데이터가 없다면 이전 글을 참고하자

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

 

1. 인덱스 구조 바꾸기

# 판다스를 pd로 임포트
import pandas as pd

# 저장해둔 csv 파일을 불러오기
pd.read_csv("multi_assets.csv")

결과 사진 (클릭시 확대)

결과 사진을 보니 형태가 이상하다.

이전에 우리가 불러왔던 것과 구조가 다르다.

행을 기준으로 봤을 때

첫째행과 둘째행이 제대로 멀티 인덱싱 되어 있지 않다.

특히, 티커 심볼이 첫 번째 행의 데이터로 입력되어있다.

아래처럼 바꿔보자.

 

# 맨 위 2개 행을 각 열의 헤더로 만들어 준다.
pd.read_csv("multi_assets.csv", header = [0, 1])

결과 사진 (클릭시 확대)

컬럼명은 정리가 된 것 같다.

그런데 가장 왼쪽 첫 번째 열을 보면

Date 날짜가 아니라 0부터 시작하는 숫자로 이루어져 있다.

우린 일일 데이터를 날짜 기준으로 다룰 것이기 때문에

Date 날짜가 인덱스가 되어야 한다.

아래처럼 바꿔보자.

 

# 날짜(Date)를 맨 처음 인덱스로 변경한다. (index_col)
# 문자열에서 날짜시간 자료형으로 변경한다. (parse_dates)
# df 변수에 담는다.
df = pd.read_csv("multi_assets.csv", header = [0,1], index_col = 0, parse_dates=[0])

df

결과 사진 (클릭시 확대)

이제 가장 왼쪽 첫 번째 열을 보면

제대로 처리가 된 것을 볼 수 있다.

df.info() 로 전체 구조를 살펴보자.

 

결과 사진 (클릭시 확대)

 

우리가 원했던 구조로 바뀌어있다.

빨간색 박스 부분을 보면 Datetime으로 Index가 되어있는 것도 확인할 수 있다.


2. 원하는 행과 열을 골라내기

2-1. 인덱스를 활용해 자산별 종가 데이터 가져오기

이제는 위에서 정리해둔 데이터를 가지고

특정 자산의 종가 데이터를 가져와보자.

 

 

# 테슬라 주식의 종가만 골라내기
df.Close.TSLA

# 결과
Date
2018-12-31     66.559998
2019-01-01           NaN
2019-01-02     62.023998
2019-01-03     60.071999
2019-01-04     63.537998
                 ...    
2022-07-27    824.460022
2022-07-28    842.700012
2022-07-29    891.450012
2022-07-30           NaN
2022-07-31           NaN
Name: TSLA, Length: 1309, dtype: float64​

 

df.Close 를 실행해보면 모든 티커 심벌들의 종가 정보를 볼 수 있다.

그리고 df.Close.TSLA 처럼 뒤에 티커 심볼을 붙이면

해당 자산의 종가 데이터만 가져올 수 있다.

 

여기까지 오기 위해 위에서 인덱스를 수정하는 작업을 했던 것이다.

 

동일한 작업을 loc 인덱서를 활용해 더 체계적으로 해보자.

 

# loc 인덱서를 활용해 테슬라 종가 데이터 가져오기
df.loc[:, ("Close","TSLA")]

# 결과
Date
2018-12-31     66.559998
2019-01-01           NaN
2019-01-02     62.023998
2019-01-03     60.071999
2019-01-04     63.537998
                 ...    
2022-07-27    824.460022
2022-07-28    842.700012
2022-07-29    891.450012
2022-07-30           NaN
2022-07-31           NaN
Name: (Close, TSLA), Length: 1309, dtype: float64

 

loc[ ]의 요소에서

첫 번째 : 표기로 전체 행을 가져왔다.

( ) 안에는 원하는 가격 정보와 티커 심볼을 지정했다.

 

주의할 점은 우리 데이터의 구조에서

가격 정보가 티커 심볼보다 바깥쪽 인덱스이다.

따라서 바깥쪽 인덱스(가격 종류)를 먼저 지정하고

안쪽 인덱스(티커 심볼)를 지정해야 접근할 수 있다.

 

위에선 : 로 지정했던 첫 번째 요소를 조작해

원하는 날짜나 기간 데이터만 가져올 수도 있다.

 

# 특정 날짜 골라내기
df.loc["2022-05-02"]

# 결과 : 모든 티커 심볼의 22년 5월 2일 데이터


# 특정 기간만큼 골라내기 
df.loc["2022-05"]

# 결과 : 모든 티커 심볼의 5월 한달치 데이터


# 특정 한달 동안의 비트코인 종가
df.loc["2022-04", ("Close","BTC-USD")]

# 결과 : 4월 한달간의 비트코인 종가 데이터


# 특정 기간 동안의 비트코인 종가
df.loc["2022-04":"2022-06", ("Close","BTC-USD")]

# 결과 : 4월에서 6월 두 달간 비트코인 종가 데이터

Date
2022-04-01   46281.6445
2022-04-02   45868.9492
2022-04-03   46453.5664
2022-04-04   46622.6758
2022-04-05   45555.9922
                ...    
2022-06-26   21027.2949
2022-06-27   20735.4785
2022-06-28   20280.6348
2022-06-29   20104.0234
2022-06-30   19784.7266
Name: (Close, BTC-USD), Length: 91, dtype: float64

 

이렇게 인덱스를 활용해 기간과 가격, 티커에 따른 데이터를 가져올 수 있다.

자료형과 인덱스에 대한 이해가 있다면 쉽게 다가올 것이다.

그런 배경지식이 없어도 파이썬 언어의 특성상

직관적으로 사용법을 파악하고 활용할 수 있다.

 

2-2. 멀티 인덱스 단계 순서 바꾸기

위에서 바깥쪽 인덱스, 안쪽 인덱스란 말을 언급했었다.

멀티 인덱스에는 일종의 단계가 있어서

데이터에 구체적으로 접근하기 위해선 그 단계를 따라야 했다.

 

df.Close.TSLA 로 테슬라의 종가 데이터를 가져왔었는데

그럼 df.TSLA 로 테슬라의 모든 가격 데이터를 가져올 수 있을까?

불가능하다. 에러가 발생한다.

멀티 인덱스를 사용하려면 우린 그 단계에 따라야 한다.

가격 종류가 아니라 티커를 기준으로 접근하고 싶다면

아래처럼 인덱스의 순서를 바꿔야 한다.

 

# 인덱스 단계 뒤바꾸기 -> 실행될때마다 바뀐다.
df = df.swaplevel(axis="columns").sort_index(axis="columns")

df.info()

결과 사진 일부 (클릭시 확대)

 

데이터의 구조 변화를 보면

컬럼명 내부가 앞뒤로 바뀐 것을 볼 수 있다.

전에는 가격 정보(시가, 종가, 최고가 등등)가 앞 쪽이었는데

지금은 티커 심볼이 앞쪽으로 왔다.

즉, 인덱스 단계가 뒤 바뀐 것이다.

 

여기서 주의할 점은 위 코드는 실행될 때마다 단계를 뒤바꾼다.

따라서 2번 실행되면 원래대로 돌아온다는 뜻이다.

 

그럼 이제 티커 심볼을 기준으로 데이터를 가져와 보자.

 

# 티커 심볼 기준으로 모든 데이터 가져오기
df.TSLA

# - 혹은 = 같은 특수문자가 포함된 경우
df["BTC-USD"]

# 인덱스 단계를 다시 원래대로 되돌리기
df = df.swaplevel(axis="columns").sort_index(axis="columns")

 

이제 가격 정보가 아니라 티커 심볼이

가장 바깥쪽 첫 번째 인덱스 단계이다.

BTC-USD 처럼 티커 심볼안에 특수문자 - 또는 = 이 있는 경우

df["BTC-USD"] 방식으로 접근할 수 있다.

 

일단 우리는 현재 자산의 종가에 관심이 있다.

따라서 원래대로 인덱스 단계를 되돌려 두었다.

 

2-3. 데이터 복사와 요약 통계

 

앞으로 판다스로 데이터를 다양하게 조작해 볼 텐데,

원본 데이터를 자꾸 건드리면

본인도 모르는 사이

데이터가 일부 삭제 혹은 수정되는 경우가 있다.

또는 원치 않는 구조로 변경돼서 번거로워질 가능성이 많다.

 

따라서 아래처럼 모든 자산의 종가 데이터를 복사(copy)해서

close 라는 변수에 담아서 사용하겠다.

# 모든 자산의 종가 데이터 복사하기
close = df.Close.copy()

 

이렇게 하면

close의 데이터는 df.Close 와 동일하다.

close를 수정해도 df 나 df.Close 는 원본 그대로 유지된다.

 

마지막으로 판다스의 요약 통계 기능을 알아보자.

 

# 요약 통계 보기
close.describe()

결과 사진 (클릭시 확대)

 

describe() 메서드를 활용해

간편하게 요약 통계 데이터를 볼 수 있다.

 

가장 왼쪽의 인덱스들을 보면

count는 손실되지 않은 값의 개수를 뜻한다.

이후 순서대로 평균, 표준편차, 최소 값, 백분위수, 최대 값을 의미한다.

 

백분위수는

값을 크기에 따라 순서대로 나열했을 때

백분율로 나타낸 특정 위치의 값을 의미한다.

따라서 50%에 해당하는 값이 중앙값이다.

데이터의 분포에 따라

평균만으로는 분석하기 어려운 상황에서 활용된다.


지금까지

저장한 데이터를 불러와서

구조를 바꾸거나 인덱스를 수정하고

특정 데이터에 접근하는 방법을 알아보았다.

 

하나씩 따라 해보는 것은 어렵지 않지만

판다스의 원리나 모든 문법을 다 파악하는 것은

현실적으로 어렵다.

지금은 모르고 이해가 안돼도 걱정하지 말자.

 

앞으로 계속해서 판다스를 활용해 데이터를 다룰 것이고,

어느 정도 수준만 되면 투자와 매매에 충분히 적용이 가능하다.

 

다음 글에서는

가져온 데이터를 가지고 시각화를 해보겠다.

댓글