fix: 리스크 결함 일괄 수정 — 누적 4% 상한·스윙 소유권·일일한도 분리·DT 순손익/체결가·시간손절 밴 제외·체결조회 경로
trade_executor - 종목당 4% 상한을 기존 보유분 포함 누적으로 (sizing_core.remaining_position_room) - 추천 경로는 스윙 소유 행만 매수·매도 (external/manual/daytrading/us_swing skip, 대칭), 고아 DT 행 warning - 일일 매수한도는 스윙 소유 매수만 집계, 집계 실패 시 fail-closed - 부분매도 반복 차단에서만 DT 매도 제외 (재매수 쿨다운은 유지) - 체결 확인: 부분체결 잔량 자동 재주문 제거(가드 전부 우회·취소/거부 시 발동), PARTIAL→COMPLETED+체결수량, 초과체결 캡 korea_investment_api - get_order_execution 이 존재하지 않는 /trading/inquire-ccnl 을 호출하던 결함 → inquire-daily-ccld (TTTC0081R 우선, 구 TR 폴백, 페이지네이션, ODNO 매칭, EXCG_ID_DVSN_CD=KRX), 실패 로그 warning daytrading - 시간손절은 loss_tracker 중립 (42일 밴이 스윙까지 막던 문제) - 실현손익을 수수료·거래세 차감 순손익으로 (trade_cost_core), 체결가 백그라운드 보정 (fill_reconciler) - legacy _record_trade strategy_type=daytrading 명시 db_worker - update_trade_history_by_order_id 를 당일(KST)+최신 1행으로 한정 (일별 재사용 ODNO 로 과거 행 덮어쓰기 방지) alembic 0013: trade_journals strategy_name='unknown' 을 trade_history.strategy_type 으로 보정 (백업 테이블 포함) CLAUDE.md: 변경 동작 반영, MT 예약 리비전 0013→0014 998 passed Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -43,6 +43,7 @@ __all__ = [
|
||||
"amount_to_quantity",
|
||||
"half_kelly_fraction",
|
||||
"effective_min_buy_amount",
|
||||
"remaining_position_room",
|
||||
]
|
||||
|
||||
|
||||
@@ -198,3 +199,27 @@ def effective_min_buy_amount(
|
||||
if small_account_cap <= 0:
|
||||
return config_min_amount
|
||||
return min(config_min_amount, small_account_cap)
|
||||
|
||||
|
||||
# ── 종목당 누적 한도 ─────────────────────────────────────────────────────────
|
||||
|
||||
def remaining_position_room(
|
||||
total_assets: float,
|
||||
position_cap_ratio: float,
|
||||
existing_position_value: float,
|
||||
) -> float:
|
||||
"""종목당 **누적** 잔여 한도 = `max(0, 총자산 × 종목당상한 − 해당 종목 기존 보유 평가액)`.
|
||||
|
||||
`clamp_by_ratios(..., [MAX_POSITION_SIZE], ...)` 는 **주문 1건**을 상한으로 묶을 뿐이라
|
||||
같은 종목이 매일 추천되면 추가매수가 쌓여 종목 비중이 상한을 넘을 수 있다
|
||||
(CLAUDE.md §5.1 "종목당 4% 절대 상한"). 이 함수는 기존 보유분을 차감한 잔여 한도를
|
||||
돌려준다.
|
||||
|
||||
**floor 있음** — 이미 한도를 초과했으면 0. `total_assets <= 0` 또는
|
||||
`position_cap_ratio <= 0` 이면 한도를 계산할 수 없으므로 0 을 반환한다
|
||||
(호출부가 "검증 불가"를 별도로 판단한다). 음수 보유 평가액은 0 으로 본다.
|
||||
"""
|
||||
if total_assets <= 0 or position_cap_ratio <= 0:
|
||||
return 0.0
|
||||
existing = max(0.0, float(existing_position_value or 0.0))
|
||||
return max(0.0, total_assets * position_cap_ratio - existing)
|
||||
|
||||
Reference in New Issue
Block a user