Strasmore Research
학습 Matt Connor작성자 Matt Connor

오픈 소스 퀀트 트레이딩 책으로 배우는 법

오픈 소스 퀀트 트레이딩 서적이 데이터 수집부터 주문 집행까지의 전체 과정을 설명합니다. 초보자가 막히는 단계와 미국 주식에 적용할 수 있는 부분을 살펴봅니다.

오픈 소스 퀀트 트레이딩 서적은 무료 공개 교육 과정이다. 초보자가 접하는 순서에 따라 원시 데이터에서 실거래 주문까지의 전체 과정을 정리해 놓았다. xingwudao가 GitHub에 공개한 XQuant: Everyone Can Be a Quantitative Trader 원고는 2026년 8월 기준 686개의 별을 받은 대표적인 사례다. 9개 장은 거의 모든 퀀트 교육 과정이 거치는 흐름을 따른다. 이 글은 그 흐름을 단계별로 살펴본다. 각 단계에서 발생하는 구체적인 실패 요인을 설명한다. 또한 중국 A주에서 미국 주식으로 적용할 때 어떤 부분이 유효한지도 구분한다.

오픈소스 퀀트 트레이딩 서적에는 무엇이 담겨 있는가?

초급 커리큘럼에서 브랜드만 제거하면 다음 다섯 단계가 남는다. 데이터를 수집하고 정제한 뒤, 데이터에서 시그널을 만들고, 과거 데이터로 해당 시그널을 검증한다. 그다음 투자 규모를 결정하고, 주문을 전송하면서 비용을 부담한다. 016b66e 기준 2026년 7월 14일에 확인한 XQuant 목차도 아홉 개 장에서 같은 내용을 다룬다.

  • 준비 단계, 이어서 1장: 하나의 전략을 처음부터 끝까지 실행한다.
  • 2장, 무엇을 매수할 것인가: 세 개의 ETF로 시작한다.
  • 3장, 얼마나 매수할 것인가: 세 가지 자산 배분 방법을 서로 비교한다.
  • 4장, 언제 거래할 것인가: 리밸런싱, 손절매, 이익 실현을 다룬다.
  • 5장, 전략이 유효한지 어떻게 판단할 것인가: 네 가지 관점에서 평가한다.
  • 6장, 너무 일찍 기뻐하지 말 것: 과적합을 방지한다.
  • 7장, 이상적인 거래에서 실제 거래로: 거래를 집행한다.
  • 8장, 출시 이후의 운영: 모니터링, 진단, 반복 개선을 수행한다.
  • 9장, 새로운 기회 찾기: 팩터 리서치를 소개한다.

이 순서는 주목할 만하다. 포지션 사이징이 3장에 배치되어 두 개의 백테스트 장보다 앞서고, 팩터 리서치는 마지막에 나온다. 독학 방식은 대체로 반대 순서로 진행된다. 먼저 팩터 아이디어를 세우고, 다음으로 백테스트를 수행하며, 포지션 사이징 규칙은 아예 다루지 않는 경우가 많다. 같은 날짜 기준으로 별표 333개를 받은 보조 실습 저장소는 완성된 코드가 아니라 문서화된 작업 명세를 중심으로 구성되어 있다. 독자가 AI 어시스턴트에게 해당 명세의 구현을 지시하는 방식이다. 직접 작성하지 않은 코드를 읽는 능력은 아래의 모든 과정을 좌우한다. 이후 발생하는 각각의 실패가 구현 세부 사항 하나에 숨어 있기 때문이다.

1단계: 데이터를 확보한 다음 분석 대상군을 정의한다

데이터 작업에서 정제는 눈에 보이는 절반이다. 잘못 체결된 거래, 누락된 거래일, 주식분할 및 배당 조정이 여기에 해당한다. 반면 어떤 종목을 분석할지 선택하는 일은 보이지 않는 절반이다. 전략 코드가 한 줄도 작성되기 전에 여기서 생존자 편향이 발생한다. 6월의 어느 한 주에 거래가 체결된 모든 미국 ticker를 매년 한 번씩 추적한 뒤, 2026년의 같은 주에도 몇 개가 계속 거래되고 있었는지 확인해야 한다.

