본문 바로가기

DB엔지니어가 공부하는 python

네이버 주식 일자별 매매동향 정보 파이썬 데이터 분석(2)

네이버 주식 일자별 매매동향 정보 파이썬 데이터 분석(2)

네이버 주식 일자별 매매동향 정보 파이썬 데이터 분석(2)

 

안녕하세요.

지난번 네이버 주식 일자별 매매동향 정보 파이썬으로 한번에 가지고 오기(1)편에 이어서 가지고온 데이터를 이용해서 데이터 분석을 하는 과정을 포스트 해보도록 하겠습니다.

 

##지난편 보러가기##

2020/09/22 - [DB엔지니어가 공부하는 python] - 네이버 주식 일자별 매매동향 정보 파이썬으로 한번에 가지고 오기(1)

 

네이버 주식 일자별 매매동향 정보 파이썬으로 한번에 가지고 오기(1)

네이버 주식 일자별 매매동향 정보 파이썬으로 한번에 가지고 오기(1) 안녕하세요. 요즘 다들 주식들 많이 하시나요? 저도 주식을 조금씩 공부 하고 있습니다. 주식에 대해서 잘 모르시는 분들이

stricky.tistory.com

위 내용을 아직 안보셨으면, 보고 오시면 이해하는데 더 도움이 되실것 같습니다.

이어지는 내용이다보니 꼭 지난편을 보시고 이번편을 봐주시길 바랍니다.

 

우선, 지난번에 아래 그림과 같이 데이터를 수집 하는것 까지 완료를 했습니다.

지난편에서 쓰인 코드를 그대로 가지고 와서 아래에 이어서 진행 하시면 되겠습니다.

네이버 주식 일자별 매매동향 정보 파이썬 데이터 분석(2)

여기서 부터 출발을 해보도록 할께요!

 

데이터 헤더 정리

분석적에 우선 Dataframe내 헤더를 정리 하고 가겠습니다.

데이터 헤더 정리1

위 두 그림을 Dataframe의 헤더가 두줄로 되어 있는걸 볼 수 있습니다.
위에 한줄을 없애겠습니다. 그래야 좀 보기가 좋겠죠. 헤더 레벨을 정리하는 코드는 아래와 같습니다.

df.columns = df.columns.droplevel() # 2레벨로 되어 있는 헤더를 하나로 낮추는 방법

2단계로 되어 있는 헤더를 하나의 단계로 다운시켰더니 아래와 같이 출력 되는 것을 확인 할 수 있습니다.

데이터 헤더 정리2

자, 이렇게 정리가 되었다면, matplotlib 라이브러리를 이용해서 그래프를 그려줄것 입니다.

1편에서 초반에 언급했던것 처럼 과연 개인투자자들과 외국인투자자, 그리고 마지막으로 기관계 투자자들 사이의 상관 관계가 있는지, 있다면 그 상관관계를 그래프를 통해서 살펴보도록 하겠습니다.

 

 

 

그래프를 그리기 앞서 그래프를 그려줄 matplotlib 라이브러리와 그래프를 그릴때 폰트를 설정하여 한글이 깨져 보이지 않도록 하는 코드를 작성 하겠습니다.

# matplotlib 라이브러리 추가
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 한글 폰트 셋팅
fm.get_fontconfig_fonts()
font_location = 'D:/NanumGothicLight.ttf'
font_name = fm.FontProperties(fname=font_location).get_name()
plt.rc('font', family=font_name)
plt.rcParams['axes.unicode_minus'] = False

이렇게 그래프를 그리기 위한 라이브러리를 추가 하고 한글 폰트를 셋팅 했습니다.

그리고, 진짜 그래프를 그리는 코드를 작성 해야겠죠?

그래프를 그리는 코드는 아주 간단합니다.

sns.regplot(x='개인', y='외국인', data=df)
plt.show() # 그래프 그리기

sns.regplot(x='개인', y='기관계', data=df)
plt.show() # 그래프 그리기

sns.regplot(x='외국인', y='기관계', data=df)
plt.show() # 그래프 그리기

위와 같은 코드를 작성을 했는데, 첫번째 라인을 보면 x축에 개인, y축에 외국인이라고 df에 있는 컬럼명을 입력했죠. data는 df를 써라 라고 지정을 했구요.

 

그리고 전 vscode에서 작성했기때문에 plt.show() 함수를 통해서 직접 그래프를 보여달라고 요청 해야 합니다. 

그럼 아래와 같이 3개의 그래프가 나오게 됩니다.

투자성향 비교 그래프1
투자성향 비교 그래프2

 

 

 

투자성향 비교 그래프3

위와 같이 각각 케이스 별로 그래프가 따로 보이는것을 확인 했습니다.

그러고 보니 위 3개의 그래프를 한번에 보여주면 더 좋을것 같습니다.

3개를 옆으로 나란히 보이도록 그래프를 보여주는 코드를 작성 해보겠습니다.

# 연달아 그리기
fig, axes = plt.subplots(ncols=3) # 3개를 가로로 나열 하겠다는 의미
fig.set_size_inches(15, 5)

import itertools as it

for ax, comb in zip(axes, it.combinations(['개인','외국인','기관계'], 2)):
    sns.regplot(x=comb[0], y=comb[1], data=df, ax=ax)
