Data Scientist/Python

[금융데이터분석] 파이썬이용하여 코스피 대장주 찾기 Project(Final)

dkrehd 2021. 12. 22. 18:17
728x90
반응형

주가데이터와 섹터 데이터연계하여 섹터별 등락률 구하기 및 코스피와 비교

1) MySQL에서 섹터 정보 불러오기(sector_info)

 - 앞서 저장한 MySQL DB에서 섹터 정보를 불러와보자, 전체 코드는 이렇다.

import pymysql
import pandas as pd
# MySQL에서 Investar DB에 접속
conn = pymysql.connect(host='localhost', user='root', passwd='여러분비번', db='여러분DB', charset='utf8')
sql = 'SELECT * FROM sector_info'
sector_table = pd.read_sql(sql, conn) # sector_info Table을 read_sql()함수로 읽는다.
sector_table

- 이렇게 잘 나오는 것을 알 수 있다.

- 설명은 앞 포스팅 내용과 많이 비슷해서 생략하도록 하겠다.

 

 

2) MySQL에서 주가 정보 불러오기(price_info)

 - 이것도 마찬가지로 DB에 저장되어 있는 price_info table을 MySQL에서 불러온다.

sql = 'SELECT * FROM price_info'
price_table = pd.read_sql(sql, conn) # sector_info Table을 read_sql()함수로 읽는다.
price_table

- 이렇게 잘 나오는 것을 볼 수 있다.

 

3) price_info table의 code를 기준으로 sector_infor의 code와 비교하여 sector 정보를 price_info의 컬럼을 추가하여 붙여 넣는다.

 

- 말이 조금 어렵긴 한데, 말 그대로 price_info table을 code 컬럼을 기준으로 해서 sector_infor code와 동일하면 해당 행에 sector값을 넣는다. 이 때 이 열을 sector 컬럼으로 넣는 것이다.

 

newdf = pd.merge(price_table, sector_table[['code','sector']])
idx_list = newdf[newdf['code'] == '017670'].index # SK텔레콤 액면분할?로 금액 헌팅있어 제외함. 추후 다시 넣어야함.
newdf = newdf.drop(idx_list) 
newdf

- merge 함수 내용을 보면 방법은 하기와 같이 구성되고, 개념은 말 그대로 데이터를 하기의 방법으로 합친다 라는 개념으로 이해하면된다.

newdf = pd.merge(price_table, sector_table[['code','sector']])

출처 : https://hyunyulhenry.github.io/quant_python/11_data_analysis.html

 

 

 

- 추가로 여기서 통신업의 SK 텔레콤의 정보를 뺐다.

idx_list = newdf[newdf['code'] == '017670'].index # SK텔레콤 액면분할?로 금액 헌팅있어 제외함. 추후 다시 넣어야함.

  : 이유는 누적 수익률 중에 400이 넘어 가는 수치가 있어서 봤더니, 해당 데이터가 이상했고, 네이버 금융을 통해 확인해보니 액면분할 한것 같았다. 그래서 해당 데이터는 제외 시켰다.

 

※ Data 확인

 : 하기 노란색 음영 표시 영역을 보면 누적 수익률이 -432라는 말도 안되는 숫자가 나오는 것을 볼 수 있다.

※ 네이버 금융 확인

 : 아래 빨간색 네모 박스 영역을 보면 종가 금액이 액면 분할 한것 처럼 바뀐 것을 볼 수 있다.

 

4) 코스피 데이터 가져오기

 

- 해당 내용은 이전에 한번 다뤘던 내용으로, 더 자세한 내용을 알고싶으면 하기 포스팅을 참고하면 좋을 것 같다.

 

https://wg-cy.tistory.com/91?category=1023254 

 

[금융] 파이썬이용하여 코스피 대장주 찾기 Project-1(코스피편)

파이썬이용하여 코스피 대장주 찾기 Project 궁극적으로는 내 뉴스 요약 블로그에 업로드 하기 위한 프로젝트로 시작해보려고 한다. 요약하자면 섹터별 대장주들의 일간 변동률과 코스피 변동

wg-cy.tistory.com

 

- 전체적인 코드는 다음과 같다.

from pandas_datareader import data  
from datetime import datetime, timedelta

today = datetime.today()                # 오늘 날짜 가져오기
start_date = today - timedelta(days=72) # 오늘 날짜 기준 30일 전 계산 하기
end_date = today                        # 오늘 날짜 기준으로  

# 두 가지의 방식
# 방법 1
kospi = data.DataReader("^KS11", "yahoo", start_date, end_date)  
# 데이터 값 실수. 소수점 1자리까지 표시
pd.options.display.float_format = '{:.1f}'.format
# 1) 일간 변동률 계산 (t.close - t.close.shift(1)) / t.close.shift(1) * 100
kospi['daily_change'] = (kospi['Adj Close'] - kospi['Adj Close'].shift(1)) / kospi['Adj Close'] * 100

# 2) 누적 합계 계산
kospi['cumsum'] = df['daily_change'].cumsum()
kospi.head()
kospi = df.dropna()
kospi = kospi.reset_index()
kospi = kospi[['Date','cumsum']]
kospi.columns = ['date','cumsum']
# kospi['date'] = pd.to_datetime(kospi['date'], format="%Y-%m-%d")
kospi['sector'] = 'KOSPI'

