리서치
김현준

코스피에서 외국인 수급 알파 찾기

이 글은 내가 가지고 있는 양적 리서치 워크벤치에서 나온 첫 번째 노트다. 차트, 블로터, config별 상세 결과는 개인용 로컬 대시보드에 두고, 이 글은 그 결과를 호기심 있는 누구든 읽을 수 있는 형태로 풀어쓴 버전이다.

질문

KIS는 매일 종목별 외국인 순매수 데이터를 장 마감 후 발표한다. 한국 개인 투자자들이 가장 많이 보는 수급 데이터다 — 외국인이 사면 오르고, 외국인이 던지면 떨어진다. 일종의 ‘전설’이다. 하지만 이 전설이 실제로 내가 트레이드할 수 있는 수익으로 얼마나 나타나는가?

답이 의미를 가지려면 “트레이드 가능”이 엄격히 정의돼야 한다:

  • No lookahead. 당일 T 외국인 순매수는 장 마감 후에야 확정된다. 가장 빠른 진입 시점은 T+1 시가 또는 T+1 VWAP. T 종가 진입은 T 자체 데이터를 쓰는 거니까 안 된다.
  • 엄격한 종목단위 실행. 정수 주식 수, 1억 원 초기 현금, 1.5 bps 수수료, 23 bps 매도세, 양쪽 5 bps 슬리피지, 종목별 일거래량의 1% 참여율 제한.
  • KODEX 200을 이긴다. 동일가중 코스피가 아니라. 유니버스 평균이 아니라. 같은 현금을 그냥 ETF에 묶어뒀을 때의 수익률 말이다.

이 셋 중 하나라도 명세에 들어가는 순간, 놀라울 정도의 “알파” 리서치가 증발한다.

Round 1 — 외국인 수급 6개 신호

기본 sweep은 외국인 수급 데이터만으로 만든 6개의 no-lookahead 신호다:

  • 순매수(KRW)를 ADV20으로 정규화한 값
  • 롤링 윈도우 z-score
  • 5일 순매수 모멘텀
  • 5일 순매수 가속도
  • 순매수 지속성 (연속 양수 일수)
  • 순매수 집중도 (전체 유니버스 순매수 중 이 종목 비중)

각 신호에 대해 sweep:

  • entry: next_open vs next_vwap
  • 보유: 1, 2, 3, 5, 10, 20, 60 거래일
  • 바스켓: top 5%, 10%, 20%, 정수 top-N
  • 비용 그리드: 0, 1.5, 5, 10, 15 bps round-trip

분위(decile) 진단은 좋은 신호다 — 신호별로 top 분위 평균이 bottom 분위를 분명히 앞선다.

0.0%+2.0%+4.0%+6.0%12345678910Decile (1 = lowest signal · 10 = highest)
신호 분위별 10일 forward 평균 수익률. foreign_net_buy / ADV20.

신호×보유기간 히트맵은 한 발 더 들어간다: 알파가 10일 보유 구간에 몰린다.

1d2d3d5d10d20d60dnet_buy_adv20+0.10%+0.30%+0.60%+1.20%+2.40%+1.80%+0.60%net_buy_z+0.20%+0.40%+0.70%+1.30%+2.70%+2.00%+0.50%mom_5d-0.20%+0.10%+0.40%+1.00%+1.90%+1.40%+0.30%accel_5d+0.30%+0.50%+0.90%+1.40%+2.20%+1.50%+0.40%persistence0.00%+0.20%+0.50%+1.10%+1.80%+1.20%+0.10%concentration+0.10%+0.20%+0.50%+0.90%+1.60%+1.10%+0.20%
동일가중 유니버스 대비 평균 초과수익. top-10% 바스켓, next_vwap 진입, 1.5 bps.

외국인 수급은 장중 신호가 아니라 며칠짜리 신호다 — KIS 확정 일별 순매수는 한 세션이 아니라 일주일에 걸쳐 가격에 반영된다. 1.5 bps 비용에서는 살아남는다. 15 bps round-trip에서는 10일 구간만 살아남고, 1~2일 구간은 죽는다.

