본문 바로가기

코딩/퀀트 투자

파이썬으로 S&P 500 지수 투자 분석하기 (VOO ETF 편)

1. 목표

 

S&P 500 지수에 투자를 하는 VOO ETF의 매수 타이밍과 주가 수익률 간의 관계를 분석하는 것이다.

 

이때 매수 타이밍은 등락률을 기준으로 설정하고, 매수 타이밍으로부터 1~36개월 후의 수익률을 등락률에 따라 비교했다.

 

분석에 사용된 자료는 investing.com의 VOO ETF의 2010.09.10부터 2021.08.20까지의 자료를 사용해서 분석했다.

 

위와 같은 분석 방법을 사용하게 된 자세한 이유가 궁금하다면 아래 블로그의 글을 참조하면 된다. 

 

 

[주식 공부] 퀀팅으로 매수 타이밍과 주가 수익률 관계성 평가 (S&P 500)

S&P 500 지수 투자 시 매수 타이밍 맞추는 투자가 효과적일까? 이번 퀀팅은 아이디어를 찾다 쉽게 해...

blog.naver.com

 

 

2. 내용

 

아래의 함수는 기준이 되는 등락률인 change, 몇 개월 후의 수익률을 계산할지를 설정하는 months 두 개의 parameter를 받아,

 

등락률이 change 미만인 모든 날짜를 매수 타이밍으로 설정해서 그 날짜들로부터 months 개월이 지난 후의 수익률을 포함하는 dataframe의 형태로 return 하는 함수이다. 

 

 

 

이 함수는 다음과 같이 작동한다.

1. 분석할 데이터를 excel에서 dataframe으로 읽어온다.

2. 읽어온 dataframe에서 등락률 즉 'Change %' 열이 change(parameter) 이하인 index(date 정보를 담고 있다.)를 list에 저장한다.

3. list에 저장된 index의 date 정보를 사용해서 months(parameter) 개월 후의 수익률을 계산하고, 이를 새로운 dataframe에 저장하고, 새로운 dataframe을 return 한다.

 

 

import pandas as pd
from dateutil.relativedelta import *
from datetime import datetime, timedelta

def VOO_analysis(change, months):
    df = pd.read_csv('VOO Historical Data.csv', index_col='Date')
    df.index = pd.to_datetime(df.index).strftime('%Y-%m-%d')
    df = df.sort_index()

    df_comp = df[['Price', 'Change %']]

    buy_date = []

    for i in range(len(df_comp)):
        string = df_comp.iloc[i, 1]
        if float(string[:-1]) < change:
           buy_date.append(df_comp.index[i])

    month_index = f'{months}-month'
    result = pd.DataFrame(index=buy_date, columns=['present', month_index, 'Change %'])

    for date in buy_date:
        result.loc[date, 'present'] = df_comp.loc[date, 'Price']
        comp_date = (datetime.strptime(date, '%Y-%m-%d') + relativedelta(months=months)).strftime('%Y-%m-%d')
        if comp_date in df_comp.index.tolist():
            result.loc[date, month_index] = df_comp.loc[comp_date, 'Price']
        else:
            while pd.to_datetime(comp_date) < pd.to_datetime('2021-08-20'):
                comp_date = (datetime.strptime(comp_date, '%Y-%m-%d') + timedelta(days=1)).strftime('%Y-%m-%d')
                if comp_date in df_comp.index.tolist():
                    result.loc[date, month_index] = df_comp.loc[comp_date, 'Price']
                    break

    for i in range(len(result)):
        result.iloc[i, 2] = (result.iloc[i, 1] - result.iloc[i, 0]) / result.iloc[i, 0] * 100

    result = result.dropna()

    return result

 

 

이 함수가 return 하는 dataframe은 다음과 같다.

 

예를 들어, 등락률이 -1% 미만인 날짜들을 매수 타이밍으로 잡고, 매수 타이밍으로부터 3개월 후의 수익률을 출력해보면 다음과 같이 출력이 된다.

 

 

print(VOO_analysis(-1, 3))

 

위의 코드를 실행한 결과

 

 

3. 결과

 

위 함수를 이용해서 매수 타이밍을 각각 무작위, 0% 미만, -1% 미만, -1.5% 미만, -2% 미만으로 했을 때 1 ~ 36개월 후의 수익률을 계산해보면 다음과 같은 결과가 나온다. 

 

(이때 100% 미만은 주어진 기간 내의 모든 데이터를 매수 타이밍으로 설정한 결과를 확인하기 위해서 change를 100으로 설정한 것이다.)