파이썬/NIPA 데이터분석 강의

NIPA 온라인 데이터분석 체험 특강 : 02 주식데이터 기초 / pandas

mcdn 2020. 9. 25. 02:23
반응형

 

 

 

주식데이터 예측하기/ 

주식에 관해 필요한 경제 관념 배우고 

우리가 만들? 분속해볼? 주가지수에 대해 알려준다. 

 

from datetime import datetime #날짜와 시간을 쉽게 조작할 수 있게 하는 클래스 제공
import pandas as pd

# csv 형태의 주식 데이터 파일을 불러오는 코드
df = pd.read_csv('stock.csv') 

# 데이터프레임 출력(데이터프레임은 (헹 X 열)로 이루어진 표 형태의 특수한 데이터 타입)
print(df)


# --- 주식 데이터 살펴보기 --- #

print('\n주식 데이터의 형태를 출력')
print(df.shape)

print('\n주식 데이터의 정보를 출력')
print(df.info)

print('\n주식 데이터의 데이터 타입을 출력')
print(df.dtypes)

print('\n주식 데이터의 상단 5개 행을 출력')
print(df.head())

print('\n주식 데이터의 하단 5개 행을 출력')
print(df.tail())

print('\n주식 데이터의 모든 열을 출력')
print(df.columns)

print('\n주식 데이터의 요약 통계 자료 출력')
print(df.describe())

 

print(df)는 전체 다 출력 

 

105 row x 7 columns 를 좌표로 찍어냄 

 

 

그냥 print(df)랑 다르게 위에 bound method  ~ 의 정보를 출력해준다 

 

 

print(df.dtypes)는 주식 데이터의 데이터 타입을 출력해준다! 열마다 어떤 타입인지 

 

 

 

각자 위의 행 5개 / 아래 행 5개를 출력한다 

 

columns는 데이터 열 정보를 다 나열해준다 

 

 

describe는 개수, 중간값 민 맥스 등 통계자료를 출력한다 

 

 

새롭게 추가된 이동평균값(MA)과 이격도값(disp)을 확인해보세요.
from datetime import datetime #날짜와 시간을 쉽게 조작할 수 있게 하는 클래스 제공
import pandas as pd
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
pd.set_option('display.max_columns', None)
elice_utils = EliceUtils()


# 주식 데이터 불러오기
df = pd.read_csv('stock.csv') 


# 수정 종가 이동평균(MA: Moving Average) 값 구하기
ma5 = df['Adj Close'].rolling(window=5).mean() # 수정 종가 5일 이동평균
ma20 = df['Adj Close'].rolling(window=20).mean() # 수정 종가 20일 이동평균
ma60 = df['Adj Close'].rolling(window=60).mean() # 수정 종가 60일 이동평균


# 이동평균 값 추가하기
df.insert(len(df.columns), "MA5", ma5) # 'MA5'라는 열 이름으로 ma5 값 추가
df.insert(len(df.columns), "MA20", ma20) # 'MA20'라는 열 이름으로 ma20 값 추가
df.insert(len(df.columns), "MA60", ma60) # 'MA60'라는 열 이름으로 ma60 값 추가


# 거래량 5일 이동평균 추가
vma5 = df['Volume'].rolling(window=5).mean() # 거래량의 5일 이동평균 구하기
df.insert(len(df.columns), "VMA5", vma5) # 'VMA5'라는 열 이름으로 vma5 값 추가


# --- 이격도 추가 --- #
# 수정 종가 데이터를 5일 이동평균 값으로 나눈 비율
disp5 = (df['Adj Close']/df['MA5'])*100

# 이격도 데이터를 'Disp5'라는 열 이름으로 추가
df.insert(len(df.columns), "Disp5", disp5) 



# 데이터 확인
print('이동평균 및 이격도가 추가된 주가 데이터')
print(df)

insert() 할때마다 MA5, MA20 MA60이 옆에 계속 추가된다. (화면은 짤린것)

 

각자 주가지수 수치를 계산하는 애들을 나타낸 것 

 

NaN은 mean을 계산하기 위한 일수가 부족해서 나타나는 숫자! 첫날은 그 전 데이터가 없으니까 당연히 NAn

 

 

 

시각화하기!

 

from datetime import datetime #날짜와 시간을 쉽게 조작할 수 있게 하는 클래스 제공
import pandas as pd
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
elice_utils = EliceUtils()


# 주식 데이터 불러오기
df = pd.read_csv('stock.csv') 
print('초기 데이터 확인')
print(df)


# 주식 데이터 전처리하기(이전 문제에서 실행했던 코드)
ma5 = df['Adj Close'].rolling(window=5).mean()
ma20 = df['Adj Close'].rolling(window=20).mean()
ma60 = df['Adj Close'].rolling(window=60).mean()

df.insert(len(df.columns), "MA5", ma5)
df.insert(len(df.columns), "MA20", ma20)
df.insert(len(df.columns), "MA60", ma60)

vma5 = df['Volume'].rolling(window=5).mean()
df.insert(len(df.columns), "VMA5", vma5)


