포스트

AI-Trader로 실거래를 맡겨도 될까? 저장소 불일치와 백테스트 함정

이 글의 정보만 믿고 AI-Trader에 실제 자금을 맡겨서는 안 되며, 먼저 저장소 정체성과 코드 출처부터 다시 확인해야 합니다. 그 뒤에도 point-in-time 데이터와 비용 포함 검증, 주문 없는 실시간 관찰과 결정적 risk gate를 통과해야 실거래 후보를 논할 수 있습니다.

가장 먼저 확인할 것은 프로젝트의 정체다

페이지의 대표 저장소는 HKUDS/AI-Trader를 가리키지만, 본문 참고 자료는 AI-Trader-Foundation/core-engine강화학습 고빈도 거래 논문을 제시합니다. 서로 다른 자료의 기능을 한 프로젝트의 확정된 아키텍처처럼 읽으면 안 됩니다.

본문은 Python 모델과 Rust 주문 엔진, ZeroMQ 또는 공유 메모리, 링 버퍼와 LMAX Disruptor를 하나의 구성으로 설명합니다. 그러나 어느 저장소의 어느 버전이 각 요소를 실제로 구현하는지 연결하지 않습니다. “1밀리초 이하”나 “마이크로초” 같은 지연 수치도 측정 환경과 거래소까지의 네트워크 구간이 빠져 있어 재현 가능한 성능 약속이 아닙니다.

도입 검토의 첫 단계는 대표 저장소의 실제 구성, 설치 문서, 라이선스, 데이터 소스와 주문 연결부를 따로 확인하는 것입니다. 논문에서 제안한 모델, 다른 코어 엔진의 설계, 작성자가 그린 통합 구상을 분리해야 이후 검증이 가능합니다.

claim inventory를 만들면 혼합을 줄일 수 있습니다. “Rust 주문 엔진”, “ZeroMQ”, “LMAX Disruptor”, latency와 전략 성능마다 source URL, commit, paper section, 실행 artifact와 확인 상태를 붙입니다. 대표 저장소에 없는 기능은 future plan 또는 별도 project로 표시합니다. 출처가 없는 수치는 용량 계획과 투자 판단에서 제외합니다.

release, dependency와 license도 확인합니다. 시장 데이터, broker connector가 sample인지 운영용인지, API key와 주문 권한을 어떤 component가 읽는지 살핍니다. 저장소 이름이 같아도 fork, 조직이 다르면 security issue와 maintenance 책임이 다를 수 있습니다.

Rust 예시는 실행 코드가 아니라 개념 조각이다

원문 Rust 조각은 Python이 만든 신호를 ZeroMQ로 받아 주문을 보내는 흐름을 보여줍니다. 하지만 SignalConfig와 order_engine 같은 정의가 없고, 거래소 연결과 계좌, 위험 한도, 재시도, 중복 주문 방지까지 완성돼 있지 않습니다. 특정 거래소 API 키를 전제로 한 부분도 있어 그대로 빌드하거나 실거래에 사용할 수 있는 예제가 아닙니다.

아키텍처의 아이디어 자체는 분명합니다. 무거운 모델 추론과 시간에 민감한 주문 처리를 분리하고, 시장 데이터가 폭증할 때 고정 크기 버퍼와 소비자를 이용해 백프레셔를 관리하자는 접근입니다. 다만 빠른 언어와 IPC를 썼다고 주문이 자동으로 안전해지는 것은 아닙니다. 거래소의 API 제한, 현재 잔고, 주문 상태, 네트워크 지연과 실패 후 재전송이 함께 설계돼야 합니다.

레거시 원장에 Kafka 같은 비동기 메시지 큐를 두는 구상도 본문에 나오지만, 체결 순서와 중복 이벤트, 원장 반영 실패를 어떻게 처리하는지는 제시되지 않습니다. 이는 완성된 통합법이 아니라 분리 원칙을 설명하는 시나리오입니다.

model signal에는 symbol, side, target position 외에 event time, data version, model version, expiry와 unique signal ID가 필요합니다. 주문 service는 최신 market snapshot, 허용 instrument, balance, position과 risk limit를 다시 확인합니다. 오래됐거나 schema가 모르는 signal은 fail closed로 거부하고 모델이 정한 confidence만으로 통과시키지 않습니다.

order lifecycle은 submitted, acknowledged, partial fill, filled, rejected와 cancel pending을 상태로 관리합니다. timeout 뒤 동일 client order ID로 거래소 상태를 조회한 후 재시도해야 중복 주문을 막을 수 있습니다. Kafka event는 partition, sequence와 idempotent consumer를 사용하고 원장 reconciliation이 맞지 않으면 새 주문을 중단합니다. 빠른 IPC보다 이 상태 정확성이 먼저입니다.

백테스트 수익률보다 먼저 볼 세 가지

첫째는 미래 참조 편향입니다. 학습 시점에 미래 가격이나 나중에 확정된 지표가 조금이라도 섞이면 백테스트는 좋아 보여도 실시간 환경에서는 재현되지 않습니다. 데이터를 시간 순서로 자르고, 각 시점에 실제로 알 수 있었던 정보만 피처에 들어갔는지 확인해야 합니다.