조회6월 한 주에 거래된 미국 티커와 2026년 6월에도 계속 거래된 종목 수
모든 수치 뒤에 숨겨진 정확한 SQL
WITH june_week AS (
    SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS year,
           ticker
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE toMonth(toTimeZone(window_start, 'America/New_York')) = 6
      AND toDayOfMonth(toTimeZone(window_start, 'America/New_York')) BETWEEN 10 AND 16
      AND toYear(toTimeZone(window_start, 'America/New_York')) BETWEEN 2016 AND 2026
      AND volume > 0
    GROUP BY year, ticker
),
survivors AS (
    SELECT ticker FROM june_week WHERE year = 2026
)
SELECT year,
       uniqExact(ticker) AS tickers_traded,
       uniqExactIf(ticker, ticker IN (SELECT ticker FROM survivors)) AS still_trading_2026,
       round(100 * uniqExactIf(ticker, ticker IN (SELECT ticker FROM survivors))
             / uniqExact(ticker), 1) AS still_trading_pct
FROM june_week
GROUP BY year
ORDER BY year
Run this yourself

2016의 해당 주에 거래된 8224개 ticker 가운데 2026의 같은 주에도 계속 거래된 종목은 50%개였다. 나머지 종목은 인수되거나 합병됐고, 명칭이 변경됐거나 상장폐지됐다. 현재의 종목 목록으로 구축한 백테스트는 살아남은 종목만 분석한다. 또한 사후적으로 선정된 기업을 보유한 전략에 수익을 부여한다. 초보자용 데이터 피드는 경고 없이 이러한 생존 종목 목록을 제공한다. 무료 주식시장 데이터 API 가이드에서는 이러한 피드가 어떤 데이터를 제공하고 제공하지 않는지 설명한다.

2단계: 데이터를 시그널로 전환하기

시그널은 특정 시점에 주식의 점수를 산출하는 규칙입니다. 팩터는 여러 종목에 걸쳐 지속적으로 유효하다고 판단하는 시그널입니다. 모멘텀, 가치, 저변동성이 대표적인 교과서적 사례입니다. 이 단계에서 발생하는 문제는 하나의 규칙이 작동할 때까지 계속 테스트하는 것입니다. 하나의 지수에서 한 세기 동안의 데이터를 대상으로 이동평균 교차 규칙을 스무 가지 변형해 테스트하면 항상 승자가 나옵니다. 그리고 그 승자는 노이즈에 가장 잘 맞춰진 규칙입니다. 방어 방법은 화려하지 않습니다. 측정하기 전에 규칙을 확정해야 합니다. 전혀 확인하지 않을 과거 데이터 일부를 따로 보관해야 합니다. 시도한 모든 변형을 기록해야 합니다. 조정 가능한 숫자는 적을수록 좋습니다. XQuant는 팩터 연구에 앞서 이 내용을 한 장 전체에서 다룹니다. 이는 올바른 순서입니다.

3단계: 백테스트, 대부분의 초보자가 멈추는 단계

이 단계에서 대부분의 독학 프로젝트가 종료된다. 대개 매우 좋아 보이는 자본곡선만 남긴 채 조용히 끝난다. 앞서 설명한 생존자 편향은 두 가지 오류 중 첫 번째다. 두 번째는 미래정보 편향이다. 주문을 제출해야 하는 시점에 시장이 아직 제공하지 않은 수치를 전략이 사용한다. 가장 흔한 형태는 오늘의 종가로 계산한 규칙을 같은 종가에 체결하는 것이다. 이 가정이 건너뛰는 거리를 측정해야 한다.

