QuantLabNote

파이썬으로 '내 매매 채점 파이프라인' 만들기 — 숫자가 거짓말 못 하게 하는 설계

이 연구노트가 실제 매매 결정 44건을 어떻게 채점하는지, 그 파이프라인 구조를 공개합니다. 핵심 규칙은 하나 — 모든 숫자는 파이썬이 계산하고, 서술은 숫자를 만들지 않는다. 따라 만들 수 있게 코드 골격까지 담았습니다.

2026-07-27 · 데이터 2026-06-02 ~ 2026-07-17 · 자체 자동매매 시스템 decision_scores·fills·signals (읽기 전용) · 파이프라인 아키텍처 설명 + 실제 DB 카운트 인용 (compute→meta→body 3단 분리)

파이썬백테스트만들기매매성과측정데이터파이프라인AI자동매매

이 연구노트를 읽고 “나도 내 매매를 이렇게 채점해 보고 싶다”는 분들을 위한 글입니다. 결론부터 — 어렵지 않습니다. 어려운 건 규율입니다. 숫자가 거짓말을 못 하게 만드는 설계 하나면 됩니다. 이 사이트가 실제 결정 44건을 채점하는 구조를 그대로 공개합니다 (2026-06-02 ~ 2026-07-17, 인용 수치는 전부 실제 DB에서 계산 — 방법론).

단 하나의 규칙: 숫자는 코드만 만든다

이 파이프라인의 전부는 한 문장으로 요약됩니다 — “서술(글)은 숫자를 절대 만들지 않는다. 모든 수치는 파이썬이 계산해 딕셔너리로 넘긴다.” LLM이나 사람이 “대략 20%쯤”이라고 쓰는 순간 그 글은 신뢰를 잃습니다. 그래서 계산과 서술을 물리적으로 분리합니다.

3단 분리: compute → meta → body

각 연구는 함수 세 개로 이뤄집니다.

def compute() -> dict:
    # ① 데이터에서 '확정 숫자'만 뽑는다. 여기서 숫자가 끝난다.
    rows = query("select d20_score from decision_scores "
                 "where action='BUY_ENTRY' and d20_score is not null")
    scores = [r[0] for r in rows]
    return {"n": len(scores),
            "mean": round(sum(scores)/len(scores), 1)}

def meta(m) -> dict:      # ② 제목·요약·태그 (m의 값만 끼움)
    return {"title": f"매수 결정 {m['n']}건 채점", ...}

def body(m) -> str:       # ③ 본문 마크다운 (m의 값만 문장에 넣음)
    return f"평균 초과수익은 {m['mean']}%p였습니다."

body() 안에는 숫자 리터럴이 없습니다. 오직 m['mean'] 같은, compute가 이미 계산해 둔 값만 문자열에 끼웁니다. 이러면 서술이 아무리 화려해도 없는 숫자를 지어낼 수가 없습니다.

데이터는 읽기 전용으로만 연다

봇 DB는 절대 수정하지 않습니다. 연결 자체를 읽기 전용으로 강제합니다.

con = sqlite3.connect(f"file:{DB}?mode=ro", uri=True)  # ro = read-only

이 한 줄이 “분석하다가 실수로 원장을 건드리는” 사고를 원천 차단합니다. 채점 대상 데이터의 무결성이 곧 채점 결과의 신뢰이기 때문입니다.

채점은 어떻게 하나 — 실제 한 건

채점 공식은 단순합니다: 진입가 대비 N일 후 수익률에서, 같은 기간 S&P500 수익률을 뺀 값(%p). 양수면 시장을 이긴 것. 예를 들어 최근 채점된 한 건은 RDW(매수) — 진입가 12.17, 그때 S&P500 620.4600219726562, 20일 뒤 이 종목 8.600000381469727, 그래서 시장 대비 초과수익 채점 -19.4%p로 확정됐습니다.

이 방식으로 이 사이트는 결정 44건 중 20일이 지나 채점 가능한 39건을 채점했고, 신호 56,063건·체결 76건·일별손익 60일치를 같은 원칙으로 집계합니다. 표본이 작으면 연구 0004처럼 작다고 맨 앞에 씁니다.

따라 만들 때 체크리스트

  • 데이터 연결은 읽기 전용으로 연다.
  • 본문 문자열 안에 숫자 리터럴을 쓰지 않는다 — 전부 compute의 dict에서 온다.
  • 표본이 작으면(n<50) 그 사실을 결론보다 먼저 쓴다.
  • 국면·기간·표본수를 항상 함께 밝힌다 — 연구 0005처럼.

무엇을 배웠나

  • 백테스트 도구를 만드는 건 라이브러리가 아니라 규율이다. compute/서술 분리 하나가 환각을 0으로 만든다.
  • ‘작은 표본을 작다고 쓰는’ 정직함은 비용이 아니라 이 노트의 유일한 자산이다.
  • 이 구조는 매매뿐 아니라 어떤 개인 데이터(운동·가계부·공부)에도 그대로 쓸 수 있다.

다음 연구 예고: 이 파이프라인이 24시간 무인으로 돌기 위해 실제로 무엇이 필요한지(데이터·서버)를 연구 0011에서 운영 규모 숫자로 뜯어봅니다.

※ 본 글은 정보·교육 목적이며 특정 종목의 매수·매도 권유가 아닙니다. 모든 수치는 위에 명시된 데이터·기간 기준으로 코드로 계산한 값이며, 과거 성과는 미래 수익을 보장하지 않습니다.

📘 이 글, 책으로도 있어요 — 무료 샘플 읽기 · 전자책 보기