파이썬 특정 날짜 고정 후 수익률 계산

조회수 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 답변

  • 좋아요

    0

    싫어요
    채택 취소하기
    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 타입 등 조작하는 게 괜히 복잡하네요.

    • 정말 감사드립니다. 파이썬을 만져본지 이제 겨우 한달 정도라 많은 시행착오를 겪고 있는 가운데 오늘은 저 수익률 구하는 방법 때문에 하루종일 찾아보면서 고민했습니다. 덕분에 날짜를 어떻게 다루어야할지 감이 조금 잡히는 것 같습니다. 문창훈 2019.6.20 19:02
    • @랭쿠 : 저도 판다스의 시각, 시간 관련해서 아주 익숙하지는 않아서 이것저것 찾아보며 (연습삼아) 만들었습니다. 훨씬 더 간편한 방법이 있을 지도 몰라요. nowp 2019.6.20 19:52
  • 사진을 보니.. 데이터가 엑셀에 담겨있는것 같네요. 저라면...

    1. 엑셀의 각 행을 dictionary 자료형에 담음.
    2. 조건문을 통해서 원하는 날자이면, 계산을 진행

    예를 들어... 1983년 4월달 전체에 대해서 한다고 하시면, for문을 통해 dictionary에서 조건에 맞는 키를 찾게 돌리고, (키는 날짜, value는 가격)

    조건문은 다음과 같겠네요

    date = '1983-04-04'
    if date[0:7]=='1983-04':    
        print("t")
    

    그 다음엔 해당 key의 value값을 가져와서 계산을 해주시면 될것같네요

    • 감사드립니다. 제가 왕초보라 말씀해주신 코드만으로 어떻게 해야할지 고민했는데 daewon 님께서 작성해주신 코드로 해결했습니다. 바쁜 와중에 신경써서 답글 고맙습니다. 문창훈 2019.6.20 19:03

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)