이름만으로는 사람을 합치지 않는다 — vault 1단계와 동명이인
기업 노트 4,104장을 2초에 만들었다. 진짜 문제는 속도가 아니라 '이상호'가 12개 회사에 있다는 것이었고, 답은 DART가 주는 출생년월이었다.
설계만 하던 vault를 오늘 실제로 만들었다. 결론부터: 기업 노트 4,104장, 생성 2초, 같은 데이터로 다시 돌리면 한 바이트도 안 바뀐다. 그리고 만들기 전에 결정 하나를 해야 했다 — 사람을 어떻게 식별할 것인가.
먼저, 남의 것을 하나 봤다
유목민의 「시그널리포트」. 네이버 프리미엄콘텐츠 월 35만원, 정규직 7명과 비정규직 10여 명이 매일 새벽 "전일 급등주 + 왜 올랐나"를 80페이지로 정리한다. 형식은 이렇다.
< 우주 / 방산 > 와이제이링크 (+23.62%), 센서뷰 (+20.69%): 스페이스X 14차 스타십 시험비행…
(종목, 등락률, 이유 한 줄, 섹터). 우리가 DB에 넣으려는 이벤트와 같은 모양이다. 우리가 기각한 "이미 드러난 강세"를 사람 17명이 손으로 정리해 파는 것이고, 수천 명이 산다. 파는 건 알파가 아니라 정리된 주의력이다. 그리고 그 서비스는 콘텐츠를 한 달 뒤에 빼 버린다. 지도를 쌓아주지 않는다. 검증도 없다. 구독은 안 했다. 어떤 식인지는 알았으니 됐다.
어디에 둘 것인가
프로젝트 폴더는 네이버 MYBOX 동기화 폴더 안에 있다. 거기에 파일 4만 개를 넣으면 동기화 클라이언트가 멎는다. 그래서 vault는 MYBOX 밖 D:\SignalioVault\에 두고, 프로젝트는 경로만 안다. 백업은 나중에 VPS와 붙을 때까지 없다. 그걸 알고 선택했다.
동명이인 — 실측부터
인물 노트의 키를 이름으로 잡으면 어떻게 되는지 2년치 내부자 공시로 세어 봤다.
| 개인 이름 | 11,441개 |
| 2개사 이상에 걸친 이름 | 1,738개 (15%) — 건수로는 34% |
| 최다 | 이상호·김동현 12개사, 진양곤 9개사 |
진양곤은 HLB 그룹 오너다. 9개사에 있는 게 맞다. 이상호 12개사는 동명이인일 것이다. 이름만으로 합치면 이상호가 한 사람이 되고, 회사별로 나누면 진양곤이 아홉 사람이 된다. 둘 다 틀린다. 그리고 우리가 가장 원하는 링크가 진양곤 쪽이다 — 그룹을 가로지르는 사람.
열쇠는 DART에 있었다
사업보고서의 임원 현황을 DART API(exctvSttus)가 corp_code 하나로 준다. 이름, 성별, 출생년월, 직위, 등기 여부, 주요경력, 재직기간. 세 회사로 실측했다.
- 삼성전자: 전영현 1960-12 부회장, 노태문 1968-09 사장 …
- 엑스게이트: 이상우 1972-07 상무 미등기 / 이상욱 1972-06 상무 미등기. 한 글자 차이, 한 달 차이. 거래 기록의 "이상욱 비등기 상무"가 1972-06에 정확히 붙는다
- 유니온: 이름이 "이 건 영"으로 온다. 공백을 지워야 거래 기록의 "이건영"과 만난다. 기타비상무이사 원종홍의 경력에 "(주)가비아 공동대표" — 겸직이 곧 회사 간 관계다
미등기임원까지 준다. 거래 기록의 80%(등기 27% + 비등기 53%)에 강한 키를 붙일 수 있다. 나머지 20%는 임원이 아닌 대주주라 원문 공시를 따로 받아야 한다. 뒤로 미룬다.
결정: 강한 키, 그리고 회사에 갇힌 약한 키
사람 = 이름 + 출생년월. people/진양곤_1960-01.md. 이게 기본이다.
처음엔 "강한 키만 쓰고, 출생년월 없는 보고자는 노드 없이 텍스트로 두자"고 했다. 단순하니까. 그런데 세어 보니 그 20%가 누구인지가 문제였다. 임원이 아닌 주요주주 712쌍(10%이상주주·사실상지배주주), 5%룰 보고자 중 임원인 적 없는 1,445쌍. 오너와 그 가족이다. 지도에서 소유 관계를 빼면 남는 게 별로 없다.
그래서 약한 노드를 둔다. 단, 회사 안에 가둔다. people/홍길동@005930.md. 같은 회사 안의 동명이인은 드물어서 안전하고, 회사를 넘어서는 절대 자동으로 합치지 않는다. 나중에 같은 회사·같은 이름에 출생년월이 생기면 강한 노드로 승격하고, 약한 파일은 merged_into 스텁으로 남겨 링크가 깨지지 않게 한다.
잘못 나눈 건 나중에 합칠 수 있지만 잘못 합친 건 못 푼다. 백테스트에서 "좋은 결과일수록 의심"과 같은 정신이다 — 그럴듯한 연결일수록 증거를 요구한다.
1단계 결과
테스트를 먼저 썼다(27개). 사람이 쓴 메모를 생성기가 지우지 않는지, 마커가 깨진 파일을 건너뛰는지, 두 번 돌리면 바이트가 같은지.
| 측정 | 값 |
|---|---|
| 노트 | 4,104장 (상장 2,869 · 폐지 450 · 가격 없음 785) |
| 생성 | 데이터 로드 8.5초 + 쓰기 2.0초 (노트당 0.5ms) |
| 용량 | 5.9MB (디스크 15MB) |
| 재실행 | unchanged 4,104 — 1.0초 |
노트 한 장에는 개요(시장·시총·종가), DART 재무 11년(연결 우선), 내부자 2년 요약(보고자·직위·순변동 — 아직 링크 없음), 관계 자리가 있다. 인물 링크는 2단계에서 출생년월 키로 붙는다.
속도는 문제가 아니었다. 미니PC를 살 이유가 "24시간"이나 "연산"에는 없다는 게 다시 확인됐다. 남은 건 LLM 비용 하나다.
다음
2단계: 임원현황 3,990사 수집 → 인물 노트 → 기업↔인물 링크. 그때 진양곤이 9개 회사를 잇는 첫 번째 노드가 된다.