- 추가된 코드 몇가지만 설명하겠다.

  1) kospi dataframe에서 Date가 index로 되어있었는데 그거를 reset_index() 함수를 통해서 index를 없애고 컬럼으로 옮겼다

  2) kospi 여러 컬럼중에, 'Date', 'cumsum' 컬럼만 가져오겠다라는 뜻이다.

  3) 'Date', 'cumsum' 컬럼명을 'date', 'cumsum'으로 변경 하겠다 라는 의미다.

kospi = kospi.reset_index()
kospi = kospi[['Date','cumsum']]
kospi.columns = ['date','cumsum']

 

5) newdf dataframe에 kopi dataframe 붙여 넣기

  - 이거는 쉽다. merge는 컬럼으로 이어 붙이는 거라면 이번에는 concat 함수를 사용해서 열로 이어붙이는 것을 하면 된다.

newdf = pd.concat([newdf, kospi])
newdf['date'] = pd.to_datetime(newdf['date'], format="%Y-%m-%d")
newdf

- 자 결과가 잘 나온 것을 볼 수 있다.

 

6) 데이터 정리

 - 이제 이 데이터들을 엑셀의 피벗 테이블 처럼 구현을 할 것이다. 파이썬 코드로 엑셀의 피벗이 어떻게 구현하는지 상상하면서 보면 더 유의미한 공부를 할 수 있을 것이다.

pd.options.display.float_format = '{:.1f}'.format
pivot_table = pd.pivot_table(newdf, # 피벗할데이터 프레임
                            index = 'date', # 행 위치에 들어갈 컬럼
                            columns = 'sector', # 열 위치에 들어갈 열
                            values='cumsum', # 데이터로 사용할 열
                            aggfunc = 'mean') # 데이터 집계 합수
pivot_table

- 결과는 아래와 같이 잘 나오는 것을 볼 수 있다. 

- 쉽게 말하면 내가 데이터 프레임을 새로 만드는 것이라고 보면 된다. (아마 엑셀을 좀 다룰줄 아시면 더 쉽게 이해가 가능할 것같다)

- 위의 코드 주석과 아래 결과를 하나씩 비교해보면 보다 더 쉽게 이해가 갈 것 이다.

 

 

6) 데이터 시각화 해서 분석 하기

 - 자 이제 모든 데이터 정리는 끝났다, 지금까지 프로젝트1,2,3,4(일부)는 다 데이터를 시각화하기 위한 데이터 정제과정이라고 보면된다. 

 - 이제 이 정제된 데이터를 가지고 분석해서 어떤 유의미한 분석 및 인사이트를 얻을 수 있는지 확인해보자.

 - 코드는 다음과 같다. 

import matplotlib.pyplot as plt
from matplotlib import rc # matplot 관련 설정을 위해 rc도 import gksek.
import seaborn as sns
%matplotlib inline
 # 한글 글씨체 안깨지게 설정
rc('font', family='AppleGothic') # 애플에서 사용하는 ApleGothic 폰트 적용
plt.rcParams['axes.unicode_minus']=False
pivot_table.boxplot(figsize=(15, 6))
plt.xticks(rotation=90) # x축 회전

코드를 하나씩 살펴보자, 크게 어려운건 없다 사실.

- 맥북 환경의 주피터 노트북 파이썬을 쓰고 있다면, 아무 설정 없이 matplot 라이브러리를 사용하면 한글 글씨가 깨진다. 이거는 지원이 안되는 폰트를 사용하기 때문이다.

- 즉 그렇기 때문에 지원이 되는 폰트로 바꿔주는 과정을 거친다. (아래와 같이 !)

from matplotlib import rc # matplot 관련 설정을 위해 rc도 import 함수.
%matplotlib inline
 # 한글 글씨체 안깨지게 설정
rc('font', family='AppleGothic') # 애플에서 사용하는 ApleGothic 폰트 적용
plt.rcParams['axes.unicode_minus']=False

- 결과는 아래와 같이 그래프로 잘 표현 되는 것을 볼 수 있다.

 : 최근에 코스피 보다 상승세 타는 종목들은, 은행, 의료정밀 등으로 볼수 있다.

 

이렇게 대장주 찾기 라는 프로젝트를 스스로 계획하고 진행해보았다. 이렇게 마무리까지 할 수 있다는 것에 개인적으로 성취감을 느낄수 있어서 좋았고, 파이썬을 활용해서 여러 데이터 분석을 할수 있다는 자신감을 갖을 수 있어서 좋았다.

 

모든 주식은 하락없이 계속적인 상승이 없는 것 처럼 이렇게 순환하게 된다. 즉 반도체 섹터라 오른다고 하면 어느 다른 하나의 섹터는 떨어지게 되었있다. 또한 외부 경제 환경에 따라 상승되는 섹터도 다르다. 

 

이렇게 어느 섹터가 더 높게 올라가는지를 데이터로 분석하면서 주식투자에 접근을 하는 것도 좋은 방법인 것 같다. 앞으로 내 블로그 주식 포스팅에 dashoboard의 한 영역으로 자리잡을 수 있는 데이터 여서 기분이 좋다. 

 

앞으로 더 발전하는 사람이 되어야겠다 

 

그럼 이만 줄이도록 하겠다.

 

반응형