유자차의 재테크 공부방

[자산배분] 채권 동적자산배분 - 파이썬으로 직접 백테스팅하기 - (1) 본문

자산배분

[자산배분] 채권 동적자산배분 - 파이썬으로 직접 백테스팅하기 - (1)

유자차H 2022. 12. 5. 19:26
반응형

채권 동적자산배분 전략에 따라 다음과 같이 구현하여 매월말 투자할 종목을 구해보았습니다.

 

전략 로직

1. 최근 6개월 수익률이 가장 높은 3개(Top3)에 투자

2. Top3 중 0이하인 ETF는 현금(BIL)로 대체

 
import pandas as pd
import numpy as np
import yfinance as yf # 야후 파이낸스 부르기

ticker = ["SHY", "IEF", "TLT", "TIP", "LQD", "HYG", "BWX", "EMB"]

# 데이터 불러오기
df = yf.download(ticker) # 야후 파이낸스에서 tickers에 해당하는 데이터 모두 불러오기
df = df["Adj Close"] # 불러온 데이터 중 Adj Close 데이터만 
df.dropna(inplace=True) # 데이터가 없는 곳이 있는 행은 삭제

# 월말 데이터만 뽑기
rebal_data = pd.DataFrame() # 월말 데이터 저장할 곳
df["year"] = df.index.year # year정보 담긴 year 열 만들기
df["month"] = df.index.month # month 정보 담긴 month 열 만들기
df["day"] = df.index.day # day 정보 담긴 day 열 만들기
days_df = df.groupby(["year","month"])["day"].max() # year, month로 그룹해서 day들 중 최대값만 뽑음
for i in range(len(days_df)): # 위 과정을 통해 뽑힌 데이터 중 day 값이 25일 이상 되면 rebal_data에 저장
    if days_df.iloc[i] >= 25: 
        day = "{}-{}-{}".format(days_df.index[i][0], days_df.index[i][1], days_df.iloc[i])
        rebal_data = pd.concat([rebal_data,df[df.index==day]])

rebal_data.head()

for i in range(12, rebal_data.shape[0]):
    date = rebal_data.index[i]
    print(date)
    
    m6 = rebal_data[ticker].iloc[i]/rebal_data[ticker].iloc[i-6] -1
    top3 = m6.nlargest(3)

    res = {}
    for j in range(3):
        if top3.iloc[j] <= 0:
            name = "BIL"
        else:
            name = top3.index[j]
        
        if name in res.keys():
            res[name] += 100/3
        else:
            res[name] = 100/3
    
    print(res)
    print("="*50)

강환국님이 올려주신 채권 동적자산배분 투자 종목 (2022.02부터 추가 됨)
 
2월 - 채권 동적자산배분: SHY 100%
3월 - 채권 동적자산배분: SHY 66.7%, TIP 33.3%
4월 - 채권 동적자산배분: SHY 100%
5월 - 채권 동적자산배분: SHY 100%
6월 - 채권 동적자산배분: SHY 100%
7월 - 채권 동적자산배분: 현금 100%
8월 - 채권 동적자산배분: 현금 100%

10월 - 채권 동적자산배분: 현금 100%
11월 - 채권 동적자산배분: 현금 100%
12월 - 채권 동적자산배분: 현금 100%

SHY가 100%가 어떻게 나오는지 모르겠지만,

(로직상 SHY는 최대 33.3%일텐데....)

SHY가 BIL라고 생각하면 맞게 나온 것 같습니다.

 

SHY가 100% 나오는 이유 아시는 분이 있다면 알려주시면 감사하겠습니다!!

반응형
Comments