https://gg4ever1724.tistory.com/58
[투자] 미국주식 백테스트 웹사이트 개발했습니다.
http://etfbacktester.ddns.net:8501/Streamlitetfbacktester.ddns.net:8501최근 미국주식 ETF에 대해 공부하면서 백테스팅을 하고 싶어서, Yahoo Finance나 Seeking Alpha 같은 사이트를 찾아보았는데 백테스트 시간도 오래
gg4ever1724.tistory.com
미국주식 기반 백테스트를 목적으로 웹사이트 개발을 하기로 결정했다. 개발이 필요했던 이유는 yahoo finance를 비롯한 미국 투자사이트에서 백테스트를 할려면 유료 구독을 해야 했기 때문에, Yahoo Finance에서 직접 API를 통해 효율적으로 백테스트를 할 수 있도록 하기 위해서이다.
이왕 개발을 하는 김에, 나에게 필요한 기능을 추가하기로 결정했다. 나는 배당성장주 기반 장기투자를 할 것이기 때문에, 다음과 같은 기능이 필요했다.
- 미국 주식을 티커(ex: SPY, SCHD, QQQ)를 통해 지정할 수 있도록 한다.
- 여러 종목을 추가해 비중으로 포트폴리오를 구성할 수 있도록 한다.(ex: SPY 70% + SCHD 30%)
- 벤치마크 전략을 추가해(ex: Benchmark : SPY 100%) 비교할 수 있도록 한다.
- 초기자본에 더해, 월급을 추가할 수 있도록 하고, 월급의 경우 연봉 상승률을 적용할 수 있도록 한다
- 만약 다양한 ETF를 추가할 경우, 가장 최신 출시된 ETF가 있는 지점부터 자동으로 백테스팅하도록 한다.
- 리밸런싱 주기를 커스터마이징하도록 한다(Month, Quarter, Half, Year)
이를 기반으로 내 친구 Gemini에게 물어본 결과 다음과 같은 친절한 답변을 해주었다.
Gemini said
미국 주식 백테스팅 어플리케이션 개발, 정말 흥미로운 프로젝트네요! 단순히 과거 수익률만 돌려보는 게 아니라 월급 투입, 연봉 상승률, 세부 리밸런싱 옵션까지 고려하신다니 실전 투자 시뮬레이션으로서 가치가 매우 높을 것 같습니다.
Windows 환경에서 Python을 활용해 이 로직을 구현하는 가이드를 잡아드릴게요.
🛠 추천 기술 스택 및 환경 (Windows)
가장 접근성이 좋고 강력한 조합입니다.
- 언어: Python (데이터 처리에 최적)
- IDE: VS Code (Windows에서 가장 깔끔합니다)
- 주요 라이브러리:
- yfinance: 야후 파이낸스 API를 통해 무료로 미국 주가 데이터를 가져옵니다.
- pandas: 시계열 데이터 관리 및 복리 계산의 핵심입니다.
- matplotlib 또는 plotly: 백테스팅 결과 시각화.
🏗 어플리케이션 설계 로직
백테스팅 엔진을 만들 때 고려해야 할 핵심 단계입니다.
1. 데이터 수집 (API)
yfinance를 사용하여 입력받은 티커(Ticker)들의 년치 종가 데이터를 다운로드합니다.
- 고려사항: 배당금이 재투자되는 '수정 종가(Adj Close)'를 사용해야 정확한 백테스팅이 가능합니다.
2. 현금 흐름 모델링 (Salary Logic)
매달 투입되는 금액을 계산하는 로직입니다.
- 월별 투입금: 초기 월급 / 12로 시작.
- 연봉 상승: 12개월마다 현재 투입금 * (1 + 연봉상승률)을 적용합니다.
3. 리밸런싱 알고리즘
설정한 주기(월, 분기, 반기, 년)가 되면 현재 포트폴리오의 비중을 확인합니다.
- 과정: 현재 자산 총액 계산 → 목표 비중(Weight)에 맞춰 각 주식의 보유 수량 조절(매수/매도).
- 계산식:
💻 핵심 코드 구조 (Python 예시)
전체 구현을 위한 뼈대 구조입니다. 이 흐름대로 코드를 작성하시면 됩니다.
import yfinance as yf
import pandas as pd
# 1. 환경 설정
tickers = ["SPY", "QQQ"]
weights = [0.6, 0.4] # 6:4 비중
initial_capital = 10000 # 초기 자본 ($)
monthly_salary = 3000 # 세후 월급 ($)
salary_growth = 0.05 # 연봉 상승률 (5%)
rebalance_freq = "Q" # 리밸런싱 주기 (M, Q, H, Y)
# 2. 데이터 불러오기
data = yf.download(tickers, start="2020-01-01")['Adj Close']
# 3. 백테스팅 루프
# 매월 투자일(매달 첫 영업일 등)을 기준으로 루프를 돌며 계산
# - 월급 투입
# - 주가 변동에 따른 자산 가치 업데이트
# - 주기별 리밸런싱 실행
📊 예상 결과물 레이아웃
백테스팅이 완료되면 다음과 같은 지표를 산출할 수 있습니다.
| 지표 | 설명 |
| Final Value | 년 후 최종 자산 평가액 |
| CAGR | 연평균 성장률 |
| MDD | 최대 낙폭 (가장 많이 깨졌을 때의 하락률) |
| Total Invested | 원금 합계 (초기 자본 + 매달 투입금) |
이를 기반으로 초기 웹사이트 기반 환경을 구성했다. 이후 자잘하게 Gemini를 학대(?)하며 내용 수정을 거쳐서 Local Host에서 동작하도록 다음과 같은 웹사이트를 최종 구성했다!

