주제 조사

260419_퀀트4

the-rich 2026. 4. 19. 17:48
  • 주제 : 시가총액 10위 vs 지수 수익률 비교
  • 총 소요 시간 : 5+a
  • 느낀점
    • 클로드가 항상 최고의 결과물을 내지는 않음
      • 1. 최신 데이터 분석이라 하고 24년 까지의 데이터 조사 추천
      • 2. 매수, 매도 시점 안물어봄
      • 3. 수수료도 현실 반영안하고, 현실 반영 요청시 인터넷 자료 갖고오는데 인터넷 자료도 최신을 반영하지 않은 내용이 있어서 오류 발생 가능

      • 4. 슬리피지도 처음에 임의로 설정했는데 다시 현실적인 것 반영 부탁하였더니 반영해줌
    -   5\. top10 기업도 바뀐 기준에 따라 제안 해주지 않기 때문에 내가 물어봐야함.

    -   6\. 원래 전략은 월별 동일가중 리밸런싱하고 매년 시가총액 top 10 기업 교체하기로 했는데 이거 까먹고 1년동안 buy & hold 하는 전략을 기반으로 초기 코드 짜

-   so 비판적인 시각을 가지고 내가 맞는 내용을 이야기해줘야함
  • 개발 phase
    • Phase 1 — 환경설정 + 데이터 수집 (완료)
    • Phase 2 — 수익률 비교 분석
    • Phase 3 — 퀀트 전략 + 백테스트
    • Phase 4 — 자동매매 시스템 (한국투자 API 연동 예정)

1. Phase 1

1) CONFIG 파일 만들기

src/config.py 파일 만들어줘.

아래 내용 그대로 반영해줘.

=============================================
분석 기간
=============================================

START_DATE = "2020-01-01"
END_DATE = "2026-03-31"

=============================================
연도별 S&P500 시가총액 top10
출처: finhacker.cz
기준: 전년도 마지막 거래일 → 다음 해 1월 첫 거래일 적용
Look-Ahead Bias 없음
FB는 yfinance 호환을 위해 META로 통일
=============================================

ANNUAL_TOP10 = {
# 2019년 말 기준 → 2020년 보유
2020: ["AAPL","MSFT","GOOGL","AMZN","META","BRK-B","JPM","V","JNJ","WMT"],
# 2020년 12월 31일 기준 → 2021년 보유
2021: ["AAPL","MSFT","AMZN","GOOGL","META","TSLA","BRK-B","V","JNJ","WMT"],
# 2021년 12월 31일 기준 → 2022년 보유
2022: ["AAPL","MSFT","GOOGL","AMZN","TSLA","META","NVDA","BRK-B","UNH","JPM"],
# 2022년 12월 30일 기준 → 2023년 보유
2023: ["AAPL","MSFT","GOOGL","AMZN","BRK-B","UNH","JNJ","XOM","V","JPM"],
# 2023년 12월 29일 기준 → 2024년 보유
2024: ["AAPL","MSFT","GOOGL","AMZN","NVDA","META","TSLA","BRK-B","LLY","V"],
# 2024년 12월 31일 기준 → 2025년 보유
2025: ["AAPL","NVDA","MSFT","GOOGL","AMZN","META","TSLA","AVGO","BRK-B","WMT"],
# 2025년 12월 31일 기준 → 2026년 보유
2026: ["NVDA","AAPL","GOOGL","MSFT","AMZN","META","AVGO","TSLA","BRK-B","LLY"],
}

=============================================
벤치마크
=============================================

BENCHMARK_INDEX = "^GSPC" # S&P500 지수 (수익률 비교용)
BENCHMARK_ETF_US = "SPY" # 미국 상장 ETF

=============================================
리밸런싱 설정
=============================================

REBALANCE_FREQ = "Y" # 연간 (매년 1월 첫 거래일)
SIGNAL_PRICE = "Close" # 신호 계산 기준
EXECUTE_PRICE = "Open" # 체결 기준 (다음 거래일 시가)

=============================================
수수료 설정 (공식 사이트 기반)
=============================================

시나리오 A - 개별주식 직접 매매

출처: 국내 증권사 공식 홈페이지 (미래에셋, 한국투자 등)

COMMISSION_STOCK = 0.0025 # 0.25% 편도
SLIPPAGE_STOCK = 0.0003 # 0.03% (S&P500 대형주 기준)



