어젯밤 페이퍼 트레이딩 프로세스가 충돌했다고 하셨죠. 다음 의사결정 전에 프로세스를 재시작했고, 오류가 없길래 중단된 지점부터 이어졌다고 생각했습니다. 그런데 이미 보유 중인 자산을 다시 매수하는 주문을 냈습니다. 전략에 버그가 있는지 알고 싶으시군요.
그럴 수도 있습니다. 하지만 먼저 재시작된 프로세스가 페이퍼 계좌와 같은 정보를 알고 있는지 확인해 보세요. 재시작은 상태 복구 문제입니다. 포지션, 현금, 미체결 주문, 다음 의사결정에 영향을 주는 전략 메모리가 모두 일치해야 합니다. 코드를 다시 실행하는 건 쉬운 부분입니다.
충돌 직전, 전략은 어떤 상태라고 판단했을까요?
프로세스가 멈추기 전에 내린 마지막 의사결정을 기록하세요. 거래하는 각 상품에 대해 목표 포지션, 계좌의 실제 포지션, 미체결 주문, 다음 행동에 영향을 줄 신호 상태를 남깁니다. 이런 기록이 없다면 재시작이 상태를 복구한 건지, 전략을 새로 초기화한 건지 알 수 없습니다.
시간 단위 전략이 추세 신호가 양수로 바뀌면 1단위를 매수하고, 음수로 바뀔 때까지 보유한다고 해 보겠습니다. 프로세스는 14:00에 매수 주문을 제출하지만, 주문이 접수됐다는 기록을 남기기 전에 충돌합니다. 페이퍼 거래소는 주문을 체결합니다. 재시작한 전략은 기록된 포지션이 없고 신호는 여전히 양수인 것을 확인해 매수 주문을 한 번 더 냅니다. 신호는 일관되게 작동하고 있습니다. 계좌 보유 내역에 대한 전략의 기억이 오래된 상태인 거죠.
따라서 새 주문을 허용하기 전에 계좌의 현재 포지션을 저장된 전략 상태와 대조해야 합니다. 로컬 스냅샷도 유용하지만, 실제로 체결된 내역의 기준은 계좌 또는 거래소입니다.
재시작 후에도 어떤 상태가 보존되어야 할까요?
먼저 다음 주문을 바꿀 수 있는 상태부터 살펴보세요. 업데이트마다 타임스탬프와 버전을 포함한 영구 기록을 남기고, 복구 로직을 바꾸기 전에 사본을 만들어 나중에 장애 상황을 재현할 수 있게 하세요.
| 상태 | 중요한 이유 | 복구 확인 항목 |
|---|---|---|
| 포지션과 현금 | 익스포저와 사용 가능한 매수 여력을 결정합니다 | 저장된 값을 페이퍼 계좌와 비교합니다 |
| 미체결 주문 | 프로세스가 중단된 사이 주문이 체결됐을 수 있습니다 | 주문 상태를 조회하고 부분 체결을 대조합니다 |
| 신호 메모리 | 교차, 쿨다운, 보유 기간은 여러 의사결정에 걸쳐 이어질 수 있습니다 | 마지막으로 커밋된 의사결정 입력값을 복구합니다 |
| 마지막 처리 이벤트 | 전략이 데이터 처리를 재개할 위치를 결정합니다 | 그 이후의 이벤트를 다시 재생하되 두 번 적용하지 않습니다 |
신호 메모리는 간과하기 쉽습니다. 크로스오버를 기준으로 거래하는 전략은 새로운 교차를 감지하기 위해 전날의 지표 값을 저장할 수 있습니다. 이 값이 비어 있는 상태로 시작하면 이미 발생한 조건을 새로운 이벤트로 오인할 수 있습니다. 쿨다운 타이머도 마찬가지입니다. 재시작한다고 해서 유지되어야 할 규칙이 조용히 초기화되어서는 안 됩니다.
복구를 어떻게 반복 가능하게 만들 수 있을까요?
각 주문에 전략 실행과 해당 주문을 발생시킨 의사결정을 바탕으로 한 고유한 client ID를 부여하세요. 시간 초과 후 프로세스가 재시도할 때, 같은 의사결정으로 이미 주문이 생성됐는지 확인해 중복 주문을 막을 수 있습니다. 해당 계좌 이벤트를 확인한 뒤에만 상태 변경을 기록하고, 변경 근거가 되는 주문 ID와 체결 ID를 보관하세요.
그런 다음 장애가 발생한 경계를 테스트하세요. 전략이 의사결정을 내리도록 실행하고 상태를 저장한 뒤 중단합니다. 페이퍼 계좌의 포지션 및 주문 내역과 함께 복구한 다음, 다음 의사결정과 그 결과 주문을 중단 없이 실행한 경우와 비교하세요. 부분 체결 주문과 제출 후 승인 응답을 받기 전에 충돌하는 경우도 반복해 확인합니다. 재개된 실행에서 포지션을 새로 만들어 내거나 완료된 행동을 반복해서는 안 됩니다.
복구 로그를 남기세요. 마지막 처리 이벤트, 계좌 스냅샷 시간, 미체결 주문 상태, 복구된 전략 버전, 재시작 후 첫 의사결정을 기록합니다. 그러면 “프로세스가 다시 켜졌다”는 말을 감사 가능한 기록으로 바꿀 수 있습니다.
재시작 후 무엇을 신뢰해야 할까요?
계좌와 전략 상태가 일치하고, 대기 중인 주문의 상태를 파악했으며, 다음 의사결정이 연속 실행을 가정했을 때 예상되는 결과와 일치할 때 프로세스를 신뢰하세요. 불일치 이유를 설명할 수 없다면 페이퍼 주문 제출을 멈추고 이벤트 기록을 살펴보세요. 프로세스가 실행 중이라는 사실만으로 전략 상태가 복구됐다고 볼 수는 없습니다.
이번 충돌에서 이미 유용한 점을 발견하셨습니다. 평소 실행에서는 드러나지 않던 가정을 확인하게 된 거죠. 재시작을 반복 가능한 시나리오로 만들면, 전략에 다시 거래를 맡기기 전에 무엇을 기억하고 있는지 알 수 있습니다.
← 전체 글


