시리즈
삼성전자 주식데이터를 분석하고 예측한다.
1. 삼성전자 주식 데이터 분석 - 분석하기
2. 삼성전자 주식 데이터 분석 - 예측하기(MLP 모델) => sosoeasy.tistory.com/333
2. 삼성전자 주식 데이터 분석 - 예측하기(lstm, rnn 모델) => sosoeasy.tistory.com/334
1. 필요 라이브러리 다운로드
# 데이터를 가져와 편리하게 다룰 수 있도록 PANDAS 패키지를 설치
!pip install pandas_datareader
# 필요한 라이브러리 다운로드
from datetime import datetime
import pandas_datareader.data as wb
2. 데이터 불러오기
# 시작날짜와 종료날짜 정하기
start = datetime(2010,11,1)
end = datetime(2020,1,30)
# 주식 종목마다 코드가 다르다. 삼성전자의 코드는 005930
df = wb.DataReader('005930.KS','yahoo',start,end)
df
3. 데이터확인
(1) att확인
df.columns
(High, Low, Open, Close, Volume, Adj Close) -> (고가, 저가, 시가, 종가, 거래량, 수정 종가)
(2) att별 type확인
df.dtypes
(3) describe() 메소드로 기본정보 확인
컬럼별로 데이터의 개수(count), 데이터의 평균값(mean), 표준 편차(std), 최솟값(min), 4분위수(25%, 50%, 75%), 그리고 최댓값(max)들의 정보를 알 수 있음.
4. 이동평균선 계산해서 att추가하기
x-N일부터 x일 까지의 평균을 "x일의 N일 이동평균선이라고 한다" 이동평균선은 주식값 예측에 중요한 역할을 한다고 한다.
단기이동평균선이 장기이동평균선을 넘으면 "골든크로스"라고 한다 (=> 최근 주식값이 예전꺼보다 높다 -> 주식이 오르고 있다)
반대로 장기이동평균선이 단기이동평균선을 넘으면 "데드크로스"라고 한다 (=> 최근 주식값이 예전꺼보다 낲다 -> 주식이 떨이지고 있다)
다음과 같이 계산하고 att에 추가할 수 있다.
(1) 종가를 이용한 이동평균선 계산, 추가
# maN : N일전부터 현재까지의 수정종가 평균
ma5 = df['Adj Close'].rolling(window=5).mean()
ma20 = df['Adj Close'].rolling(window=20).mean()
ma60 = df['Adj Close'].rolling(window=60).mean()
ma120 = df['Adj Close'].rolling(window=120).mean()
#새로운 데이터를 삽입하는 코드
df.insert(len(df.columns), "MA5", ma5)
df.insert(len(df.columns), "MA20", ma20)
df.insert(len(df.columns), "MA60", ma60)
df.insert(len(df.columns), "MA120", ma120)
(2) 거래량을 이용한 이동평균선 계산, 추가
(3) 추가된 데이터 확인
5. 이동평균선 그래프로 그리기
(1) 5일 이동평균선
#이동평균값 plot 그리기
plt.plot(df.index,df['MA5'], label="MA5")
plt.legend(loc='best') #라벨 위치 설정
plt.xticks(rotation=45) #x축 좌표각도
plt.grid() #격자
plt.show() #현재까지 그려진 그래프 보여주기
(2) 모든 이동평균선
#차트에 표현할 요소 설정
plt.plot(df['Adj Close'], label="Adj Close")
plt.plot(df['MA5'], label="MA5")
plt.plot(df['MA20'], label="MA20")
plt.plot(df['MA60'], label="MA60")
plt.plot(df['MA120'], label="MA120")
#'best'를 인자로 주어 가장 적절한 자리에 위치하게 함
plt.legend(loc='best')
#격자 그리기
plt.grid()
plt.show()
6. 주가변동율 추가 및 시각화
(1) 변동율 추가
# x일 행에 x+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']
df
(2) 시각화
plt.figure(figsize=(12,8))
plt.plot(df.index,df['Fluctuation Rate'], color = 'lightblue')
plt.axhline( y = 0, color = 'red', ls = '--') #기준선추가
plt.show()
7. 변화율의 히스토그램과 커널 밀도함수
(1) 히스토그램
# 히스토그램
df['Fluctuation Rate'].plot.hist()
plt.title('Fluctuation Rate Histogram')
(2) 커널 밀도함수
#커널 밀도함수
df['Fluctuation Rate'].plot.kde()
plt.title('Fluctuation Rate Histogram')
8. 봉차트 그리기
(1) 라이브러리 다운
!pip install https://github.com/matplotlib/mpl_finance/archive/master.zip
(2) 라이브러리 import
from mpl_finance import candlestick2_ohlc
import matplotlib.pyplot as plt
#matplotlib에서 x축과 y축에 표시되는 값을 ticker라 함
import matplotlib.ticker as ticker
import matplotlib.dates as mdates
import numpy as np
(3) 그래프 그리기_1
#차트와 피규어 그리기 준비 및 크기 설정
fig, ax = plt.subplots(figsize=(15,7))
# 시고저종 데이터를 통해 캔들 차트를 그리기 (순서를 반드시 시고저종으로 입력)
candlestick2_ohlc(ax,df['Open'],df['High'],df['Low'],df['Close'],width=0.6, colorup='r', colordown='b')
# 차트 타이틀 설정
plt.title('Candle stick S elec.')
plt.show()
(4) 그래프 그리기_2(적은기간으로 보기쉽게)
- 데이터 추출
start = datetime(2020,1,1) #시작날짜
end = datetime(2020,3,2) #끝 날짜df = wb.DataReader('005930.KS', 'yahoo' , start, end)
df2 = wb.DataReader('005930.KS', 'yahoo',start,end)
* 시간포멧 보기좋게 바꾸는 방법
#날짜 포멧을 일, 또는 연-월-일로 바꾸기
print(df2.index[0])
print(df2.index[0].strftime('%d'))
print(df2.index[0].strftime('%Y-%m-%d'))
- 새로운 차트 그리기
#다시 차트 그리기
fig, ax = plt.subplots(figsize=(13,7))
#x축의 눈금을 설정
day_list = []
name_list = []
for i, day in enumerate(df2.index):
day_list.append(i) # 고정 축 list 생성
name_list.append(day.strftime('%Y-%m-%d')) # 고정 축에 적힐 날짜 list 생성
ax.xaxis.set_major_locator(ticker.FixedLocator(day_list)) #day_list를 받아서 리스트 안의 값의 위치에 고정 축 생성
ax.xaxis.set_major_formatter(ticker.FixedFormatter(name_list)) #설정한 고정 축에 name_list 안의 값을 축에 출력
candlestick2_ohlc(ax,df2['Open'],df2['High'],df2['Low'],df2['Close'], width=0.5, colorup='r', colordown='b')
plt.xticks(rotation = 90) #x축 각도 회전
#fig.autofmt_xdate() #날짜 형식으로 자동 format 지정
plt.title('Candle stick S elec')
plt.grid()
plt.show()