매달 자동으로 자산 비중 조정하는 방법
리밸런싱은 “자주”가 아니라 “일관되게” 하는 것이 핵심입니다. 이번 글은 코딩이 익숙하지 않은 분도 따라 할 수 있도록, 구글 시트 + 알림 + 간단 규칙만으로 월 1회 자동 리밸런싱 루틴을 만드는 방법을 정리했습니다.
1) 먼저 수치로 잠그는 가드레일
- 현금 버퍼: 계좌가치의 10~15%
- 리밸런싱 밴드(상대): ±20% (편차율이 20% 넘을 때만 조정)
- 노출 캡: 주식 합산 ≤ 55%, 상관 0.8↑ 쌍 합산 ≤ 25%, 섹터 ≤ 20%
- 실행 시간: 매월 1일 21:00 (장중 변경 금지)
- 비용·회전율: 월 회전율 ≤ 100%, 연 비용 ≤ 0.6%p
2) 시트 구조(복붙용)
아래 표를 그대로 구글 시트에 붙여넣고, ‘계좌가치(₩)’만 입력하면 나머지는 자동 계산되게 설계합니다.
자산 | 목표w | 현재w | 편차율=(현재-목표)/목표 | 밴드 | 조정액(₩) |
---|---|---|---|---|---|
국내주식 | 0.25 | =현재가치/계좌가치 | =(C2-B2)/B2 | 0.20 | =IF(ABS(D2)>E2, (B2-C2)*계좌가치, 0) |
해외주식 | 0.25 | =현재가치/계좌가치 | =(C3-B3)/B3 | 0.20 | =IF(ABS(D3)>E3, (B3-C3)*계좌가치, 0) |
채권 | 0.30 | =현재가치/계좌가치 | =(C4-B4)/B4 | 0.20 | =IF(ABS(D4)>E4, (B4-C4)*계좌가치, 0) |
현금 | 0.20 | =현재가치/계좌가치 | =(C5-B5)/B5 | 0.20 | =IF(ABS(D5)>E5, (B5-C5)*계좌가치, 0) |
노트: 계좌가치는 합계(국내주식+해외주식+채권+현금), 현재가치는 각 자산 항목의 현재 평가금액입니다.
3) 실행 규칙 — ‘필요한 자산만, 조금만’
- |편차율| > 밴드(0.20)인 자산만 조정
- max_step: 1회 비중 이동 ≤ 3%p (과도한 체결·비용 방지)
- 주식 합산 ≤ 55%, 섹터 ≤ 20%, 상관쌍(0.8↑) 합산 ≤ 25%
- 비용 추정(수수료+슬리피지) > 기대 이익이면 보류
- 매도 → 매수 순서, 현금 버퍼 10~15% 유지
4) 월 1회 자동 알림(코딩 초보용) — Apps Script
시트 → 확장 프로그램 > Apps Script에서 아래 코드를 붙여넣고, 시간 기반 트리거를 매월 1일 21:00(Asia/Seoul)로 설정합니다.
function rebalanceAlert(){ const ss = SpreadsheetApp.getActive(); const sh = ss.getSheetByName('리밸런싱'); // 위 표가 있는 시트명 const rows = [[2,'국내주식'],[3,'해외주식'],[4,'채권'],[5,'현금']]; const account = sh.getRange('H1').getValue(); // H1=계좌가치 let lines = []; rows.forEach(r=>{ const asset = r[1]; const target = sh.getRange(r[0],2).getValue(); // B=목표w const current = sh.getRange(r[0],3).getValue(); // C=현재w const drift = (current - target)/target; const band = sh.getRange(r[0],5).getValue(); // E=밴드 if (Math.abs(drift) > band){ const adj = (target - current) * account; lines.push(`${asset}: 편차율 ${(drift*100).toFixed(1)}% → 조정액 ${Math.round(adj).toLocaleString()}원`); } }); if(lines.length===0){ lines.push('조정 없음(모든 자산 편차율 ≤ 밴드)'); } const body = [ '[리밸런싱 알림]', `계좌가치: ${Math.round(account).toLocaleString()}원`, ...lines, '규칙: max_step 3%p, 주식합산 ≤55%, 비용>이익 시 보류' ].join('\n'); MailApp.sendEmail(Session.getActiveUser().getEmail(), '월간 리밸런싱 알림', body); }
결과: 이메일로 “조정 필요 자산과 금액”이 도착합니다. 실제 주문은 본인 앱/증권사에서 수동 확인 후 진행하세요.
5) 체크리스트(월 10분)
- ① 편차율>밴드 자산만 조정했는가?
- ② 주식 합산 ≤55%, 섹터 ≤20%, 상관쌍 ≤25%인가?
- ③ 회전율 ≤100%/월, 알림 ≤10건/일, 조치율 ≥70% 유지?
- ④ 20일 변동성 >12% 또는 누적손익 ≤ -3R이면 보수 모드 전환했는가?
- ⑤ 저널에 날짜·사유·조치·비용을 기록했는가?(5분)
6) 자주 묻는 질문
Q. 월 1회 vs 주 2회, 무엇이 좋나요?
초기엔 월 1회가 비용·체력 면에서 유리합니다. 알림 과다·편차 누적이 크면 주 2회로.
Q. 밴드 ±20%는 고정인가요?
시작값일 뿐입니다. 경보가 과다하면 ±25%, 너무 뜸하면 ±15%로 조정하세요.
Q. 자동 주문까지 가능한가요?
증권사 API가 있어야 합니다. 본 글은 알림·의사결정 자동화까지 다룹니다(주문은 본인 확인 후 실행).
마무리
리밸런싱은 규칙 → 알림 → 10분 실행의 반복입니다. 오늘은 시트에 목표 비중·밴드·노출 캡을 입력하고, 매월 1일 21:00 알림을 걸어보세요. 내려갈 때 덜 잃고, 오를 때는 놓치지 않는 구조가 만들어집니다.
※ 교육용 정보이며 특정 상품 권유가 아닙니다. 수수료·세율·앱 기능은 기관 최신 공지를 확인하세요.
- 📈 KPI 대시보드: 수익률, 변동성, MDD, 회전율, 비용
- 🧪 롤링 12개월 성과와 벤치마크 비교
- 🧩 드리프트·노출·알림 데이터로 원인 분석
- 🛠 조정 룰: 밴드·노출 캡·현금 버퍼·리밸런싱 주기
월 10분 알림 + 분기 30분 리뷰만으로도 포트폴리오의 체력이 달라집니다.