-
[파이썬] 개별 주식 주간/월별 주익률 계산하기 (How to Calculate Weekly and Monthly returns of individual stocks)코딩/파이썬 2021. 10. 15. 14:47반응형
주식 관련 분석을 할 때 일별 데이터도 자주 사용하지만 주간 혹은 월간 데이터를 사용하는 경우도 많이 있습니다. 이번 포스트에서는 파이썬으로 주간 및 월별 수익률을 계산하는 방법을 알아보도록 하겠습니다.
주간/월별 수익률 계산하기(Calculate weekly and monthly returns)
수익률을 계산하는 공식은 일별이든, 주간이든, 월별이든 똑같습니다. 문제는 가격 데이터를 일별 데이터에서 주간 혹은 월간 데이터로 만들어준 후에 공식을 적용하는 것입니다. 일별 수익률 계산하는 방법은 아래 링크에서 확인하실 수 있습니다.
2021.10.09 - [코딩/파이썬] - [파이썬] 개별 주식 수익률 계산 (Calculate individual stock returns)
1. 사용된 패키지와 데이터 생성 (Used Packages and Generating data)
일별 수익률 계산에서 사용된 패키지에 더하여 날짜를 다룰 수 있는 패키지가 필요합니다. datetime과 pandas.tseries.offsets를 이용하여 날짜를 생성하거나 요일 이름을 만들어주는 등의 조작을 해 줄 것입니다.
123456#Packages used (사용된 패키지)import yfinance as yfimport pandas as pdimport numpy as npimport datetime as dtfrom pandas.tseries.offsets import *cs 다음으로 가격 데이터를 생성하도록 하겠습니다. 절차는 일별 수익률에서 했던 것과 같습니다.
123456789#Download price data from Yahoo finance (가격 데이터 다운로드)p_apple = yf.download('AAPL',start = '2019-01-01')p_google = yf.download('GOOGL',start = '2019-01-01')#Merge the tow tables above (표 병합)p_apple = p_apple[['Adj Close']].rename(columns = {'Adj Close':'Close_Apple'})p_google = p_google[['Adj Close']].rename(columns = {'Adj Close':'Close_Google'})price = pd.concat([p_apple,p_google],axis=1)cs 데이터는 다음과 같이 생겼습니다.
Yahoo finance에서 받은 자료는 거래소가 휴일이거나 공휴일의 가격은 없기 때문에 모든 날짜가 포함되어 있는 것이 아닙니다. 먼저 없는 날짜를 다시 만들어 주기 위해서 날짜 변수를 다음 코드로 만들어 주겠습니다. 위에서 알 수 있듯이 가격 dataframe의 index가 날짜로 되어 있기 때문에 reset_index() 매서드를 통해서 변수로 만들어 주겠습니다.
1price = price.reset_index()cs 결과는 다음과 같습니다. Date 변수가 index에 있지 않고 column으로 만들어진 것을 확인할 수 있습니다.
이제 원래 가격 데이터에 없는 날짜를 만들어 주겠습니다. 데이터 상의 가장 처음 날짜를 start_date 변수로, 마지막 날짜를 end_date 변수로 만든 후에 pd.date_range() 함수를 이용하여 start_date부터 end_date까지 날짜를 만들어 줍니다. .to_frame() 매서드로 dataframe으로 만들어 준 후 pd.merge() 함수를 이용해 가격 데이터와 합병해줍니다. 이때 pd.merge() 안에 매개 변수로 들어가는 순서를 주의해 줘야 합니다. 날짜 데이터, 가격 데이터 순으로 넣어주어야 합니다.
12345678#Get all days within the sample period (데이터에 없는 날짜 채우기)start_date = price['Date'].astype(str).iloc[0]end_date = price['Date'].astype(str).iloc[-1]date_all = pd.date_range(start_date, end_date, freq='D').to_frame().rename(columns={0:'Date'}).reset_index(drop=True)#Merge with price data (데이터 병합)price_all = pd.merge(date_all,price,how='left')cs 결과는 다음과 같습니다.
원래 데이터에 없는 1월 5일과 6일이 생긴 것을 볼 수 있습니다. 이제 새로 생긴 NaN 변수에 가격 데이터를 채워줘야 합니다. 직전 날짜의 가격 데이터를 넣어주면 되므로 다음과 같은 코드를 작성해 줍니다.
12#the 'ffill' method propagates last valid observation forward (직전의 유효한 값으로 NaN 값 채우기)price_all = price_all.fillna(method='ffill')cs 결과는 다음과 같습니다. NaN 변수가 직전 가격으로 바뀐 것을 알 수 있습니다.
2. 주간 수익률 계산 (Calculate weekly returns)
데이터가 준비되었기 때문에 이제 주간 수익률을 계산해 보도록 하겠습니다. 주간 수익률은 요일 이름을 기준으로 만들어 줄 것이기 때문에 다음과 같이 요일 이름 변수를 만들어 주겠습니다. .dt.day_name() 매서드를 사용하였습니다.
12#Generate day of week variables (요일 이름 변수 생성)price_all['Day_Name'] = price_all['Date'].dt.day_name()cs 결과는 다음과 같습니다. Day_Name column을 보시면 요일 이름이 들어가 있는 것을 볼 수 있습니다.
이제 월요일 종가에서 다음 주 월요일 종가까지 주간 수익률을 계산해 보도록 하겠습니다. 다음 코드를 통해 가격 데이터에서 월요일 가격만 뽑아내 줍니다.
12#Get Monday prices (월요일 가격만 뽑아내기)price_mon = price_all[price_all['Day_Name']=='Monday']cs 결과는 다음과 같습니다. 월요일 날짜만 있는 것을 볼 수 있습니다.
Date column을 index로 만들어 주고 Day_Name column을 없앤 다음 수익률을 계산해 주겠습니다.
12345#Set index and remove the Day Name columns (index 설정 및 Day_Name column 삭제)price_mon = price_mon.set_index(['Date']).drop(['Day_Name'],axis=1)#Monday close-to-Monday close weekly returns (월요일 종가-월요일 종가 주간 수익률)week_mon_ret = price_mon.pct_change(1).dropna()cs 결과는 다음과 같습니다.
월요일-월요일 수익률이 직관적인 주간 수익률이지만 수요일-수요일 수익률을 사용하는 경우도 종종 있습니다. 같은 요령으로 계산해 보도록 하겠습니다.
12345678#Get Wednesday prices (수요일 가격만 뽑아내기)price_wed = price_all[price_all['Day_Name']=='Wednesday']#Set index and remove the Day Name columns (index 설정 및 Day_Name column 삭제)price_wed = price_wed.set_index(['Date']).drop(['Day_Name'],axis=1)#Wednesday close-to-Wednesday close weekly returns (수요일 종가-수요일 종가 주간 수익률)week_wed_ret = price_wed.pct_change(1).dropna()cs 결과는 다음과 같습니다. 월요일-월요일 수익률과 수요일-수요일 수익률이 다른 것을 볼 수 있습니다. 주간 수익률을 사용할 때는 이 점을 고려하여 어떤 요일을 사용할지 정해야 합니다.
3. 월별 수익률 계산 (Calculate weekly returns)
월 수익률을 계산해 주기 위해서 월말 날짜 데이터를 만들어 주도록 하겠습니다. pd.date_range() 함수에서 freq를 M (Month)로 설정해 주면 됩니다.
12#Generate end of month data (월말 날짜 생성)month_end = pd.date_range(start_date, end_date, freq='M')cs 결과는 다음과 같습니다.
월말 날짜 데이터를 이용하여 월말 가격 데이터를 다음과 같이 만들어 주도록 하겠습니다. .isin() 매서드를 이용하면 월말 날짜 데이터에 포함되어있는 날짜만 뽑아낼 수 있습니다.
12#Get only end of month prices (월말 가격 데이터 생성)price_month = price_all[price_all['Date'].isin(month_end)].reset_index(drop=True)cs 결과는 다음과 같습니다. 날짜를 보면 월 마지막 날짜로만 되어 있는 것을 볼 수 있습니다.
주간 수익률을 계산하는 요령과 동일하게 월 수익률을 계산해 줍니다.
12345#Set index and remove the Day Name columns (index 설정 및 Day_Name column 삭제)price_month = price_month.set_index(['Date']).drop(['Day_Name'],axis=1)#Monthly returns (월 수익률)month_ret = price_month.pct_change(1).dropna()cs 결과는 다음과 같습니다.
여기에서 계산된 개별주식의 주간/일별 수익률을 이용하여 여러 주식의 묶음으로 되어 있는 포트폴리오 수익률을 계산하는 것은 지난번에 올린 포트폴리오 수익률 계산에서 수익률 데이터만 주간/일별 수익률 데이터로 바꿔주면 되고 나머지는 똑같이 하면 됩니다. 자세한 것은 아래 링크를 참고해 주세요.
2021.10.11 - [코딩/파이썬] - [파이썬] 주식 포트폴리오 수익률 계산하기 (Calculate portfolio returns)
지금까지의 모든 파이썬 코드는 아래의 Google Colab 링크에서 연습해 보실 수 있습니다.
반응형'코딩 > 파이썬' 카테고리의 다른 글
[파이썬] Mean-Variance Frontier 계산하기 (최적 포트폴리오 계산하기) (4) 2021.10.14 [파이썬] 주식 포트폴리오 수익률 계산하기 (Calculate portfolio returns) (10) 2021.10.11 [파이썬] 개별 주식 일별 수익률 계산 (Calculate daily individual stock returns) (0) 2021.10.09 [파이썬] 일본어 한자에 후리가나 달기/일본어 한자 히라가나 변환 (0) 2021.09.14 [파이썬] 자막에서 텍스트만 뽑아내기 (2) 2021.03.01