파이썬 특정 날짜 고정 후 수익률 계산
조회수 1881회
안녕하세요. 파이썬으로 일자별 수익률 계산을 하고 싶은데. 특정 일자를 고정시킨 후 수익률 계산하는 방법을 알고 싶습니다.
위와 같이 1983년에서 2010년까지 일간 주가 데이터가 있다고 가정할 경우 월말을 고정한 후에 특정 날짜와의 수익률을 계산하고 싶은데 어떤 방식으로 구현해야할지 모르겠네요.
제가 구하고 싶은 것은 예를 들어 3월말 가격 29.29을 고정한 후 4월 가격 전부와 수익률을 구하는 것입니다. 4월 4일은 29.44/29.29 -1
이 될테고 4월 5일은 29.71/29.29 -1
이 될텐데 모든 달에 걸쳐 이러한 과정을 반복해서 수익률을 구하고 싶습니다.
resample(rule = 'M').last()
하면 각 월말 일자와 가격은 구해지는데 이러한 접근법은 아닌 거 같아서 질문드립니다. 또한 datetime 및 datarange도 살펴봤는데 위 함수로는 제가 구현하고자 하는 수익률 계산에 맞지 않는 것 같습니다.
2 답변
-
import pandas as pd # In[2]: s = '1983-03-30 29.4 1983-03-31 29.29 1983-04-04 29.44 1983-04-05 29.71 1983-04-06 29.44 1983-04-07 29.71 1983-04-08 29.92 1983-04-11 30.17 1983-04-12 30.38 1983-04-13 30.26 1983-04-14 30.83 1983-04-15 30.82 1983-04-18 30.67 1983-04-19 30.48 1983-04-20 30.75 1983-04-21 30.75 1983-04-22 30.7 1983-04-25 30.68 1983-04-26 30.75 1983-04-27 30.84 1983-04-28 30.71 1983-04-29 30.78 1983-05-02 30.74 1983-05-03 30.63' d = s.split() df = pd.DataFrame({ "date":d[::2], "wti":d[1::2]}) # In[3]: df.tail() # In[4]: df['date_period'] = pd.to_datetime(df.date).dt.to_period('D') df['month_period'] = pd.to_datetime(df.date).dt.to_period('M') df.wti = df.wti.astype(float) df.set_index('date_period', inplace=True) # In[5]: df.head() # In[6]: df.info() # In[7]: lasts = df.resample('M').last() lasts # In[8]: lasts.drop(columns=['date', 'month_period'], inplace=True) lasts = lasts.shift(periods=1) lasts.index.name = 'month_period' lasts.columns = [ 'wti_last'] # In[9]: lasts # In[10]: lasts = lasts.reset_index() df = df.merge(lasts) df.drop(columns=['month_period'], inplace=True) # In[11]: df.head(10) # In[12]: df['지난달말일대비수익률'] = df.wti/df.wti_last - 1 # In[13]: df
resample
로 monthly period 로 그룹한 데이터프레임을 만들고,- 말일값을 시프트하고, (따라서 전달말일값이 됨.)
- 원본 데이터프레임에 monthly period 컬럼을 만들어서
- 두 데이터프레임을
merge
. - 이후엔 컬럼간 사칙연산을 통해서, 원하는 컬럼을 만들기.
datetime, period 타입 등 조작하는 게 괜히 복잡하네요.
-
사진을 보니.. 데이터가 엑셀에 담겨있는것 같네요. 저라면...
- 엑셀의 각 행을 dictionary 자료형에 담음.
- 조건문을 통해서 원하는 날자이면, 계산을 진행
예를 들어... 1983년 4월달 전체에 대해서 한다고 하시면, for문을 통해 dictionary에서 조건에 맞는 키를 찾게 돌리고, (키는 날짜, value는 가격)
조건문은 다음과 같겠네요
date = '1983-04-04' if date[0:7]=='1983-04': print("t")
그 다음엔 해당 key의 value값을 가져와서 계산을 해주시면 될것같네요
댓글 입력