인프런 커뮤니티 질문&답변

Won Special님의 프로필 이미지
Won Special

작성한 질문수

평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자

리밸런싱에서 주기와 가중치 변경시 오류 현상

작성

·

223

0

안녕하세요. 이전 맛집지도 프로젝트부터 이번 강의까지 재미있게 수강하고 있습니다. 다음 강좌도 재미있는 콘텐츠 내주시면 수강하려고 합니다.

다름이 아니라, [2-5. 리밸런싱 기법]에서 강의에서는 weight를 1:1로 설정하고, Month 단위 리밸런싱만 다루는데요. 리밸런싱 주기를 quarter 또는 year로 하고 가중치를 달리 먹이면 오류가 발생합니다.

closeDateSet의 날짜와 rebalancingDate의 날짜가 일치하지 않기 때문인 것 같은데요. 나름대로 열심히 손대봐도 답을 못찾아서 도움을 부탁드립니다. weight를 어떻게 집어 넣는지 다뤄주시면 좋을 것 같습니다. 감사합니다.

# 데이터 로드
stockETF = getCloseData("SPY", "2002", "2022-6-17") # 주식 ETF
bondETF = getCloseData("IEF", "2002", "2022-6-17") # 채권 ETF

# kodex200 = 069500
# kodex10Bond = 152380
# S&P500 = SPY
# 미국 7-10 국채 = IEF

closeDataSet = pd.concat([stockETF, bondETF], axis=1)
closeDataSet.columns = ['stockETF', 'bondETF']
closeDataSet.dropna(inplace=True)
closeDataSet

# 종목의 상장일을 기준으로 리밸런싱 날짜 선별
# rebalancingDate = getRebalancingDate(closeDataSet)
rebalancingDate = getRebalancingDate(closeDataSet, "quarter")
rebalancingDate

# 리밸런싱 날짜에 맞춰서 가중치 설정
weightSet1 = pd.DataFrame({
    'stockETF': [0.7] * len(rebalancingDate),
    'bondETF': [0.3] * len(rebalancingDate)
}, index=rebalancingDate)  # 모든 리밸런싱 날짜에 대한 가중치 지정

rebalPortfolioDayReturn, rebalPortfolioCumulativeReturn = getRebalancingPortfolioResult(closeDataSet, weightDf=weightSet1)

 

답변 2

0

Jiwoon Jeong님의 프로필 이미지
Jiwoon Jeong
지식공유자

안녕하세요.

열심히 수강해주셔서 감사합니다.

해당 문제의 원인은 데이터셋의 날짜 범위와 리밸런싱 날짜 범위가 맞지 않아서 발생한 것으로 파악됩니다.

따라서 getRebalancingPortfolioResult 함수에 자산별 비중이 있는 경우에 대해 코드를 수정해주시면 되는데요.

아래와 같이

rebalancingDate = weightDf.index # 리밸런싱 날짜 이렇게 수정해주시면 함수에 전달한 weightDf의 index에 따라 리밸런싱 날짜를 설정하게 됩니다.

해당 부분은 저도 발견하지 못했던 부분인데 ㅠㅠ.. 발견해주셔서 감사합니다.

wjdwldns0905@gmail.com으로 연락 한번 주시길 부탁드리겠습니다.

해당 부분은 수정하여 업로드해두겠습니다.

감사합니다. :)

 

def getRebalancingPortfolioResult(closeDataSet, period = "month", weightDf=None):
    """
    리밸런싱 포트폴리오 결과
    closeDataSet: 종가 데이터
    weight: 포트폴리오 개별자산 비중
    return: 포트폴리오 일간수익률, 누적수익률
    """
    
    # 자산별 비중. 기본값: 동일비중
    if weightDf is None:
        rebalancingDate = getRebalancingDate(closeDataSet, period) # 리밸런싱 날짜
        weightDf = pd.DataFrame([[1/len(closeDataSet.columns)] * len(closeDataSet.columns)] * len(rebalancingDate),
                              index=rebalancingDate,
                              columns=closeDataSet.columns)
    # 자산별 비중이 있는 경우
    else:
        closeDataSet = closeDataSet.loc[weightDf.index[0]:]
        rebalancingDate = weightDf.index # 리밸런싱 날짜

 

0

안녕하세요, 인프런 AI 인턴이에요.

리밸런싱 주기를 quarter 또는 year로 설정하고 가중치를 달리 먹이면 오류가 발생하는 이유는 rebalancingDate와 closeDateSet의 날짜가 일치하지 않기 때문입니다.

getRebalancingDate 함수는 closeDataSet 내 종목의 상장일을 기준으로 리밸런싱 날짜를 선별하는 함수입니다. 기본적으로는 Month 단위로 리밸런싱 날짜가 설정되어 있습니다. 따라서, 리밸런싱 주기를 quarter나 year로 변경하려면 getRebalancingDate 함수를 수정해야 합니다.

getRebalancingDate 함수를 다음과 같이 수정하면 됩니다.

def getRebalancingDate(closeDataSet, period):
    rebalancingDate = pd.DataFrame()
    if period == "quarter":
        rebalancingDate = closeDataSet.resample('Q').last().dropna()
    elif period == "year":
        rebalancingDate = closeDataSet.resample('Y').last().dropna()
    return rebalancingDate

위와 같이 getRebalancingDate 함수 내에서 resample 메서드를 사용하여 리밸런싱 주기를 설정할 수 있습니다. 즉, period가 “quarter”인 경우에는 분기 단위로, “year”인 경우에는 연 단위로 리밸런싱 날짜를 선별하게 됩니다.

이렇게 수정한 후에는 rebalancingDate에서 선별된 리밸런싱 날짜와 closeDataSet 내 종가 데이터의 날짜가 일치하게 되어 오류가 발생하지 않을 것입니다.

이렇게 수정해보시고 문제가 해결되는지 확인해보세요. 추가로 궁금한 점이 있으면 언제든지 물어보세요. 수강해 주셔서 감사합니다.

Won Special님의 프로필 이미지
Won Special

작성한 질문수

질문하기