Capital Markets and Settlement
Twenty overfill alerts — how many were real?
한국어 원문으로 표시합니다.
목표
체결 보고 스트림에서 금지된 상태 전이·수량 등식 위반·누적 역행·과체결·평균 단가 불일치를 각각 찾아내고, 그 가운데 중복 보고와 순서 뒤바뀜으로 설명되는 것을 걷어 내 진짜 결함만 남깁니다.
왜 중요한가
주문 자료는 사람이 눈으로 읽어 이상을 찾을 수 있는 크기가 아닙니다. 다행히 이 도메인에는 규칙이 있어 거름망을 만들 수 있습니다. 상태 전이표가 있고, 수량에는 등식이 있고, 평균 단가는 다시 계산할 수 있습니다. 어려운 것은 검사 자체가 아니라 걸러 낸 것을 설명하는 일입니다. 중복 보고는 합을 부풀려 과체결처럼 보이게 하고, 뒤바뀐 도착 순서는 멀쩡한 주문을 금지 전이로 만듭니다. 이 셋을 나누지 않고 "이상 30건" 이라고 넘기면 받은 사람은 아무것도 할 수 없습니다.
단계
python3로/root/orders/data에transitions.json·orders.csv·reports.csv를 만듭니다.- 전이표를
/root/orders/reachable.json으로 정리하고, 종결 상태를/root/orders/terminal.txt에, 표 자신의 모순을/root/orders/graph_defects.txt에 적습니다. - 받은 순서대로 읽었을 때의 금지 전이를
/root/orders/illegal.csv에 적습니다. - 수량 등식이 깨진 보고를
/root/orders/qty_break.csv에 적습니다. - 누적 체결 수량이 되돌아간 자리를
/root/orders/cum_back.csv에 적습니다. - 주문 수량을 넘어선 주문을
/root/orders/overfill.csv에 적습니다. - 평균 단가가 가중 평균과 다른 보고를
/root/orders/avgpx_break.csv에 적습니다. - 주문마다 원인을 갈라
/root/orders/verdict.csv에 적고, 원인별 수를/root/orders/summary.json에 요약합니다.
참고
- 3단계부터 7단계까지는 받은 순서(seq) 대로 읽습니다. 순서를 고치는 것은 8단계에서 합니다.
- 수량 등식은 살아 있는 주문에만 적용합니다. 종결 상태에서는 잔량이 0 이어야 합니다. 종결 상태 목록은
transitions.json에 있습니다. - 평균 단가는
decimal로 계산하고 소수 넷째 자리에서ROUND_HALF_UP으로 반올림합니다.float로 하면 멀쩡한 자료가 어긋난 것처럼 나옵니다. - 8단계 원인은 순서대로 판정합니다. 중복을 제거해 이상이 사라지면
중복보고, 거기에 더해 거래소 시각으로 정렬해 사라지면순서뒤바뀜, 그래도 남으면진짜결함이고defects칸에 남은 검사 이름을|로 이어 적습니다(중복보고·순서뒤바뀜은없음). - 흔한 실수 1: 등식을 상태와 무관하게 적용해 정상적인 취소를 전부 이상으로 올리는 것.
- 흔한 실수 2: 중복 보고를 제거하지 않고 과체결을 판정하는 것.
- 공개 문서: FIX Standards, Fiximate, decimal. 전이표와 열두 주문은 이 실습의 합성 자료입니다.
전이표와 열두 주문의 체결 보고 만들기
python3 로 /root/orders/data 에 transitions.json·orders.csv·reports.csv 를 만듭니다. 난수를 쓰지 않는 생성 스크립트를 그대로 쓰세요.
고객 자료를 그대로 가져올 수 없으니 같은 모양의 합성 자료를 만듭니다. 난수를 쓰지 않아야 누가 몇 번을 돌려도 같은 자료가 나오고 서로의 판정을 대조할 수 있습니다. 채점기는 자료를 표준형으로 바꿔 지문을 대조하므로 손으로 고치면 뒤 단계가 전부 막힙니다.
전이표를 읽고 표 자신의 모순 찾기
/root/orders/reachable.json 에 상태별 다음 상태 목록을, /root/orders/terminal.txt 에 종결 상태를 한 줄에 하나씩, /root/orders/graph_defects.txt 에 종결이라고 선언됐는데 나가는 전이가 남은 상태를 적으세요.
종결 상태는 더 갈 곳이 없어야 합니다. 표에서 종결로 선언한 상태의 다음 상태 목록이 비어 있지 않다면 그 표는 자기 모순이고, 그 상태를 지나는 잘못된 보고를 검사기가 통과시킵니다. 목록은 정렬해 두면 대조가 쉽습니다.
받은 순서대로 읽어 금지 전이 찾기
/root/orders/illegal.csv 에 첫 줄 order_id,from_seq,from_status,to_status 를 두고, 주문마다 seq 순서로 읽었을 때 표에 없는 전이를 적으세요.
주문별로 나눠 seq 오름차순으로 읽고 이웃한 두 보고를 견줍니다. 앞 상태의 다음 상태 목록에 뒤 상태가 없으면 금지 전이입니다. 종결 상태는 목록이 비어 있으므로 그 뒤에 오는 모든 보고가 걸립니다.
수량 등식이 깨진 보고 찾기
/root/orders/qty_break.csv 에 첫 줄 report_id,order_id,ord_status,expected_leaves,leaves_qty 를 두고, 살아 있는 주문에서 등식이 깨졌거나 종결 상태에서 잔량이 0 이 아닌 보고를 적으세요.
살아 있는 주문에서 기대 잔량은 주문 수량에서 누적 체결을 뺀 값이고, 종결 상태에서는 0 입니다. 종결 상태 목록은 자료에서 읽으세요. 취소로 끝난 주문을 전부 위반으로 올린다면 상태를 보지 않은 것입니다.
누적 체결 수량이 되돌아간 자리 찾기
/root/orders/cum_back.csv 에 첫 줄 order_id,seq,prev_cum,cum 을 두고, seq 순서로 읽을 때 바로 앞 보고보다 누적 체결이 작아진 지점을 적으세요.
누적 체결은 줄어들지 않습니다. 같은 값이 이어지는 것은 문제가 아니고 작아지는 것만 찾습니다. seq 는 되돌아간 쪽 보고의 것을 적으세요.
주문 수량을 넘어선 주문 찾기
/root/orders/overfill.csv 에 첫 줄 order_id,order_qty,max_cum,sum_last 를 두고, 누적 체결의 최댓값이나 체결 수량의 합이 주문 수량을 넘은 주문을 적으세요.
두 가지를 다 봅니다. 누적 체결이 주문 수량을 넘은 경우와, 체결 수량을 전부 더하면 넘는 경우입니다. 뒤쪽은 같은 보고가 두 번 들어와도 생기므로, 이 단계에서는 중복을 지우지 말고 있는 그대로 세세요. 가르는 일은 8단계에서 합니다.
평균 단가를 다시 계산해 대조하기
/root/orders/avgpx_break.csv 에 첫 줄 report_id,order_id,reported_avg,recomputed_avg 를 두고, 보고의 평균 단가가 그때까지의 가중 평균과 다른 보고를 적으세요.
그 보고까지의 체결 수량과 금액을 누적해 나누고 소수 넷째 자리에서 반올림합니다. decimal 을 쓰고 ROUND_HALF_UP 으로 맞추세요. 체결이 하나도 없는 보고의 평균은 0 입니다. 값은 소수 넷째 자리까지 적습니다.
중복과 순서 문제를 걷어 내고 진짜만 남기기
/root/orders/verdict.csv 에 첫 줄 order_id,cause,defects 를 두고 결함이 보이는 주문마다 한 줄씩 적고, /root/orders/summary.json 에 orders·clean·중복보고·순서뒤바뀜·진짜결함·defects 를 요약하세요.
판정은 순서대로 합니다. 중복 보고를 지웠을 때 모든 검사가 조용해지면 중복보고, 거기에 더해 거래소 시각으로 정렬했을 때 조용해지면 순서뒤바뀜, 그래도 남으면 진짜결함 입니다. 중복 제거는 보고 식별자 기준이고, 정렬은 거래소 시각과 seq 순입니다. defects 칸에는 마지막까지 남은 검사 이름만 적습니다.