조회월별 전일 종가와 다음 거래일 시가 간 평균 차이
모든 수치 뒤에 숨겨진 정확한 SQL
WITH sessions AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS session,
           argMin(open, window_start) AS session_open,
           argMax(close, window_start) AS session_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'NVDA')
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2024-08-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, session
),
gaps AS (
    SELECT ticker,
           session,
           toFloat64(session_open) AS open_px,
           toFloat64(lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY session)) AS prev_close
    FROM sessions
)
SELECT formatDateTime(toStartOfMonth(session), '%Y-%m') AS month,
       formatDateTimeInJodaSyntax(toStartOfMonth(session), 'MMMM yyyy') AS month_label,
       round(avgIf(abs(open_px / prev_close - 1) * 10000, ticker = 'SPY'), 1) AS spy_gap_bps,
       round(avgIf(abs(open_px / prev_close - 1) * 10000, ticker = 'NVDA'), 1) AS nvda_gap_bps
FROM gaps
WHERE prev_close > 0
GROUP BY month, month_label
HAVING countIf(ticker = 'SPY') > 0 AND countIf(ticker = 'NVDA') > 0
ORDER BY month
Run this yourself

July 2026에서 종가와 다음 시가의 평균 거리는 SPY에서 40.8bp, NVDA에서 107.4bp로 측정됐다. 1bp는 1%포인트의 100분의 1이다. August 2024부터 시작하는 패널의 전체 24개월이 0을 웃돈다. 종가에 의사결정을 내리고 같은 종가에 체결하는 백테스트는 모든 거래에서 이 거리를 비용 없이 얻는다. 그러나 실제 주문에서는 이런 일이 일어나지 않는다. 백테스트의 미래정보 편향에서는 그 작동 원리를 분석하고, 주가가 밤사이 갭을 보이는 이유에서는 갭 자체를 설명한다.

4단계: 매수 규모를 결정한다

여기서 문제는 부재다. 독학으로 투자하는 트레이더 대부분은 포지션 규모 규칙을 작성하지 않는다. 따라서 대개 종목별로 동일한 금액을 배분하거나, 그때그때 사용 가능한 현금을 투자하는 방식이 사실상의 규칙이 된다. 동일한 금액을 투자한다고 위험이 동일해지는 것은 아니다.

조회일일 변동 12개월: 연환산 변동성과 최악의 거래일, 8개 종목
모든 수치 뒤에 숨겨진 정확한 SQL
WITH daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS session,
           argMax(close, window_start) AS session_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'KO', 'JNJ', 'MSFT', 'AAPL', 'NVDA', 'TSLA', 'COIN')
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2025-08-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, session
),
rets AS (
    SELECT ticker,
           toFloat64(session_close) AS close_px,
           toFloat64(lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY session)) AS prev_close
    FROM daily
)
SELECT ticker,
       round(stddevSamp(close_px / prev_close - 1) * sqrt(252) * 100, 1) AS annualized_vol_pct,
       round(abs(min(close_px / prev_close - 1)) * 100, 2) AS worst_day_pct
FROM rets
WHERE prev_close > 0
GROUP BY ticker
ORDER BY annualized_vol_pct DESC
Run this yourself

2026년 7월 31일로 끝나는 12개월 동안 COIN의 연환산 변동성은 68%였다. 패널에서 가장 안정적인 흐름을 보인 SPY12.7%였다. COIN의 최악의 단일 거래일 종가는 직전 종가보다 13.34% 낮았다. 반면 SPY의 최악의 하루 하락률은 2.69%였다. 각 종목에 동일한 금액을 투자하면 일일 변동폭은 크게 달라진다. 초보자가 실제로 경험하는 것은 신호가 아니라 이 변동폭이다. Kelly 기준 포지션 규모 설정은 하나의 공식적인 해법을 제시한다. 집중 위험은 비공식적인 해법이 어떤 형태를 보이는지 설명한다.

5단계: 실행과 백테스트가 잊는 비용

두 가지 비용이 있으며, 하나만 눈에 보입니다. 수수료와 규제 수수료는 거래 명세서에 표시됩니다. 슬리피지는 표시되지 않습니다. 슬리피지는 화면에 보인 가격과 실제 체결 가격의 차이입니다. 슬리피지의 하한은 매수·매도 호가 스프레드입니다. 이는 해당 시점의 최우선 매수호가와 최우선 매도호가 사이의 차이입니다. 매수자는 매도호가를 지불하고 매도자는 매수호가에 체결하므로, 왕복 거래에서는 스프레드를 두 번 넘게 됩니다. 스프레드는 고정값이 아닙니다.

