HERMES v3 진행상황: 이번에는 데이터부터 다시 쌓는 중
HERMES v3를 다시 짓기 시작한 지 얼마 안 됐는데, 생각보다 바닥 공사가 꽤 멀리 왔다.
아직 매매를 다시 시작한 건 아니다. 오히려 그 반대다. 이번에는 주문이나 쥬의 말투보다 먼저, 나중에 결과가 마음에 안 들어도 원인을 다시 찾아갈 수 있는 데이터와 규칙부터 깔고 있다.
이 글은 2026-08-01 밤, 현재 작업 트리와 테스트 결과를 보고 적는 중간 보고서다. 계좌·인증값·실제 보유 종목·주문 정보는 적지 않는다.
지금 어디까지 왔나
한 줄로 줄이면 이렇다.
v3는 매매 시스템이 아니라, 매매 시스템이 될 자격을 검증할 데이터 공장을 먼저 만들고 있다.
Phase 0의 구조 정리와 Phase 1a의 파이프라인 골격은 끝났다. 지금은 Phase 1, 그러니까 데이터 평면을 실제 값으로 채우는 구간이다. 바 데이터, 리서치 문서, 기업행동, 미국 주식 유니버스를 각각 따로 다루되, 나중에 하나의 백테스트에서 같은 시간 기준으로 만날 수 있게 하는 작업이다.
현재 Python 코드만 보면 운영 코드 52개 파일, 테스트 19개 파일로 구성돼 있다. 숫자 자체가 중요한 건 아니지만, 예전처럼 한 덩어리 안에서 기능을 계속 덧붙이는 대신 역할별 경계를 먼저 세우고 있다는 흔적은 된다.
1. 먼저 정리한 것은 “언제 알았는가”다
자동매매 쪽에서 제일 무서운 건 나중에 알게 된 정보를 과거 판단에 슬쩍 섞어 넣는 일이다. 결과는 좋아 보이는데 실제 당시에는 알 수 없었던 정보를 쓴 백테스트, 흔히 말하는 룩어헤드가 그렇게 생긴다.
그래서 v3의 데이터는 단순히 날짜만 저장하지 않는다.
- 가격 바는 원주가와 수정계수를 분리한다.
- 리서치 문서는 발행일보다 우리 시스템이 실제로 볼 수 있었던 시각을 기준으로 삼는다.
- 기업행동은 발표 시각, 확인 가능 시각, 실제 효력일을 따로 둔다.
- 저장소 쓰기는 한 경로만 통과하게 하고, 단계별 결과는 성공·건너뜀·저하 상태를 남긴다.
겉으로 보면 꽤 귀찮은 규칙이다. 하지만 이 귀찮음이 없으면 나중에 “왜 이 전략이 과거에서는 좋았지?”라는 질문에 답할 수 없다.
2. 가격 데이터는 실제로 쌓이기 시작했다
가장 먼저 규모가 나온 곳은 Binance 쪽이다.
- 3년 일봉·4시간봉·1시간봉 백필 완료
- 479개 심볼
- 10,810,642행
- 수집 후 품질 검사와 기존 데이터 교차 검증까지 통과
매크로와 환율도 10개 시계열, 7,443개 관측치까지 따로 쌓았다. 이 값들도 그냥 차트 장식이 아니라, 나중에 시장 국면을 나누고 수익을 원화 기준으로 읽을 때 사용할 기반이다.
국내 주식은 욕심내서 빨리 받으려다 KRX 쪽에서 차단을 한 번 맞았다. 이건 숨길 일이 아니라 이번 구조에서 가장 중요한 학습이었다. 지금은 호출 간격 하한을 코드로 강제했고, 차단이나 레이트 제한이 오면 계속 밀어붙이지 않고 바로 멈추도록 바꿨다. 국내 데이터는 일부 세션만 확보된 상태이며, 재개 전까지는 무리해서 채우지 않는다.
빠르게 많이 받는 것보다, 다음날 다시 돌려도 데이터를 망가뜨리지 않는 쪽을 선택한 셈이다.
3. 리서치는 옮기면서 오염도 같이 걷어냈다
v2에 있던 증권사 리서치 문서 6,270건과 문서-종목 연결 17,846건도 v3 평면으로 옮겼다. 단순 복사는 아니었다.
가장 큰 문제는 목표주가가 없는 문서를 0으로 저장하던 습관이었다. 실제로 3,749건, 거의 60%가 0이었다. 채권이나 산업 리포트는 애초에 목표주가가 없을 뿐인데, 이걸 숫자 0으로 취급하면 시스템은 “목표주가가 0원”이라고 오해한다.
v3에서는 모르는 값을 NULL로 두고, 0이 다시 들어오지 못하게 막았다. 리포트가 발행된 날과 우리가 수집해 읽을 수 있었던 날도 분리했다. 예전에 두 달 늦게 수집된 리포트가 있었는데, 발행일만 믿으면 그 두 달을 과거에 미리 알고 있었던 셈이 되기 때문이다.
그리고 모든 리포트를 곧바로 LLM에 넣는 방식도 멈췄다. 전량 6,270건으로 먼저 재보니 종목 리포트가 아닌 문서가 61%였고, 정규식으로 확실히 처리할 수 있는 문서까지 먼저 걷어내면 LLM 2단계로 넘어갈 것은 560건이었다. 월 기준 추정 토큰은 1,881만에서 168만으로 91.1% 줄었다.
모델을 더 많이 부르는 것보다, 모델에게 정말 판단이 필요한 문서만 넘기는 편이 더 낫다는 아주 단순한 결론이다.
4. 기업행동과 미국 주식도 비어 있던 자리를 채우는 중
액면분할, 유상증자 같은 기업행동은 과거 가격을 읽을 때 빠지면 안 되는 정보다. v2에는 스키마만 있고 실제로 채우는 경로가 거의 없었다. v3에서는 DART 공시에서 사건을 수집하고, 거래소의 수정주가와 원주가 비율로 실제 조정계수를 확인하는 구조를 따로 만들었다.
다만 여기에도 아직 남은 일이 있다. DART 목록만으로는 유상증자의 배정 방식이나 정확한 효력일을 다 알 수 없어서, 상세 공시 보강과 KRX 재개 뒤의 수정계수 적재가 필요하다. 이 항목은 안 채워진 상태에서 백테스트를 통과 처리하면 안 된다.
미국 주식은 계획보다 규모가 커졌다. KIS 공식 종목 마스터를 실제로 받아 보니 백필 대상이 처음 예상한 약 5,800개가 아니라 12,665개였다. NASDAQ·NYSE·AMEX의 주식과 ETF를 합친 값이다.
그래서 미국 일봉 어댑터와 재개 가능한 백필 러너를 만들었다. 원주가를 받도록 명시해 분할 뒤에 과거 가격이 조용히 바뀌는 문제도 피한다. 주식을 ETF보다 먼저 받도록 순서를 정했고, 전체 3년 백필은 아직 시작 전이다. 대상이 두 배 넘게 커진 만큼, 표본 검증과 호출 한도 확인을 거쳐야 한다.
그래서 지금 쥬는 무엇을 할 수 있나
아직은 사람처럼 종목을 보고 주문하는 쥬가 아니다.
지금의 v3는 데이터를 받아 저장하고, 이상한 행은 격리하고, 어느 데이터가 언제 들어왔는지 기록하고, 나중에 쓸 리서치 사실을 덜 오염된 형태로 정리하는 쪽에 가깝다.
아직 남은 큰 관문은 명확하다.
- 국내·미국 데이터의 백필과 완결성 검증
- 로컬 알파 엔진과 시장 국면 분류
- 같은 파이프라인을 재생하는 이벤트 기반 백테스트
- 비용을 뺀 뒤에도 기대값이 남는지 확인하는 게이트
- 그 뒤에야 판단 계층과 주문 계층
특히 실제 주문은 Phase 5 전까지 호출하지 않도록 막아 두었다. 지금 데이터가 많아 보인다고 바로 매매를 재개하면, v2에서 느꼈던 “왜 이런 결과가 나왔는지 모르겠다”로 금방 돌아갈 것 같다.
이번에는 나쁜 소식도 구조 안에 남긴다
이번 진행에서 마음에 드는 부분은 잘된 숫자만 쌓지 않는다는 점이다.
KRX 차단, Binance와 미국 유니버스의 생존 편향, 리서치의 짧은 과거 범위, 아직 비어 있는 기업행동 계수는 전부 계획서와 검증 대상에 남아 있다. 나중에 백테스트 결과가 좋아도 이 한계들을 무시하면 안 된다.
Claude로 다시 시작한 리팩토링의 결과가 더 좋을지는 아직 모른다. 다만 지금까지의 방향은 분명하다. 모델이 시스템을 대신 똑똑하게 만들어 주길 기다리기보다, 사람이 다시 이해할 수 있는 경계와 실패 기록을 먼저 만들어 두고 있다.
오늘은 “v3가 완성됐다”고 쓸 날은 아니다.
대신 이번에는 뼈대만 그려 둔 상태가 아니라, 실제 데이터를 얹고 실패한 경로까지 기록하기 시작했다고는 쓸 수 있겠다.
현재 검증
게시 전 현재 코드 기준으로 전체 테스트, 의존성 경계 검사, Ruff 정적 검사와 포맷 검사를 실행했다. 모두 통과했다. 외부 데이터 전체 백필이나 실제 주문 실행은 이 검증에 포함하지 않았다.
이 글은 개발 기록이며 투자 권유가 아니다. 시스템은 아직 백테스트와 실행 게이트를 통과하지 않았고, 실제 투자 판단은 별도로 해야 한다.
HERMES v3 진행상황: 이번에는 데이터부터 다시 쌓는 중