Data Analysis/Python for DA

[Invest Class] 1. buyandhold 함수 생성

Jiyeon's Desk 2025. 3. 28. 00:08

1. buyandhold : 매수 후 일정 기간 동안 유지한 뒤 매도하여 수익률 구하기

 

* Adj Close를 사용하는 이유:

adjusted close는 기업의 주식 분할, 배당금 지급 등의 이벤트를 반영해서 조정한 가격이다. 과거 주식의 수익률을 계산하거나 시계열 데이터 분석 및 포트폴리오 수익률 계산 시 사용되어지고 배당과 주식분할 등의 이벤트를 반영한 '실제 투자자가 체감한 수익률 기준'의 가격이다.

 

*  일별 수익률 구할때 주의점:

오늘의 수정종가/ 전날의 수정종가 식으로 구할때 첫번째 데이터는 이전날의 데이터가 없기때문에 결측치 발생

->

AAPL['daily_rtn'] = \
    (AAPL['Adj Close'] / AAPL['Adj Close'].shift()).fillna(1)

 

* 수익률/ 누적수익률 구하는 법 

수익률 -> pct_change() 함수 혹은 shift() 함수 이용하기

# pct_change() 함수를 이용하여 일별 수익율 
AAPL['daily_rtn2'] = \
    (AAPL['Adj Close'].pct_change() + 1).fillna(1)

AAPL['daily_rtn'] = \
    (AAPL['Adj Close'] / AAPL['Adj Close'].shift()).fillna(1)

 

누적 수익률-> for문 혹운 cumprod()함수 이용하기

rtn = 1

for i in range(len(AAPL)):
    # i가 의미하는것은? 데이터프레임의 위치
    rtn *= AAPL.iloc[i, 1]

rtn
# cumprod() : 누적곱 함수 
AAPL['daily_rtn2'].cumprod()

 

* 시계열 데이터로 필터링

start_time = "2010-01-01"
end_time = "2015-12-31"
start = pd.to_datetime(start_time)
end = datetime.strptime(end_time, '%Y-%m-%d')

 AAPL.loc[start : end, ['Adj Close']]

 

 

2. buyandhold 함수 생성하기

일정기간 유지후 누적수익률을 되돌려 주는 함수를 생성

 

def buyandhold(_df, start="2010-01-01", end=datetime.now(), col = 'Adj Close'):
    df = _df.copy()
    if 'Date' in df.columns:
        df.set_index('Date', inplace = True)
    df.index = pd.to_datetime(df.index)
    
    try:
        start = pd.to_datetime(start)
        if isinstance(end,str):
            end = datetime.strptime(end, "%Y-%m-%d")
    except:
        print("잘못된 형식임")
        return ""
    
    df = df.loc[start:end, [col]]
    df['daily_rtn'] = (df[col].pct_change()+1).fillna(1)
    df['acc_rtn'] = df['daily_rtn'].cumprod()
    acc_rtn = df.iloc[-1,2]
    print(f"""
          From {start.strftime('%Y-%m-%d')} to {end.strftime('%Y-%m-%d')},
          your accumulated return is {df.iloc[-1,2]}.
          """)
    return df, acc_rtn

 

* 시작시간과 종료시간에 try , except 구문을 사용하는 이유 ->

시작시간과 종료시간이 올바른 날짜 형식인지 확인하고 잘못됐을 경우 사용자에게 메세지를 보여주기 위해서. 또한 사용자가 이미 datetime객체인 end값을 문자열로 전달하면 datetime객체로 변환해주어 에러 방지

 

bnh_amzn, rtn_amzn = buyandhold(amzn, start = '2015-01-01')

 

 

결과값 잘나옴!