자본시장과 결제 · 주문 상태 기계와 수량 불변식 · 이론
주문의 상태는 아무 값이나 될 수 없다
한 줄 요약
주문 보고는 자유로운 기록이 아니라 상태 기계의 출력이고, 그 안의 수량에는 깨지면 안 되는 등식이 있다. 장애 조사에서 "무엇이 잘못됐는가" 의 대부분은 이 둘을 기계로 검사하면 나온다.
왜 이게 필요했나
주문 하나에 달린 보고는 적으면 서너 줄, 많으면 수십 줄이다. 그 줄들을 사람이 눈으로 읽어 이상을 찾는 것은 처음 몇 건까지만 가능하다. 하루치를 받아 보면 수만 줄이고, 그 안에서 문제가 되는 것은 대여섯 건이다. 그래서 FDE 가 고객 자료를 받고 처음 하는 일은 읽는 것이 아니라 거르는 것이다.
거름망을 만들 수 있는 이유는 이 도메인에 규칙이 있기 때문이다. [FIX 프로토콜](https://www.fixtrading.org/standards/)은 주문의 상태를 OrdStatus 라는 필드로 표현하고, New·PartiallyFilled·Filled·Canceled 같은 이름을 정해 두었다. 필드의 뜻은 [Fiximate](https://fiximate.fixtrading.org/)에서 확인할 수 있다. 어떤 상태에서 어떤 상태로 갈 수 있는지는 시장과 중개사마다 조금씩 다르므로(이 실습에서는 전이표를 자료로 주고 그것을 이 실습의 가정으로 삼는다), 중요한 것은 표를 외우는 것이 아니라 표가 있다는 것과 그 표를 코드가 읽게 만드는 것이다.
어떻게 동작하나
검사는 다섯 갈래다.
첫째, 금지된 전이. 앞 보고의 상태에서 뒤 보고의 상태로 가는 길이 표에 없으면 문제다. 여기서 가장 중요한 부류가 종결 상태다. 체결 완료·취소·거절·만료처럼 더 갈 곳이 없는 상태에서 다시 무언가가 나오면, 그것은 늦게 도착한 보고이거나 진짜 결함이다. 그런데 표 자체가 틀려 있는 경우도 있다. 종결이라고 선언해 놓고 나가는 전이가 한 줄 남아 있으면 검사기는 그 전이를 정상으로 통과시킨다. 그래서 표를 읽자마자 표 자신의 모순부터 찾는다.
둘째, 수량 등식. 살아 있는 주문에서는 CumQty + LeavesQty == OrderQty 다. 누적 체결과 남은 수량을 더하면 주문 수량이라는 뜻이다. 주의할 점은 주문이 끝나면 이 등식이 성립하지 않는다는 것이다. 절반만 체결된 주문을 취소하면 남은 절반은 사라지고 잔량은 0 이 된다. 등식을 무조건 적용하는 검사기는 정상적인 취소를 전부 오탐으로 올린다.
셋째, 누적의 단조성. CumQty 는 줄어들지 않는다. 줄어든 것처럼 보이면 보고가 뒤바뀌어 도착했거나 되감기가 일어난 것이다.
넷째, 과체결. 체결 수량의 합이 주문 수량을 넘으면 그것은 돈이 걸린 사고다. 다만 같은 보고가 두 번 들어오면 합이 부풀어 과체결처럼 보인다. 그래서 이 판정은 중복 제거 뒤에 다시 해야 한다.
다섯째, 평균 단가. AvgPx 는 그때까지의 체결을 수량으로 가중한 평균이어야 한다. 여기서 부동소수를 쓰면 마지막 자리가 흔들려 멀쩡한 자료가 어긋난 것처럼 나온다. 금액 계산은 [decimal](https://docs.python.org/3/library/decimal.html)로 하고 반올림 방식을 정해 둔다.
그리고 마지막 질문이 남는다. 걸러 낸 것들 가운데 무엇이 진짜 결함인가. 같은 보고가 두 번 들어온 것이라면 중복을 제거하면 이상이 사라진다. 도착 순서가 뒤바뀐 것이라면 거래소 시각으로 다시 정렬하면 사라진다. 둘 다 해도 남는 것이 진짜다. 이 세 갈래를 나누지 않고 "이상 30건" 이라고 보고하면 상대는 아무것도 할 수 없다.
현장에서 만나는 모습
한 번은 과체결 경보가 하루에 스무 건씩 올라온 적이 있다. 전부 같은 원인이었는데, 재전송된 체결 보고가 중복 제거 없이 합산되고 있었다. 실제 과체결은 그 스무 건 안에 없었고, 정말 위험한 한 건은 몇 주 뒤 다른 경로로 발견됐다. 거름망이 잡음으로 가득 차면 아무도 그 경보를 보지 않게 된다.
또 하나는 등식 검사였다. 취소된 주문을 전부 이상으로 올리는 검사기 때문에 하루 수천 건이 경보로 나갔고, 결국 그 검사가 통째로 꺼졌다. 상태를 보지 않고 수량만 본 결과다.
세 번째는 전이표 자체였다. 고객이 준 문서에는 체결 완료가 종결 상태로 적혀 있었는데, 코드가 읽는 표에는 그 상태에서 나가는 줄이 하나 남아 있었다. 문서와 코드가 어긋난 자리는 검사기가 보는 쪽이 이긴다. 그래서 새 고객의 자료를 받으면 전이표를 먼저 자기 자신과 대조한다. 종결이라고 선언한 상태에 나가는 길이 있는가, 어떤 상태에서도 도달할 수 없는 상태가 있는가, 시작 상태에서 종결까지 가는 길이 정말 있는가. 이 세 가지는 자료만 보고 몇 줄로 확인할 수 있고, 여기서 걸리는 것이 있으면 뒤의 모든 판정을 믿을 수 없다.
마지막으로 실무에서 한 가지를 덧붙인다. 이 검사들은 고객에게 넘겨줄 수 있는 형태로 만들어 두는 편이 낫다. 조사 때 한 번 쓰고 버리면 같은 문제가 석 달 뒤에 다시 올라오고, 그때는 또 처음부터 짠다. 규칙이 자료에 있고 코드가 그 자료를 읽게 해 두면, 시장이나 중개사가 바뀌어도 같은 도구가 그대로 돈다.
다음 실습에서 할 것
전이표와 열두 개 주문의 체결 보고를 만들고, 표 자신의 모순부터 찾습니다. 그 다음 금지 전이·수량 등식·누적 역행·과체결·평균 단가를 차례로 검사하고, 마지막에 중복 보고와 순서 뒤바뀜으로 설명되는 것과 그렇지 않은 것을 갈라 원인별 요약을 냅니다. 취소로 끝난 주문과 거절로 끝난 주문이 섞여 있으니, 등식을 무조건 적용하면 그 자리에서 막힙니다.