8.6 KiB
8.6 KiB
req-127: 공통 계좌 자본배분 순수 정책
- Status: Approved
- Type: Interface
- Priority: High
- Owner: trex-core-dev
Intent
- 메가 스윙과 탑50 스윙이 같은 계좌 현금 배분 규칙을 사용하도록, 외부 입출력과 분리된 결정적 정책을 Core 도메인에 제공한다.
- 고가 종목을 무조건 균등액으로 자르지 않고 제한된 한 주 가격 여유를 허용하되, 실제로 동시에 열릴 수 있는 최악 슬롯 조합도 가용 현금을 넘지 않게 한다.
- KIS 어댑터는 현금·호가 조회와 결과 매핑만 맡고, Portfolio Hub 원장과 기존 주문수량 계약은 변경하지 않는다.
Requirement
- Core는
available_cash, 양의slot_count, 고유한portfolio_id·symbol과 양의protected_share_cost를 가진 후보 목록, 0 이상의flex_share_count를 입력받는 순수 자본배분 정책을 제공해야 한다. - 보호된 한 주 가격은 양의
price와 0 이상의slippage_pct를 받아price × (1 + slippage_pct/100)을 원 단위 올림해 계산해야 한다. - 초기 후보 적격 상한은
available_cash // slot_count + cheapest_protected_share_cost × flex_share_count여야 하며, 이를 넘는 후보는protected_share_above_flex_limit으로 제외해야 한다. - 1차 적격 후보 중 가장 비싼
min(slot_count, eligible_count)개 한 주 가격 합이 가용 현금을 넘으면, 후보 가격과 입력 순서를 안정적인 동률 기준으로 가장 비싼 후보부터 제외하고worst_case_cash_overcommit을 반환해야 한다. - 남은 후보에는 각 후보의 보호 한 주 가격 이상이면서, 가장 큰
min(slot_count, eligible_count)개 배정액 합이 가용 현금 이하인 최대 공통 배정액을 적용해야 한다. - 현금이 0이면 모든 후보의 배정액을 0으로 하고
no_available_cash를 반환해야 한다. 음수 현금, 0 이하 슬롯 수, 빈 후보, 음수 유동 여유, 중복 식별자, 0 이하 한 주 가격은 명시적으로 거부해야 한다. - 결과는 입력 후보 순서를 보존한 후보별
portfolio_id,symbol, 배정액, 사유와 계좌 수준available_cash,slot_count를 제공해야 하며, 단순portfolio_id → 배정액호환 표면도 제공해야 한다. - 정책 모듈은 네트워크, 파일, 환경변수, 데이터베이스, 브로커 및 전략 모듈에 의존하지 않아야 한다. 현금·호가 조회, 후보·슬롯 선택, 설정 저장, 실제 주문수량 산출과 주문 제출은 호출 계층 책임으로 유지해야 한다.
- 기존
BuyIntent의 정수 수량·가격 계약, Core 주문 실행, 슬롯 상태머신, Portfolio Hub 원장 계약을 변경하지 않아야 한다. docs/project-structure.md와 배치 검증 문서는 공통 정책의 책임, 호출 계층 책임, 비운영 범위, 회귀 증거를 구현과 일치하게 기록해야 한다.
Acceptance Criteria
- Given 메가 스윙 후보가 삼성전자 보호가격 220,000원과 SK하이닉스 보호가격 1,400,000원이고 현금 2,000,000원·2슬롯인 경우, When 정책을 실행하면, Then 삼성전자 2,000,000원·SK하이닉스 0원을 반환하고 SK하이닉스 제외 사유가
protected_share_above_flex_limit이다. - Given 같은 후보에서 현금 3,000,000원이고 SK하이닉스 보호가격이 1,510,000원인 경우, When 한 주 유동 여유를 적용하면, Then 삼성전자 1,490,000원·SK하이닉스 1,510,000원을 반환한다.
- Given 현금 2,000,000원·3슬롯과 보호가격 100,000/200,000/500,000/700,000/1,050,000원인 탑50 후보 5개, When 정책을 실행하면, Then 마지막 후보를 제외하고 650,000/650,000/650,000/700,000/0원을 반환한다.
- Given 현금 0원, When 정책을 실행하면, Then 모든 배정액은 0이고 사유는
no_available_cash이다. - Given 잘못된 가격·현금·슬롯·후보·중복 식별자 입력, When 정책을 실행하면, Then 조용한 보정 없이
ValueError로 거부한다. - Given 고정 시드 무작위 입력 10,000개, When 모든 결과의 가장 큰 양수 배정액을 슬롯 수만큼 합하면, Then 모든 경우 가용 현금 이하이고 양수 배정액은 해당 후보의 한 주 가격 이상이다.
- Given 기존 로컬 어댑터 공식과 고정 시드 무작위 입력 50,000개, When 양쪽 결과를 비교하면, Then
portfolio_id → 배정액결과가 모든 경우 완전히 일치한다. - Given Core 전체 테스트와 로컬 어댑터 전체 테스트, When Core 정책 연결 상태로 실행하면, Then 기존 회귀와 신규 정책 테스트가 모두 통과한다.
- Given 탑50 3슬롯 한 달 가상거래 입력, When 기존 공식과 Core 정책 연결 결과를 비교하면, Then 요약 지표와 거래원장·배분결정 원장이 동일하다.
- Given 이 브랜치가 검토 중인 경우, When 운영 상태를 확인하면, Then 실전 런타임·주문 게이트·계좌 설정·Portfolio Hub 데이터에는 변경이 없다.
Impacted Area
- Docs:
docs/discovery/dcy-042_20260729_shared-account-capital-allocation-policy.mddocs/project-structure.md- 신규 배치의 계획·설계·구현·검증 문서
- Modules:
trex_core/domain/capital_allocation.py- 로컬 KIS 어댑터의 자본배분 호환 연결부
- Tests:
tests/domain/test_capital_allocation.py- 로컬 어댑터 회귀
- 메가 대표 경계값과 탑50 월간 가상거래 비교
Notes
- Source Discovery:
docs/discovery/dcy-042_20260729_shared-account-capital-allocation-policy.md. - 기존
dcy-021과REQ-061의 주문수량 책임은 유지한다. Core는 이 반복에서 계좌 배분의 순수 계산만 소유하며, 실제 주문 의도의 수량을 자동 수정하지 않는다. - Portfolio Hub는 현금·보유·손익 원장의 정본으로 유지한다. 이 요구사항은 Hub API·스키마·데이터를 변경하지 않는다.
REQ-124REQ-126과dcy-039dcy-041,BAT-059~BAT-061은 병렬 Core 브랜치 작업에 예약되어 있어 충돌 방지를 위해 다음 미사용 번호를 선택했다.- 구현·가상 검증·Draft PR은 허용되지만 실전 배포와 주문 활성화는 별도 승인 대상이다.
Change Log
CHG-20260729-01
- Date: 2026-07-29
- Author: delivery-runner
Change Summary
- 확정된
dcy-042의 공통 계좌 자본배분을 단일 Core 도메인 인터페이스 요구사항으로 작성했다.
Intent
- 공통 계산의 중복을 제거하면서 브로커·원장·전략 책임 경계를 유지한다.
Acceptance Criteria Delta
- Added:
- 메가 대표 2건, 탑50 대표 1건, 입력 거부, 10,000건 불변식, 50,000건 기존 공식 완전 일치, 전체 회귀, 월간 원장 비교, 비운영 확인.
- Updated:
- 없음.
- Removed:
- 없음.
Impacted Area Delta
- Docs:
- Discovery, 프로젝트 구조, 신규 배치 문서.
- Modules:
- Core 순수 도메인 정책과 로컬 어댑터 연결부.
- Tests:
- Core 단위·속성 회귀, 어댑터 전체 회귀, 탑50 월간 가상 비교.
Delivery Trace Delta
- Batches:
- none.
- Releases:
- none.
Revalidation Impact
- Reverification Needed: yes
- Existing Implementation Invalidated: no
- Status Recommendation: keep-current
- Follow-up Action: 요구사항 승인 후 단일 배치에서 구현·문서·교차 검증을 완료한다.
Validation Plan
- Core 단위·전체 회귀, 기존 공식 50,000건 완전 일치, 로컬 어댑터 전체 회귀, 메가 경계값, 탑50 월간 가상 원장 비교와 공용 7단계 가상 인증을 수행한다.
CHG-20260729-02
- Date: 2026-07-29
- Author: trex-dev-lead
Change Summary
- 사용자 승인 범위, 필수 문서 필드, 측정 가능한 수락 기준과 비운영 경계를 재검토해
REQ-127을 Approved로 전환했다.
Intent
- 단일 배치의 구현·검증 기준으로 사용할 수 있도록 요구사항을 동결한다.
Acceptance Criteria Delta
- Added:
- 없음.
- Updated:
- 없음.
- Removed:
- 없음.
Impacted Area Delta
- Docs:
- SRS 상태와 인덱스 상태 동기화.
- Modules:
- 없음.
- Tests:
- 없음.
Delivery Trace Delta
- Batches:
- 다음 단계에서 BAT-062 생성.
- Releases:
- none.
Revalidation Impact
- Reverification Needed: yes
- Existing Implementation Invalidated: no
- Status Recommendation: keep-current
- Follow-up Action: BAT-062에서 구현·검증 증거를 수락 기준별로 연결한다.
Validation Plan
- REQ-127 수락 기준 1~10을 배치 검증 문서와 자동화된 테스트·가상거래 증거로 대조한다.