시나리오 B - SPY (미국 상장 ETF)

출처: ssga.com 공식 (Gross Expense Ratio 0.0945%)

COMMISSION_SPY = 0.0025 # 0.25% 편도
EXPENSE_SPY = 0.000945 # 0.0945% 연간 운용보수
SLIPPAGE_SPY = 0.0001 # 0.01%

=============================================
포트폴리오 설정
=============================================

INITIAL_CAPITAL = 100_000 # 초기 투자금 (달러)
WEIGHT_METHOD = "equal" # 동일비중 (equal) 또는 시가총액비중 (market_cap)

=============================================
설정 출력 함수
=============================================

def print_config():
print("=" * 50)
print("Alpha Engine - 설정 요약")
print("=" * 50)
print(f"분석 기간 : {START_DATE} ~ {END_DATE}")
print(f"리밸런싱 : 연간 (매년 1월 첫 거래일)")
print(f"체결 기준 : 전년도 말 신호 → 다음 해 시가 체결")
print(f"초기 투자금 : ${INITIAL_CAPITAL:,}")
print(f"비중 방식 : {WEIGHT_METHOD}")
print()
print("[연도별 보유 종목]")
for year, tickers in ANNUAL_TOP10.items():
print(f" {year}년: {', '.join(tickers)}")
print()
print("[수수료 설정]")
print(f" A. 개별주식 : 매매 {COMMISSION_STOCK_100:.2f}% + 슬리피지 {SLIPPAGE_STOCK_100:.2f}%")
print(f" B. SPY ETF : 매매 {COMMISSION_SPY_100:.2f}% + 운용 {EXPENSE_SPY_100:.4f}% + 슬리피지 {SLIPPAGE_SPY_100:.2f}%")
print(f" C. TIGER : 매매 {COMMISSION_TIGER_100:.2f}% + 운용 {EXPENSE_TIGER_100:.2f}% + 슬리피지 {SLIPPAGE_TIGER_100:.2f}%")
print("=" * 50)

if name == "main":
print_config()

2) COLLECTOR.PY 만들기

src/data/collector.py 만들어줘.

아래 조건으로 작성해줘:

1. src/config.py에서 설정값 불러오기
START_DATE, END_DATE
ANNUAL_TOP10 (연도별 종목)
BENCHMARK_INDEX, BENCHMARK_ETF_US

2. 수집할 전체 티커 목록
ANNUAL_TOP10의 모든 연도 종목 합집합 (중복 제거)
벤치마크: ^GSPC, SPY 추가

3. yfinance로 전체 기간 일별 OHLCV 데이터 수집
한 번에 전체 티커 다운로드 (yf.download)
수집 기간: START_DATE ~ END_DATE

4. data/ 폴더에 저장
data/prices_raw.csv : 전체 종목 일별 종가(Close)
data/ohlcv/ 폴더에 티커별 개별 CSV 저장

5. 수집 완료 후 아래 요약 출력
수집 기간
전체 티커 목록
종목별 데이터 행 수
결측치 있는 종목 표시

실행: python src/data/collector.py

3) Jupyter Notebook 만들기

notebooks/01_data_check.ipynb 만들어줘.

아래 순서로 작성해줘:

1. 라이브러리 import 및 데이터 로드
data/prices_raw.csv 불러오기
src/config.py에서 ANNUAL_TOP10, START_DATE, END_DATE 불러오기

2. 기본 정보 확인
데이터 shape, 기간, 종목 목록 출력
각 종목 시작가/종료가/등락률 표로 출력

3. 누적 수익률 차트 (plotly)
각 종목 정규화 (시작일 = 1.0 기준)
top10 종목들 vs ^GSPC 한 차트에 표시
^GSPC는 굵은 검정선으로 강조
범례, 제목, x축 y축 레이블 포함

4. 연도별 top10 변화 표
ANNUAL_TOP10 딕셔너리 기반으로

5. 연도별 종목 구성 변화를 표로 출력
신규 진입/탈락 종목 표시
연도별 수익률 히트맵 (plotly)
각 종목의 연도별 수익률을 컬러맵으로 표시
수익=초록, 손실=빨강


+ notebooks/01_data_check.ipynb 섹션 3 차트에 SPY도 추가해줘. ^GSPC는 굵은 검정선, SPY는 굵은 파란선으로 강조해줘.

1. Phase 2

1) 포트폴리오 수익률 계산 엔진

src/portfolio.py 만들어줘.

아래 기능 포함해줘:

1. 연도별 top10 동일비중 포트폴리오 수익률 계산
   - config.py의 ANNUAL_TOP10 기반
   - 종목 교체: 매년 1월 첫 거래일 시가(Open)로 교체
   - 리밸런싱: 매월 말 종가 신호 → 다음 거래일 시가 동일비중 조정
   - 수수료 반영 (COMMISSION_STOCK + SLIPPAGE_STOCK 왕복, 월 12회)

2. 벤치마크 수익률 계산
   - ^GSPC 일별 수익률
   - SPY 일별 수익률 (운용보수 EXPENSE_SPY 일할 차감)

3. 성과 지표 계산 함수
   - 누적 수익률 (Cumulative Return)
   - 연평균 수익률 CAGR
   - 최대 낙폭 MDD (Maximum Drawdown)
   - 샤프 비율 (Sharpe Ratio, 무위험 수익률 4.5% 적용)
   - 변동성 (연환산 표준편차)
   - 승률 (월별 수익률 기준)

4. 데이터 입력
   - data/prices_raw.csv 사용
   - data/ohlcv/ 개별 CSV에서 Open 가격 가져오기

5. 결과 저장
   - results/portfolio_returns.csv 저장
   - results/benchmark_returns.csv 저장

2) Jupyter Notebook 만들기

notebooks/02_performance_analysis.ipynb 만들어줘.

src/portfolio.py 실행해서 나온 결과 기반으로
아래 순서로 작성해줘:

1. 라이브러리 import 및 sys.path 설정
   - sys.path.insert(0, os.path.abspath('..'))
   - src/portfolio.py에서 결과 데이터 로드

2. 핵심 성과 요약 테이블
   - Top10 vs ^GSPC vs SPY
   - 누적수익률, CAGR, MDD, 샤프비율, 변동성 항목
   - Top10이 이기는 항목은 초록, 지는 항목은 빨강 강조

3. 누적 수익률 차트 (plotly)
   - 초기 $100,000 기준 자산 증가 곡선
   - Top10=주황선, ^GSPC=검정선(굵게), SPY=파란선(굵게)
   - 주요 시장 이벤트 수직선 표시
     · 2020-03 코로나 폭락
     · 2022-03 금리인상 시작
     · 2023-01 AI 랠리 시작
   - 각 이벤트 레이블 표시

4. 연도별 수익률 막대 차트 (plotly)
   - Top10 vs ^GSPC vs SPY 나란히 비교
   - 수익=초록, 손실=빨강
   - 각 막대 위에 수익률 수치 표시

5. MDD 차트 (plotly)
   - Top10 vs ^GSPC 낙폭 비교
   - 음수 영역 채우기로 시각화

6. 월별 수익률 히트맵 (plotly)
   - Top10 포트폴리오 기준
   - 연도(행) x 월(열) 구조
   - 수익=초록, 손실=빨강, 수치 표시

7. 수수료 임팩트 분석
   - 수수료 적용 전후 누적수익률 차이 차트
   - 수수료로 인한 연간 손실 금액 표시

누적 수익률 차트

=============================================
수수료 임팩트 요약
=============================================
  최종 Gross 가치  : $     226,520
  최종 Net   가치  : $     222,527
  총 수수료 손실   : $       3,993
  연평균 수수료    : $         640
  수수료 손실 비율 : 1.76%
