6/21 윈도우 폰트 문제 수정
지난 포스팅에서는 국내 주식과 ETF 투자 시 특정 기간 또는 특정 월/일마다 리밸런싱을 하는 전략들에 대한 파이썬 백테스트를 구현해봤습니다. 그런데 리밸런싱을 꼭 '기간'을 기준으로 하는 게 가장 좋은 방법일까요? 리밸런싱을 하는 이유는 자산 배분율을 일정하게 유지해나가면서 익절과 추매를 자연스럽게 하게됨으로써 계좌 수익률의 안정성을 확보하고 꾸준히 우상향을 만들어나가기 위함입니다. 그렇다면 리밸런싱을 고정된 시기가 아닌 종목별 비중에 변동이 생기는 날을 기준으로 리밸런싱을 한다면 리밸런싱의 목적에 더 가깝지 않을까요? 그래서 오늘은 종목 별 투자금액의 비중이 변화한 정도에 따라 리밸런싱을 하는 전략을 파이썬으로 백테스트 해보려고 합니다. 테스트 방법과 코드 실행 방법에 대해서 설명드리겠습니다.
비중 변동 기준 리밸런싱 백테스트 전략
첨부 파일 중 StockInfo4.json 파일에 설정한 테스트 시작/종료일과 구성 종목 및 비율, 투자금에 따라서 다음과 같이 동작합니다. 리밸런싱을 할 기준인 변동률(%)은 코드 상에서 직접 입력해야 하며, 이는 아래에서 추가로 설명하도록 하겠습니다.
- 국내 상장된 주식 및 ETF를 대상으로 테스트
- 테스트 시작일의 종가를 기준으로 초기 투자금으로 설정한 비율만큼 전 종목 매수
- 단, 테스트 시작일에 상장되지 않은 종목이 있다면, 모든 종목이 상장된 날을 기준으로 테스트 시작
- 테스트 기간 동안 단일 종목에 대해서, 초기 설정 비율 대비 N% 이상 차이가 발생한 날 전종목 리밸런싱을 수행 (3%로 설정한 경우, 초기 비율이 25%이면 테스트 기간 중 비율이 22%이하 또는 28%이상이 되는 경우에 리밸런싱을 수행한다)
- 최종 수익률은 원금 대비 몇 배가 증감했는 지를 그래프로 나타냄
- 매수 수수료는 0.015%, 매도 수수료는 0.23%로 설정함 (코드에서 수정 가능)
파이썬 패키지 설치
이 전략을 구현한 파이썬 코드를 실행하기 위해서는 아래 패키지를 설치해야 합니다.
pip install requests
pip install pandas
pip install matplotlib
pip install beautifulsoup4
pip install numpy
백테스트 설정 방법
StockInfo4.json 파일에 아래 내용을 입력해야 합니다.
- name: 결과 그래프를 저장할 파일명
- balance: 초기 투자금
- start_date: 테스트 시작 날짜
- end_date: 테스트 종료 날짜
- stock_list: 투자 할 국내 상장된 주식/ETF 종목 리스트. 종목코드/종목명/투자비율(0~1)을 순서대로 입력
{
"portfolio": {
"name": "단일N%_변동시_리밸런싱",
"balance": 1000000,
"start_date": "20120101",
"end_date": "20211231",
"stock_list": [
[
"005930",
"삼성전자",
0.2
],
[
"000660",
"SK하이닉스",
0.2
],
[
"033780",
"KT&G",
0.2
]
...
]
}
}
리밸런싱 할 기준 %를 설정하기 위해서는 stock_backtest_4.py 파일의 354라인에 있는 for문을 수정하면 됩니다.
# 테스트해볼 % 범위를 설정
# 1) 0.01 (1%) 부터 0.1 (10%) 까지 0.01 단위로 테스트 하려는 경우 아래와 같이 작성
# for change_pct in numpy.arange(0.01, 0.11, 0.01):
# 2) 0.01 (1%) 부터 0.05 (5%) 까지 0.005 (0.5%) 단위로 테스트 하려는 경우 아래와 같이 작성
# for change_pct in numpy.arange(0.01, 0.055, 0.005):
# 3) 특정 %만 테스트 하고자 하는 경우 (2%, 4%, 5%, 8%)
# for change_pct in [0.02, 0.04, 0.05, 0.08]:
for change_pct in numpy.arange(0.01, 0.11, 0.01):
# backtest 수행
매수/매도 수수료를 변경하고자 한다면 stock_backtest_4.py 파일의 86, 88라인을 수정하시면 됩니다.
if last_stock_num < stock_num:
fee = 0.00015 # 매수 수수료
else:
fee = 0.0023 # 매도 수수료
리밸런싱 백테스트 결과
이번 샘플 테스트에서는 10년동안 단일 종목의 비중이 1~10% 이상 차이가 발생하는 날 리밸런싱을 하는 경우 얼마나 수익이 발생하는 지를 백테스트 해보았습니다. 1%로 설정 시, 2%로 설정시, ... 10%로 설정 시 각각에 대한 수익률을 하나의 그래프로 나타내고, 각 설정 %별 테스트 기간 동안의 리밸런싱 횟수(리밸런싱이 발생한 날)와 최종 계좌 총액이 얼마나 되는 지는 콘솔에 출력합니다.
아래 결과를 살펴보면, 우선 리밸런싱을 하지 않고 최초 매수 후 보유만 한 경우 최종 평가액은 초기 투자금 대비 2.86배가 됩니다. 수익률은 186%로 표현할 수 있겠네요. 그렇다면 리밸런싱을 했을 때, 1%~10% 중 어떤 전략의 수익률이 가장 높은 지를 확인해보겠습니다. 가장 높은 수익률을 낸 전략은 7%로 설정한 케이스입니다. 무려 원금 대비 3.42배나 증가를 한 것을 알 수 있습니다. 수익률로 보면 242%네요. 가장 낮은 수익률을 기록한 것은 10%로 설정한 케이스입니다. 그럼에도 불구하고 리밸런싱을 하지 않았을 때보다는 높은 수익률을 기록했습니다.
그래프 하단 콘솔 출력 결과를 좀 더 살펴보면, 리밸런싱을 하기 위한 기준 %를 너무 낮게 설정하는 경우 리밸런싱을 하게 되는 날이 상당히 많은 것을 알 수 있습니다. 1%로 설정 시 리밸런싱을 한 날이 무려 2429일이나 되고, 10%로 설정 시에는 단 6일만 리밸런싱을 수행했습니다. 리밸런싱을 많이 하게 되면 매매 수수료가 그만큼 많이 발생하기 때문에 수익률이 생각보다 좋지 않습니다. 만약 수수료에 따른 수익률을 비교해보고 싶으면 위에서 말씀드린 코드를 수정하여 비교해볼 수 있습니다.
--------
Rebalancing change_pct %: 1.0
Total Balance : 3100073
Investment Amount: 1000000
Total Profit : 3.100073
Rebalancing Count: 2429
--------
Rebalancing change_pct %: 2.0
Total Balance : 3043312
Investment Amount: 1000000
Total Profit : 3.043312
Rebalancing Count: 1773
--------
Rebalancing change_pct %: 3.0
Total Balance : 3053558
Investment Amount: 1000000
Total Profit : 3.053558
Rebalancing Count: 887
--------
Rebalancing change_pct %: 4.0
Total Balance : 3044560
Investment Amount: 1000000
Total Profit : 3.04456
Rebalancing Count: 389
--------
Rebalancing change_pct %: 5.0
Total Balance : 3105057
Investment Amount: 1000000
Total Profit : 3.105057
Rebalancing Count: 167
--------
Rebalancing change_pct %: 6.0
Total Balance : 3046280
Investment Amount: 1000000
Total Profit : 3.04628
Rebalancing Count: 29
--------
Rebalancing change_pct %: 7.0
Total Balance : 3416130
Investment Amount: 1000000
Total Profit : 3.41613
Rebalancing Count: 31
--------
Rebalancing change_pct %: 8.0
Total Balance : 3162643
Investment Amount: 1000000
Total Profit : 3.162643
Rebalancing Count: 10
--------
Rebalancing change_pct %: 9.0
Total Balance : 3279811
Investment Amount: 1000000
Total Profit : 3.279811
Rebalancing Count: 8
--------
Rebalancing change_pct %: 10.0
Total Balance : 2995885
Investment Amount: 1000000
Total Profit : 2.995885
Rebalancing Count: 6
리밸런싱 백테스트 파이썬 코드
아래 첨부 파일을 받아서 실행해보시면 됩니다. 요즘 투자에 관심을 갖게 되면서 리밸런싱과 같은 간단한 전략을 제 입맛대로 백테스트 해보기 위해 파이썬 코드를 구현해보고 있습니다. 저와 같은 분들에게 조금이나마 도움이 되길 바라며, 코드는 자유롭게 수정하여 사용하시면 되고 원본은 무단 배포하지는 말아주시길 바랍니다.
특정 기간마다 리밸런싱 하는 전략 포스팅
2022.05.17 - [재테크] - 국내 주식/ETF 포트폴리오 리밸런싱 백테스트 파이썬 코드
2022.06.01 - [재테크] - 주식 투자 리밸런싱 수익률 비교 (파이썬 백테스트)
2022.06.04 - [재테크] - 주식투자 연간 리밸런싱 최적의 시기는? 파이썬 백테스트