제미나이에게 추가로 조언을 구한 결과, CAGR, 변동성, Sharpe, MDD를 포함한 전체 성과를 표현해서 이 전략의 베네핏과 위험성을 평가하도록 했다.
추가로, SpreadSheet 형태로 나의 전략과 벤치마크 전략의 총 자산, 연 배당금, 자산 성장률, 배당 성장률, MDD를 연도별로 정리해서 csv 파일로 다운받을 수 있도록 정리했다.
추가로, Streamlit을 도입해서 웹페이지를 만들었다. Streamlit이란, Python 코드만으로 쉽게 대화형 웹 어플리케이션을 만들 수 있도록 해주는 오픈소스 파이썬 라이브러리로, 특히 Pandas 기반으로 분석한 데이터를 그래프로 보여줄 때 용이하다. 주로 이러한 웹사이트의 목표는 다음과 같기 때문이다.
- yfinance 라이브러리로 미국 주식 데이터를 수집해서,
- 그 값을 numpy에 담고,
- 그걸 Pandas의 Dataframe에 담아서,
- 최종적으로 streamlit에서 지원하는 차트를 통해 나타낸다.
예시는 다음과 같다.
import streamlit as st
import pandas as pd
import numpy as np
# 1. 제목 설정
st.title('간단한 스트림릿 앱')
# 2. 텍스트 출력
st.write("데이터를 표와 그래프로 보여줍니다.")
# 3. 데이터프레임 생성 및 표시
df = pd.DataFrame(
np.random.randn(10, 5),
columns=('col %d' % i for i in range(5))
)
st.dataframe(df) # 대화형 테이블
# 4. 상호작용 위젯: 슬라이더
x = st.slider('그래프 범위 설정', 0, 100, 50)
st.write(f'선택한 값: {x}')
# 5. 차트 그리기
st.line_chart(df)
이제 다음 포스트에서는 이 "로컬 페이지"를 라즈베리파이를 통해 "서버"에 올려서 "도메인"을 통해 접속하는 방법에 대해 설명하겠다.
'개발 > ETF Backtester' 카테고리의 다른 글
| ETF Backtester 개발(4)(完) : 라즈베리파이 DDNS IP 주소 자동 갱신 설정 (0) | 2026.02.17 |
|---|---|
| ETF Backtester 개발(3) : no-ip.com에서 무료 도메인 할당받기 (0) | 2026.02.16 |
| ETF Backtester 개발(2) : 공유기 설정으로 고정 IP 할당받기 (0) | 2026.02.16 |