2018~2023 FinanceData.KR
구글 Colab (혹은 우분투 리눅스)의 경우 별도의 한글 폰트 설치가 필요합니다. matplotlib에서 모든 FFT(True Type Font)를 가져다 사용할 수 있습니다.
여기서는 명령라인에서 폰트를 가져다 설치합니다.
matplotlib 전역 환경을 파라미터들을 설정해 줍니다. 차트 이미지의 크기, 폰트, 라인 속성 등을 지정할 수 있습니다.
한글 폰트 설치
아래 셀을 실행하고, 런타임 재시작 (메뉴의 "런타임 / 런타임 다시 시작...") 후 다시 한번 아래 셀을 실행합니다.
'한글 테스트' 가 표시되면 성공한 것입니다.
# 한글 폰트 설치와 폰트 캐시 재설정
!apt-get install -y -qq fonts-nanum
!rm -rf ~/.cache/matplotlib/*
# matplotlib 설정
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = 'NanumBarunGothic'
plt.rcParams["axes.grid"] = True
plt.rcParams["figure.figsize"] = (10,3)
plt.rcParams["axes.formatter.useoffset"] = False
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams["axes.formatter.limits"] = -10000, 10000
plt.title('한글 테스트')
Text(0.5, 1.0, '한글 테스트')
다음과 같이 단 한 줄의 명령으로 데이터를 가져올 수 있습니다.
!git clone "https://github.com/FinanceData/marcap.git" marcap
fatal: destination path 'marcap' already exists and is not an empty directory.
from marcap import marcap_data
df_marcap = marcap_data('1995-05-02', '2023-05-15')
df_marcap
len(df_marcap)
숫자가 커서 과학적 표기법(10의 승수로 표현)으로 표시되면 오히려 읽기 좋지 않은 경우가 있습니다.
pandas에서 수치값을 출력할 때 과학적 표기법을 사용하지 않고, 소수점 이하 몇 자리 출력할 것인지를 정해줍니다.
import pandas as pd
pd.options.display.float_format = '{:.1f}'.format
!pip install -q finance-datareader
다음과 같이 간편하게 전체종목 코드와 섹터 데이터를 가져올 수 있습니다. 전체종목 목록을 "종목마스터"(df_master)라고 부르겠습니다.
import FinanceDataReader as fdr
df_master = fdr.StockListing('KRX')
df_master.head(10)
len(df_master)
ETF 혹은 우선주에는 Sector 값이 지정되어 있지 않습니다. 따라서 Sector 가 지정된(즉, NaN이 아닌) 종목만 추출합니다.
df_master = df_master.dropna(subset=['Sector'])
df_master
다음 두 데이터를 종목코드를 기준으로 병합합니다.
시가총액 데이터(df_marcap)에서 종목코드(Code), 종목명(Name), 시가총액(Marcap) 데이터만 사용하고, 이후 날짜를 사용하기 위해 인덱스를 풀어(reset_index)줍니다.
df_marcap[['Code', 'Name', 'Marcap']].reset_index()
"종목마스터"(df_master)에서 종목코드(Symbol)와 섹터(Sector) 데이터만 활용합니다.
df_master[['Symbol', 'Sector']]
종목코드를 기준으로 시가총액 데이터(df_marcap)와 종목마스터(df_master)를 병합 합니다. 개별 종목에 Sector를 지정하기 위함입니다.
df = pd.merge(df_marcap[['Code', 'Name', 'Marcap']].reset_index(), df_master[['Symbol', 'Sector']], left_on='Code', right_on="Symbol")
df
피벗하여 날짜별(로우), 섹터(컬럼) 시가총액 합계를 구합니다.
marcap_sector = pd.pivot_table(df, index='Date', columns='Sector', values='Marcap', aggfunc='sum')
marcap_sector
marcap_sector.columns
marcap_sector.loc['2021-01-15'] # 특정한 날짜의 섹터별 시가총액
특정한 날짜의 섹터별 시가총액을 소트하여 TOP 10을 구합니다
pd.DataFrame(marcap_sector.loc['2021-01-15'].sort_values(ascending=False)).head(10)
cols = pd.DataFrame(marcap_sector.loc['2021-01-15'].sort_values(ascending=False)).head(10).index
cols
marcap_sector[cols].plot(figsize=(14,8))
펜데믹을 중심으로 2020년 이후 TOP10 섹터를 살펴봅니다.
marcap_sector.loc['2020':, cols].plot(figsize=(16,8))
'통신 및 방송 장비 제조업' 섹터의 시가총액이 다른 섹터에 비해 압도적으로 크고 또 가파르게 성장하는 것을 확인할 수 있습니다.
TOP 10을 산출합니다.
marcap_sector_count = pd.pivot_table(df, index='Date', columns='Sector', values='Marcap', aggfunc='count')
marcap_sector_count[cols]
marcap_sector_count[cols].plot(figsize=(16,8))
marcap_sector_count.loc['2021-01-15']
count_top10 = marcap_sector_count.loc['2021-01-15'].sort_values(ascending=False)[:10]
count_top10
특정 날짜(2021-01-15)기준으로 가장 많은 종목은 '특수 목적용 기계 제조업', '소프트웨어 개발 및 공급업', '전자부품 제조업' 순이네요.
섹터별 종목수 TOP 10을 파이차트로 표현해 봅니다.
count_top10.plot.pie(figsize=(8, 8))
시가총액(marcap) 데이터셋은 26년간 개별 종목의 가격 등 다양한 데이터를 포함하고 있습니다.
특정 분야의 종목의 시총을 일자별로 합산하면 특정 영역의 혹은 특정 산업의 트렌드를 분석하는데도 요긴하게 사용할 수 있으며, 산업의 규모나 트렌드 분석하는데도 사용할 수 있습니다.