둘째는 오프라인과 온라인 피처의 일치입니다. 백테스트 코드와 실시간 스트림 코드가 같은 계산식, 같은 누락값 처리, 같은 시간 기준을 쓰지 않으면 모델보다 데이터 경로가 결과를 망칩니다. 신호가 발생한 시점부터 주문이 접수되고 체결되는 시점까지의 지연도 백테스트에 반영해야 합니다.

셋째는 슬리피지와 거래 비용입니다. 본문이 강조한 초저지연 구조도 시장 충격이나 유동성 부족을 없애지 못합니다. 실제 체결 가능한 가격, 부분 체결, API 제한과 실패를 포함하지 않은 수익 곡선은 실거래 판단 근거로 부족합니다.

데이터 split은 임의 행 분할이 아니라 시간 순서의 train, validation, test와 walk-forward로 구성합니다. 당시 거래 가능했던 종목 universe, 상장 폐지와 corporate action을 포함해 survivorship bias를 막습니다. 뉴스, 재무 지표에는 발행, 수집 시각을 사용하고 나중에 수정된 값이 과거 feature에 들어가지 않게 합니다.

단순 전략, 거래하지 않음과 기존 rule을 기준선으로 둡니다. model, feature, risk component를 하나씩 제거하는 ablation으로 무엇이 기여했는지 확인합니다. return 외에 turnover, 최대 낙폭, tail loss, exposure, capacity와 비용 후 수익을 시장 국면별로 봅니다. 여러 전략을 시험해 가장 좋은 하나만 보고하면 selection bias가 생깁니다.

실거래 전에 필요한 중단 조건

처음부터 자금을 연결하기보다 과거 데이터 재현, 시간 순서가 보존된 검증, 모의 주문 순으로 범위를 넓혀야 합니다. 각 단계에서 모델 출력뿐 아니라 입력 피처, 의사결정 시각, 주문 요청과 거래소 응답을 함께 기록해야 문제 원인을 구분할 수 있습니다.

운영 단계에는 주문량, 일일 손실, 포지션의 상한, 데이터 지연 시 거래 중단, 모델 응답이 없거나 비정상일 때의 기본 동작이 필요합니다. 원문은 모델의 불확실성, GPU 상시 비용, Rust, Python, 금융 도메인을 함께 운영하는 난이도를 명확한 부담으로 지적합니다.

AI 모델이나 빠른 체결 엔진은 수익을 보장하지 않습니다. 이 자료에서 얻을 수 있는 유용한 관점은 추론과 주문 실행을 분리하고 백프레셔와 피처 일치를 점검하라는 설계 원칙입니다. 실제 프로젝트의 기능과 성능은 저장소별로 다시 검증하고, 그 전까지 원문의 코드는 아키텍처 설명용 스냅샷으로만 다루는 것이 맞습니다.

paper trading에서 무엇을 관찰할까

실시간 market input으로 signal을 만들되 broker에는 보내지 않고 당시 bid, ask와 가능한 체결을 기록합니다. signal age, online/offline feature diff, 제안, risk 거부율, 예상, 가능 체결가, rate-limit와 data gap을 trace합니다. backtest와 live shadow의 feature vector를 같은 timestamp에서 hash 비교하면 training-serving skew를 찾기 쉽습니다.

고의로 stale data, feed 단절, 큰 spread, 거래 중지, model timeout과 duplicate signal을 주입합니다. 어떤 경우에도 position, 일일 손실, order rate 상한을 넘지 않고 kill switch가 새 주문을 막는지 확인합니다. 사람의 emergency cancel과 credential revoke 절차를 반복 연습합니다.

실거래를 검토하더라도 모델이 broker credential을 직접 갖지 않고 별도 service가 작은 allowlist와 금액, 사람 승인을 집행해야 합니다. 이 글은 투자 조언이 아니며 수익을 보장하지 않습니다. 검증되지 않은 source 혼합이 남아 있거나 paper 결과가 비용 후 기준선을 넘지 못하면 도입을 멈추는 것이 올바른 결과입니다.

원문과 버전 확인

함께 읽으면 이해가 이어지는 글

자주 묻는 질문

AI-Trader의 backtest 수익률이 높으면 실거래를 시작해도 되나요?

안 됩니다. 미래 정보 누수, universe selection, slippage, fee와 online feature 차이를 제거하고 out-of-sample, paper trading을 거쳐야 합니다.

Python model과 Rust order engine을 나누면 주문이 안전해지나요?

자동으로 안전해지지 않습니다. schema, sequence, freshness와 중복, 부분 체결, 거래소 상태를 결정적 risk, order service가 검증해야 합니다.

저장소와 논문이 섞인 글은 어떻게 검토해야 하나요?

각 claim, code, 수치가 어느 repository commit이나 paper section에서 왔는지 provenance 표로 분리하고 확인되지 않은 통합 구조는 가정으로 취급해야 합니다.

THE END / OPSOAI

여기까지 읽었습니다

핵심 장면을 한 번 더 떠올려 보세요. 이해가 남았다면 이 책은 제 역할을 다했습니다.

다른 책 고르기
표지 1

키와 좌우 스와이프를 지원합니다. 읽던 페이지는 이 기기에 저장됩니다.

CONTENTS

이 책의 목차

    8개 장 16 분읽는 시간