=============================================
  1. 핵심 성과 요약 인사이트
    • Top10 포트폴리오는 CAGR 13.7%로 ^GSPC(11.3%) 대비 +2.4%p 초과 수익을 달성했다. 시총 상위 집중 투자가 장기적으로 시장을 이겼다.
    • SPY(CAGR 12.8%, Sharpe 0.47) 대비 Top10(Sharpe 0.46)은 수익률은 높으나 위험 대비 효율은 엇비슷하다. 변동성(24.6% vs 20.5%)이 더 크기 때문이다.
    • 수수료 총 손실은 약 $4,000 수준으로 최종 자산의 약 1.8%를 잠식했다. 연평균 약 $630으로 절대 금액은 작지만 복리로 누적될수록 영향이 커진다.
  2. 연도별 승패 분석
    • Top10은 강세장(2020·2021·2023·2024)에서 ^GSPC를 크게 앞섰고, 약세장(2022)에서는 더 크게 빠졌다. 집중 투자는 양날의 검이다.
    • 2022년 Top10 구성 종목인 TSLA(-65%), META(-64%), NVDA(-50%)가 동시에 폭락하며 지수 대비 초과 손실이 발생했다. 고성장주 편중이 핵심 원인이다.
    • 2023년에는 ^GSPC(+26%)를 오히려 밑돌았는데, NVDA(+239%)가 2023 교체에서 제외되어 AI 랠리 수혜를 놓친 것이 결정적이었다.
    • Top10이 지수를 이긴 연도가 더 많지만, 진 연도의 손실 폭이 커서 MDD(최대낙폭)가 더 깊은 구조적 특징이 있다.
  1. 종목별 기여도 분석
    • TSLA는 2020년 +743% 급등으로 포트폴리오 전체 수익의 가장 큰 단일 기여자였으나, 2022년 -65%로 반납하며 변동성 리스크를 동시에 체화한 종목이다.
    • NVDA는 2022년 편입 직후 -50% 하락, 2023년 포트폴리오에서 제외되어 역대급 랠리(+239%)를 놓쳤고, 2024년 재편입 후 +171% 기여하며 명실상부 핵심 기여자가 됐다.
    • AAPL·MSFT는 모든 연도에 편입되어 안정적인 누적 기여를 제공했고, 하락폭도 상대적으로 작아 포트폴리오의 앵커 역할을 했다.
    • META, AMZN은 2022년 급락 후 2023~2024년 강하게 반등하며 중장기 기여도가 플러스로 전환됐다.
  2. 리스크 분석
    • Top10의 MDD(-37.1%)가 ^GSPC(-33.9%)보다 깊은 이유는 집중도 때문이다. 10종목 포트폴리오는 섹터 분산이 없어 성장주 동반 폭락 시 완충재가 없다.
    • 가장 위험했던 구간은 2022년 전반부로, 연준 금리인상 + 나스닥 약세가 겹치며 Top10이 저점에서 최대 -37% 하락했다. 코로나(2020-03) 폭락은 빠르게 회복됐다.
    • 샤프비율은 Top10(0.46) < SPY(0.47) < ^GSPC(0.40). SPY 대비 Top10은 수익률은 높지만 위험 대비 효율은 사실상 동일하다. 무위험 수익률 4.5% 기준 모두 낮게 나온다.
    • 단순 초과 수익보다 MDD 관리가 Phase 3의 핵심 과제다. MDD를 5%p 줄이면 샤프비율이 크게 개선된다.
  1. 종목 교체 효과 분석
    • 매년 종목을 교체하지 않고 2020년 구성(AAPL·MSFT·GOOGL·AMZN·META·BRK-B·JPM·V·JNJ·WMT)을 유지했다면 TSLA·NVDA·LLY 등의 고성장주를 놓치게 된다.
    • 연간 교체의 최대 수혜는 TSLA 2021년 편입NVDA 2024~2026 편입이었다. 교체가 없었다면 이 수익을 전혀 얻지 못했다.
    • 반면 교체의 최대 실책은 NVDA를 2023년에 제외한 것이다. 시총 순위 기준으로 탈락했지만 그 해 +239%의 수익을 기록했다.
    • 결론: 연간 교체 전략은 장기적으로 고정 포트폴리오 대비 유리하나, 종목 교체 타이밍 리스크는 존재한다. Phase 3에서 모멘텀 필터로 보완 가능하다.

 

※ 이 글은 개인적인 공부 및 정보 공유 목적에서 작성된 내용으로, 투자 권유나 재정적 조언이 아닙니다.

※  시장 상황은 언제든 변할 수 있으며 글의 내용은 작성자의 주관적 해석이 포함되어 있습니다.

※  투자에 따른 모든 결과와 책임은 투자자 본인에게 있으니, 반드시 본인의 판단과 추가적인 검토를 거쳐 결정하시기 바랍니다.

'주제 조사' 카테고리의 다른 글

260426_양자컴퓨팅 주식, 4월  (0) 2026.04.25
260419_피지컬 AI  (1) 2026.04.19
260412_주간 현황  (1) 2026.04.12
260412_퀀트 3  (0) 2026.04.12
260405 퀀트 2  (0) 2026.04.12