+) 매매 수수료 적용한 코드로 업데이트 했습니다. (매수 0.015%, 매도 0.23%)
+) 윈도우 폰트 문제 수정
국내 주식/ETF를 투자하기 전, 과거 데이터를 기준으로 자산 배분(리밸런싱) 전략 수익률을 확인해볼 수 있는 파이썬(python) 백테스트 코드입니다. 여러 종목을 분산투자하는 경우 특정 기간 동안 어느 정도의 수익을 낼 수 있는지 간단하게 확인해볼 수 있습니다. 매매 수수료는 보수적으로 0.3%를 적용 했으니 참고해주시기 바랍니다. 수수료율은 코드 상에서 수정 가능합니다.
이 코드는 파이썬 언어로 구현되어 있으며, 파이썬을 구동할 줄 아는 분들을 대상으로 설명하도록 하겠습니다. 국내 주식과 ETF 가격 정보는 네이버 금융 사이트를 크롤링 해서 읽어왔습니다. 본문 하단에 첨부한 코드를 다운로드 받아서 보시면 될 것 같고, 코드와 관련해 궁금하신 사항은 댓글로 남겨주시면 답변 드리도록 하겠습니다.
실행 환경
우선 해당 파이썬 코드를 실행하기 위해 설치해야 하는 패키지는 아래와 같습니다.
pip install requests
pip install pandas
pip install matplotlib
pip install beautifulsoup4
백테스트 로직
테스트 하고자 하는 기간과 자산 배분(리밸런싱) 기간 등을 설정 후 구동하면 다음과 같이 백테스트가 수행됩니다.
- 구성한 종목들을 초기 투자금과 종목 별 설정한 배분률에 따라 매수
- 단, 테스트 시작 날짜에 상장된 종목이 없는 경우 가장 먼저 상장된 날짜를 시작 날짜로 계산한다
- 월 단위 리밸런싱 기간을 설정하면, 투자 시작 후 해당 개월 수가 지날 때마다 리밸런싱을 수행한다
- 월 적립금을 설정하는 경우, 매월 해당 적립금에 대해 각 종목 별 설정 비율대로 추가 매수한다
- 리밸런싱 하는 월에는 월 적립금을 포함하여 리밸런싱을 수행한다
- 최종 수익률은 원금 대비 최종 평가액이 몇 배(ratio)인 지를 계산한다
- 매매 수수료는 매수 0.015%, 매도 0.23%로 적용
백테스트 환경 설정
백테스트할 종목 구성(포트폴리오), 투자금, 투자기간 등 전략은 첨부파일 중 'StockInfo.json' 파일에 작성합니다.
여러 포트폴리오를 한 번에 테스트할 수 있으며, 아래 작성 방법을 참고하시기 바랍니다.
- num_of_portfolio: 테스트 할 포트폴리오 셋 개수입니다. 1~N
- portfolio_0 ~ portfolio_N: 포트폴리오 별 설정 정보입니다. 구성 종목과 투자 비율, 초기 자금, 월 신규 투자 금액, 리밸런싱 월 단위 등을 설정합니다.
- stock_list: 포트폴리오 별 구성 종목과 투자 비율을 입력합니다. portfolio_N 마다 작성해줘야 합니다.
- balance: 초기 투자 금액. portfolio_N 마다 작성해줘야 합니다.
- monthly_amount: 매월 추가 납입 금액입니다. 0으로 입력 시 추가 납입 없이 리밸런싱만 테스트 합니다. portfolio_N 마다 작성해줘야 합니다.
- interval_month: 리밸런싱할 개월 수 입니다. 3개월마다 리밸런싱 하는 경우 3으로 입력하면 됩니다. portfolio_N 마다 작성해줘야 합니다.
{
"num_of_portfolio": 1, // 테스트 할 포트폴리오 갯수
"start_from_latest_stock": "true",
"portfolio_0": { // 포트폴리오 구성 및 테스트 환경 설정
// portfolio_숫자 형태로 작성해야 하며, 0부터 시작
// 위 포트폴리오 개수를 2로 입력한 경우 portfolio_0, portfolio_1 과 같이 작성
"stock_list": [ // 종목 구성 정보
[
"005930", // 종목 코드
"삼성전자", // 종목명
0.25 // 투자 비율
],
[
"000660",
"SK하이닉스",
0.25
],
[
"005380",
"현대차",
0.25
],
[
"033780",
"KT&G",
0.1
],
[
"088980",
"맥쿼리인프라",
0.15
]
],
"balance": 5000000, // 초기 투자 금액
"monthly_amount": 300000, // 월 추가 적립 금액
"interval_month": 3, // 리밸런싱 할 월 단위
"start_date": "20120101", // 백테스팅 시작 날짜
"end_date": "20220506" // 백테스팅 종료 날짜
}
}
백테스팅 결과
테스트 결과는 동일 폴더 내에 'stock_backtest.png' 라는 이미지 파일로 저장됩니다.
실제로 두 개의 포트폴리오를 가지고 테스트를 하면 아래와 같은 그래프 이미지가 만들어지게 됩니다. 개별 종목의 최초 매수가 대비 수익률과 본인이 구성한 포트폴리오(Backtest) 수익률을 비교해볼 수 있습니다. 각 항목 별 최종 수익률은 각 종목 명 우측에 표시됩니다.
ex) Backtest (2.87) --> 설정한 포트폴리오의 최종 평가액은 원금 대비 2.87배, 수익률은 187%
파이썬 코드 다운로드
아래 파일을 다운로드 하시면 되며, 자유롭게 사용하시되 무단 배포는 하지 말아 주세요 :)
코드 수정 버전 추가 공유합니다. 기존 코드는 마지막 리밸런싱 날짜까지만 수익률을 계산하는 형태였고, 새로 공유하는 버전은 백테스트 기간으로 설정한 마지막 날까지의 수익률을 보여주도록 개선했습니다.
리밸런싱 엑셀 관리
실제 투자를 시작한 후 간단하게 계좌 별 투자 관리를 하고자 하신다면 아래 포스팅에 올려둔 엑셀(스프레드시트)를 사용하시면 도움이 될 것 같습니다. 계좌 별 투자하고 있는 종목과 수익률을 체크해볼 수 있고 리밸런싱 할 때 매수/매도를 얼마나 해야 하는 지 한 눈에 파악할 수 있습니다.
2022.05.17 - [재테크 초짜] - 국내 주식/ETF 리밸런싱 엑셀 투자 관리/계산
자산 비중 변동 기준 리밸런싱 전략 백테스트
이번 포스팅에서 다룬 일정 기간마다 리밸런싱 하는 전략이 아닌, 종목별 자산 비중의 변동 정도에 따라 리밸런싱 하는 전략도 있습니다. 비중 변동 기준 백테스트 코드가 궁금하시면 아래 포스팅도 함께 읽어보시기 바랍니다.
2022.06.09 - [재테크] - 국내주식/ETF 비중변동기준 리밸런싱 전략 백테스트 파이썬