적립식 투자자를 위한 개인화된 ETF/주식/코인 포트폴리오 리밸런싱 계산기입니다. 매월 투자할 예산과 현재 보유 종목·목표 비율을 입력하면 어떤 종목을 얼마나 매수해야 하는지 자동으로 계산해 줍니다.
지원 시장: 한국 ETF/주식 (Naver Finance) · 미국 주식/ETF (Yahoo Finance) · 암호화폐 (Upbit)
-
🌏 다중 시장 지원
- KR (한국): Naver Finance, 6자리 영숫자 티커 (예:
069500) - US (미국): Yahoo Finance, 1~10자 티커 (예:
AAPL,ES=F,GC=F) - CRYPTO (코인): Upbit KRW 마켓, 2~10자 대문자 티커 (예:
BTC,ETH) - 티커 입력 시 현재가 자동 조회 (debounce 600ms)
- US 자산은 Yahoo Finance 실시간 환율(USD→KRW)로 자동 환산, 10분 캐시
- KR (한국): Naver Finance, 6자리 영숫자 티커 (예:
-
🔀 수량·금액 기준 매수 선택
- 자산별로 수량 기준(주) 또는 금액 기준(원) 매수 방식을 토글로 선택 가능
- 수량 기준: 정수 주 단위로 계산 (한국 ETF 기본값)
- 금액 기준: 소수점 수량 계산 — 코인·소수점 주식에 적합 (CRYPTO 기본값)
-
🔒 100% 클라이언트 사이드 연산 (Privacy-First)
- 모든 계산과 데이터 관리가 브라우저 내부에서 수행됩니다.
- 서버는 외부 금융 API의 CORS 프록시 역할만 담당하며, 자산 데이터를 저장하지 않습니다.
- 다수의 사용자가 동시에 접속해도 완전히 독립적으로 동작합니다.
-
💾 JSON 데이터 Import / Export (v2)
- 포트폴리오 상태(시장·통화·매수방식·보유량 등)를
.json파일로 저장하고 언제든 불러올 수 있습니다. - v1 형식 자동 마이그레이션 지원.
- 포트폴리오 상태(시장·통화·매수방식·보유량 등)를
-
🎯 스마트 리밸런싱 알고리즘
- 목표 총 자산(현재 자산 + 이번 달 예산)을 기준으로 각 종목의 목표 금액을 산출합니다.
- 예산 초과 시 비례 축소 로직이 자동으로 적용됩니다.
- 0% 목표 비율 지원: 더 이상 추가 매수하지 않고 보유만 유지할 종목도 포트폴리오에 남겨둘 수 있습니다.
-
📊 시각화 및 직관적인 UI/UX
- 매수 전/후의 비율을 비교할 수 있는 인터랙티브 바 차트 제공
- 모바일 기기에서도 완벽하게 작동하는 반응형(Responsive) 웹 디자인 (Light Theme)
- HTML5 / CSS3 (CSS Variables, Flex/Grid 기반 반응형 레이아웃)
- Vanilla JavaScript (ES2022+) (프레임워크 없이 가볍고 빠른 동작)
- Python 3.13 / FastAPI / Jinja2 (정적 파일 및 CORS 프록시)
- httpx (비동기 HTTP 클라이언트)
- uv (패키지 관리 및 가상환경)
- ruff (Lint & Format) / pyright (타입 체크)
- Docker (멀티 스테이지 컨테이너)
- Fly.io (클라우드 배포, Auto-stop/start 적용으로 리소스 최적화)
# 저장소 클론
git clone <repository-url>
cd ETF_Rebalancer
# 개발 서버 시작 (hot-reload)
make dev브라우저에서 http://localhost:8080으로 접속합니다.
기타 make 명령:
make test # 테스트 실행
make lint # ruff check + pyright
make build # Docker 이미지 빌드
make clean # 컨테이너/이미지 정리git clone <repository-url>
cd ETF_Rebalancer
# 의존성 설치 (uv가 Python 3.13 + 가상환경을 자동 생성)
uv sync
# FastAPI 서버 실행
uv run uvicorn app.main:app --reload --host 0.0.0.0 --port 8000브라우저에서 http://localhost:8000으로 접속합니다.
# 이미지 빌드
docker build -t etf-rebalancer .
# 컨테이너 실행 (포트 8080 매핑)
docker run -p 8080:8080 etf-rebalancer이 프로젝트는 Fly.io 배포에 최적화된 fly.toml을 포함하고 있습니다. (도쿄 nrt 리전 기준)
fly auth login
fly deployETF_Rebalancer/
├── app/
│ ├── main.py # FastAPI 앱
│ │ # GET /api/price/{ticker}?market=KR|US|CRYPTO
│ │ # GET /api/rate/{pair} (예: USDKRW)
│ ├── static/
│ │ ├── app.js # 리밸런싱 계산 + UI 로직 (전부 클라이언트 사이드)
│ │ └── style.css # UI 스타일링 (Light Theme)
│ └── templates/
│ └── index.html # SPA 진입점
├── tests/
│ └── test_main.py # pytest 테스트
├── .github/
│ └── workflows/
│ └── fly-deploy.yml # GitHub Actions CI/CD
├── Dockerfile # 멀티 스테이지 빌드 (production, dev)
├── docker-compose.yml # 개발/테스트 컨테이너 설정
├── Makefile # 개발 작업 단축 명령
├── fly.toml # Fly.io 배포 설정 파일
├── pyproject.toml # 프로젝트 설정 및 의존성
└── uv.lock # 의존성 잠금 파일
- 예산 설정: 화면 상단에 이번 달 투자 예산(₩)을 입력합니다.
- 포트폴리오 구성:
- [ETF 추가] 버튼을 눌러 종목을 추가합니다.
- 시장 선택 → 종목코드 입력 시 현재가 자동 조회
- 종목명, 보유 수량, 목표 비율(%) 입력 (합계 100%)
- 보유 수량 오른쪽의
주/원버튼으로 매수 방식 전환:주— 수량 기준 (정수 주 단위, 한국 ETF 기본)원— 금액 기준 (소수점 수량, 코인·소수점 주식 기본)
- 계산하기: [리밸런싱 계산하기] 버튼(또는 Enter)을 누릅니다.
- 결과 확인: 표와 차트에서 매수 수량·금액 및 최종 비율을 확인합니다.
- 저장: [내보내기]로 현재 상태를
.json으로 저장하고, 다음 달에 [불러오기]로 이어서 사용합니다.
본 애플리케이션의 계산 결과는 사용자가 입력한 데이터를 바탕으로 한 수학적 산출 결과일 뿐이며, 투자 권유나 재무적 조언을 목적으로 하지 않습니다. 실제 매매 시에는 주식 시장의 호가 단위, 수수료, 세금 등에 의해 오차가 발생할 수 있으므로 반드시 투자 판단의 참고용으로만 사용하시기 바랍니다.