- 코어-새틀라이트 전략이란
- 코어와 새틀라이트의 역할 분리
- 실전 포트폴리오 설계: 3가지 시나리오
- 자동 리밸런싱 구현
- 상관관계 관리: 분산 효과 유지
- 코어-새틀라이트 운영 연간 달력
- 퀴즈
- 참고 자료

코어-새틀라이트 전략이란
코어-새틀라이트(Core-Satellite)는 포트폴리오를 두 가지 역할로 나누는 자산 배분 전략이다. **코어(Core)**는 시장 전체를 추종하는 저비용 인덱스 ETF로 구성해 안정적인 수익을 추구하고, **새틀라이트(Satellite)**는 특정 섹터, 테마, 스타일 ETF로 구성해 초과 수익(알파)을 노린다.
이 전략은 100% 인덱스 투자와 100% 액티브 투자의 중간점이다. David Swensen(예일대 기금 운용)이 Unconventional Success에서 제안한 개인 투자자용 자산 배분의 핵심이기도 하다.
코어-새틀라이트의 기본 원칙:
- 코어 비중 60-80%, 새틀라이트 비중 20-40%
- 코어는 거의 손대지 않는다 (연 1-2회 리밸런싱)
- 새틀라이트는 시장 상황에 따라 교체 가능 (분기 단위 검토)
- 전체 포트폴리오 보수율(TER)을 0.3% 이하로 유지
코어와 새틀라이트의 역할 분리
코어: 시장 베타를 확보한다
코어의 목표는 단순하다. 시장 수익률을 가장 낮은 비용으로 얻는 것이다. "시장을 이기려" 하지 않는다.
코어 ETF 선정 기준:
- 운용 보수 0.1% 이하 (보수는 확실한 마이너스 수익)
- 순자산 1,000억원 이상 (유동성 확보)
- 추적 오차(Tracking Error) 최소 (지수와 괴리 적음)
- 배당 재투자 구조 (TR 지수 추종 우선)
한국에서 쓸 수 있는 코어 ETF 후보 (2026년 기준):
| ETF | 종목코드 | 추종 지수 | 보수 | 순자산 | 용도 |
|---|---|---|---|---|---|
| TIGER 미국S&P500 | 360750 | S&P 500 | 0.07% | 6.5조원 | 미국 대형주 |
| KODEX 미국S&P500TR | 379800 | S&P 500 TR | 0.05% | 3.2조원 | 미국 대형주 (배당 재투자) |
| KODEX 200 | 069500 | KOSPI 200 | 0.05% | 5.8조원 | 한국 대형주 |
| TIGER 미국나스닥100 | 133690 | NASDAQ-100 | 0.07% | 4.1조원 | 미국 기술주 |
| KODEX 미국채울트라30년선물(H) | 304660 | US Treasury 30Y | 0.09% | 2,800억원 | 미국 장기채 |
| TIGER 미국채10년선물 | 305080 | US Treasury 10Y | 0.09% | 1.2조원 | 미국 중기채 |
| KODEX 종합채권(AA-이상)액티브 | 443160 | 국내 우량 채권 | 0.05% | 3,500억원 | 국내 채권 |
새틀라이트: 테마와 알파를 추구한다
새틀라이트는 특정 섹터, 지역, 스타일에 집중 투자해 시장 대비 초과 수익을 노린다. 코어와 달리 교체가 가능하며, 확신이 없으면 비중을 줄이거나 현금으로 유지할 수 있다.
새틀라이트 ETF 유형:
| 유형 | 예시 | 특징 | 위험도 |
|---|---|---|---|
| 섹터 | 반도체, 2차전지, 바이오 | 특정 산업에 집중 | 높음 |
| 테마 | AI, 로봇, 클린에너지 | 성장 트렌드 추종 | 높음 |
| 지역 | 인도, 일본, 베트남 | 특정 국가 성장 | 중간-높음 |
| 스타일 | 고배당, 가치주, 소형주 | 팩터 기반 투자 | 중간 |
| 대체자산 | 금, 원자재, 리츠 | 상관관계 낮음, 분산 효과 | 중간 |
새틀라이트 교체 판단 기준:
- 투자 논리(thesis)가 여전히 유효한가?
- 지난 분기 벤치마크 대비 성과는?
- 더 낮은 보수의 유사 ETF가 출시되었는가?
- 포트폴리오 내 상관관계가 과도하게 높아지지 않았는가?
실전 포트폴리오 설계: 3가지 시나리오
시나리오 1: 안정 성장형 (보수적 투자자)
# 목표: 연 6-8% 수익, 최대 낙폭 15% 이내
# 대상: 은퇴 10-15년 전, 원금 보존 중시
portfolio:
name: '안정 성장형'
core_weight: 0.80
satellite_weight: 0.20
core:
- ticker: 'KODEX 미국S&P500TR'
weight: 0.30
role: '미국 시장 베타'
- ticker: 'KODEX 200'
weight: 0.15
role: '한국 시장 베타'
- ticker: 'TIGER 미국채10년선물'
weight: 0.20
role: '금리 하락 시 방어'
- ticker: 'KODEX 종합채권(AA-이상)액티브'
weight: 0.15
role: '안정적 이자 수익'
satellite:
- ticker: 'TIGER 금은선물(H)'
weight: 0.10
role: '인플레이션 헤지'
- ticker: 'TIGER 미국배당다우존스'
weight: 0.10
role: '배당 수익'
expected:
annual_return: '6-8%'
max_drawdown: '-15%'
total_expense_ratio: '0.07%'
시나리오 2: 성장 추구형 (30대 직장인)
# 목표: 연 10-12% 수익, 최대 낙폭 25% 감수
# 대상: 투자 기간 15년 이상, 적극적 성장 추구
portfolio:
name: '성장 추구형'
core_weight: 0.65
satellite_weight: 0.35
core:
- ticker: 'TIGER 미국S&P500'
weight: 0.35
role: '미국 시장 베타'
- ticker: 'TIGER 미국나스닥100'
weight: 0.15
role: '기술주 성장'
- ticker: 'KODEX 200'
weight: 0.10
role: '한국 시장 베타'
- ticker: 'TIGER 미국채10년선물'
weight: 0.05
role: '최소 채권 배분'
satellite:
- ticker: 'TIGER 반도체'
weight: 0.12
role: '반도체 사이클 알파'
- ticker: 'KODEX 2차전지산업'
weight: 0.08
role: '2차전지 성장'
- ticker: 'TIGER Fn반도체TOP10'
weight: 0.08
role: '한국 반도체 집중'
- ticker: 'TIGER 인도니프티50'
weight: 0.07
role: '인도 시장 성장'
expected:
annual_return: '10-12%'
max_drawdown: '-25%'
total_expense_ratio: '0.15%'
시나리오 3: 올웨더형 (변동성 최소화)
# 목표: 어떤 시장 환경에서도 양의 수익 추구
# 대상: 변동성을 극도로 싫어하는 투자자
# 참고: Ray Dalio의 All Weather 전략 변형
portfolio:
name: '올웨더형'
core_weight: 0.85
satellite_weight: 0.15
core:
- ticker: 'TIGER 미국S&P500'
weight: 0.25
role: '경제 성장기 수익'
- ticker: 'TIGER 미국채10년선물'
weight: 0.25
role: '경기 침체 방어'
- ticker: 'KODEX 미국채울트라30년선물(H)'
weight: 0.15
role: '디플레이션 방어'
- ticker: 'KODEX 종합채권(AA-이상)액티브'
weight: 0.10
role: '안정적 이자'
- ticker: 'TIGER 금은선물(H)'
weight: 0.10
role: '인플레이션 헤지'
satellite:
- ticker: 'KODEX 200'
weight: 0.10
role: '한국 시장 노출'
- ticker: 'TIGER 원유선물Enhanced(H)'
weight: 0.05
role: '원자재 인플레이션 대응'
expected:
annual_return: '5-7%'
max_drawdown: '-10%'
total_expense_ratio: '0.09%'
자동 리밸런싱 구현
코어 vs 새틀라이트 분리 리밸런싱
코어와 새틀라이트는 리밸런싱 주기와 기준이 다르다. 하나의 규칙으로 묶지 않는다.
"""
코어-새틀라이트 분리 리밸런싱 엔진
- 코어: 연 2회 + 편차 5% 초과 시 긴급
- 새틀라이트: 분기 1회 + 편차 7% 초과 시 긴급
"""
from dataclasses import dataclass
@dataclass
class RebalanceRule:
"""자산 유형별 리밸런싱 규칙."""
section: str # "core" or "satellite"
scheduled_frequency: str # "semi-annual" or "quarterly"
drift_threshold: float # 편차 임계치
min_trade_krw: int # 최소 거래 금액
RULES = {
"core": RebalanceRule(
section="core",
scheduled_frequency="semi-annual",
drift_threshold=0.05,
min_trade_krw=200_000,
),
"satellite": RebalanceRule(
section="satellite",
scheduled_frequency="quarterly",
drift_threshold=0.07,
min_trade_krw=100_000,
),
}
def check_section(
section: str,
holdings: dict,
targets: list[dict],
total_value: int,
) -> dict:
"""특정 섹션의 리밸런싱 필요 여부를 판단한다."""
rule = RULES[section]
drift_alerts = []
for target in targets:
code = target["code"]
current_value = holdings.get(code, {}).get("value_krw", 0)
current_weight = current_value / total_value if total_value > 0 else 0
target_weight = target["weight"]
drift = abs(current_weight - target_weight)
if drift > rule.drift_threshold:
drift_alerts.append({
"ticker": target["ticker"],
"code": code,
"target": target_weight,
"current": round(current_weight, 4),
"drift": round(drift, 4),
"action_needed": True,
})
return {
"section": section,
"rule": rule,
"needs_rebalancing": len(drift_alerts) > 0,
"alerts": drift_alerts,
}
def run_core_satellite_rebalance(portfolio_config: dict, holdings: dict):
"""코어와 새틀라이트를 분리하여 각각 리밸런싱을 실행한다."""
total_value = sum(h["value_krw"] for h in holdings.values())
print(f"총 자산: ₩{total_value:,}\n")
for section in ["core", "satellite"]:
targets = portfolio_config[section]
result = check_section(section, holdings, targets, total_value)
section_label = "코어" if section == "core" else "새틀라이트"
print(f"=== {section_label} 점검 ===")
print(f"리밸런싱 주기: {result['rule'].scheduled_frequency}")
print(f"편차 임계치: ±{result['rule'].drift_threshold * 100}%")
if result["needs_rebalancing"]:
print(f"상태: 리밸런싱 필요")
for alert in result["alerts"]:
print(
f" - {alert['ticker']}: "
f"목표 {alert['target']*100:.1f}% / "
f"현재 {alert['current']*100:.1f}% / "
f"편차 {alert['drift']*100:.1f}%p"
)
else:
print("상태: 정상 범위 내")
print()
# 사용 예시
config = {
"core": [
{"ticker": "TIGER 미국S&P500", "code": "360750", "weight": 0.35},
{"ticker": "KODEX 200", "code": "069500", "weight": 0.15},
{"ticker": "TIGER 미국채10년선물", "code": "305080", "weight": 0.15},
],
"satellite": [
{"ticker": "TIGER 반도체", "code": "091230", "weight": 0.12},
{"ticker": "KODEX 2차전지산업", "code": "305720", "weight": 0.08},
{"ticker": "TIGER 인도니프티50", "code": "453810", "weight": 0.07},
],
}
holdings = {
"360750": {"value_krw": 4_500_000},
"069500": {"value_krw": 1_500_000},
"305080": {"value_krw": 1_200_000},
"091230": {"value_krw": 1_800_000},
"305720": {"value_krw": 600_000},
"453810": {"value_krw": 400_000},
}
run_core_satellite_rebalance(config, holdings)
새틀라이트 교체 로직
새틀라이트는 분기마다 성과를 검토하고, 투자 논리가 약해진 종목을 교체한다.
"""새틀라이트 ETF 성과 검토 및 교체 판단."""
def evaluate_satellite(
ticker: str,
quarter_return: float,
benchmark_return: float,
thesis_valid: bool,
cheaper_alternative: str | None = None,
) -> dict:
"""새틀라이트 ETF의 교체 필요 여부를 판단한다."""
excess_return = quarter_return - benchmark_return
recommendation = "HOLD"
reasons = []
# 투자 논리가 무효화된 경우
if not thesis_valid:
recommendation = "REPLACE"
reasons.append("투자 논리(thesis)가 더 이상 유효하지 않음")
# 3분기 연속 벤치마크 대비 부진한 경우
if excess_return < -0.05:
recommendation = "REVIEW"
reasons.append(
f"벤치마크 대비 {excess_return*100:.1f}%p 부진"
)
# 더 저렴한 대안이 있는 경우
if cheaper_alternative:
reasons.append(f"보수가 더 낮은 대안 존재: {cheaper_alternative}")
return {
"ticker": ticker,
"quarter_return": f"{quarter_return*100:.1f}%",
"excess_return": f"{excess_return*100:.1f}%p",
"recommendation": recommendation,
"reasons": reasons,
}
# 분기 검토 예시
reviews = [
evaluate_satellite(
ticker="TIGER 반도체",
quarter_return=0.12,
benchmark_return=0.08,
thesis_valid=True,
),
evaluate_satellite(
ticker="KODEX 2차전지산업",
quarter_return=-0.03,
benchmark_return=0.08,
thesis_valid=True,
),
evaluate_satellite(
ticker="TIGER 인도니프티50",
quarter_return=0.06,
benchmark_return=0.08,
thesis_valid=True,
cheaper_alternative="KODEX 인도Nifty50(합성)",
),
]
print("=== 새틀라이트 분기 검토 ===")
for r in reviews:
print(f"\n{r['ticker']}")
print(f" 분기 수익률: {r['quarter_return']}")
print(f" 초과 수익: {r['excess_return']}")
print(f" 판정: {r['recommendation']}")
if r["reasons"]:
for reason in r["reasons"]:
print(f" - {reason}")
상관관계 관리: 분산 효과 유지
코어-새틀라이트 전략의 함정 중 하나는 새틀라이트끼리 상관관계가 높아지는 것이다. 반도체 ETF와 나스닥100 ETF를 동시에 보유하면 실질적으로 기술주에 과도하게 집중된다.
상관관계 모니터링
"""포트폴리오 내 ETF 상관관계를 계산한다."""
import numpy as np
def check_correlation(returns_matrix: dict, threshold: float = 0.8) -> list:
"""높은 상관관계를 가진 ETF 쌍을 찾는다.
Args:
returns_matrix: {종목코드: [일별 수익률 리스트]}
threshold: 경고 기준 상관계수
Returns:
상관계수가 threshold를 넘는 ETF 쌍 목록
"""
tickers = list(returns_matrix.keys())
data = np.array([returns_matrix[t] for t in tickers])
corr = np.corrcoef(data)
high_corr_pairs = []
for i in range(len(tickers)):
for j in range(i + 1, len(tickers)):
if abs(corr[i][j]) > threshold:
high_corr_pairs.append({
"pair": (tickers[i], tickers[j]),
"correlation": round(corr[i][j], 3),
"warning": "분산 효과 약화 - 한쪽 비중 축소 검토",
})
return high_corr_pairs
# 예시: 60일 일별 수익률 (시뮬레이션)
np.random.seed(42)
market = np.random.normal(0.0005, 0.01, 60)
sample_returns = {
"S&P500": market + np.random.normal(0, 0.002, 60),
"NASDAQ100": market * 1.3 + np.random.normal(0, 0.003, 60),
"반도체": market * 1.5 + np.random.normal(0, 0.005, 60),
"미국채10년": -market * 0.3 + np.random.normal(0, 0.003, 60),
"금": np.random.normal(0.0002, 0.008, 60),
}
alerts = check_correlation(sample_returns, threshold=0.7)
print("=== 상관관계 경고 ===")
for alert in alerts:
print(f" {alert['pair'][0]} <-> {alert['pair'][1]}: "
f"상관계수 {alert['correlation']}")
print(f" -> {alert['warning']}")
코어-새틀라이트 운영 연간 달력
| 월 | 코어 | 새틀라이트 | 기타 |
|---|---|---|---|
| 1월 | 정기 리밸런싱 | 분기 검토 + 연간 전략 점검 | 연간 수익률 정산, 세금 확인 |
| 2-3월 | 편차 모니터링 | - | 배당 기준일 확인 |
| 4월 | - | 분기 검토 | ISA/IRP 납입 상황 점검 |
| 5-6월 | 편차 모니터링 | - | 중간 점검 |
| 7월 | 정기 리밸런싱 | 분기 검토 | 하반기 전략 조정 |
| 8-9월 | 편차 모니터링 | - | - |
| 10월 | - | 분기 검토 + 내년 전략 수립 | ISA/IRP 연말 납입 계획 |
| 11-12월 | 편차 모니터링 | - | 세금 최적화 매매 (해외 ETF) |
퀴즈
Q1. 코어-새틀라이트 전략에서 코어의 역할은?
정답: ||시장 전체 수익률(베타)을 저비용으로 확보하는 것이다. 시장을 이기려 하지 않고, 인덱스 ETF로
안정적 수익을 추구한다.||
Q2. 코어와 새틀라이트의 리밸런싱 주기가 다른 이유는?
정답: ||코어는 장기 보유가 원칙이므로 연 1-2회 정기 리밸런싱이면 충분하다. 새틀라이트는 시장
상황에 따라 교체가 가능하므로 분기 단위로 검토한다. 각각의 성격에 맞는 관리 주기를 적용해야
불필요한 매매를 줄일 수 있다.||
Q3. 새틀라이트 ETF 교체를 판단하는 가장 중요한 기준은?
정답: ||투자 논리(thesis)가 여전히 유효한가이다. 단기 성과 부진만으로 교체하면 감정적 매매가 되고,
투자 논리가 무효화되었는데도 보유하면 손실이 확대된다.||
Q4. 포트폴리오 내 ETF 상관관계가 높으면 왜 문제인가?
정답: ||상관관계가 높은 자산을 여러 개 보유하면 분산 효과가 사라진다. 예를 들어 S&P500 + NASDAQ100
- 반도체 ETF를 동시에 보유하면 기술주 하락 시 세 종목이 동시에 하락하여 포트폴리오 전체가 큰 타격을 받는다.||
Q5. 올웨더형 포트폴리오가 주식, 채권, 금을 동시에 보유하는 이유는?
정답: ||경제 성장기(주식 상승), 경기 침체기(채권 상승), 인플레이션기(금 상승), 디플레이션기(장기채
상승) 등 어떤 환경에서도 일부 자산이 수익을 내도록 설계하기 위해서다. Ray Dalio의 All Weather
전략의 핵심 원리다.||
Q6. 코어 ETF 선정 시 보수(TER)를 가장 중요하게 보는 이유는?
정답: ||코어 ETF는 장기간(10년 이상) 보유하므로 보수가 복리로 누적된다. 보수 0.05%와 0.5%의 차이는
20년 후 약 9%의 수익률 차이를 만든다. 코어는 시장 수익률을 추종하므로 보수가 낮을수록 실질 수익이
높다.||
참고 자료
- Swensen, David. Unconventional Success: A Fundamental Approach to Personal Investment. Free Press, 2005.
- Dalio, Ray. All Weather Strategy 원리: https://www.bridgewater.com/
- Bogleheads Wiki - Core and Satellite: https://www.bogleheads.org/wiki/Core_and_satellite
- Investopedia - Core-Satellite Investing: https://www.investopedia.com/terms/c/core-satellite.asp
- 한국거래소 ETF 정보: https://www.krx.co.kr/
- ETF CHECK: https://www.etfcheck.co.kr/
현재 단락 (1/380)
코어-새틀라이트(Core-Satellite)는 포트폴리오를 두 가지 역할로 나누는 자산 배분 전략이다. **코어(Core)**는 시장 전체를 추종하는 저비용 인덱스 ETF로 구성해...