LabHub
배우기 러닝패스 코스

資本市場と決済

取消通知が二度届き、ポジションが反対に振れた

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

이미 나간 체결에 대한 취소·정정 통지를 원 체결에 이어 붙이고, 원 장부를 지우는 대신 상쇄 기록을 더해 새 장부를 만듭니다. 포지션을 다시 계산해 이미 나간 보고와 대조하고, 같은 통지를 두 번 받아도 장부가 같은지 확인한 뒤 재보고 대상과 정정 보고서를 냅니다.

왜 중요한가

체결 원장은 이미 여러 곳으로 흘러 나간 자료입니다. 그 한 줄을 조용히 고쳐 쓰면 어제 나간 보고와 오늘 보는 원장이 어긋나고, 어긋난 이유는 어디에도 남지 않습니다. 그래서 금융 장부는 뒤에 씁니다. 취소는 부호가 반대인 상쇄 기록을 더하는 일이고, 정정은 상쇄한 뒤 고쳐진 값으로 다시 쓰는 일입니다. 어려운 것은 이 규칙 자체가 아니라 가장자리입니다. 통지가 없는 체결을 가리킬 수도 있고, 같은 통지가 재전송으로 두 번 올 수도 있고, 이미 취소된 체결에 정정이 올 수도 있습니다. 하나만 놓쳐도 포지션이 반대로 넘어가고, 그 사실은 대개 다음 날 보고가 틀린 뒤에야 드러납니다.

단계

  1. python3/root/bust/datafills.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 에 적습니다.

참고

체결 원장과 취소·정정 통지, 포지션 보고 만들기

python3/root/bust/datafills.jsonl·notices.jsonl·position_report.csv·rules.json 을 만듭니다. 난수를 쓰지 않는 생성 스크립트를 그대로 쓰세요.

고객의 체결 원장을 그대로 가져올 수 없으니 같은 모양의 합성 자료를 만듭니다. 난수를 쓰지 않아야 누가 몇 번을 돌려도 같은 자료가 나오고 서로의 판정을 대조할 수 있습니다. 채점기는 자료를 표준형으로 바꿔 지문을 대조하므로 손으로 고치면 뒤 단계가 전부 막힙니다.

통지와 원 체결을 이어 붙여 판정하기

/root/bust/notice_match.csv 에 첫 줄 seq,notice_id,type,target_fill_id,verdict 를 두고, 통지를 도착 순서대로 읽어 적용·대상없음·이미취소됨·중복통지 중 하나를 적으세요. 모든 통지를 한 줄씩 적습니다.

네 가지를 이 순서로 봅니다. 같은 통지 식별자를 앞에서 이미 봤는가, 가리키는 체결이 원장에 있는가, 그 체결이 앞에서 이미 취소됐는가, 그리고 나머지가 적용입니다. 취소를 적용할 때마다 그 체결 식별자를 기억해 두어야 세 번째 검사가 가능합니다. 통지 식별자는 판정과 무관하게 전부 기억합니다.

취소를 상쇄 기록으로 더해 새 장부 만들기

/root/bust/ledger_bust.jsonl 에 원 체결 열여덟 줄을 kindfill 인 기록으로 그대로 옮기고, 적용할 취소마다 수량과 금액의 부호가 반대인 reversal 기록을 더하세요. 원 기록은 고치지 않습니다.

지우지 않고 더합니다. 상쇄 기록의 수량은 원 체결 수량에 마이너스를 붙인 값이고 단가는 원 체결 그대로입니다. 그래야 금액도 저절로 반대 부호가 됩니다. entry_id 는 통지 식별자에 -rv 를 붙이고 source_notice 에 그 통지를 남겨 두면 나중에 출처를 따라갈 수 있습니다. 원 체결 기록의 source_notice 는 빈 문자열입니다.

정정을 반영하고 평균 단가 다시 내기

/root/bust/ledger_final.jsonl 은 3단계 장부에 정정마다 reversalrebook 두 줄을 더한 것입니다. /root/bust/order_avg.csv 에 첫 줄 order_id,net_qty,net_notional,avg_px 를 두고 주문마다 한 줄씩 적으세요.

