빨강 · 확정 장부로 쓰면 안 됨
원가가 비어 있는 KIS·키움 스냅샷과, 시작 보유분을 알 수 없는 경우입니다.
2026년 8월 17일 · 전체 API 이력 대사 완료 · 15세도 이해할 수 있는 설명
2020년부터 현재까지의 기관 API 기록을 따로 모아 DB와 대조했습니다. 결론은 “아무 숫자나 믿으면 안 되지만, 이전보다 훨씬 분명히 구분할 수 있다”입니다.
원가가 비어 있는 KIS·키움 스냅샷과, 시작 보유분을 알 수 없는 경우입니다.
API와 DB 수수료 차이, 키움의 거래번호 형식 변경, 수동 보정 거래입니다.
업비트·빗썸의 API 거래는 DB 거래와 수수료가 고유 거래번호 기준으로 일치합니다.
각 기관 API에서 2020-01-01부터 2026-08-17까지의 거래를 다시 받아, 운영 DB는 건드리지 않고 별도 감사 저장소에 보관했습니다. 응답 파일마다 해시를 검사했고 불일치는 0건이었습니다.
| 기관 | 완료 기간 창 | API 거래 행 | DB와의 핵심 결과 |
|---|---|---|---|
| 업비트 | 347 | 785 | API 거래 전체 반영 · 가상 잔고 보정 1건은 실제 주문이 아님 |
| 빗썸 | 347 | 203 | API 거래 전체 반영 · 수동/가상 보정 5건은 실제 주문이 아님 |
| 토스증권 | 81 | 147 | 실제 주문 147건 일치 · 수동 시작원가 보정 2건 존재 |
| 키움증권 | 346 | 289 | 거래번호 형식 변경과 집계/체결 중복이 있어 경제값 기준 대사 필요 |
| KIS | 346 | 별도 조회 | 거래·손익·원가 조회 증적 수집 완료, 스냅샷 원가 매핑은 아직 비어 있음 |
평가손익은 지금 가치 − 산 가격입니다. 산 가격이 비어 있으면, 화면에 나온 이익·손실을 기관 원본 기준으로 확정할 수 없습니다.
| 문제 구간 | 원가가 비어 있는 평가 범위 | 거래원장 복원 결과 | 판정 |
|---|---|---|---|
| KIS 보유 주식 | 189,752,300원 | 평가손익 약 -8,346,000원 | 기관 스냅샷만으로는 확정 불가 |
| 키움 보유 주식 | 1,913,203원 | 평가손익 약 -9,048,644원 | 기관 스냅샷만으로는 확정 불가 |
최대 오차를 하나의 숫자로 못 박을 수는 없습니다. 시작부터 보유했던 주식, 입출고, 액면분할처럼 거래원장 밖의 일이 있었다면 원가 자체가 달라질 수 있기 때문입니다. 다만 현재 거래원장만으로 복원한 두 금액은 “가장 그럴듯한 추정치”이며, 기관의 평균매입단가 또는 공식 거래명세로 확인해야 확정됩니다.
실현 이벤트가 매도 건수보다 많은 이유는 한 번의 매도가 여러 개의 과거 매수 묶음(lot)을 나눠 사용하기 때문입니다. 계산식 오류는 0건이었습니다: 모든 이벤트가 ‘매도금액 − 취득원가 − 수수료 = 실현손익’과 일치합니다.
매도 6건(총 거래금액 8,301,580원, 수수료 1,190원)은 키움의 같은 날 집계 거래와 체결별 거래가 겹친 사례입니다. 둘 다 더하면 같은 매도를 두 번 센 셈이므로 체결별 6건을 억제했습니다. 억제하지 않았다면 보유 수량과 손익이 중복될 수 있었습니다.
남은 위험: 억제 규칙이 잘못된 경우 이 묶음의 경제적 영향 상한은 매도금액 830만 원 범위입니다. 하지만 수량이 정확히 같고, 집계금액 차이가 20원·50원 수준이며, 원본 체결 수수료 1,190원이 확인돼 현재 판정은 적합합니다.
최신 API 증적과 같은 주문번호를 다시 대조해, 원본 거래의 수수료 필드만 갱신했습니다.
| 기관 | 보정 주문 수 | 반영 수수료 | 결과 |
|---|---|---|---|
| 토스증권 | 92건 | +223,894.07원 | 최신 API 값으로 갱신 |
| 키움증권 | 2건 | +5,250원 | 집계 거래에 체결 수수료 연결 |
| 토스 수동 보정 | 3건 | 48,592.99원 | 의도적 0원 고정이라 자동 변경 제외 |
키움 API는 어떤 날에는 거래를 한 줄로 합친 결과와 여러 체결 줄을 함께 제공합니다. 예를 들어 2026-07-07에 082270 200주와 287840 250주는 DB의 집계 줄과 API의 분할 체결 줄이 서로 대응합니다. 금액 차이는 각각 20원·50원 수준이지만, 수수료는 분할 체결 줄에 있습니다.
| 거래 | 집계 거래금액 | 분할 체결 합계 | 차이 | 분할 체결 수수료 |
|---|---|---|---|---|
| 082270 · 200주 | 2,201,400원 | 2,201,380원 | 20원 | 320원 |
| 287840 · 250주 | 6,100,250원 | 6,100,200원 | 50원 | 870원 |
현재 억제수칙의 평가는 조건부 적합입니다. 제공자·계좌·종목·날짜·매매 방향이 같고, 합계 수량이 정확히 같으며 금액 차이가 아주 작을 때만 숨기고 원본은 삭제하지 않습니다. 이 사례에서는 안전합니다. 하지만 독립 주문이 우연히 비슷해 보이는 경우까지 완전히 배제할 수 없으므로, 830만 원 이상 묶음은 자동 억제 뒤 사람이 한 번 확인하는 규칙이 필요합니다.
같은 시작 보유분, 모든 매수·매도·수수료가 포함, 마지막에 전량 매도라는 세 조건이 맞으면 누적 실현손익은 FIFO와 이동평균이 같습니다. 중간에 일부만 팔았을 때만 어느 매수를 먼저 썼다고 보느냐에 따라 시점별 숫자가 달라집니다.
따라서 지금 차이는 “FIFO가 틀렸다”는 뜻이 아니라, 원가 NULL·수수료 차이·시작 보유분·중복 보정이 조건을 깨뜨릴 수 있다는 경고입니다.
적합. 4개 기관 전체 기간 수집 완료, 원본 응답 해시 불일치 0건.
조건부 적합. 거래원장 FIFO는 작동하지만 수수료·원가 경고를 함께 보여야 합니다.
아직 부적합. KIS 원가와 토스·키움 수수료 대사 전에는 확정 장부로 사용하면 안 됩니다.
이 페이지는 2026년 8월 17일에 동결한 DB와 API 응답을 대조한 결과입니다. API가 과거에 이미 정정한 내역, 계좌 밖 입출고, 최초 보유분의 공식 원가까지 자동으로 증명하지는 않습니다. 그래서 빨강·노랑 항목은 ‘확정값’이 아니라 확인이 필요한 위험으로 표시했습니다.