Skip to content

feat: 소액 트랙 v2 — 유휴 현금을 CD금리 파킹 ETF로 + ETF 매도세 면제 반영#451

Merged
easygap merged 1 commit into
mainfrom
feat/pocket-cash-yield
Jul 7, 2026
Merged

feat: 소액 트랙 v2 — 유휴 현금을 CD금리 파킹 ETF로 + ETF 매도세 면제 반영#451
easygap merged 1 commit into
mainfrom
feat/pocket-cash-yield

Conversation

@easygap

@easygap easygap commented Jul 7, 2026

Copy link
Copy Markdown
Owner

배경 — "최대한 이득 + 안전"의 정직한 레버

알파 부재가 정착 결론인 체제에서 수익을 더 끌어올 수 있는 원천은 예측이 아니라 구조다. kr_pocket v1(지수 50 / 현금 50)은 총자산의 절반이 이자 0의 유휴 현금으로 잠들어 있었고, 체결 모델은 ETF에 개별주 매도세 0.20%를 물리고 있었다(실제로는 국내 상장 ETF 거래세 면제). 위험을 더하지 않고 이 둘만 고치면 연 +1%대가 정직하게 나온다.

변경 1 — kr_pocket v2: 유휴 현금을 CD금리 파킹 ETF로

  • 구성: KODEX 200 (069500) 47.5% + TIGER CD금리투자KIS(합성) (357870) 47.5% + 현금 5%
  • 357870은 CD 91일물 금리를 일할 누적하는 무분배(TR형) 파킹 ETF — 시장 위험 없이 연 ~3%대. 위험자산 노출은 종전 절반 원칙 그대로(50%→47.5%), 무수익 절반만 이자 자산으로 전환
  • min_cash_ratio 바스켓별 오버라이드 신설: 전역 20% 현금 하한은 개별 주식 바스켓용 안전판 — 보유분 절반이 현금성인 바스켓엔 과잉이라 5%로 낮춘다
  • 클램프 규칙을 effective_stock_fraction(core/basket_deploy.py) 한 곳으로 통합. 종전엔 같은 로직이 5벌 복제돼 있었다(리밸런서·평가 귀속·헬스 + 대시보드·자본 시뮬레이터) — 오버라이드를 일부만 반영하면 대시보드는 "설계 80%", 디스코드 카드는 "설계 95%"로 표면마다 다른 숫자를 보여주게 되는 구조였고, 실제로 셀프 리뷰에서 대시보드·시뮬레이터 2곳의 미이관을 잡아 함께 옮겼다

변경 2 — ETF 매도 거래세 면제를 체결 모델에 반영

  • transaction_costs.tax_exempt_symbols 신설 (069500, 357870 등록)
  • calculate_transaction_costs(symbol=...) — 면제 종목은 매도세 0, effective_price에서도 제외. symbol 미전달 호출부(백테스트·스크립트)는 기존 일괄 과세 그대로
  • order_executor 체결 경로 8곳에 symbol 전달 — 승격 게이트의 비용 상한(연 1%) 판정이 가짜 세금으로 왜곡되던 것 교정

변경 3 — 구조 허용 오차를 다중 슬롯으로 확장 (리뷰에서 발견)

셀프 리뷰의 12개월 적립 시뮬레이션에서: 구조 허용 오차(#448)가 '최고가 1주/총액'만 재는데, v2는 슬롯이 2개라 정수 절사가 슬롯마다 동시에 쌓인다 → 적립 4·9·10개월차에 양쪽 슬롯 모두 '부족분 < 1주'(매수 불가능, 정상)인데 미달이 허용을 넘어 몇 주씩 거짓 ATTENTION이 뜰 상태였다. structural_deployment_tolerance를 '보유 슬롯별 1주 가격의 합'으로 교정 — 단일 슬롯 동작은 불변(8/1 입금 시나리오 pin 유지), 빈 슬롯은 절사가 아니라 실패이므로 합산에서 제외돼 통째 미체결은 여전히 잡힌다.

한계 고지 (정직)

  • KODEX 200 분배금(연 ~1.5-2%)은 페이퍼가 수령하지 못함 — 실계좌 대비 보수적 편향(승격 판단을 부풀리지 않음). 357870은 무분배라 누락 없음
  • 30만 시점 배치율 ~80%는 1주 단위 정수 절사 — 적립 누적 시 수렴

검증

  • 단위: effective_stock_fraction 8케이스 / ETF 면제 6케이스 / 다중 슬롯 허용 오차 2케이스(4개월차 무경보 + 통째 미체결 경보) / kr_pocket 인바리언트 v2 갱신 — 전체 스위트 통과
  • E2E(격리 DB, 실가격): 사이클1 지수 1주 매수(회전상한 60% 내 큰 슬롯 우선) → 사이클2 파킹 2주 매수 → 사이클3 드리프트 9.4%p 감지되나 부족분 < 1주로 0주문(조용) — 정착 상태 정상. 자본 300,000원 인식(리스크 가드 포함)
  • 실CLI: capital_slot_simulator kr_pocket 30만 → "배치율 79.7%/설계 95%, 미체결 0" (실사이클과 일치)
  • 머지 후 운영 조치: 트랙레코드 v2 재시작(가역 아카이브, 0/60) — 실돈을 정당화할 기록은 실제 굴릴 구성으로 측정

알파가 없다는 결론 아래에서 수익을 더 끌어올 정직한 원천은 예측이 아니라
구조다. v1(지수 50/현금 50)은 절반이 이자 0으로 잠들어 있었고, 체결 모델은
거래세 면제인 ETF에 개별주 매도세 0.20%를 물리고 있었다.

- kr_pocket v2: KODEX200 47.5 + TIGER CD금리투자KIS 47.5 + 현금 5.
  위험자산 노출은 종전 절반 원칙 그대로, 무수익 절반만 이자 자산으로(연 +1%대).
  min_cash_ratio 바스켓별 오버라이드 신설(전역 20%는 개별주용 안전판 — 현금성
  ETF 바스켓엔 과잉이라 5%).
- 클램프 규칙을 effective_stock_fraction 한 곳으로 통합 — 종전 5벌 복제
  (리밸런서/평가/헬스/대시보드/시뮬레이터)라 표면마다 설계 비중이 어긋날 구조.
- transaction_costs.tax_exempt_symbols + calculate_transaction_costs(symbol=)
  — ETF 매도세 0. 체결 경로 8곳 전달, 미전달 호출부는 기존 동작.
- 구조 배치 허용 오차를 보유 슬롯별 1주 가격의 합으로 교정 — 최고가 1주만
  재면 다중 슬롯 정상 적립(4/9/10개월차)에 몇 주씩 거짓 ATTENTION.
  단일 슬롯 동작 불변, 빈 슬롯은 실패로 그대로 경보.

검증: 스위트 1677 통과. 격리 DB E2E 3사이클(지수 1주 -> 파킹 2주 -> 정착
0주문 조용) + 시뮬레이터 실CLI 일치. 분배금 미수령은 보수적 편향으로 문서화.
@easygap easygap merged commit 37089df into main Jul 7, 2026
1 check passed
@easygap easygap deleted the feat/pocket-cash-yield branch July 7, 2026 09:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant