Files
openclaw/agents/stock/workspace/memory/2026-05-07-ka10170-ottks-tp.md
hyowons fed3526b20 Initial commit: OpenClaw 워크스페이스 버전관리 시작
설정·스크립트·스킬·문서·큐레이션 메모리 추적.
시크릿(credentials/identity)·런타임 상태(state/logs/sessions/sqlite)·
백업(clobbered/bak)·dream 캐시는 .gitignore로 제외.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 15:39:41 +09:00

48 lines
2.5 KiB
Markdown

# 2026-05-07 ka10170 당일매매일지 ottks_tp 함정 — 보유분 매도 손익 0원 사고
레이가 "오늘 매매손익 0원"이라고 보고. 실제로는 ISA 계좌에서 5종목 매도해 +199,543원 실현손익 발생한 상태였음. 코디 작업으로 원인 추적·수정.
## 원인
`scripts/kiwoom_client.py:get_trade_journal()` 가 ka10170 호출 시 `ottks_tp='1'` 사용. 명세 정의:
| 값 | 의미 |
|---|---|
| `1` | **당일매수에 대한 당일매도** (round-trip만 — 당일 매수했다가 같은 날 매도한 경우) |
| `2` | **당일매도 전체** (어제 이전 보유분의 당일 매도까지 포함) |
코드 주석은 `ottks_tp='1' (위탁)` 으로 잘못 해석. "단주구분" 이라는 명세 라벨에서 추측한 것으로 보이지만 실제 의미는 round-trip 여부. **위탁/신탁 구분이 아님**.
## 영향
- 어제 이전부터 보유한 종목을 오늘 매도 → ka10170 응답의 `pl_amt=0`, `tot_pl_amt=0`
- `stock_portfolio_report.enrich_journal_realized_pl()` 가 그 빈자리를 어제 스냅샷 avg_price로 추정 보강해 메일 카드에는 표시되었지만, **추정값**이라 키움 ground truth(수수료·세금 정확 차감)와 미세 차이
- 레이가 텔레그램에서 "당일 매매손익" 묻는 자연어 응답 → ka10170 직접 호출하면 0 반환 → 0원으로 답변
오늘 ISA 케이스 (`ottks_tp=1` vs `2` 비교):
| 종목 | 매도 수량 | ottks_tp=1 pl_amt | ottks_tp=2 pl_amt |
|---|---|---|---|
| 아진산업 | 268 | 0 | +144,931 |
| KODEX 은선물(H) | 1 | 0 | -588 |
| 티엠씨 | 16 | 0 | +45,220 |
| KODEX 코스닥150레버리지 | 30 | 0 | +9,980 |
| **합계** | | **0** | **+199,543** |
## 수정
- `kiwoom_client.py:315``ottks_tp='1'``'2'`
- 주석: "위탁" 잘못된 해석 제거, 명세 정의 기록
- `stock_portfolio_report.enrich_journal_realized_pl` docstring 갱신 — 메인 경로에서 fallback 으로 격하 (ottks_tp=2면 평소 발동 안 함, 키움 응답 누락 시만 작동)
수정 후 검증:
- ka10170 직접 호출: `tot_pl_amt: 199543` (이전엔 0)
- `stock_portfolio_report.py run` 메일에 `당일 실현손익: +199,543원 (수수료·세금 3,719원)` 정확히 표시
- 회귀 테스트 136건 통과
## 미래의 자기에게 — ka10170 호출 규칙
- **`ottks_tp='2'` 무조건 사용.** `'1'`은 round-trip 한정이라 일반적인 매매일지로는 부적절.
- "단주구분" 라벨에 헷갈리지 말 것 — 의미는 round-trip 여부.
- `ottks_tp='1'`로 회귀하는 PR이 들어오면 거부.