삶의 공유
[금융데이터분석] 파이썬이용하여 코스피 대장주 찾기 Project(Final) 본문
주가데이터와 섹터 데이터연계하여 섹터별 등락률 구하기 및 코스피와 비교
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']])
- 추가로 여기서 통신업의 SK 텔레콤의 정보를 뺐다.
idx_list = newdf[newdf['code'] == '017670'].index # SK텔레콤 액면분할?로 금액 헌팅있어 제외함. 추후 다시 넣어야함.
: 이유는 누적 수익률 중에 400이 넘어 가는 수치가 있어서 봤더니, 해당 데이터가 이상했고, 네이버 금융을 통해 확인해보니 액면분할 한것 같았다. 그래서 해당 데이터는 제외 시켰다.
※ Data 확인
: 하기 노란색 음영 표시 영역을 보면 누적 수익률이 -432라는 말도 안되는 숫자가 나오는 것을 볼 수 있다.
※ 네이버 금융 확인
: 아래 빨간색 네모 박스 영역을 보면 종가 금액이 액면 분할 한것 처럼 바뀐 것을 볼 수 있다.
4) 코스피 데이터 가져오기
- 해당 내용은 이전에 한번 다뤘던 내용으로, 더 자세한 내용을 알고싶으면 하기 포스팅을 참고하면 좋을 것 같다.
https://wg-cy.tistory.com/91?category=1023254
- 전체적인 코드는 다음과 같다.
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의 한 영역으로 자리잡을 수 있는 데이터 여서 기분이 좋다.
앞으로 더 발전하는 사람이 되어야겠다
그럼 이만 줄이도록 하겠다.
'Data Scientist > Python' 카테고리의 다른 글
[Python활용]텍스트 마이닝 - 데이터 수집 (0) | 2022.01.02 |
---|---|
[Python기초] Numpy A to Z (0) | 2022.01.02 |
[금융데이터분석] 파이썬이용하여 코스피 대장주 찾기 Project-3(주가 DB저장) (0) | 2021.12.22 |
[금융데이터분석] 파이썬이용하여 코스피 대장주 찾기 Project-2(섹터 DB저장) (0) | 2021.12.12 |
[금융] 파이썬이용하여 코스피 대장주 찾기 Project-1(코스피편) (0) | 2021.12.08 |