# 이동평균선의 시각화
plt.plot(df.index, df['MA5'], label = "MA5") # 이동평균선 시각화
plt.plot(df.index, df['Adj Close'], label='Adj Close') # 수정 종가 시각화


# 시각화 옵션 코드
# (시각화 강의에서 별도로 다루는 내용입니다)
plt.legend(loc='best')
plt.xticks(rotation = 45)
plt.grid()
plt.savefig("plot.png")
elice_utils.send_image("plot.png")

임의로 내가 MA60도 추가해봤다 :D

 

저번 강의에서 추가된 시각화 옵션들 

하나씩 주석처리하고 고치면서 확인해봄 

 

첫번째 plt.legend(loc = center)의 경우 저 label들의 로케이션을 정해주는 함수 

loc = center 하면 그림처럼 가운데에, 원래 예시처럼 best면 가장 괜찮은 자리(오른쪽 아래)에 위치시켜준다 

 

두번째 plt.xticks(rotation = 45)는 아래 x좌표를 조금 tilt 회전 시켜주는 함수 

앞의 그림과 다르게 0 20 40 60 80 100 숫자들이 정방향으로 서있다! 

주석을 해제하면 45도 약간 기울게 된다 

 

세번째 grid함수 

앞의 그림과 다르게 뒤에 눈금선이 사라졌음을 확인할 수 있다 

 

 

아래 두 코드들은 터미널에 (출력창에) png를 보여주는데 필요한 코드들이다. 둘중 하나라도 주석처리하면 에러가 나거나 결과가 출력되지 않는다 

 

from datetime import datetime #날짜와 시간을 쉽게 조작할 수 있게 하는 클래스 제공
import pandas as pd
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
elice_utils = EliceUtils()



# 주식 데이터 불러오기
df = pd.read_csv('stock.csv') 
print('초기 데이터 확인')
print(df)


# 주식 데이터 전처리하기(이전 문제에서 실행했던 코드)
ma5 = df['Adj Close'].rolling(window=5).mean()
ma20 = df['Adj Close'].rolling(window=20).mean()
ma60 = df['Adj Close'].rolling(window=60).mean()

df.insert(len(df.columns), "MA5", ma5)
df.insert(len(df.columns), "MA20", ma20)
df.insert(len(df.columns), "MA60", ma60)

vma5 = df['Volume'].rolling(window=5).mean()
df.insert(len(df.columns), "VMA5", vma5)


# 이동평균선 시각화
plt.plot(df['Adj Close'], label="Adj Close") # 수정 종가
plt.plot(df['MA5'], label="MA5") # 종가 5일 이동평균
plt.plot(df['MA20'], label="MA20") # 종가 20일 이동평균
plt.plot(df['MA60'], label="MA60") # 종가 60일 이동평균


# 시각화 옵션 코드
# (시각화 강의에서 별도로 다루는 내용입니다)
plt.legend(loc='best')
plt.grid()
plt.savefig("plot.png")
elice_utils.send_image("plot.png")

다음강의는 응용 MA20 MA60 모두 추가했다 

 

from datetime import datetime #날짜와 시간을 쉽게 조작할 수 있게 하는 클래스 제공
import pandas as pd
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
elice_utils = EliceUtils()
pd.set_option('display.max_columns', None)



# 주식 데이터 불러오기
df = pd.read_csv('stock.csv') 
    

# 당일 종가가 아니라 다음 날 종가를 새로운 컬럼으로 추가하기
# shift(-1) 옵션을 사용하여 데이터를 하루씩 밀어서 삽입
df['tomorrow Adj Close']= df['Adj Close'].shift(-1)


# 주가 변동 및 변동률(%) 추가하기 - 기대 수익률 계산 가능
df['Fluctuation'] = df['tomorrow Adj Close'] - df['Adj Close'] # 주가 변동 데이터(다음날 종가 - 오늘 종가)
df['Fluctuation Rate'] = df['Fluctuation'] / df['Adj Close'] # 주가 변동률 데이터(변동 / 오늘 종가)


# 데이터 보기
print(df)

주가변동데이터 주가 변동률 데이터 계산하기가 추가되었다!

 

tomorrow adj close는 그냥 하루+1 값을 그날 줄에 넣어서 계산할 수 있게 도와주는 줄이다 (0번줄의 55400은 1번날의 종가다)

 

fluctuation 는 다음날 종가 - 현재 종가로 단순한 변동 수치고 

 

fluctuation rate는 fluctuation즉 변화값을 현재 종가로 나눈 것! 

 

 

변동률 시각화하기
from datetime import datetime #날짜와 시간을 쉽게 조작할 수 있게 하는 클래스 제공
import pandas as pd
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
elice_utils = EliceUtils()


# 주식 데이터 불러오기
df = pd.read_csv('stock.csv') 
print('초기 데이터 확인')
print(df)


