본문 바로가기

EP 빌드로그

EP.34 달러 자산 원화 환산, 왜 수익률과 따로 봐야 할까 (EP.P0-A)

들어가며 · 원화로 보면 왜 헷갈릴까

달러로 무언가를 사두면 두 가지가 동시에 움직입니다. 하나는 산 물건의 값이 오르내리는 것, 다른 하나는 달러와 원화를 바꾸는 비율이 오르내리는 것입니다. 이 둘이 섞이면 "내가 잘 골라서 번 건지, 그냥 달러가 비싸져서 번 건지"를 구분할 수 없습니다.
이번 회차에서는 기록용 화면이 원화 금액을 잘못 보여주던 문제를 고친 이야기를 정리합니다. 결론부터 말하면, 성과는 달러 기준으로, 원화 금액은 참고용으로 따로 보여주도록 나눴습니다. 어느 하나를 없애는 게 아니라 두 숫자의 역할을 분리한 것이 핵심입니다.


무엇을 확인했나 · 고정환율의 문제

기존 화면은 원화 금액을 계산할 때 환율을 항상 1,380원으로 고정해서 썼습니다. 실제 환율은 매일 움직이는데 화면은 늘 같은 숫자를 쓰니, 원화로 표시된 총자산이 실제와 어긋났습니다.

  • 실제 환율이 1,300원이든 1,450원이든 화면은 무조건 1,380원으로 환산
  • 그 결과 "지금 원화로 얼마어치인가"라는 아주 기본적인 질문에 틀린 답을 표시

그렇다고 매번 실제 환율을 그대로 갖다 쓰면 다른 문제가 생깁니다. 성과를 재는 기준 금액까지 환율에 따라 흔들려서, 실력으로 번 것과 환율 덕에 번 것이 뒤섞입니다.


원인 · 표시용 환율과 기준 환율은 목적이 다르다

같은 '환율'이라는 단어를 쓰지만 쓰임새가 둘로 나뉩니다.

표시용 환율"지금 원화로 얼마인지" 보여주기최신(실시간) 환율
기준 환율성과가 좋은지 나쁜지 재기고정된 기준 환율

정리하면 두 가지 문제가 함께 있었습니다. 하나는 원화 금액을 고정환율(1,380원)로만 보여줘 "지금 원화로 얼마인지"가 부정확했다는 점입니다. 다른 하나는, 그렇다고 최신 실환율을 성과 기준 금액에까지 쓰면 전략이 잘한 건지 환율이 도와준 건지 구분할 수 없게 된다는 점입니다. 그래서 표시용과 회계 기준을 회계 관점에서 나눠야 한다고 판단했습니다.


어떻게 고쳤나 · 환율을 가져오는 3단계

먼저 최신 환율을 가져오는 별도 부품(app/provider/usdkrw_rate.py)을 만들었습니다. 이 부품은 환율을 구할 때 다음 순서로 단계를 낮춰가며 시도합니다.

  1. 실시간: 외부 시세(달러-원)를 조회해서 사용
  2. 캐시: 실시간 조회가 안 되면 마지막으로 받아둔 값을 사용
  3. 기본값: 그것마저 없으면 미리 정해둔 기본 환율을 사용

그리고 환율 값 하나만 넘기는 게 아니라, 이 값이 언제·어디서 온 것이고 추정치인지까지 함께 넘기도록 했습니다. 담긴 정보는 아래와 같습니다.

FxRate {
  rate        // 환율 값
  fetched_at  // 가져온 시각
  source      // 실시간 / 캐시 / 기본값 중 무엇인지
  is_estimate // 추정치 여부
}

마감 리뷰 화면(shadow_review.build_review_message)은 이 정보를 받아 두 숫자를 나눠 보여줍니다.

  • 전략 총자산: 달러와 퍼센트로 (환율과 무관하게 성과만 표시)
  • 원화 금액: 최신 환율로 환산한 참고값으로 (≈ 원화 평가액 …(추정) · 환율 …원/$ + 실시간/캐시/기본값 시각)

또한 실시간 조회가 아닐 때는 ⚠️ 기준환율이라고 표시해, 이 숫자를 얼마나 믿어도 되는지 보는 사람이 바로 알 수 있게 했습니다. 환율을 가져오는 부분은 외부에서 갈아 끼울 수 있게 해서, 테스트할 때는 실제 네트워크 조회 없이 검증할 수 있도록 했습니다.


전후 비교

원화 환산 환율항상 1,380원 고정실시간 값 우선, 실패 시 마지막 보유값(캐시)→기본값으로 낮춰 사용하며 각 경우의 출처를 함께 표시
원화 총자산 표시고정환율(1,380원)로 환산해 표시전략 성과는 달러·퍼센트로, 원화는 최신 환율 기준 참고값으로 분리
환율 신뢰도 표시없음출처·시각 표기, 실시간 아니면 ⚠️
원화 금액 성격정확한 값처럼 보임참고용 추정치로 명시

기록상 이 변경과 관련해 테스트 7건, 전체 204건 통과로 남아 있습니다.


남은 과제

이번 회차에서 얻은 원칙은 하나로 정리됩니다. 표시용 환율과 회계 기준 환율은 반드시 나눠야 한다는 것, 그리고 외부에서 값을 가져올 때는 실시간→캐시→기본값으로 낮춰 쓰되 그 출처를 화면에 드러내(⚠️) 보는 사람이 신뢰도를 스스로 판단하게 한다는 것입니다.
이 원칙 자체는 다른 통화나 다른 화면에도 그대로 넓혀볼 수 있습니다. (아래는 개발 기록에 확정된 계획이 아니라 글쓴이의 개인적인 생각입니다.) 캐시 값을 얼마나 오래된 것까지 허용할지, 기본값으로 떨어졌을 때 표시를 어떻게 더 강조할지 같은 부분은 앞으로 검토해볼 여지가 있어 보입니다.

반응형