조회미 동부시간 30분 단위 평균 호가 스프레드: AAPL 및 KO, 2026년 7월 17일 금요일
모든 수치 뒤에 숨겨진 정확한 SQL
WITH quotes AS (
    SELECT ticker,
           toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE) AS bucket,
           toFloat64(ask_price - bid_price) / toFloat64((ask_price + bid_price) / 2) * 10000 AS spread_bps
    FROM global_markets.cache_stocks_quotes
    WHERE ticker IN ('AAPL', 'KO')
      AND sip_timestamp >= toDateTime('2026-07-17 13:00:00')
      AND sip_timestamp < toDateTime('2026-07-17 21:00:00')
      AND bid_price > 0
      AND ask_price > bid_price
)
SELECT formatDateTime(bucket, '%H:%i') AS et_time,
       round(avgIf(spread_bps, ticker = 'AAPL'), 2) AS aapl_spread_bps,
       round(avgIf(spread_bps, ticker = 'KO'), 2) AS ko_spread_bps
FROM quotes
WHERE spread_bps > 0 AND spread_bps < 500
GROUP BY et_time
HAVING countIf(ticker = 'AAPL') > 0 AND countIf(ticker = 'KO') > 0
ORDER BY et_time
Run this yourself

이 패널은 한 금요일의 16개 30분 구간을 다룹니다. 개장 종 전 09:00번째 구간부터 폐장 후 16:30번째 구간까지입니다. 첫 구간에서 AAPL의 호가 스프레드는 10.53 베이시스포인트였고, 마지막 구간에서는 3.27였습니다. KO는 각각 28.878.04였습니다. 이날 가장 좁은 호가는 차트 중앙에 있으며, 양 끝 구간과 대조됩니다. 시장에서 유동성이 가장 높은 종목 두 개를 개장 시 거래하는 전략은 같은 전략을 한낮에 실행할 때와 다른 비용을 부담합니다. 비용을 0으로 가정한 백테스트는 어느 경우의 비용도 제대로 반영하지 못합니다. 매수·매도 호가 스프레드는 그 수치를 정의하고, 개장 시 스프레드가 확대되는 이유는 곡선의 형태를 설명하며, 주식 거래에 드는 비용은 왕복 거래 전체의 비용을 합산합니다. 깔끔한 백테스트와 실제 자금 운용 사이에는 한 단계가 더 있습니다. 바로 실제 자금 투입 전 모의거래입니다.

A 주식 커리큘럼 중 미국 주식에 적용할 수 있는 부분은 무엇인가?

XQuant와 유사한 방법론은 중국 A 주식과 ETF를 대상으로 작성됐다. 그러나 방법론 자체는 그대로 적용된다. 단계의 순서, 정의, 과적합 관리 원칙, 비용을 사후적으로 처리하지 않고 항목으로 기록하는 습관, 포지션 규모 산정의 모든 계산이 이에 해당한다. 가격 바는 어디서나 가격 바다. 다만 그 주변의 규정은 그대로 적용되지 않는다.

  • A 주식에는 실제 T+1 제한이 적용된다. 당일 매수한 주식은 다음 거래 세션까지 매도할 수 없다. 미국의 T+1은 결제 관행일 뿐이며 장중 거래를 제한하지 않는다. 다만 패턴 데이 트레이더 규정에 따라 증거금 계좌의 잔고가 $25,000 미만이면 영업일 기준 5일 동안 데이 트레이딩을 3회로 제한한다.
  • 중국 본토 메인보드 A 주식은 일일 가격 변동폭이 10%로 제한되며, 성장판은 20%로 제한된다. 미국 주식에는 일일 가격 제한폭이 없다. 대신 변동성 밴드와 뉴스에 따른 거래 중단이 적용된다.
  • A 주식 주문은 100주 단위로 거래된다. 미국의 많은 브로커는 소수점 주식 거래를 지원한다. 이에 따라 포지션 규모 산정 규칙이 표현할 수 있는 범위 자체가 달라진다.
  • 중국은 매도 측에 인지세를 부과한다. 미국의 매도자는 규모와 구조가 다른 소액의 규제 수수료를 부담한다.
  • 상하이와 선전 시장의 점심 휴장 시간을 포함해 거래 세션 구조도 다르다. 미국 주식시장 거래 시간은 중단 없이 이어지며 종가 경매로 종료된다.

