4-1. 데이터 전처리란?
•
데이터 전처리(Data Preprocessing)는 데이터 분석의 초기 단계로, 데이터 분석에 적합한 형태로 데이터를 가공하는 과정입니다.
•
데이터 전처리에는 다음과 같은 작업이 포함됩니다:
◦
데이터 정제: 잘못된 데이터 수정하고 누락된 값을 처리하거나 이상치를 제거합니다.
◦
데이터 변환: 분석에 용이하도록 데이터를 변환합니다.
4-2. fdrCommon.py 개발
데이터 전처리에 앞서 finance-datareader를 이용해 데이터를 수집하는 공통모듈을 개발합니다. 개발된 공통모듈은 다른 코드에서 호출해서 공통적으로 사용할 수 있습니다.
4-2-1. Common 디렉토리와 fdrCommon.py 파일 추가
PyCharm을 실행해 myStartUPQuant 프로젝트에 Common 디렉토리와 fdrCommon.py 추가하기
•
myStartUPQuant 폴더에서 마우스 우클릭
◦
New > Directory > Common 입력 후 엔터
•
Common 폴더에서 마우스 우클릭
◦
New > Python File > fdrCommon.py 입력 후 엔터
4-2-2. Common 디렉토리를 Sources Root로 등록하기
Common 디렉토리를 Sources Root로 등록합니다. 그래야만 다른 디렉토리에서 Common 디렉토리에 작성된 공통 모듈들을 자유롭게 사용가능합니다.
•
PyCharm의 프로젝트 탐색기에서 Common 디렉토리를 우클릭합니다.
•
컨텍스트 메뉴에서 Mark Directory as > Sources Root를 선택합니다.
4-2-3. fdrCommon.py 코드 입력해보기
common 디렉토리 아래에 추가한 fdrCommon 코드를 작성합니다.
아래 코드에서는 getPriceHistory(특정 종목의 일별 주가 수집)와 getStockList(종목정보수집)라는 함수를 생성합니다. 생성된 함수는 다른 코드에서 호출해서 사용할 수 있씁니다.
# Common\fdrCommon.py
# https://github.com/FinanceData/FinanceDataReader 참고
import FinanceDataReader as fdr # 주식, 가상화폐 등 금융 데이터를 쉽게 가져올 수 있는 파이썬 라이브러리
from datetime import datetime, timedelta # 시간, 일자 관련 처리하기 위한 라이브러리
def getPriceHistory(symbol, end_date='', days=0):
# end_date가 비어있으면 오늘 날짜로, days가 0이면 200으로 설정
if not end_date:
end = datetime.today()
else:
end = datetime.strptime(end_date, '%Y-%m-%d')
if days == 0: days = 200
start = end - timedelta(days=days) # 종료 일자 계산
df_history = fdr.DataReader(symbol, start=start, end=end) # FinanceDataReader를 사용하여 주식 가격 데이터 가져오기
return df_history
def getStockList(market):
# fdr의 모듈을 사용해 market에 해당하는 종목 리스트를 가져와 df(dataframe)에 담아둠
df = fdr.StockListing(market)
return df
Python
복사
4-3. preprocessingMA.py 개발하기
주가 데이터를 수집한 후에 이동평균(Moving Average)를 처리하는 전처리 모듈과 전처리된 이동평균을 시각화해주는 모듈을 개발합니다.
4-3-1. Common 디렉토리와 preprocessingMA.py 파일 추가
PyCharm을 실행해 myStartUPQuant 프로젝트에 Class04 디렉토리와 preprocessingMA.py 추가하기
•
myStartUPQuant 폴더에서 마우스 우클릭
◦
New > Directory > Class04 입력 후 엔터
•
Common 폴더에서 마우스 우클릭
◦
New > Python File > preprocessingMA.py 입력 후 엔터
4-3-2. preprocessingMA.py 개발하기
# Class04\preprocessingMA.py
import pandas as pd
import fdrCommon
import matplotlib.pyplot as plt
import numpy as np # 과학 계산을 위해 사용, 대규모 다차원 배열과 행렬 연산에 최적화된 기능을 제공
pd.set_option('display.max_columns', None) # df(Dataframe) 출력시 모든 컬럼 출력하도록 처리
pd.set_option('display.width', 1000) # df(Dataframe) 출력시, 한 로우가 따로 출력되지 않도록 충분한 길이 설정
def preprocessing_MA(df):
# 현재 df의 Date 컬럼이 인덱스이자 Date 형태 값으로 구성되어 있음
# 이 경우, 차트로 그릴때 휴일을 알아서 건너뛰고 나오므로, Date를 일부러 문자로 변환 처리
# 인덱스는 순번으로 재처리
df.index = df.index.strftime('%Y-%m-%d') # 'Date' 인덱스를 문자열로 변환
df.reset_index(drop=False, inplace=True) # 인덱스는 순번 재처리(Date 컬럼이 일반 컬럼으로 변경됨)
df['MA20'] = df['Close'].rolling(window=20).mean() # 20일 이동평균
df['MA60'] = df['Close'].rolling(window=60).mean() # 60일 이동평균
df['MA120'] = df['Close'].rolling(window=120).mean() # 120일 이동평균
df['MA200'] = df['Close'].rolling(window=200).mean() # 200일 이동평균
return df
def DrawChart(df, showDays):
# df의 내용을 시각화합니다.
df = df.tail(showDays).copy() # df에서 최근 몇 개의 데이터만 잘라냅니다.
# 차트와 서브플롯 생성
fig, (ax1, ax2) = plt.subplots(2, 1, gridspec_kw={'height_ratios': [4, 1]})
# 'Close' 및 이동평균을 ax1에 표시
ax1.plot(df['Date'], df['Close'], label='Close', color='black')
ax1.plot(df['Date'], df['MA20'], label='MA20', color='red', alpha=0.7)
ax1.plot(df['Date'], df['MA60'], label='MA60', color='green', alpha=0.7)
ax1.plot(df['Date'], df['MA120'], label='MA120', color='blue', alpha=0.7)
ax1.plot(df['Date'], df['MA200'], label='MA200', color='purple', alpha=0.7)
ax1.legend(loc='upper left')
ax1.set_title('Stock Price and Moving Averages')
ax1.set_ylabel('Price')
# 'Volume'을 ax2에 표시
ax2.bar(df['Date'], df['Volume'], color='gray', alpha=0.8)
ax2.set_ylabel('Volume')
# xtick이 너무 많아서 안보이므로 10개만 보이도록 처리.
day_xticks = np.linspace(0, len(df['Date']) - 1, 10, dtype=int)
ax1.set_xticks(day_xticks)
ax1.set_xticklabels(df['Date'].iloc[day_xticks])
ax2.set_xticks(day_xticks)
ax2.set_xticklabels(df['Date'].iloc[day_xticks])
plt.show()
symbol = "005930"
df = fdrCommon.getPriceHistory(symbol, '', 600) # fdr공통모듈을 통해 티커의 주가 정보 가져오기
df_MA = preprocessing_MA(df)
print(df_MA)
DrawChart(df_MA, 200)
Python
복사
Homework
•
최종 차트의 제목을 보면 종목코드(Ticker/Symbol)의 정보가 없습니다. 차트 제목에 종목코드가 포함되도록 처리해주세요.
•
자신이 관심있는 주가 데이터를 사용하세요.(현재 구성은 한국거래소의 일반 종목만 가능합니다.)