본문 바로가기

프로젝트/시각화

[Python] 시각화를 통해 가격대가 다른 두 주식 비교하기

오늘은 시각화를 통해 가격대가 다른 두 주식을 비교해보도록 하겠습니다.

 

밑에 코랩 링크를 통해 직접 구현해 보실 수 있습니다.

 

 

증권 데이터 수집하기


pip install finance-datareader

증권 데이터를 수집하기 위해 외장 라이브러리인 finance-datareader를 설치합니다.

 

import FinanceDataReader as fdr

설치한 finance-datareader를 가져옵니다.

 

finance-datareader는 판다스 데이터프레임의 기능을 가집니다.

 

# 삼성과 애플의 주가 데이터 수집
# 애플 첫 데이터가 1980-12-12, 삼성 첫 데이터가 1998-01-09이므로 시작일은 삼성 기준으로 맞춰줍니다.
samsung = fdr.DataReader("005930")
samsung_first_date = str(samsung.index[0])[:10]  # 삼성의 첫번째 데이터의 날짜, 추후 변동 가능
apple = fdr.DataReader("aapl", samsung_first_date)

삼성과 애플의 증권 데이터를 수집합니다.

 

DataReader.("티커", "시작일", "종료일") 순으로 입력해줍니다.

시작일이나 종료일은 입력하지 않아도 됩니다.

한국의 티커는 숫자로 되어있고, 미국의 티커는 알파벳으로 이루어져 있습니다.

 

애플과 삼성의 주가 데이터를 비교하기 위해 라이브러리에서 구현되는 삼성의 첫 데이터의 시작일인

1998-01-09로 애플의 데이터를 맞춰줍니다.

 

※ 2022년 3월 20일자 삼성의 첫 데이터 시작일이 1998-02-03으로 바뀌었습니다. 따라서 추후 또 변수의 값이 변할 것에 대비하여 "samsung_first_date" 변수를 추가하였습니다.

 

# 삼성의 주가 데이터
samsung

출력 결과

삼성의 주가 데이터입니다.

 

출력 결과는 판다스 데이터 프레임의 형식으로 나타나고 판다스의 메서드를 통해 분석을 하거나 출력할 수 있습니다.

 

# 결측치 확인
samsung_isna = samsung.isna().sum()
apple_isna = apple.isna().sum()

데이터 분석을 위해서 결측치를 남겨놓는 것은 좋지 않으니 결측치가 있는지 확인합니다.

 

"isna().sum()"을 통해 결측치의 개수를 확인합니다.

 

# 삼성 주가 데이터중 변동률에 결측치 한 개 확인
samsung_isna

출력 결과

삼성의 "Change"열에 결측치 한 개가 확인된 것을 알 수 있습니다.

 

삼성의 첫 데이터 시작일에서 변동률을 구할 수 없으므로 결측치가 생긴 것입니다.

 

# 결측치를 0으로 바꿔줍니다.
samsung = samsung.fillna(0)
samsung

앞서 말했다시피 결측치가 있을 경우 데이터 분석에 용이하지 않으므로 결측치를 0으로 바꿔줍니다.

 

결측치를 특정 숫자로 바꿔 줄 경우에는 결측치가 왜 생겼는지를 이해하고 그에 맞는 숫자로 넣어줘야 합니다.

 

이번 결측치는 삼성의 첫 데이터 시작일에서 생긴 것이므로 변동률을 0으로 가정하면 되기 때문에

결측치에 숫자 0을 넣어줍니다.

 

애플의 증권 데이터에는 결측치가 없으므로 넘어가도록 하겠습니다.

 

시각화를 통해 두 주식 비교하기


import matplotlib.pyplot as plt

시각화를 구현하기 위해 맷플롯립을 가져옵니다.

 

<안 좋은 예>

# 종가로 두 주식의 수익률 비교하기
# 두 주식의 단위가 다르기 때문에 부적절

plt.figure(figsize=(15,10))
plt.plot(samsung["Close"], label="SAMSUNG")
plt.plot(apple["Close"], label="APPLE")
plt.legend(fontsize=16)

plt.show()

출력 결과

단순히 종가로 두 주식을 비교해 보도록 합니다.

 

가로 15인치, 세로 10인치로 설정합니다.

 

삼성의 종가 데이터와 애플의 종가 데이터를 한 그래프에 비교합니다.

 

label은 legend를 구현하기 위해 입력해줍니다.

 

legend란 두 그래프를 비교하기 위해 이 그래프가 어떤 그래프인지 설명해줍니다.

왼쪽 위 사각형이 legend입니다.

legend의 fontsize를 16px로 지정해 줍니다.

 

"plt.show()"를 통해 그래프를 구현합니다.

 

구현 결과를 보니 삼성의 주가 그래프는 잘 나왔지만 애플의 주가 그래프는 일자로 된 것을 볼 수 있습니다.

 

이는 삼성의 주가 단위는 "원"인 것에 반해 애플의 주가 단위는 "달러"이기 때문에

두 주가의 가격대가 굉장히 큰 차이를 보이기 때문입니다. 

 

따라서 이런 경우에 종가로 두 주식을 비교하는 것은 적절하지 않습니다.

 

 

# 일간 변동률로 두 주식 비교하기
# 그래프가 너무 겹쳐보이고 주식의 추이를 알기 힘들기 때문에 부적절

