자본시장과 결제 · 주문이 나가기 전에 거는 위험 한도 · 실습
자리 수를 하나 더 친 주문은 어디서 막히는가
목표
주문 스트림에 단일 주문 한도·가격 대역·제한 종목·중복·누적 노출·킬 스위치를 한 겹씩 얹어 보고, 누적을 갱신하는 시점과 점검의 순서가 결과를 어떻게 바꾸는지 숫자로 확인합니다.
왜 중요한가
체결된 뒤에 찾아내는 것과 나가기 전에 막는 것은 다른 일입니다. 나간 주문은 이미 시장에 있고 되돌리는 값은 그대로 손실입니다. 그래서 점검은 주문 경로 위에 놓입니다. 그런데 점검은 켜 두는 것만으로 되지 않습니다. 거부된 주문까지 누적 한도에 넣으면 실제 노출이 한도의 절반인 사람이 막히고, 기준가가 없는 종목을 통과로 두면 점검이 있는 이유가 사라집니다. 보류를 거부로 세면 킬 스위치가 엉뚱한 자리에서 켜지고, 차단 상태를 메모리에만 두면 재시작 한 번에 풀립니다. 이 실습은 그 함정을 하나씩 직접 만들어 보고 숫자로 확인합니다.
단계
1. python3 로 /root/risk/data 에 orders.jsonl·limits.json·limits_tight.json·refprice.csv·restricted.txt·accounts.csv 를 만듭니다.
2. 단일 주문 한도(수량·금액)만 걸어 /root/risk/single.csv 를 만듭니다.
3. 가격 대역 점검을 더해 /root/risk/band.csv 를 만듭니다. 기준가가 없는 종목은 보류입니다.
4. 제한 종목과 중복 주문 점검을 더해 /root/risk/screen.csv 를 만듭니다.
5. 계좌·데스크 누적 노출 한도를 더해 /root/risk/exposure.csv 를 만들고, 거부된 주문까지 누적에 넣는 잘못된 구현이 막았을 주문을 /root/risk/naive_blocked.csv 에 적습니다.
6. 킬 스위치를 더해 /root/risk/final.csv 를 만들고 차단 상태를 /root/risk/killswitch.json 에 남깁니다.
7. 가격 대역 점검을 앞으로 당긴 순서로 다시 돌려 /root/risk/order_compare.csv 와 /root/risk/order_compare.json 에 차이를 적습니다.
8. 사유별 통계를 /root/risk/stats.json 에, 한도를 조인 설정과의 비교를 /root/risk/tuning.json 에 적습니다.
참고
- 판정 값은 넷입니다.
ACCEPT(통과) ·REJECT(거부) ·HOLD(보류) ·BLOCK(킬 스위치로 전체 차단). 사유는OK·MAX_QTY·MAX_NOTIONAL·PRICE_BAND·NO_REF_PRICE·RESTRICTED·DUPLICATE·ACCT_EXPOSURE·DESK_EXPOSURE·KILL_SWITCH열 가지입니다. - 표준 점검 순서는
RESTRICTED다음MAX_QTY,MAX_NOTIONAL,PRICE_BAND,DUPLICATE,ACCT_EXPOSURE,DESK_EXPOSURE입니다. 첫 번째로 걸리는 점검의 사유를 적고 거기서 멈춥니다. - 각 단계는 그때까지 켠 점검만 겁니다. 2단계는 수량·금액 상한만, 3단계는 거기에 가격 대역까지입니다. 주문은 모두 한 줄씩 적습니다(통과한 것도 적습니다).
- 금액은
decimal로 계산하고 소수 둘째 자리까지 적습니다. 가격 대역은 기준가 대비 백분율로 견주되, 나눗셈 대신 양변에 곱해 비교하면 반올림 문제가 생기지 않습니다. - 누적 노출은 통과한 주문만 더합니다. 거부와 보류는 누적을 소진하지 않습니다.
- 중복 판정의 기준은 계좌·종목·방향·수량·지정가가 모두 같고, 앞서 통과한 주문과의 시간 차가
duplicate_window_sec이하인 것입니다. - 킬 스위치는 거부가
window_sec안에rejects건 이상 쌓인 순간 켜집니다. 보류와 차단은 거부로 세지 않습니다. 켜진 주문 자신은 원래 판정을 유지하고, 그 다음 주문부터 전부BLOCK입니다. - 자료 파일은 고치지 마세요. 채점기가 자료의 지문을 매 단계 확인합니다.
- 흔한 실수 1: 기준가가 없는 종목을 통과로 두는 것.
- 흔한 실수 2: 누적 노출을 주문 로그에서 그대로 합산해 거부된 주문까지 넣는 것.
- 공개 문서: [eCFR 240.15c3-5](https://www.ecfr.gov/current/title-17/chapter-II/part-240/section-240.15c3-5), [연방관보 채택 고시](https://www.federalregister.gov/documents/2010/11/15/2010-28268/risk-management-controls-for-brokers-or-dealers-with-market-access), [FIX Standards](https://www.fixtrading.org/standards/), [decimal](https://docs.python.org/3/library/decimal.html). 한도 수치와 주문 47건은 이 실습의 합성 자료입니다.
단계 8개
- 주문 스트림과 한도 정의 만들기
- 단일 주문 한도 걸기
- 가격 대역과 기준가 없는 종목
- 제한 종목과 중복 주문 걸러 내기
- 누적 노출 한도와 잘못된 구현 비교하기
- 킬 스위치를 올리고 상태를 파일로 남기기
- 점검 순서를 한 자리 바꿔 다시 돌리기
- 사유별 통계와 한도를 조인 설정의 비교