자본시장과 결제 · 스냅숏과 증분으로 호가창 다시 세우기 · 실습
화면의 호가창이 조용히 틀린 채로 돌고 있었다
목표
스냅숏 한 장과 증분 갱신으로 호가창을 다시 세우고, 순번이 끊긴 자리와 늦게 도착한 줄이 만든 차이를 가격 단계 수로 셉니다. 마지막에는 재동기화 규칙을 넣은 구현이 기준 스냅숏과 한 단계도 어긋나지 않는 것을 확인합니다.
왜 중요한가
시세 화면은 틀려도 아무 소리를 내지 않습니다. 값이 비거나 예외가 나는 것이 아니라 조금 다른 값이 계속 돌기 때문에, 며칠 뒤 주문이 이상하게 나가고 나서야 거슬러 올라가게 됩니다. 스냅숏에 박힌 순번과 증분의 순번을 어떻게 잇느냐, 순번이 끊겼을 때 멈추느냐 계속 얹느냐 하는 두 줄짜리 규칙이 그 차이를 만듭니다. 그리고 이 실습의 계산은 전부 가격을 다룹니다. 가격을 이진 부동소수로 빼는 순간 한 호가 단위를 재는 판정이 조용히 0 이 되므로, 값이 아니라 자료형에서 먼저 지고 들어가는 경우가 무엇인지도 함께 봅니다.
단계
1. python3 로 /root/cap/book/data 에 네 개 자료 파일을 만듭니다. 생성 스크립트를 그대로 쓰세요.
2. 증분 스트림의 모양을 세어 /root/cap/book/shape.txt 에 아홉 줄로 적습니다.
3. 시작 스냅숏으로 호가창을 세우고 겹치는 증분을 세어 /root/cap/book/init.json 에 적습니다.
4. 증분을 순번 순서로 얹어 /root/cap/book/naive.json 에 호가창과 동작별 건수를 적습니다.
5. 재생 중 불변식이 깨진 자리를 찾아 /root/cap/book/invariant.txt 에 일곱 줄로 적습니다.
6. 끊긴 구간과 다시 세운 결과의 차이를 /root/cap/book/gap.json 에 적습니다.
7. 늦게 도착한 줄과 그것이 만든 차이를 /root/cap/book/late.json 에 적습니다.
8. 재동기화 규칙을 넣은 최종 호가창을 /root/cap/book/final/book.json 에, 품질 보고를 /root/cap/book/final/report.json 에 남깁니다.
참고
- 피드 형식은
/root/cap/book/data/feed_spec.txt에 적혀 있습니다. 실제 거래소 규격이 아니라 이 실습을 위한 합성 형식입니다. - 세션 상수는
/root/cap/book/data/session.json에 있습니다. 호가 단위, 스냅숏이 찍힌 순번, 시작 스냅숏, 기준 스냅숏이 모두 거기 있으니 숫자를 코드에 박지 마세요. - 가격은
decimal.Decimal로 다룹니다.float로 빼면 한 호가 단위가 정확히 나오지 않아 5단계의 스프레드 판정이 0 으로 떨어집니다. - 어긋난 가격 단계 수는 두 호가창을 각각
(종목, 방향, 가격, 수량)집합으로 만든 뒤 대칭 차집합의 크기로 셉니다. 한 가격의 수량만 다르면 양쪽에서 하나씩 나오므로 2 입니다. updates.jsonl의 줄 순서가 도착 순서입니다. 순번 순서와 다를 수 있습니다.- 흔한 실수 1: 수량 0 을 값으로 저장하는 것. 0 은 값이 아니라 그 가격 단계를 지우라는 동작입니다.
- 흔한 실수 2: 6단계에서 다시 세울 스냅숏을 마지막 것으로 고르는 것. 끊긴 자리를 메울 수 있는 것 중 가장 이른 검사점을 씁니다.
- 표준 문서: [FIX Trading Community](https://www.fixtrading.org/standards/), [FIXimate](https://fiximate.fixtrading.org/), [decimal 모듈](https://docs.python.org/3/library/decimal.html).
단계 8개
- 스냅숏과 증분 스트림 만들기
- 증분 스트림의 모양 세기
- 스냅숏으로 호가창 세우고 겹치는 증분 버리기
- 증분을 얹어 호가창 재구성하기
- 교차한 호가창이 나오는 순간 찾기
- 끊긴 자리에서 계속 얹은 것과 다시 세운 것 견주기
- 늦게 도착한 줄을 그대로 얹으면 어떻게 되는가
- 재동기화 규칙을 넣은 최종 구현으로 기준과 대조하기