본문 바로가기

데이터분석/금융

python 활용 투자 포트폴리오 [1화: AI ETF와 비교한 수익률 백테스팅]

데이터 분석을 어디에 쓰면 좋을까, 고민하다가 게임을 시작했고 (핑계에 가깝지만) 결과는 신통치 않다. 딱히 데이터 분석을 하고 있는지도 잘 모르겠는 것이다. 그러던 와중에 재테크 책인 강환국 "거인의 포트폴리오"를 읽게 되었다. 아하, 데이터 분석이 주목을 많이 받는 분야는 여기였구나! 싶었더랬다.

 

23가지 전략?

 

근데 보이는가? 23가지 전략이라니 많기도 하다. 다시금 python을 꺼내들지 않을 수가 없었다. 어떻게 23가지를 손으로 일일이 다 계산한담? 기존 시행착오에서 pykrx라는 모듈을 잘 써먹을 수 있겠거니 하고 정리해둔 바 있다. 2021년 1월 글이니 거진 3년이 다 되어가는 글이다. 이럴 때 글로 적어두길 참 잘했다 싶다.

 

 

Python를 활용한 코스피 재무 데이터 확인 방법 3 + 1가지

"데이터를 만지려면 크롤링은 기본이지" 이렇게 말한 친구가 있었다. 크롤링이란, 인터넷에 있는 데이터를 코드를 통해 자동으로 긁어오도록 만드는 작업을 뜻하는데 예를 들면 네이버 금융을

mech-literacy.tistory.com

 

그런데 웬걸, 책에서 추천하는 미국 주식 거래에는 pykrx가 영 신통치 않았다. 국내 주식 거래 데이터를 다루기 때문이다. 결국 yfinance 모듈을 사용해서 데이터를 수집하게 되었다. yfinance에도 국내 주식이 올라와 있긴 하지만 누락된 데이터가 많다고 한다.

 

 

데이터를 모으고 나니, 모의 거래 방법을 선택해야 했다. "뭐 잘 정리된 라이브러리 쓰면 되지 않을까?" 싶었는데, 아니나다를까 backtesting.py라는 좋은 python library가 있었다. 멋진 그래프까지 한큐에 그려주는 모듈이었다. 

 

어디 포트폴리오를 한 번 구성해볼까~ 하고 나섰던 것도 잠시, backtesting.py 에서는 한 번에 하나의 종목만 보여질 수 있었다. 이러면 "포트폴리오"를 구성한다는 의미가 사라진다. 다양한 코드를 추가하면 어떻게 가능은 할 수 있겠다만, 그러느니 내가 처음부터 백테스팅을 구현해보기로 했다. 

 

import numpy as np
import finplot as fplt
import yfinance as yf

ticker = yf.Ticker("IWD") # 미국 대형 가치주
start_date = "2022-01-01"
end_date = "2022-12-31"
iwd = ticker.history(start=start_date, end=end_date)

ticker = yf.Ticker("GLD") # 금
gld = ticker.history(start=start_date, end=end_date)

ticker = yf.Ticker("IEF") # 미국 중기 국채
ief = ticker.history(start=start_date, end=end_date)


asset = 10000
portion = [1/3, 1/3, 1/3]
num_item = 3
total_items = [iwd, gld, ief]
commission = 0.002
buying_prices = np.zeros([num_item, 1])
buying_vol = np.zeros([num_item, 1])
transaction = np.zeros([num_item, 1])
remain = 0

for i in range(num_item):
    item = total_items[i]
    buying_prices[i] = np.mean(np.array(item)[0,1:3])
    tmp = np.floor(asset*portion[i] / buying_prices[i])
    if tmp * buying_prices[i] + commission * tmp * buying_prices[i] < asset*portion[i]:
        buying_vol[i] = np.floor(asset*portion[i] / buying_prices[i])
    else:
        buying_vol[i] = np.floor(asset*portion[i] / buying_prices[i]) - 1
    transaction[i] = commission * buying_prices[i] * buying_vol[i]
    
remain = asset - np.sum(buying_prices * buying_vol) - np.sum(transaction)
print(buying_prices)
print(buying_vol)
print(buying_vol*buying_prices)
print(transaction)
print(remain)

portfolio = [None] * num_item
for i in range(num_item):
    portfolio[i] = total_items[i] * buying_vol[i][0]
    if i == 0:
        portfolio_sum = portfolio[0]
    else:
        portfolio_sum = portfolio_sum + portfolio[i].values
portfolio_sum
result = np.array(portfolio_sum)[-1,3]
print(result)

 

이것 참 뚝딱 아니겠는가? 한 시간도 안 걸렸다. 일단 처음에 포트폴리오를 구성하는 것만 해봤지만, 이런 식으로 사고 파는 전략을 만들 수 있지 않을까 싶다. 첫 번째 튜토리얼로 진행하려고 했던 것은, 미국 대형가치주 (IWD), 금 (GLD), 미국 중기국채 (IEF) 로 구성된 포트폴리오와 크래프트 AI ETF의 수익률 분석이다. AI ETF가 단순한 포트폴리오보다 성능이 얼마나 좋은지 비교하고자 했다. 

Qraft AI ETF 구성 방법 - 왜 Pabii 블로그는 실패했는가 (tistory.com)

 

Qraft AI ETF 구성 방법 - 왜 Pabii 블로그는 실패했는가

매주 하는 머신러닝 스터디 발표에서, 원래는 Pabii 블로그와 Qraft Technology의 키보드 배틀을 다루려고 했더랬다. 그런데 Qraft 사의 글을 읽으면 읽을수록 Pabii 블로그의 논지가 점점 말도 안되는 것

mech-literacy.tistory.com

 

분석 결과는 위와 같다. 이거 참 AI ETF의 처절한 실패가 아닐 수가 없다. 물론 전반적으로 하락장이기 때문에 모두 수익률이 마이너스인 것은 어쩔수 없지만, 사놓고 그냥 두기만 하는 buy and hold 전략의 포트폴리오보다도 한참 떨어지는 수익률인 것은 분명 문제가 있다. 

 

튜토리얼을 굳이 위 내용으로 잡았던 까닭은 "그냥 AI ETF에 투자해두면 내가 굳이 python으로 이런 거 안해도 되는 거 아냐?" 라는 의문을 해소하기 위함이었다. 이로서 내가 직접 데이터를 분석해봐야 한다는 명분이 선 셈이니, 앞으로도 열심히 해봐야겠다.