본문 바로가기
공부 목록/IT & 프로그래밍

Python 시계열 데이터의 이동 평균 활용 (feat. 주식 매수 시점)

by 독학박사 2023. 7. 16.

목차


     주식 차트와 같은 데이터를 시계열 데이터라고 하는데 이러한 데이터를 분석하기 위해 이동 평균이라는 것을 사용하게 됩니다. 이번 글에서는 시계열 데이터의 특성, 이동평균을 사용하는 이유와 '삼성전자'의 주식 차트를 이용하여 매매시점 분석하는 코드를 예시로 보여드리려고 합니다.

     

     

    시계열 데이터 이동평균 분석
    시계열 데이터 이동평균 분석

     

    1. 시계열 데이터란?

    시계열 데이터는 일련의 시간적 순서를 따라 발생한 데이터 포인트들의 모음입니다. 간단하게 말하면, 시간에 따라 측정되거나 기록된 데이터들을 순차적으로 나열한 것을 의미합니다. 이러한 데이터는 일정한 시간 간격으로 측정되는 경우도 있고, 불규칙한 시간 간격으로 기록되는 경우도 있습니다. 일반적인 시계열 데이터들에는 아래와 같은 것들이 있습니다.

     

    주식 가격: 주식 시장에서 주식들의 가격은 틱(tick) 단위로 기록되며, 이를 시간에 따라 나열한 시계열 데이터입니다.

    기온 변화: 하루 동안의 기온 변화를 시간별로 기록한 시계열 데이터입니다.

    경제 지표: 월별, 분기별 또는 연도별로 측정되는 경제 지표들도 시계열 데이터로 취급됩니다. 예를 들어, 국내총생산(GDP), 실업률, 소비자 물가 지수 등이 해당됩니다.

    인구 통계: 연도별 인구수, 나이별 인구 비율 등 시간에 따라 변화하는 인구 통계도 시계열 데이터입니다.

    소셜 미디어 활동: 소셜 미디어에서 게시물 수, 좋아요 수, 댓글 수 등을 시간에 따라 기록한 것이 시계열 데이터입니다.

     

    시계열 데이터는 많은 분야에서 활용되고 있습니다. 주식 시장 예측, 기후 변화 분석, 경제 예측, 시계열 데이터를 활용한 기계 학습 모델 개발 등 다양한 분야에서 중요한 데이터 형태로 사용되고 있습니다. 

     

     

    2. 시계열 데이터의 이동평균

    시계열 데이터에서 이동평균(Moving Average)은 데이터를 부드럽게 만들어주고, 주기성과 변동성을 파악하는 데에 유용한 통계적인 기법입니다. 이동평균은 특정 시점의 데이터와 그전 또는 후의 일정 기간 동안의 데이터를 평균하여 새로운 값을 생성하는 방식으로 동작합니다. 시계열 데이터는 시간에 따라 변동하는 경향이 있기 때문에, 이동평균은 이러한 시계열 데이터의 흐름을 더 잘 이해하고 예측하는 데에 도움을 줍니다.

     

    이동평균 계산 개념
    이동평균 계산 개념

     

     이동평균을 사용할 때 주요한 인자는 얼마간의 구간을 평균값으로 만들 것이냐는 겁니다. 예를 들어 주식 차트에서 보면 5, 10 ,20과 같은 이동평균이 존재하는데 이는 5일 평균, 10일 평균, 20일 평균을 의미합니다. 오늘 날짜로 해당 값들을 나타내려면 5일 평균은 오늘 기준으로 5일 전, 10일 평균은 오늘 기준으로 10일 전의 데이터들을 이용하는 겁니다. 

     

    파이썬에서 이동평균을 하는 방법은 매우 간단합니다. 데이터 프레임의 각 열을 추출하여 열에 rolling() 함수를 사용하고 그 뒤에 평균을 할 것인지, 맥스값을 뽑을 것인지 지정을 해주면 됩니다. 아래 코드는 주식 데이터 중 '종가(Close)'에서 short_period(20)을 구간으로한 평균을 구한다는 겁니다. 결과는 위의 이미지와 같이 계산하게 됩니다.

     

    data['Close'].rolling(window=short_period).mean()

     

    3. 이동평균을 이용하여 주식의 매매시점 확인하기

    시계열 데이터와 이동평균에 대한 이론을 확인했으니, 예제 코드를 확인하면 실제 응용은 어떻게 하는지 확인해 보도록 하겠습니다. 시계열 데이터를 얻기 위해 파이썬의 라이브러리인 yfinance를 호출하였고 우리나라의 대표 주식인 '삼성전자(005930.KS)'의 주가를 이용하여 매매시점을 확인해 보도록 하겠습니다.

     

    매매시점을 확인하는 기본적인 알고리즘은 기간별 이동평균을 이용하는 겁니다. 여기서 보이는 예는 단순히 이동평균에 대한 응용을 위해 사용한 것으로 실제 주가 예측과는 상관이 없음을 사전에 알려드립니다.

     

     

    import pandas as pd
    import yfinance as yf
    import matplotlib.pyplot as plt
    
    # 시작 날짜와 종료 날짜를 설정합니다.
    start_date = '2016-01-01'
    end_date = '2023-07-05'
    
    # 삼성 주식의 종목 코드는 '005930.KS'입니다. 필요에 따라 수정할 수 있습니다.
    stock_code = '005930.KS'
    
    # 이동 평균을 계산할 기간을 설정합니다.
    moving_average_periods = [20, 40, 60]
    short_period = 20  # 짧은 기간의 이동평균
    medium_period = 40  # 중간 기간의 이동평균
    long_period = 60  # 긴 기간의 이동평균
    
    # 삼성 주식 데이터를 불러옵니다.
    data = yf.download(stock_code, start=start_date, end=end_date)
    
    # 데이터를 확인합니다.
    data['Short_MA'] = data['Close'].rolling(window=short_period).mean()
    data['Medium_MA'] = data['Close'].rolling(window=medium_period).mean()
    data['Long_MA'] = data['Close'].rolling(window=long_period).mean()
    
    # 매수신호 계산
    data['Buy_Signal'] = False
    data.loc[
        (data['Short_MA'] > data['Medium_MA']) &
        (data['Medium_MA'] > data['Long_MA'].shift()) &
        (data['Long_MA'] == data['Long_MA'].rolling(window=long_period).max()),
        'Buy_Signal'
    ] = True
    
    # 그래프 그리기
    plt.figure(figsize=(10, 6))
    plt.plot(data['Close'], label='Close')
    plt.plot(data['Short_MA'], label=f'{short_period}MA')
    plt.plot(data['Medium_MA'], label=f'{medium_period}MA')
    plt.plot(data['Long_MA'], label=f'{long_period}MA')
    
    # 화살표로 매수신호 표시
    buy_dates = data[data['Buy_Signal']].index
    buy_prices = data[data['Buy_Signal']]['Close']
    plt.scatter(buy_dates, buy_prices, color='green', marker='^', label='Buy Signal')
    
    # 그래프 스타일 설정
    plt.title('Samsung Stock Price with Moving Averages and Buy Signals')
    plt.xlabel('Date')
    plt.ylabel('Price')
    plt.grid(True)
    plt.legend()
    
    # 그래프 출력
    plt.show()

     

    위의 코드를 실행하면 아래와 같은 결과가 나옵니다. 빨간색 원 내 녹색 삼각형은 매수시점을 나타내는 결과입니다. 이동평균을 이용하여 시계열 데이터를 예측할 때는 한 가지 주의사항이 있습니다. 이동평균은 과거의 데이터를 이용하기 때문에 미래 예측에는 참고만 해야지 완전히 의존하면 안 된다는 겁니다. 

     

    예제 코드 결과 그래프
    예제 코드 결과 그래프

     

     

    4. 마치며

     지금까지 시계열 데이터, 이동평균, 주식 데이터 분석에 대해 정리해 봤습니다. 시계열 데이터는 x축이 시간, y축이 데이터로 구성된 데이터를 의미합니다. 이러한 데이터를 분석 및 예측하기 위해 또는 전처리하기 위해 이동평균 기법을 사용합니다. 이러한 예측 기법을 통해 주식 데이터의 예측도 가능하나 정확한 예측을 위해서는 추가적이 변수들이 필요합니다.