해외주식 평가금액 증발 버그 해결기 | 토스 개발기 #0-1

토스 자동매매 개발기 시리즈 (현재: #0-1 / 전체 2편)

이전 글: [Phase 0] 5개 파일로 시작한 자동매매 봇

포트폴리오 대시보드를 며칠 돌려보다가 이상한 걸 발견했다. 종목별 상세 목록에는 해외주식(가상 종목 스페이스X, SOXL)이 분명히 $ 단위로 잘 찍히는데, 상단 요약 통계 — 총 매수금액, 총 평가금액, 총 평가손익 — 에는 그 금액이 아예 반영이 안 되고 있었다. 개별 종목은 맞는데 합계는 틀린, 전형적으로 찜찜한 불일치였다.

원인: 통화 키를 하드코딩해뒀다

toss_test.py로 원본 응답을 다시 뜯어봤다. totalPurchaseAmount, marketValue.amount, profitLoss.amount, dailyProfitLoss.amount 전부 {"krw": ..., "usd": ...} 형태로 통화별로 나뉘어 내려오고 있었다. 그런데 상단 요약 계산 로직은 .get("krw")만 조회하고 있었으니, USD 쪽은 그냥 조용히 버려지고 있던 거였다. 덤으로 하나 더 발견한 게 있는데, 이 금액 값들이 전부 숫자가 아니라 문자열로 내려온다는 점이었다(예: "1687167"). 캐스팅을 빼먹으면 또 다른 사고가 날 뻔했다.

참고로 profitLoss.ratedailyProfitLoss.rate는 통화 구분 없이 통합 비율 하나만 내려온다는 것도 이번에 같이 확인했다.

환율 변환 대신 통화별 분리 표시를 택했다

고치는 방법은 두 가지를 두고 고민했다.

  • A안: 환율 변환 없이 KRW/USD 합계를 각각 분리해서 보여주기
  • B안: 환율 API를 붙여서 하나의 통합 총액으로 환산해서 보여주기

B안이 더 “완성된” 형태처럼 보이긴 하는데, 환율 오차가 생기면 정확해야 할 자산 집계가 오히려 부정확해진다. 게다가 구현 범위도 확 늘어난다. 그래서 일단 A안으로 갔다. 실제 자산 상태를 왜곡 없이 보여주는 게 우선이라고 판단했다.

def extract_amounts_by_currency(amount_dict: dict) -> dict:
    """응답에 존재하는 모든 통화 키를 동적으로 순회하며 안전 캐스팅"""
    result = {}
    for currency, value in amount_dict.items():
        try:
            result[currency] = float(value)
        except (TypeError, ValueError):
            result[currency] = 0.0
    return result

통화 키를 미리 정해두지 않고 응답에 있는 걸 그대로 순회하게 만들어서, 나중에 다른 통화가 추가돼도 코드를 안 건드려도 되게 했다. 대시보드 출력에는 [KRW] / [USD] 블록을 분리해서 붙였고, 해외주식이 없는 계좌라면 USD 블록 자체가 자동으로 생략되도록 했다.

근데 진짜 삽질은 그 다음부터였다

로직을 고치고 실행했더니 — 아무 출력도 없이 그냥 조용히 끝났다. 에러도 안 뜨고 그냥 프롬프트로 돌아왔다. 파일을 열어보니 if __name__ == "__main__": 진입점 블록이 통째로 사라져 있었다. 코드를 옮기다가 어딘가에서 날아간 모양이었다.

진입점을 복원하고 다시 돌렸더니 이번엔 NameError: name 'logger' is not defined. 확인해보니 파일 상단 import 구문이랑 safe_int, get_display_width 같은 헬퍼 함수 몇 개까지 같이 유실돼 있었다. 부분적으로 짜깁기하듯 고치다 보니 파일이 이빨 빠진 상태가 된 거였다.

여기서 결론을 내렸다. 조각조각 이어붙이는 걸 그만두고, 파일 전체를 온전한 상태로 다시 구성해서 통째로 교체하기로 했다. 부분 패치는 빠른 것 같지만, 어디서 뭐가 빠졌는지 추적하는 데 드는 시간이 훨씬 크다는 걸 이번에 제대로 배웠다.

결과

파일 전체 재구성 후에는 KRW/USD 자산이 각각 정확히 집계돼서 나왔다.

💰 [KRW] 총 매수금액 :  1,687,167 원
💵 [USD] 총 매수금액 : $ 1,716.08

원하던 그림이 정확히 나왔다.

다음으로 이어질 것

이번에 겪은 “부분 패치가 코드를 파편화시킨다”는 경험은, 다음 Phase 1에서 계획 중인 재시도·백오프 로직 공통화 작업과도 맞닿아 있다. 흩어진 로직을 한 곳으로 모으는 작업의 필요성을 다시 한번 체감했다.

“해외주식 평가금액 증발 버그 해결기 | 토스 개발기 #0-1”에 대한 13개의 생각

댓글 남기기