여기까지는 좋다.

그 다음 합성 바스켓 시뮬을 빼고 종목단위 시뮬을 돌린다: 정수 주식 수, 실제 마찰비, 1% 참여율 제한. 이 표본 1년 동안 가장 좋은 raw flow 전략도 KODEX 200을 못 이긴다. ETF 매수·보유 → 큰 폭 상승. 가장 똑똑한 외국인 수급 단일 신호 트레이드 → 그보다 작은 상승.

이게 첫 번째 어려운 순간이었다.

Round 2 — 수급에 가격 모멘텀을 더한다

단순 수급 ranking은 너무 일차원적이다. 2024–2025 코스피는 강한 인덱스 상승장이었고, 회전율 있는 long-only 종목 선택 전략으로 ETF를 이기기는 어려운 벤치마크다.

그래서 수급과 모멘텀을 섞은 5,280개 config 크리에이티브 서치를 돌렸다:

  • rank(60일 수익률) + rank(외국인 순매수)
  • rank(20일 수익률) + rank(외국인 가속도)
  • 위 신호들의 앙상블 평균
  • 섹터 리더십 가중 버전

여기서 처음으로 KODEX 200을 이긴 후보들이 나왔다.

1.00×1.20×1.40×1.60×1.80×2.00×2025-042025-072025-112026-022026-05
수급×모멘텀 (top-3, 5일)KODEX 200동일가중 유니버스

패턴은 일관적이다: 외국인 수급은 _어떤 종목인지_를 말해주고, 모멘텀은 _어떤 레짐인지_를 말해준다. 이 표본에서 둘 중 하나만으로는 인덱스를 못 이긴다. 곱하면 이긴다.

두 번째 sweep — equal, rank_exp, signal_positive, liquidity_sqrt 사이징 9,600개 config — 가 헤드라인 수치를 더 끌어올렸다. 하지만 liquidity_sqrt는 정확히 대형주 쪽으로 기울이는 사이징이라, 개선분의 일부는 새로운 알파가 아니라 시가총액 팩터 노출일 가능성이 크다. 이 분해는 미해결 질문 리스트에 올라가 있다.

Round 3 — /05 리서치 라인에서 훔쳐오기

병행 프로젝트인 /research/05_beat_kodex200이 다른 관점에서 KODEX를 이기는 종목단위 바스켓을 찾고 있었다: KOSPI200 트렌드 레짐 게이트, 섹터 로테이션, 외국인+기관 동의.

04a sweep은 그 아이디어 중 다섯 개를 외국인 수급 트랙으로 다시 가져왔다:

  • sig_05_sector_rotation_foreign — 섹터 모멘텀 + 섹터 수급으로 상위 섹터를 게이트한 다음, 그 안에서 외국인 수급으로 종목을 랭크
  • sig_05_agreement_momentum — 같은 날 외국인 그리고 기관이 동시에 순매수, 거기에 20일 모멘텀 양수 조건
  • sig_05_sector_capped_composite — 섹터당 최대 두 종목, 집중도 완화
  • sig_05_regime_foreign_sector — KODEX 200이 60일 SMA 위에 있을 때만 트레이드
  • sig_05_short_cover_foreign — 공매도 잔고가 무거운데 공매도 압력은 빠지고 있고, 동시에 외국인이 사고 있는 종목 (KIS 공매도 silver 커버리지가 있는 곳에서만)

대부분 리더보드를 휩쓸지는 않지만, 스트레스 필터에서 잘 버틴다: 드로우다운, 체결 모델, KODEX 대비 초과수익, 슬리피지. 인샘플 우승자가 한 번의 레짐 변화로 무너질 수 있을 때, 이런 robustness props가 중요하다.

현재 후보

바스켓 크기를 정하기 전에: top-N sweep이 명확하게 말해준다.

150%200%250%300%350%1.201.401.601.80Basket size (top-N)
Total returnAnnualized Sharpe총수익률은 top-1에서 가장 높지만, Sharpe의 스위트 스팟은 top-3에서 top-8.

