Search

Class 04. 데이터 전처리와 이동평균

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)의 정보가 없습니다. 차트 제목에 종목코드가 포함되도록 처리해주세요.
자신이 관심있는 주가 데이터를 사용하세요.(현재 구성은 한국거래소의 일반 종목만 가능합니다.)