fig.tight_layout()

plt.show() # 그래프 그리기

그래프를 연달아 그리기 위해서는 matplotlib.pyplot 라이브러리 내 subplots 라는 라이브러리를 사용해야 합니다.

그 뒤에 붙어있는 ncols는 나열할 그래프의 수를 의미하구요.

 

중간에 itertools를 import 했는데, 이건 개인, 외국인, 기관계 이렇게 3개의 컬럼을 우리가 비교 할 예정이잖아요? 그 사이에서 나올수 있는 모든 경우의 수를 다 불러오는것 입니다.

개인-외국인, 개인-기관계, 외국인-기관계 이렇게 세쌍을 다 비교하겠다는거죠. 그런 모든 경우의 수를 만들어주는 라이브러리 입니다.

 

이걸 이용해서 3개의 그래프를 모두나타나게해서 코드를 실행하면 아래와 같이 그래프가 나타날 것 입니다.

투자자별 주식 매매 동향 그래프

이렇게 그래프가 잘 그려졌습니다.

 

 

 

투자자별 매매동향 분석

제가 투자자별 매매동향 분석이라고 거창하게 썼지만, 전 그저 데이터를 가지고 와서 그래프를 그렸을뿐이구요. 뭐 나름대로 분석을 하자면, 위에서 개인과 외국인을 비교한 첫번째 그래프를 보도록 하겠습니다.

 

그래프를 보면 좌상에서 우하로 대각선으로 선이 그려지는것을 볼 수 있죠. 이런 형태의 그래프가 그려진다는건 개인이 살때는 외국인 투자자들이 팔고, 외국인 투자자들이 살때는 개인투자자들이 판다는 의미 입니다. 그렇게 보면 개인과 기관과도 비슷한 동향을 보이는것으로 보입니다.

 

마지막 그래프는 외국인과 기관계를 비교 한것 인데, 이건 동그랗게 퍼져있는걸 봤을때는 서로 그때그때 상관관계가 다르다라고 해석 할 수 있겠죠.

 

이렇게 허접한 데이터 의미 분석까지 해봤습니다.

 

최종 코드 리뷰

이번 실습에서는 requests, BytesIO, pandas, seaborn, tqdm,matplotlib, itertools 이렇게 라이브러리들을 사용해 봤습니다.

 

tqdm의 경우 코드가 실행될때 프로그래스바를 보여줘서 뭔가 답답함이 없었던것 같구요. itertools는 여기서는 간단하게 이용했지만, 복잡한 관계들을 분석할때는 앞으로 잘 쓸수 있을것 같았습니다. 전반적으로 많이 배울 수 있었던 실습 이었습니다. 여러분들도 한번 잘 따라 해보시면서 실력이 조금이라도 향상 되셨길 바랍니다.

 

감사합니다.

 

최종코드 공유 합니다.

 

 

 

import requests
from io import BytesIO
import pandas as pd
import seaborn as sns
from tqdm import tqdm

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 네이버 금융 일자별 순매수 정보 자동저장 프로그램

# 네이버 금융 일자별 순매수 url 저장
page = 1
url = "https://finance.naver.com/sise/investorDealTrendDay.nhn?bizdate=20201125&sosok=&page={0}".format(page)
resp = requests.get(url)
html = BytesIO(resp.content)
df = pd.read_html(html)[0]

# 컬럼정보만 저장 하기
cols = df.columns
df = pd.DataFrame(columns = cols)


# 반복문을 통해서 전체 데이터 불러와서 df와 합치기
for page in tqdm(range(1, 20)): # tqdm은 반복문의 progress bar를 보기 위한 라이브러리
    url = "https://finance.naver.com/sise/investorDealTrendDay.nhn?bizdate=20201125&sosok=&page={0}".format(page)
    resp = requests.get(url)
    html = BytesIO(resp.content)
    df_single = pd.read_html(html)[0]
    df = pd.concat([df, df_single])
    
df = df.dropna() # NaN으로 저장된 데이터들 삭제
df = df.reset_index(drop=True) # 일정하지 않은 인덱스 번호를 재 정의

# 2일차 시작
df.columns = df.columns.droplevel() # 2레벨로 되어 있는 헤더를 하나로 낮추는 방법

# 폰트 셋팅
fm.get_fontconfig_fonts()
font_location = 'D:/NanumGothicLight.ttf'
font_name = fm.FontProperties(fname=font_location).get_name()
plt.rc('font', family=font_name)
plt.rcParams['axes.unicode_minus'] = False


sns.regplot(x='개인', y='외국인', data=df)
plt.show() # 그래프 그리기

sns.regplot(x='개인', y='기관계', data=df)
plt.show() # 그래프 그리기

sns.regplot(x='외국인', y='기관계', data=df)
plt.show() # 그래프 그리기

# 연달아 그리기
fig, axes = plt.subplots(ncols=3) # 3개를 가로로 나열 하겠다는 의미
fig.set_size_inches(15, 5)

import itertools as it

for ax, comb in zip(axes, it.combinations(['개인','외국인','기관계'], 2)):
    sns.regplot(x=comb[0], y=comb[1], data=df, ax=ax)
fig.tight_layout()

plt.show() # 그래프 그리기



 

 

 

by.sTricky