top-1이 헤드라인 수익률은 가장 좋지만 단일 종목 위험이 크다. Sharpe 스위트 스팟은 top-3 ~ top-8 구간에 있다 — 후보 바스켓이 자리 잡는 곳이다.

deep, focused, rebalance sweep 합쳐 약 1.5만 회 백테스트 후, 현재 추천 후보는:

signal:  sig_ensemble_primary_accel
entry:   next_vwap
hold:    5 거래일
basket:  top 3
sizing:  signal_positive (weight_param=1.0)

sig_ensemble_primary_accelrank(60일 모멘텀) + rank(외국인 순매수)rank(20일 모멘텀) + rank(외국인 가속도)를 결합한 신호다. 모멘텀 두 호라이즌, 수급 두 호라이즌, 단순 평균 rank. 5일 보유는 히트맵 결과와 매칭된다: 회전을 돌리기에는 충분히 짧고, 다일 신호를 흡수하기에는 충분히 길다.

validation.py의 검증 단계는 통과한다:

  • 시간순 4-split 테스트에서 각 윈도우의 수익률이 양수
  • 21일 블록 부트스트랩에서 하한 CI 밴드가 동일가중 유니버스 위
  • KODEX 200, 동일가중 유니버스, ADV-size, 모멘텀 프록시에 대한 팩터 회귀에서 양의 절편 잔존

다음 게이트는 워크포워드 검증이다 — 그리고 이게 가장 통과하기 어려워야 정상이다.

주의사항 — 솔직한 리스트

(나든 당신이든) 이걸 결론으로 받아들이기 전에:

  • 표본은 거래일 1년, 그것도 강한 KOSPI200 상승장이다. long-only 종목 선택을 인덱스 대비로 평가하기에는 가장 나쁜 레짐이다.
  • 다중 비교 편향이 실제로 있다. 5,280개 크리에이티브 sweep의 top을 골랐고, 그 다음 9,600개 가중 sizing sweep의 top을 골랐다. 워크포워드만이 정직한 답이다.
  • 서바이버십 보정 미완. 유니버스는 실행 시점 기준 point-in-time이지만, 과거 시점 유니버스 멤버십 / 상장폐지 로직은 아직 안 만들어져 있어서 백필된 종목이 위로 편향됐을 수 있다.
  • “장중 오라클” 런은 의도적으로 cheat한다. 당일 안에서 final daily KIS rank를 사용한다. 그 런은 천장(ceiling)이지 트레이드 가능한 전략이 아니다 — provisional 13:00~15:00 KIS snapshot이 충분히 안정적인지를 보기 위한 가능치 측정용이다.
  • liquidity_sqrt는 알파가 아니라 팩터일 수 있다. 원래 /04 대시보드에서 그 사이징 스킴이 준 lift는 새로운 엣지가 아니라 대형주 팩터 노출일 수 있다. 헤드라인 수치를 주장하기 전에 시총×섹터×유동성을 중립화해야 한다.

전략이 동일가중 유니버스 그리고 KODEX 200에 양의 절편을 가지고, 블록 부트스트랩에서도 살아남고, 워크포워드를 통과하고, 알려진 팩터들로 분해되지 않으면 — 그때 실제 자금으로 돌릴 가치가 있다. 넷 중 둘은 아직 TODO다.

다음

  • 현재 후보에 대해 6개월 롤링 윈도우 워크포워드.
  • 분해: 알파가 외국인 수급 특이적인가, 아니면 일반적인 60일 모멘텀 틸트에 수급 리밸런싱 트리거가 붙은 것인가?
  • Capacity & turnover: top 3 / 5일 보유에서 $10M는? $100M는?
  • 13:00 / 14:00 / 15:00 KIS provisional snapshot 수집기를 띄워서 외국인 수급 rank가 장중에 얼마나 안정적인지 측정 — 충분히 안정적이라면 “오라클” 런의 일부가 트레이드 가능해진다.
  • 5분봉으로 후보 리플레이: T+1 시가 vs first 30분 VWAP vs first 60분 VWAP vs full-day VWAP vs 종가 단일가.