정정은 원 기록을 상쇄한 뒤 고쳐진 값으로 다시 한 줄 씁니다. 통지에 없는 값은 원 체결의 값을 그대로 쓰세요. 가격만 바뀐 정정은 수량이 같고 금액만 달라집니다. 평균 단가는 장부의 금액 합을 수량 합으로 나눈 값이고, 전부 취소된 주문은 수량 합이 0 이라 0 으로 둡니다. 나누기 전에 0 인지부터 보세요.

포지션을 다시 계산해 기존 보고와 대조하기

/root/bust/position_diff.csv 에 첫 줄 symbol,reported_qty,recomputed_qty,diff 를 두고, 최종 장부로 다시 계산한 포지션이 position_report.csv 와 다른 종목만 적으세요.

포지션은 매수를 더하고 매도를 빼서 셉니다. 상쇄 기록은 수량이 음수라 부호가 저절로 뒤집히므로 따로 분기할 필요가 없습니다. diff 는 다시 계산한 값에서 보고된 값을 뺀 것입니다. 값이 같은 종목은 적지 않습니다. 차이가 전부 늦게 온 통지로 설명되지는 않으니, 설명되지 않는 종목이 있어도 그대로 두세요.

같은 통지를 두 번 받아도 장부가 같은지 시험하기

통지 스트림 뒤에 같은 통지를 한 번 더 이어 붙여(두 번째 묶음은 seq 에 1000 을 더합니다) /root/bust/ledger_twice.jsonl 을 만들고, /root/bust/idem.jsonentries·same_as_final·ignored_duplicates 를 적으세요.

재전송은 정상적인 일입니다. 통지 식별자를 기억하지 않으면 한 번 취소된 체결이 두 번 상쇄되어 포지션이 반대로 넘어갑니다. 두 번째 묶음은 식별자가 전부 앞에서 본 것이므로 하나도 적용되지 않아야 하고, 그러면 장부는 4단계 것과 똑같아집니다. ignored_duplicates 는 이어 붙인 스트림 전체에서 중복통지로 판정된 통지의 수이고, same_as_final 은 참과 거짓입니다.

보고 뒤에 도착한 통지를 재보고 대상으로 모으기

/root/bust/rereport.csv 에 첫 줄 notice_id,type,target_fill_id,symbol,position_delta 를 두고, 적용된 통지 가운데 통지 시각이 rules.json 의 포지션 보고 시각보다 뒤인 것을 적으세요.

포지션 보고가 나간 뒤에 도착한 통지는 장부만 고쳐서 끝나지 않고 이미 나간 보고를 틀린 것으로 만듭니다. 기준 시각은 rules.json 에 있으니 오늘 날짜를 쓰지 마세요. position_delta 는 그 통지가 포지션을 얼마나 움직이는가이고, 매도는 부호가 반대입니다. 가격만 바뀐 정정은 수량을 건드리지 않아 0 이 되지만 재보고 대상에서 빼지는 마세요.

정정 보고서와 변경 추적표 쓰기

/root/bust/trace.csv 에 첫 줄 entry_id,kind,fill_id,source_notice,reason,qty,px,notional 을 두고 최종 장부에서 kindfill 이 아닌 기록을 전부 적고, /root/bust/report.json 에 전체 요약을 적으세요.

받는 사람이 다음에 무엇을 할지 정할 수 있어야 보고가 쓸모 있습니다. 변경마다 어떤 통지에서 왔는지와 그 통지의 사유를 붙이면 몇 달 뒤에도 따라갈 수 있습니다. reason 은 통지 자료에서 가져오되 실제로 적용된 통지의 것이어야 합니다. 같은 식별자로 재전송된 사본은 사유가 달라 여기서 갈립니다. 요약에 넣을 열쇠는 fills·notices·적용·대상없음·이미취소됨·중복통지·bust_applied·adjust_applied·entries_before·entries_after·position_mismatch·rereport 입니다.