KRX 상장 종목 중 시가총액 상위 10개 종목 데이터를 수집하여 분석하고 시각화했다.
데이터 수집에 FinanceDataReader를 활용했다.
데이터 수집
우선 Anaconda Prompt에서 finance-datareader를 설치했다.
그 후 library import
import pandas as pd
import numpy as np
import FinanceDataReader as fdr
네이버 금융 페이지에서 pandas의 read_html로 상위 10개 종목을 가져오기
url = "https://finance.naver.com/sise/entryJongmok.naver?&page=1"
df_top10 = pd.read_html(url)[0].dropna()
df_top10
하지만 네이버 금융 페이지에서는 종목 코드 데이터가 없었다.
FinanceDataReader를 이용하여 KRX 전체 종목의 종목명과 종목코드를 수집했다.
df_krx = fdr.StockListing('KRX').loc[:, ['Name', 'Code']]
df_krx.shape
# 실행 결과
(2697, 2)
df_krx.head()
head()로 데이터를 확인해 보면
이렇게 종목명 순으로 정렬되어 있는 것을 확인할 수 있다.
하지만 2697개의 종목 중 시가총액 상위 10개 종목만 필요하다.
merge를 통해 해결하였다.
SQL의 left join과 개념이 유사하다.
df_10 = df_top10.merge(df_krx, left_on='종목별', right_on='Name')
df_10 = df_10.loc[:, ['Name', 'Code']]
df_10
merge 후 종목명과 종목코드만 추출했다.
FinanceDataReader의 DataReader 함수에 종목 코드를 입력하여 일별 시세를 수집할 수 있다.
fdr.DataReader('005930', start='2022')
2022년을 시작점으로 설정하였다.
삼성전자(005930)의 2022년부터 현재까지 OHLCVC가 수집되었다.
이제 이를 이용하여 top10 종목의 종가(Close)를 수집해보자.
item_list = [fdr.DataReader(code, start='2022')['Close'] for code in df_10['Code']]
item_list
item_list는 시가총액 순위별 종가가 들어있는 데이터프레임 리스트가 된다.
수집한 리스트를 pandas의 concat을 이용하여 데이터프레임 병합하고
모두 똑같이 Close로 되어 있는 column name을 각 종목명으로 바꾸어준다.
df = pd.concat(item_list, axis=1)
df.columns = df_10.loc[:, 'Name']
df
concat의 인자로 axis=1을 설정하여 컬럼 기준으로 병합했다.
이렇게 필요한 데이터를 성공적으로 수집했다.
데이터 분석, 시각화
시각화를 위한 설정
그래프에서 한글 폰트 사용을 위해 koreanize_matplotlib을 install하고 import했다.
import koreanize_matplotlib
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
그리고 스타일로는 fivethirtyeight을 설정했다.
여러 종목 시각화
df.plot(figsize=(10, 7), linewidth=3)
plt.legend(bbox_to_anchor=(1, 1));
top10 모든 종목의 종가 추세를 한 그래프에 표현한다.
그래프는 잘 그려졌으나 색상 구분이 어려워서 직관적이지 않다.
삼성전자, LG화학 시각화
df.loc[:, ['LG화학', '삼성전자']].plot(figsize=(12,7))
2개의 종목만 비교해보자.
삼성전자와 LG화학의 추세 구분은 확실히 됐으나 둘의 스케일 차이가 너무 커서 삼성전자의 변동은 확인하기 어렵다.
2축 그래프 그리기
df.loc[:, ['LG화학', '삼성전자']].plot(figsize=(15,7), secondary_y='삼성전자')
secondary_y를 이용하여 삼성전자의 y축을 오른쪽에 따로 표시할 수 있다.
두 종목 구별이 잘 되며 추세도 직관적으로 확인할 수 있게 되었다.
수익률 분석
종목마다 주가 스케일이 다르기 때문에 이를 일치시킨다.
첫날을 0으로 맞추고 상대적으로 상승 또는 하락 값을 구한다.
# 첫번째 날 가격으로 나머지 가격을 나눠주고 -1을 해주면 수익률을 구할 수 있다.
df_norm = (df / df.iloc[0, :]) - 1
# LG에너지솔루션은 첫날이 NaN이기 때문에 따로 구해서 덮어쓴다
df_norm['LG에너지솔루션'] = (df['LG에너지솔루션'] / df['LG에너지솔루션'].dropna().iloc[0]) - 1
df_norm
LG에너지솔루션은 2022년 첫 거래일에 아직 상장하지 않았기 때문에 상장일을 기준으로 계산해야한다.
LG에너지솔루션에 대한 처리를 따로 해주지 않았다면 LG에너지솔루션의 값은 모두 NaN이 되었을 것이다.
수익률 시각화
df_norm.plot(linewidth=2, figsize=(12, 6))
plt.axhline(0, color='red', linewidth=1, linestyle='--')
plt.legend(bbox_to_anchor=(1,1))
수익률 0 선에 빨간색 수평라인을 추가하였다.
legend의 bbox_to_anchor를 (1,1)로 하여 범례가 우상단에 표시된 것을 확인할 수 있다.
수평선을 추가해서 현 시점 수익률이 0이 넘는 종목이 LG화학, 삼성SDI, LG에너지솔루션임을 직관적으로 확인할 수 있다.
하지만 종목이 너무 많은 점이 단점이다.
3개의 종목만 조회하면 훨씬 보기 쉽다.
df_norm.iloc[:, :3].plot(linewidth=2, figsize=(12, 6));
삼성전자, LG에너지솔루션, SK하이닉스만 시각화한다.
세 종목의 비교가 직관적이며, LG에너지솔루션은 상장일부터 표시되는 것을 확인할 수 있다.
수익률 히스토그램
df_norm.hist(figsize=(12,10), edgecolor='black');
edgecolor 지정으로 막대가 명확히 표현된다.
수익률 분포를 히스토그램으로 시각화했다.
2022년부터에 전체적인 시가총액 상위종목 분위기가 좋지 않았던 것 같다.
시가총액 상위 10종목의 데이터를 다루고 시각화해봤다. 재미있다.
반복학습으로 내 것으로 만들어야겠다.
'AI SCHOOL > TIL' 카테고리의 다른 글
[DAY 28] SQL 데이터 집계하기 - ROLLUP, WINDOW FUNCTION (0) | 2023.02.03 |
---|---|
[DAY 27] Week 7 Insight Day 미니프로젝트2 시작, 수료생 특강 (0) | 2023.02.02 |
[DAY 25] 서울시 코로나19 EDA - crosstab, str.contains와 isin, 데이터 시각화 (0) | 2023.02.01 |
[DAY 24] 서울시 코로나19 발생동향 분석 - index 다루기, 데이터 요약, 기술통계, 파생변수, 시각화 (0) | 2023.01.31 |
[DAY 23] SQL 집합연산, 서브쿼리, WITH, CTE (0) | 2023.01.27 |
댓글