자본시장과 결제 · 체결 취소와 정정, 그리고 장부 상쇄 · 실습
취소 통지가 두 번 들어와 포지션이 반대로 넘어갔다
목표
이미 나간 체결에 대한 취소·정정 통지를 원 체결에 이어 붙이고, 원 장부를 지우는 대신 상쇄 기록을 더해 새 장부를 만듭니다. 포지션을 다시 계산해 이미 나간 보고와 대조하고, 같은 통지를 두 번 받아도 장부가 같은지 확인한 뒤 재보고 대상과 정정 보고서를 냅니다.
왜 중요한가
체결 원장은 이미 여러 곳으로 흘러 나간 자료입니다. 그 한 줄을 조용히 고쳐 쓰면 어제 나간 보고와 오늘 보는 원장이 어긋나고, 어긋난 이유는 어디에도 남지 않습니다. 그래서 금융 장부는 뒤에 씁니다. 취소는 부호가 반대인 상쇄 기록을 더하는 일이고, 정정은 상쇄한 뒤 고쳐진 값으로 다시 쓰는 일입니다. 어려운 것은 이 규칙 자체가 아니라 가장자리입니다. 통지가 없는 체결을 가리킬 수도 있고, 같은 통지가 재전송으로 두 번 올 수도 있고, 이미 취소된 체결에 정정이 올 수도 있습니다. 하나만 놓쳐도 포지션이 반대로 넘어가고, 그 사실은 대개 다음 날 보고가 틀린 뒤에야 드러납니다.
단계
1. python3 로 /root/bust/data 에 fills.jsonl·notices.jsonl·position_report.csv·rules.json 을 만듭니다.
2. 통지를 도착 순서대로 읽어 판정을 /root/bust/notice_match.csv 에 적습니다.
3. 적용할 취소를 상쇄 기록으로 더해 /root/bust/ledger_bust.jsonl 을 만듭니다.
4. 정정을 상쇄와 재기장으로 더해 /root/bust/ledger_final.jsonl 을 만들고 주문별 평균 단가를 /root/bust/order_avg.csv 에 냅니다.
5. 포지션을 다시 계산해 /root/bust/position_diff.csv 에 어긋난 종목만 적습니다.
6. 같은 통지 스트림을 두 번 흘려 넣어 /root/bust/ledger_twice.jsonl 과 /root/bust/idem.json 을 만듭니다.
7. 보고 시각 뒤에 도착한 통지를 모아 /root/bust/rereport.csv 를 만듭니다.
8. 변경 하나하나의 출처를 /root/bust/trace.csv 에, 전체 요약을 /root/bust/report.json 에 적습니다.
참고
- 통지는
seq가 도착 순서입니다. 판정은 이 순서대로 하고, 적용한 취소를 기억해야 재취소를 가를 수 있습니다. - 판정 이름은 넷입니다. 같은 통지 식별자를 앞에서 이미 본 것은
중복통지, 가리키는 체결이 원장에 없으면대상없음, 가리키는 체결이 앞에서 이미 취소됐으면이미취소됨, 나머지는적용입니다. 이 순서로 봅니다. - 장부 기록은 열한 칸입니다.
entry_id·kind·fill_id·order_id·symbol·side·qty·px·notional·source_notice·entry_time.kind는fill·reversal·rebook셋입니다. - 상쇄 기록의
entry_id는 통지 식별자에-rv를 붙인 것, 재기장은-rb를 붙인 것입니다.entry_time은 통지 시각입니다. - 정정 통지의
new_qty·new_px가null이면 그 값은 원 체결의 값을 그대로 씁니다. - 금액은
decimal로 계산하고 소수 넷째 자리에서ROUND_HALF_UP으로 반올림합니다. 문자열로 적으세요. - 포지션은 매수를 더하고 매도를 빼서 셉니다. 상쇄 기록은 수량이 음수라 부호가 저절로 뒤집힙니다.
- 자료 파일
rules.json에 포지션 보고 시각이 들어 있습니다.date로 오늘을 쓰지 마세요. - 흔한 실수 1: 원 기록을 고쳐서 정정하는 것. 적용 전 자료가 남아 있어야 전후를 견줄 수 있습니다.
- 흔한 실수 2: 통지 식별자를 기억하지 않아 재전송된 취소를 두 번 상쇄하는 것.
- 공개 문서: [FIX Standards](https://www.fixtrading.org/standards/), [Fiximate](https://fiximate.fixtrading.org/), [decimal](https://docs.python.org/3/library/decimal.html). 체결 열여덟 건과 통지 열네 건은 이 실습의 합성 자료입니다.
단계 8개
- 체결 원장과 취소·정정 통지, 포지션 보고 만들기
- 통지와 원 체결을 이어 붙여 판정하기
- 취소를 상쇄 기록으로 더해 새 장부 만들기
- 정정을 반영하고 평균 단가 다시 내기
- 포지션을 다시 계산해 기존 보고와 대조하기
- 같은 통지를 두 번 받아도 장부가 같은지 시험하기
- 보고 뒤에 도착한 통지를 재보고 대상으로 모으기
- 정정 보고서와 변경 추적표 쓰기