국내 대형주 · 한 종목 비중 · 코스피200 ETF · 실측 재현 페이지

확신 가는 대형주 하나,
계좌에 얼마나 넣을까

2009년 6월 1일, 1,000만원을 넣고 2026년 10월 15일까지 그대로 뒀습니다(배당은 가격에 다시 넣은 야후 보정 종가 · 산 날 수수료 0.1%). ① 코스피200 ETF(KODEX 200) 만 ② 2009년에 이미 큰 국내 대형주 한 종목에 전부 ③ 한 종목에 10%만, 나머지 90%는 코스피200 ETF(처음 나눈 뒤 다시 맞추지 않음). 대형주는 2007년 무렵 코스피 시가총액 상위권 38종목에서 인적분할 7종목·자료 없는 2종목을 뺀 29종목입니다.

21종목29종목 중 한 종목에 전부 넣었을 때 코스피200 ETF 만(6,394만원)보다 덜 남은 종목 — 영상의 「열 종목 중 일곱」
307만원가장 나빴던 LG디스플레이에 전부 넣었을 때. 10%만 넣고 나머지는 ETF 였다면 5,786만원
90.4%시작 달을 바꾼 10년짜리 89번 모두 — 10%만 넣은 계좌는 가장 나쁜 종목을 골라도 ETF 만 산 계좌의 이만큼 이상을 지켰습니다(20%면 80.7%)

오늘 드리는 것 — 기준 한 줄

상황기준
확신 가는 국내 대형주가 있다한 종목에는 계좌의 10%까지만 넣고, 나머지는 코스피200 ETF 에 둔다
왜 10%인가그 종목이 크게 떨어져도 계좌의 90%는 코스피200 을 따라갑니다 — 가장 나빴던 종목을 골라도 ETF 만의 90.5% (20% 넣으면 5,177만원 · 81.0% / 30% 넣으면 4,568만원 · 71.4%)
대신 내는 값맞혔을 때 덜 법니다 — 삼성전자에 전부 2억 5,980만원 · 10%만 8,353만원. 그리고 10%만 넣은 계좌도 가운데는 ETF 만의 96.0% — 10%는 ETF 보다 나은 방법이 아니라, 확신 가는 종목을 꼭 담고 싶을 때의 상한입니다
ETF 보다 더 남은 종목SK하이닉스 11억 8,361만원 · 삼성전자 2억 5,980만원 · 삼성전기 2억 3,530만원 · 기아 1억 3,813만원 · 고려아연 8,747만원 · 하나금융지주 8,093만원 · KB금융 6,445만원 · 현대차 6,397만원
시작 달을 바꾸면2009년 6월 ~ 2016년 10월에 시작한 10년짜리 89번 중 한 종목 끝 금액의 가운데가 ETF 보다 덜 남은 때 82번 · ETF 보다 더 남은 종목은 5~17개(29종목 중)

한계 — 먼저 읽어 주세요

받아가기

돌리는 법: zip 을 풀고 pip install numpy pandas 뒤 python run_onestock.py

그대로 돌린 출력

[판] 2009-06-01 ~ 2026-10-15 · 코스피200 ETF 거래일 4249개 · 가장 긴 빈 구간 11일

[점프 점검] 하루 ±30% 넘게 움직인 날 (인적분할·상하한가 흔적)
  HD한국조선해양(009540): 2017-05-10 +59.7% ← 뺌
  두산에너빌리티(034020): 2020-07-21 +30.0%
  한화오션(042660): 2015-07-15 -30.0%, 2017-10-30 -56.7%, 2024-11-08 +30.2%
  NAVER(035420): 2013-07-30 +46.0%, 2013-08-01 -31.5%, 2013-08-29 +33.4% ← 뺌

[뺀 종목 9개] HD한국조선해양(2017-04 현대일렉트릭 등 인적분할) · SK텔레콤(2021-11 SK스퀘어 인적분할) · 우리금융(구)(자료 없음) · 신세계(2011-06 이마트 인적분할) · 삼성물산(구)(자료 없음) · LG(2021-05 LX홀딩스 인적분할) · NAVER(2013-08 NHN엔터 인적분할) · 롯데쇼핑(2017-10 롯데지주 인적분할) · 대한항공(2013-08 한진칼 인적분할)

[1,000만원 · 2009-06-01 ~ 2026-10-15 · 그대로 둠]
  코스피200 ETF 만: 6,394만원 (6.39배)
  대형주 29종목 중 ETF 보다 더 남은 종목 8개 · 덜 남은 종목 21개 · 원금보다 줄어든 종목 5개
  더 남은 종목: SK하이닉스 11억 8,361만원 · 삼성전자 2억 5,980만원 · 삼성전기 2억 3,530만원 · 기아 1억 3,813만원 · 고려아연 8,747만원 · 하나금융지주 8,093만원 · KB금융 6,445만원 · 현대차 6,397만원
  한 종목 끝 금액의 가운데(15번째): 3,833만원

[종목마다 — 전부 넣었을 때 / 10%%만 넣고 나머지는 ETF]
  LG디스플레이    전부        307만원 · 10%만      5,786만원
  한화오션       전부        390만원 · 10%만      5,794만원
  GS건설       전부        481만원 · 10%만      5,803만원
  현대제철       전부        590만원 · 10%만      5,814만원
  삼성중공업      전부        902만원 · 10%만      5,845만원
  한국가스공사     전부      1,056만원 · 10%만      5,861만원
  POSCO홀딩스   전부      1,192만원 · 10%만      5,874만원
  한국전력       전부      1,233만원 · 10%만      5,878만원
  두산에너빌리티    전부      1,306만원 · 10%만      5,886만원
  LG전자       전부      1,648만원 · 10%만      5,920만원
  현대건설       전부      1,745만원 · 10%만      5,929만원
  SK이노베이션    전부      1,983만원 · 10%만      5,953만원
  LG화학       전부      2,057만원 · 10%만      5,961만원
  KT         전부      2,911만원 · 10%만      6,046만원
  현대모비스      전부      3,833만원 · 10%만      6,138만원
  S-Oil      전부      4,360만원 · 10%만      6,191만원
  기업은행       전부      4,370만원 · 10%만      6,192만원
  신한지주       전부      5,090만원 · 10%만      6,264만원
  삼성화재       전부      5,489만원 · 10%만      6,304만원
  삼성SDI      전부      5,633만원 · 10%만      6,318만원
  KT&G       전부      5,899만원 · 10%만      6,345만원
  현대차        전부      6,397만원 · 10%만      6,395만원
  KB금융       전부      6,445만원 · 10%만      6,399만원
  하나금융지주     전부      8,093만원 · 10%만      6,564만원
  고려아연       전부      8,747만원 · 10%만      6,630만원
  기아         전부   1억 3,813만원 · 10%만      7,136만원
  삼성전기       전부   2억 3,530만원 · 10%만      8,108만원
  삼성전자       전부   2억 5,980만원 · 10%만      8,353만원
  SK하이닉스     전부  11억 8,361만원 · 10%만   1억 7,591만원

[한 종목에 넣는 몫을 바꾸면 — 가장 나빴던 종목을 골랐을 때 · 가장 좋았던 종목을 골랐을 때]
    5%  가장 나쁜 LG디스플레이      6,090만원 (ETF 만의 95.2%) · 가장 좋은 SK하이닉스   1억 1,993만원 · ETF 보다 덜 남은 종목 21개
   10%  가장 나쁜 LG디스플레이      5,786만원 (ETF 만의 90.5%) · 가장 좋은 SK하이닉스   1억 7,591만원 · ETF 보다 덜 남은 종목 21개
   20%  가장 나쁜 LG디스플레이      5,177만원 (ETF 만의 81.0%) · 가장 좋은 SK하이닉스   2억 8,788만원 · ETF 보다 덜 남은 종목 21개
   30%  가장 나쁜 LG디스플레이      4,568만원 (ETF 만의 71.4%) · 가장 좋은 SK하이닉스   3억 9,984만원 · ETF 보다 덜 남은 종목 21개
   50%  가장 나쁜 LG디스플레이      3,351만원 (ETF 만의 52.4%) · 가장 좋은 SK하이닉스   6억 2,378만원 · ETF 보다 덜 남은 종목 21개
  100%  가장 나쁜 LG디스플레이        307만원 (ETF 만의 4.8%) · 가장 좋은 SK하이닉스  11억 8,361만원 · ETF 보다 덜 남은 종목 21개
  삼성전자를 고른 사람: 전부 2억 5,980만원 · 10%만 8,353만원
  10%만 넣은 계좌의 가운데: ETF 만의 96.0%

[시작 달을 바꿔 — 10년씩, 시작 2009-06 ~ 2016-10]
  10년짜리 89번 · 한 종목 끝 금액의 가운데가 ETF 보다 덜 남은 때 82번
  ETF 보다 더 남은 종목 수: 가장 적을 때 5개 · 가장 많을 때 17개 (29종목 중)
  가장 나쁜 종목을 골라도 — 10%만: ETF 만의 90.4% 이상 · 20%: 80.7% 이상

끝.

코드 전문

# -*- coding: utf-8 -*-
"""확신 가는 대형주 하나, 계좌에 얼마나 넣을까 — 재현 코드 (AlgoLab · 2026-10-16)

무엇을 재나
  2009년 6월 1일에 1,000만원을 넣고 2026년 10월 15일까지 그대로 둔다(편도 수수료 0.1% 한 번).
  ① 코스피200 ETF(KODEX 200 · 069500) 만
  ② 국내 대형주 한 종목에 전부
  ③ 한 종목에 w(10% 등) + 나머지는 코스피200 ETF (처음 나눈 뒤 다시 맞추지 않는다)

가격 자료
  data_onestock/<코드>_KS.csv — 야후 일봉. close 는 배당·분할을 반영한 보정 종가(야후 adjclose 비율로 보정).
  2026-10-16 에 받아 얼렸다(ASOF 이후 봉은 쓰지 않는다).

종목 목록
  2007년 무렵 코스피 시가총액 상위권 38종목(사람이 정한 목록 — 정확한 순위표가 아니다).
  · 인적분할로 회사가 둘로 쪼개진 7종목은 뺀다: 야후 보정 종가가 떨어져 나간 회사 몫을 담지 못해
    한 종목 성적이 틀린다(SK텔레콤 2021-11 · 신세계 2011-06 · 대한항공 2013-08 · NAVER 2013-08 ·
    LG 2021-05 · 현대중공업 2017-04 · 롯데쇼핑 2017-10). 아래 [점프 점검] 에 그 흔적이 찍힌다.
  · 우리금융(구)·삼성물산(구)은 합병으로 사라져 야후 자료가 없다.
  → 사라진 회사가 빠진 만큼 '한 종목' 쪽이 실제보다 좋게 나왔을 수 있다.

돌리는 법: pip install numpy pandas → python run_onestock.py
"""
import os
import numpy as np
import pandas as pd

HERE = os.path.dirname(os.path.abspath(__file__))
D = os.path.join(HERE, "data_onestock")
ASOF = "2026-10-15"
START = "2009-06-01"
FEE = 0.001
WON = 1000  # 만원
U = {"005930": "삼성전자", "005490": "POSCO홀딩스", "009540": "HD한국조선해양", "015760": "한국전력", "105560": "KB금융",
     "055550": "신한지주", "017670": "SK텔레콤", "066570": "LG전자", "005380": "현대차", "000660": "SK하이닉스", "034220": "LG디스플레이",
     "053000": "우리금융(구)", "096770": "SK이노베이션", "034020": "두산에너빌리티", "030200": "KT", "010140": "삼성중공업",
     "012330": "현대모비스", "051910": "LG화학", "000810": "삼성화재", "033780": "KT&G", "010950": "S-Oil", "042660": "한화오션",
     "004020": "현대제철", "004170": "신세계", "000830": "삼성물산(구)", "003550": "LG", "000270": "기아", "086790": "하나금융지주",
     "024110": "기업은행", "006400": "삼성SDI", "009150": "삼성전기", "035420": "NAVER", "023530": "롯데쇼핑", "000720": "현대건설",
     "006360": "GS건설", "003490": "대한항공", "036460": "한국가스공사", "010130": "고려아연"}
SPINOFF = {"017670": "2021-11 SK스퀘어 인적분할", "004170": "2011-06 이마트 인적분할", "003490": "2013-08 한진칼 인적분할",
           "035420": "2013-08 NHN엔터 인적분할", "003550": "2021-05 LX홀딩스 인적분할",
           "009540": "2017-04 현대일렉트릭 등 인적분할", "023530": "2017-10 롯데지주 인적분할"}
BENCH = "069500"


