본문 바로가기
Python

파이썬 이용 월 별 주식 투자 수익률 분석

by 아짱이아빠 2021. 10. 2. 17:12
반응형

파이썬을 이용하여 특정 주식의 월 별 평균 수익률을 계산하는 코드에 대해 알아보고 몇몇 기업의 데이터를 넣어 그 결과를 확인해 보겠다.

 

파이썬 코드의 구조는 먼저 확인하고자 하는 주식 데이터를 불러온 후 각 월 별 수익률을 저장할 공간을 만든다. 

그런 다음 불러온 주식 데이터에서 일일 수익률을 구하고 이를 월 별로 평균을 내는 구조이다.

 

파이썬 코드는 Youtube의 “Computer Science”를 참고하였다.



[주식 데이터 불러오기]

다른 포스트에서 설명한 것과 동일한 내용이지만 한번 더 설명하도록 하겠다.

주식 데이터를 불러오기 전에 다음과 같은 라이브러리를 불러온다.

! pip install finance-datareader
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
import FinanceDataReader as fdr

 

google colab에서 주식 데이터를 불러와서 읽기 위해 맨 위에 있는 ‘finance-datareader’를 설치한다.

 

아래의 코드로 원하는 주식 데이터를 불러와서 시각화한다.

stock_data = fdr.DataReader('008770', '1997')
plt.figure(figsize=(12,4))
plt.plot(stock_data.Close, lw = 0.8)
plt.title('Close Price')
plt.xlabel('Date')
plt.ylabel('Price')
plt.xticks(rotation=45)
plt.show()

 

위의 예는 ‘호텔신라’의 주식 데이터를 1997년부터 불러와서 종가(Close Price)를 시각화하며 결과는 아래와 같다.

호텔신라의 1997년부터 종가 데이터
(호텔신라의 1997년부터 종가 데이터)

 

 

[월 별 누적 수익률 계산]

먼저 아래와 같이 각 달의 빈 list를 만들어 준다.

Jan = []
Feb = []
Mar = []
Apr = []
May = []
June = []
July = []
Aug = []
Sept = []
Oct = []
Nov = []
Dec = []

 

그리고 각 달에 수익률을 집어넣기 위한 기능의 정의를 만든다.

def get_returns(month, returns):
  if month == '01':
    Jan.append(float(returns))
  elif month == '02':
    Feb.append(float(returns))
  elif month == '03':
    Mar.append(float(returns))
  elif month == '04':
    Apr.append(float(returns))
  elif month == '05':
    May.append(float(returns))
  elif month == '06':
    June.append(float(returns))
  elif month == '07':
    July.append(float(returns))
  elif month == '08':
    Aug.append(float(returns))
  elif month == '09':
    Sept.append(float(returns))
  elif month == '10':
    Oct.append(float(returns))
  elif month == '11':
    Nov.append(float(returns))
  elif month == '12':
    Dec.append(float(returns))

 

불러온 주식 데이터의 index는 “1997-09-09”와 같이 년도와 월, 일로 표현되어 있으며 아래에서 이 문자열을 ‘-’ 기준으로 나누어 월에 해당하는 정보만 읽어드릴 것이다.

만약 index가 연도-월-일로 되어있지 않다면 수정이 필요하다.

 

다음의 코드는 일일 수익률을 계산하여 기존 주식 데이터가 저장되어있는 ‘stock_data’에 새로운 ‘DSR’ column을 만들어 넣어준다.

일일 수익률은 종가를 기준으로 “.pct_change()” 함수를 이용하여 쉽게 구할 수 있으며 만약 하루 전이 아니고 N일 전의 가격으로 거래했을 때의 수익률을 구하고자 할 때에는 괄호 안에 해당하는 N 일을 넣으면 된다.

DSR = stock_data['Close'].pct_change()
stock_data['DSR'] = DSR

 

여기까지의 결과는 다음과 같다.

호텔신라의 일일 수익률
(호텔신라의 일일 수익률)

 

맨 처음 9월 9일의 데이터는 그 전날의 데이터가 없기 때문에 NaN으로 표시된다.

데이터가 없는 날은 아래의 코드로 삭제를 시킨다.

 

stock_data = stock_data[1:]

 

앞에서 만들어 놓은 월 별 빈 list에 각 월에 해당하는 일일 수익률을 집어넣는다.

이는 아래와 같이 for 문을 통해 수행한다.

for i in range(0, len(stock_data)):
  stock_data_date = str(stock_data.index[i])
  stock_data_returns = stock_data['DSR'][i]
  stock_data_month = stock_data_date.split('-')[1]
  get_returns(stock_data_month, stock_data_returns)

 

데이터 index의 월에 해당하는 정보를 기준으로 앞에서 만들어 놓은 정의를 수행하여 각 월에 해당하는 일일 수익률을 넣는다.

 

반응형

 

그리고 다음의 코드는 각 월에 모아놓은 일일 수익률을 평균하는 내용이다.

df_AVG = pd.DataFrame()

def AVG(month):
  return[sum(month) / len(month)]

df_AVG['AVG'] = AVG(Jan) + AVG(Feb) + AVG(Mar) + AVG(Apr) + AVG(May) + AVG(June) + AVG(July) + AVG(Aug) + AVG(Sept) + AVG(Oct) + AVG(Nov) + AVG(Dec)
df_AVG = df_AVG.set_index(df_AVG.index + 1)

 

각 월 별 평균을 구하고 저장할 빈 데이터프레임 ‘df_AVG’를 만든다.

각 월에 저장되어 있는 일일 수익률을 평균하기 위한 정의를 만들고 이를 수행하여 ‘AVG’ column에 저장한다.

마지막은 이 데이터프레임에 1부터의 index를 넣어주는 부분이다.

 

평균된 수익률을 100 분률로 바꾸어 보기 쉽게 간단히 bar 차트로 표현한다.

df_AVG*100
df_AVG.plot.bar()

 

호텔신라 월별 수익률 평균
(호텔신라 월별 수익률 평균)

 

위의 결과를 보면 1997년도부터 현재까지 호텔신라는 4월의 수익률이 가장 좋았으며 10월은 손해가 가장 컸다고 볼 수 있다.

 

 

[다른 종목에 적용 결과]

아래는 개인적으로 관심 있는 종목에 대해 앞에서의 코드를 이용하여 월 별 수익률 평균을 구해본 것이다.

대한항공의 1994년부터 현재까지의 월별 수익률
(대한항공의 1994년부터 현재까지의 월별 수익률)

 

삼성전자의 1994년부터 현재까지의 월별 수익률
(삼성전자의 1994년부터 현재까지의 월별 수익률)

 

신한금융지주의 1994년부터 현재까지의 월별 수익률
(신한금융지주의 1994년부터 현재까지의 월별 수익률)

 

신일전자의 1994년부터 현재까지의 월별 수익률
(신일전자의 1994년부터 현재까지의 월별 수익률)

 

신일전자의 경우에는 대표적인 여름 테마주로서 이런 계절 테마주는 어떤 경향이 있었는지 궁금해서 해보았는데 3월의 수익률이 가장 좋은 것으로 나왔다.

아마도 사람들이 3월에 여름을 준비하면서 기업의 매출이 늘어서 이런 경향이 나왔을 수도 있다고 생각된다.

 

 

여기까지 파이썬을 이용하여 주식 데이터를 불러와서 수익률을 계산하고 이를 월 별로 표현하는 것에 대해 알아봤다.

이 분석이 주식을 투자함에 있어 큰 도움은 되진 않겠지만 그래도 투자 시점을 고려할 때에 조금은 참고가 되지 않을까 생각된다.

 

반응형

댓글