교육 과정에서 배운 비용이나 시간 관련 상수를 자신의 코드에 그대로 복사하면, 첫 실거래 주문에서 문제가 발생할 수 있다.

README가 아니라 참조 대상을 고정하라

2026년 8월 기준으로 저장소에는 태그가 지정된 릴리스가 없다. 따라서 지속적으로 인용할 수 있는 대상은 2026년 7월 14일의 커밋 016b66e이다. 아직 집필 중인 책에서는 이 점이 중요하다. 장 번호는 바뀌고, README 파일은 다시 작성되며, 7장을 가리키던 링크가 어느새 다른 내용을 가리킬 수 있다. 커밋과 날짜를 인용하고, 장 번호가 아니라 읽은 장의 제목을 기록해야 1년 뒤에도 노트를 확인할 수 있다. 원고는 CC BY-NC-SA 4.0으로 공개되며, 빌드 스크립트에는 MIT 라이선스가 적용된다. 이는 강의계획서 자체가 전하는 마지막 교훈이기도 하다. 고정된 데이터 스냅샷에서 다시 실행할 수 없는 전략은 결과가 아니라 이야기에 불과하다.

FAQ

무료 오픈소스 서적으로 퀀트 트레이딩을 배울 수 있습니까?

기본적인 방향을 잡는 데는 가능합니다. 오픈 원고라면 모든 주장을 출처와 대조할 수 있습니다. 그러나 서적이 제공할 수 없는 것도 있습니다. 바로 자신의 시장에 맞는 데이터, 비용, 규정입니다. 특정 거래소를 기준으로 작성된 커리큘럼은 이 지점에서 자신의 브로커와 더 이상 일치하지 않게 됩니다.

퀀트 커리큘럼에서 대부분의 초보자가 가장 많이 막히는 단계는 무엇입니까?

백테스트입니다. 이 단계에는 결과를 실제보다 좋게 보이게 만드는 오류가 두 가지 있습니다. 하나는 사후에 구성한 종목군에서 발생하는 생존자 편향이고, 다른 하나는 아직 시계에 표시되지 않은 가격으로 체결하는 룩어헤드 편향입니다. 50%의 종목만이 2016의 해당 6월 주간에 거래되고 있었으며, 10년 뒤에도 거래를 지속했습니다.

생존자 편향과 룩어헤드 편향의 차이는 무엇입니까?

생존자 편향은 종목군의 문제입니다. 검증 대상 종목이 살아남은 종목이라는 이유로 선정됐기 때문에 발생합니다. 룩어헤드 편향은 시점의 문제입니다. 전략이 주문을 제출해야 했던 시점에는 존재하지 않았던 수치를 사용하기 때문에 발생합니다. 전자는 종목 목록을 부풀리고, 후자는 체결 가격을 유리하게 부풀립니다.

중국 A주 퀀트 과정이 미국 주식에도 적용됩니까?

방법론은 적용됩니다. 그러나 시장 규정은 다릅니다. 단계의 순서, 과적합 통제, 비용 계산 방식은 유지해야 합니다. 이후 실제 자금이 움직이기 전에 데이터 처리 방식, T+1 매도 제한, 일일 가격 제한, 거래 단위를 미국 시장에 맞는 기준으로 바꿔야 합니다.


위의 모든 패널은 SQL이 함께 저장된 쿼리입니다. 패널 하나를 열고 종목 또는 날짜를 바꾼 뒤 Strasmore terminal에서 직접 실행하면 됩니다.

#quant#learning path#backtesting#open source#beginners