def 만원(x):
    x = int(round(x))
    if x >= 10000:
        return "%d억 %s만원" % (x // 10000, format(x % 10000, ",")) if x % 10000 else "%d억원" % (x // 10000)
    return format(x, ",") + "만원"


def load(code):
    p = os.path.join(D, code + "_KS.csv")
    if not os.path.exists(p):
        return None
    df = pd.read_csv(p, parse_dates=["date"]).set_index("date")
    s = df["close"].astype(float)
    s = s[~s.index.duplicated()]
    return s[s > 0].loc[:ASOF]


raw = {c: load(c) for c in U}
bench = load(BENCH)
idx = bench.loc[START:ASOF].index
print("[판] %s ~ %s · 코스피200 ETF 거래일 %d개 · 가장 긴 빈 구간 %d일" % (
    idx[0].date(), idx[-1].date(), len(idx), int(np.diff(idx.values).astype("timedelta64[D]").astype(int).max())))

print("\n[점프 점검] 하루 ±30% 넘게 움직인 날 (인적분할·상하한가 흔적)")
for c, s in raw.items():
    if s is None:
        continue
    r = s.loc[START:ASOF].pct_change().dropna()
    big = r[r.abs() > 0.30]
    if len(big):
        print("  %s(%s): %s%s" % (U[c], c, ", ".join("%s %+.1f%%" % (d.date(), v * 100) for d, v in big.items()),
                                  " ← 뺌" if c in SPINOFF else ""))

px, dropped = {}, []
for c, s in raw.items():
    if s is None:
        dropped.append("%s(자료 없음)" % U[c]); continue
    if c in SPINOFF:
        dropped.append("%s(%s)" % (U[c], SPINOFF[c])); continue
    px[c] = s.reindex(idx).ffill()
P = pd.DataFrame(px)
B = bench.reindex(idx).ffill()
assert P.iloc[0].notna().all()
print("\n[뺀 종목 %d개] %s" % (len(dropped), " · ".join(dropped)))

g = (P.iloc[-1] / P.iloc[0]) * (1 - FEE)          # 한 종목에 전부: 원금 배수
gb = float(B.iloc[-1] / B.iloc[0]) * (1 - FEE)     # 코스피200 ETF 만
etf = WON * gb
n = len(g)
win = g[g > gb].sort_values(ascending=False)
print("\n[1,000만원 · %s ~ %s · 그대로 둠]" % (idx[0].date(), idx[-1].date()))
print("  코스피200 ETF 만: %s (%.2f배)" % (만원(etf), gb))
print("  대형주 %d종목 중 ETF 보다 더 남은 종목 %d개 · 덜 남은 종목 %d개 · 원금보다 줄어든 종목 %d개" % (
    n, len(win), n - len(win), int((g < 1).sum())))
print("  더 남은 종목: " + " · ".join("%s %s" % (U[c], 만원(WON * g[c])) for c in win.index))
print("  한 종목 끝 금액의 가운데(15번째): %s" % 만원(WON * float(np.median(g))))

print("\n[종목마다 — 전부 넣었을 때 / 10%%만 넣고 나머지는 ETF]")
for c in g.sort_values().index:
    print("  %-10s 전부 %12s · 10%%만 %12s" % (U[c], 만원(WON * g[c]), 만원(WON * (0.1 * g[c] + 0.9 * gb))))

print("\n[한 종목에 넣는 몫을 바꾸면 — 가장 나빴던 종목을 골랐을 때 · 가장 좋았던 종목을 골랐을 때]")
lo, hi = g.idxmin(), g.idxmax()
for w in [0.05, 0.1, 0.2, 0.3, 0.5, 1.0]:
    a_lo = WON * (w * g[lo] + (1 - w) * gb)
    a_hi = WON * (w * g[hi] + (1 - w) * gb)
    rel = (w * g + (1 - w) * gb) / gb
    print("  %3d%%  가장 나쁜 %s %12s (ETF 만의 %.1f%%) · 가장 좋은 %s %12s · ETF 보다 덜 남은 종목 %d개" % (
        round(w * 100), U[lo], 만원(a_lo), a_lo / etf * 100, U[hi], 만원(a_hi), int((rel < 1).sum())))
s = "005930"
print("  삼성전자를 고른 사람: 전부 %s · 10%%만 %s" % (만원(WON * g[s]), 만원(WON * (0.1 * g[s] + 0.9 * gb))))
med10 = float(np.median((0.1 * g + 0.9 * gb) / gb))
print("  10%%만 넣은 계좌의 가운데: ETF 만의 %.1f%%" % (med10 * 100))

print("\n[시작 달을 바꿔 — 10년씩, 시작 %s ~ 2016-10]" % START[:7])
rows = []
for st in pd.date_range(START, periods=400, freq="MS"):
    en = st + pd.DateOffset(years=10)
    if en > pd.Timestamp(ASOF):
        break
    i0 = idx.searchsorted(st); i1 = idx.searchsorted(en) - 1
    gg = (P.iloc[i1] / P.iloc[i0]).values * (1 - FEE)
    bb = float(B.iloc[i1] / B.iloc[i0]) * (1 - FEE)
    rr = gg / bb
    rows.append((np.median(rr), int((rr > 1).sum()), (0.1 * rr + 0.9).min(), (0.2 * rr + 0.8).min()))
R = np.array(rows)
print("  10년짜리 %d번 · 한 종목 끝 금액의 가운데가 ETF 보다 덜 남은 때 %d번" % (len(R), int((R[:, 0] < 1).sum())))
print("  ETF 보다 더 남은 종목 수: 가장 적을 때 %d개 · 가장 많을 때 %d개 (%d종목 중)" % (R[:, 1].min(), R[:, 1].max(), n))
print("  가장 나쁜 종목을 골라도 — 10%%만: ETF 만의 %.1f%% 이상 · 20%%: %.1f%% 이상" % (R[:, 2].min() * 100, R[:, 3].min() * 100))
print("\n끝.")

알고랩 Strategy Lab — 전략을 검증하고, 검증한 것만 자동매매로 옮깁니다. 확신이 들 때 더 넣지 않는 일은 사람보다 봇이 잘합니다. 알고랩 자동매매 살펴보기 · 전략 검증 전체 보기

과거 데이터를 돌려 본 결과이며 미래 수익을 보장하지 않습니다. 투자 판단과 책임은 본인에게 있습니다.