# 주식 데이터 전처리하기(이전 문제에서 실행했던 코드)
df['tomorrow Adj Close']= df['Adj Close'].shift(-1) # 당일 종가가 아니라 다음 날 종가를 새로운 컬럼으로 추가하기
df['Fluctuation']= df['tomorrow Adj Close'] - df['Adj Close'] # 주가 변동 데이터(다음날 종가 - 오늘 종가)
df['Fluctuation Rate']= df['Fluctuation']/df['Adj Close'] # 주가 변동률 데이터(변동 / 오늘 종가)


# 변동률의 시각화
plt.figure(figsize=(12,8)) # 표현할 그래프의 크기 설정
plt.plot(df.index, df['Fluctuation Rate']) # 변동률 데이터 시각화
plt.axhline( y = 0, color = 'red', ls = '--') # 변동률 폭을 관찰하기 위한 기준 수평선 추가


# 시각화 옵션 코드
# (시각화 강의에서 별도로 다루는 내용입니다)
plt.legend(loc='best')
plt.grid()
plt.savefig("plot.png")
elice_utils.send_image("plot.png")

 

앞에서 구했던 fluctuation rate을 그래프로 나타낸다!

 

우선 plt.figure(figsize(12.8)) 이건 그래프 png자체 크기를 결정하는듯 

위의 그림은 10,5로 숫자를 바꾼 건데 굉장히 작아짐!

 

다음으로 axhline -- 부분을 없앴더니 그냥 일자선이 됨. axhiline은 저 임의 중간선을 그릴 수 있는 툴!

 

 

시각화 옵션은 아까랑 크게 다르지 않아서 패스!

 

 

from datetime import datetime #날짜와 시간을 쉽게 조작할 수 있게 하는 클래스 제공
import pandas as pd
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
elice_utils = EliceUtils()



# 주식 데이터 불러오기
df = pd.read_csv('stock.csv') 
print('초기 데이터 확인')
print(df)


# 주식 데이터 전처리하기(이전 문제에서 실행했던 코드)
df['tomorrow Adj Close']= df['Adj Close'].shift(-1) # 당일 종가가 아니라 다음 날 종가를 새로운 컬럼으로 추가하기
df['Fluctuation']= df['tomorrow Adj Close'] - df['Adj Close'] # 주가 변동 데이터(다음날 종가 - 오늘 종가)
df['Fluctuation Rate']= df['Fluctuation']/df['Adj Close'] # 주가 변동률 데이터(변동 / 오늘 종가)


# 히스토그램을 이용해 분포 살펴보기
df['Fluctuation Rate'].plot.hist()
plt.title('Fluctuation Rate Histogram')


# 현재까지 그려진 그래프를 보여줌
plt.savefig("plot.png")
elice_utils.send_image("plot.png")
plt.cla() #그래프를 그린 후 초기화


# 커널 밀도함수를 이용해 분포 살펴보기
df['Fluctuation Rate'].plot.kde()
plt.title('Fluctuation Rate KDE plot')


# 현재까지 그려진 그래프를 보여줌
plt.savefig("plot.png")
elice_utils.send_image("plot.png")

와! 히스토그램! 

plot.hist()은 히스토그램을 그리는 함수다 

title()을 통해 제목도 지어줄 수 있다. 

savefig / sendimage는 아까와 같고 cla는 잘 모르겠다.. 

 

kde를 사용하면 커널 밀도함수를 그릴 수 있다 

커널을 왜 이용하나 찾아보니 

끊어지는 히스토그램에 비해 KDE 커널 밀도함수는 자연스러운 곡선 형태를 보여주기 때문에 그 사이 밀도(값)을 추정하는데 도움을 준다고 한다 

 

니파 설명

봉차트
from datetime import datetime
import pandas as pd
import matplotlib.pyplot as plt
import mplfinance as mpf
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker 
import matplotlib.dates as mdates
import numpy as np
from elice_utils import EliceUtils
elice_utils = EliceUtils()


# 주식 데이터 불러오기
df = pd.read_csv('stock.csv', index_col = 0, parse_dates = True) 
df2 = pd.read_csv('stock.csv', index_col = 0, parse_dates = True) 

print('주가 데이터 출력')
print(df)


# mplfinance 라이브러리를 사용하면 캔들 차트를 간편하게 시각화할 수 있습니다.
mc = mpf.make_marketcolors(up='r',down='b')
s  = mpf.make_mpf_style(marketcolors=mc)
mpf.plot(df, type='candle', figscale=1.2, style=s)


# 시각화 함수
plt.savefig("plot.png")
elice_utils.send_image("plot.png")

더 추가된 라이브러리 중 mplfinance는 봉차트를 그리는데 사용된다 

mplfinance as mpf라고 해서 mpf라고 줄여 쓸 수 있다!!!! 와! 

mpf.make_marketcolors라는 함수는 색깔을 골라준다 

mpf_style을 추석처리해보면 

이렇게 되는데 아마 저런 색깔이 살아있는 화이트 백그라운드를 골라주는 스타일이 내장되어 있어 가져올 수 있는 것 같다!

나머지는 출력하는데 필요한 함수들이어서 또 건너뒤끼 

 

이렇게 주식데이터 이해 분석 끝!

 

 

반응형