apple.loc["2016-02-29"]["Change"] = -0.025 # fdr라이브러리 데이터 이상으로 데이터 수정하였습니다.

plt.figure(figsize=(15,10))
plt.plot(samsung["Change"], label="SAMSUNG")
plt.plot(apple["Change"], label="APPLE")
plt.legend(fontsize=16)

plt.show()

출력 결과

(애플의 일간 변동률에 이상이 발견되어 수정하였습니다.)

 

일간 변동률로 두 주식을 비교해보도록 합니다.

 

위 그래프는 두 그래프가 너무 겹쳐 보이고 두 주가의 추이를 알기 어렵기 때문에 부적절합니다.

 

<좋은 예>

# 누적곱으로 두 주식 비교하기
apple.loc["2016-02-29"]["Change"] = -0.025 # fdr라이브러리 데이터 이상으로 데이터 수정하였습니다.

sam_change_cp = ((samsung["Change"]+1).cumprod()-1)
aapl_change_cp = ((apple["Change"]+1).cumprod()-1)

plt.figure(figsize=(15,10))
plt.plot(sam_change_cp, label="SAMSUNG")
plt.plot(aapl_change_cp, label="APPLE")
plt.legend(fontsize=16)

plt.show()

출력 결과

일간 변동률의 누적곱을 사용하여 두 주식을 비교합니다.

 

누적곱이란 이전 데이터들을 모두 곱한 값을 말합니다.

 

단순히 일간 변동률로 누적곱을 구할 경우 일간 변동률이 0이 존재하는 경우에 그 이후의

데이터들은 모두 값이 0이 됩니다.

 

따라서 일간 변동률에 전부 1을 더한 뒤 누적곱을 구하고 나중에 1을 빼줍니다.

 

이제야 두 그래프를 비교하기 좋게 되었습니다.

 

# 지수화로 두 주식 비교하기
sam_exp = (samsung["Close"] / samsung["Close"][samsung_first_date])
aapl_exp = (apple["Close"] / apple["Close"][samsung_first_date])

plt.figure(figsize=(15,10))
plt.plot(sam_exp, label="SAMSUNG")
plt.plot(aapl_exp, label="APPLE")
plt.legend(fontsize=16)

plt.show()

출력 결과

지수화(indexation)를 사용하여 두 그래프를 비교합니다.

 

지수화란 기준이 되는 날짜의 데이터 대비 특정 날짜의 데이터를 구하는 방식입니다. 

 

삼성과 애플 모두 첫 날짜의 종가 데이터 대비 특정 날짜의 종가 데이터를 구해봅니다.

 

누적곱을 사용하여 구한 것과 비슷한 것을 알 수 있습니다.

 

그렇다면 누적곱을 사용한 그래프와 지수화를 사용한 그래프를 한번 비교해볼까요?

 

# 누적곱과 지수화 그래프 비교하기
sam_change_cp = ((samsung["Change"]+1).cumprod()-1)
sam_exp = (samsung["Close"] / samsung["Close"][samsung_first_date]) - 1

plt.figure(figsize=(15,10))
plt.plot(sam_change_cp, label="cumulative product")
plt.plot(sam_exp, "--", label="indexation")
plt.legend(fontsize=16)

plt.show()

출력 결과

삼성의 데이터를 통해 누적곱 그래프와 지수화 그래프를 비교해 보았습니다.

 

거의 일치하는 것을 알 수 있습니다.

 

두 데이터 간에 얼마간의 차이가 나는지 알아볼까요?

 

import pandas as pd

# 두 데이터의 오차 확인 (몇번째 소수 자릿값까지 일치하는지)
compare_df = pd.DataFrame({"CP": sam_change_cp, "INDEX": sam_exp})
i_list = [] # 소수 자릿값 리스트

for date, cp, index in compare_df.itertuples():
    for i in range(1, 15):
        if round(cp, i) != round(index, i): # i번째 소수까지 반올림
            i_list.append(i)
            print(i, date, cp, index) 

print(min(i_list)) # 소수 자릿값의 최소값

출력 결과

데이터가 너무 많아 위의 상당 부분을 잘랐습니다.

 

마지막 코드인 "print(min(i_list))"의 출력 결과가 10인 것은 소수 10번째 자리까지 반올림하니

두 데이터가 달라졌다는 뜻입니다.

 

따라서 소수 10번째까지는 두 데이터가 일치한다는 것을 알 수 있습니다.

 

아마 크롤링 대상 웹사이트의 변동률 계산 과정에서 약간의 오차가 생긴 것으로 보입니다.

 

하지만 소수 자리 10번째까지는 모두 일치하니 크게 신경 쓸 정도는 아닌 것 같습니다.

 

따라서 가격대가 다른 두 주식을 비교하는 경우 누적곱이나 지수화 중 자신이 편한 방법을

택하는 것이 좋을 것입니다.

 

 


이번 시간에는 시각화를 통해 가격대가 다른 두 주식을 비교해보았습니다.

 

가격대가 많이 차이 날 경우 그래프를 통해 비교하기가 어려우므로 누적곱이나 지수화 방법을

사용해주면 되겠습니다.

 

 

코랩 링크: https://colab.research.google.com/drive/1A6mH3Ov2mcyKa5ejUqF5SQ-J7XHIWQHn?usp=sharing

 

가격대가 다른 두 주식 비교하기(배포용).ipynb

Colaboratory notebook

colab.research.google.com