코스피 ETF의 종류와 매월 일정금액을 투자했다면 그 결과는?!

목차

    2020. 7. 29. 17:00

    코스피 ETF는 여러가지 종류가 있습니다. 크게는 코스피 200을 추종하는 ETF, 코스피200과 반대로 움직이는 인버스 ETF, 배로 움직이는 레버리지 상품이 있습니다. 코스피ETF는 ETF상품에서도 가장 기본에 해당합니다. 그래서 삼성증권, 미래에셋증권 등 대부분의 운영사가 코스피 ETF상품을 보유하고 있습니다. 오늘은 코스피 ETF의 종류와 매월 일정금액을 투자했다면 그 결과는 어떻게 될지 알아보겠습니다.

     

     

    1. 코스피ETF란

    코스피 ETF는 코스피 지수를 추종하는 상품은 아니고, 정확히는 코스피200지수를 추종합니다. 코스피는 유가증권시장에 상장된 전체 종목을 포함하기 때문에, 운영하기가 어렵습니다. 그래서 시가총액이 상위군이고 거래량이 많은 종목 순으로 200 종목을 편입해 지수를 산출한 것인데요. 이 코스피200지수를 추종하는 상품이 우리가 코스피ETF 상품이라고 부르는 것입니다. ( 코스피 지수를 추종하도록 만든 ETF상품도 있습니다. )

     

    IRP계좌로 ETF를 매수하면, 수수료 뿐만 아니라 소득공제 혜택도 받을 수 있습니다.

     

     

    2. 코스피 ETF의 종류

    ETF의 종류는 네이버 증권에서 쉽게 확인할 수 있습니다. 네이버 증권의 주요시세정보에서 ETF를 클릭하고, 국내시장지수를 선택하면 61개의 ETF 상품을 확인할 수 있습니다. 이 중에서 코스피 200지수를 추종하는 시가총액 상위 ETF 상품을 알아보면 아래 5가지가 있습니다.

     

    ETF명

    시가총액
    (억원)

    운영사

    운영보수

    추적오차율

    1년 수익률

    KODEX 200 53,723 삼성자산운용 0.15% 0.59% 12.58%
    TIGER 200 26,415 미래에셋자산 0.05% 0.62% 12.59%
    KODEX 200TR 11,261 삼성자산운용 0.07% 0.38% 12.4%
    KBSTAR 200 11,086 케이비자산운용 0.045% 0.46% 12.62%
    ARIRANG 200 8,107 한화자산운용 0.04% 0.46% 12.46%

    - 20년 7월 29일 기준임

     

     

    ETF를 고를 때 거래가 활발하고 운영규모가 큰 것이 좋다고 합니다. 그래야 사고 팔기가 좋기 때문인데요. 수익률은 큰 차이가 없고, 추적오차율은 KODEX 200TR이 가장 낮습니다. 추적오차율은 추종하는 지수를 ETF가 얼마나 잘 따라가는지를 나타내는 지표로 낮을수록 좋습니다. TR은 배당금을 재투자한다는 의미입니다.

     

    KODEX 200TR은 KODEX 200과 같지만, 배당금을 배분하지 않고 자동재투자하는 상품입니다. 보수나 추적오차율 값은 좋으나 이 ETF는 17년11월에 출시된 상품으로 장기간 투자결과를 평가하기 어려워 제외하였습니다. 나머지 중에서는 운영보수가 가장 저렴한 ARIRANG200 ETF 상품을 선택하였습니다.

     

    매월 일정금액을 투자했을때 결과

     

    ARIRANG200을 매월 100만원씩 매수한다면 수익률은 어떻게 될까요. 이를 확인하는 방법은 여러가지가 있지만, 필자는 파이썬과 zipline이라는 패키지를 이용하였습니다. zipline에 대해서는 필자의 책을 참고하시면 되겠습니다.

     

    금융데이터를_위한_파이썬
    금융-데이터를-위한-파이썬

     

    우선 ARIRANG200 ETF의 거래 데이터를 FinanceDataReader패키지로 수집하였습니다. 필자의 책에서 만든 to_csv함수를 이용해서 수집했습니다.

     

    from kor_stock_to_csv import to_csv

     

    # arirang etf

    to_csv("152100","2015")

     

    데이터를 수집하고 난 후에는, zipline의 data bundle에 데이터를 등록해야 합니다. 터미널에서 아래와 같이 실행하여 kor_stocks라는 번들에 데이터를 등록하였습니다.

     

    > zipline ingest -b kor_stocks

     

    이제 매월 100만원씩 ETF를 매수한다고 가정하고, 코드를 작성하였습니다. 23일이 지난 후에 매수하는 것으로 하였습니다. 주식 거래일을 기준으로 하면 약 23일이 지난 후가 다음 달입니다. 작성한 코드는 buy_etf_monthly.py로 저장하였습니다.

     

     

    from zipline.api import order, record, symbol

     

    def initialize(context):

        context.i=0

        pass

     

    def handle_data(context, data):

        context.i+=1

        record(nth=context.i)

     

        if int(context.i)%23==0:

            buy_cnt=int(1000000/int(data.current(symbol('152100'), 'price')))

            order(symbol('152100'),buy_cnt)

            record(buy_cnt=buy_cnt)

            record(etf=data.current(symbol('152100'), 'price'))

        else:

            record(buy_cnt=0)

            record(etf=data.current(symbol('152100'), 'price'))

            pass

     

     

     

    터미널에서 아래와 같이 코드를 실행하여, 백테스트 결과를 얻었습니다.

     

    > zipline run -f buy_etf_monthly.py --start 2015-1-1 --end 2020-7-28 --bundle kor_stocks --trading-calendar XKRX -o buy_etf_monthly.pickle

     

    수익률을 아래와 같이 계산해보았습니다.

     

    import pandas as pd

     

    perf=pd.read_pickle('buy_etf_monthly.pickle')

     

    cnt_sum=perf["buy_cnt"].sum()

    print("총 매수수량: {}".format(cnt_sum))

     

    perf["buy_amt"]=perf["buy_cnt"]*perf["etf"]

    buy_sum=perf["buy_amt"].sum()

    print("총매수금액: {}".format(buy_sum))

     

    last_price=perf.loc[perf["nth"]==perf["nth"].max(),"etf"][0]

    cur_sum=cnt_sum*last_price

    print("평가금액: {}".format(cur_sum))

     

    print("수익률: {:.2f}%".format(cur_sum/buy_sum*100-100))

     

    [Out]:

    총 매수수량: 2257

    총매수금액: 58,286,328

    평가금액: 68,138,830

    수익률: 16.90%

     

    매수매도-차트
    코스피200ETF-가격흐름-매수시점(보라색)

     

     

    약 5년 6개월간 총 2,257주를 매수했습니다. 총 투자금액은 5,800만원 정도 되고, 평가금액은 6,800만원입니다. 수익률은 16.9%입니다. 필자가 욕심이 과했던 것인지 예상한 수익률보다는 낮습니다. 기간별 수익률을 감안하지 않더라도 이보다는 훨씬 높을 거라고 예상했습니다.

     

     

    책에서 다룬 pyfolio 패키지를 이용해서 연간수익률도 구해보았습니다.

     

    import pyfolio as pf

     

    pf.create_full_tear_sheet(perf.returns)

    pf.timeseries.perf_stats(perf.returns)[["Annual return"]]

     

    [Out]:

    Annual return    0.133696

     

    포스팅을 작성하다보니 글이 너무 길어졌습니다. 수익률이 잘 나오지 않은 이유에 대해서는 다음 포스팅에서 이어서 알아보겠습니다.

     

    Recommendation 포스팅