MyStock - 수익률보다 내가 사고판 흔적

MyStock에 처음 투자성과라는 메뉴를 만들었을 때 내가 보고 싶었던 건 단순했다. 내가 가진 종목들의 수익률을 한 화면에서 보고, KOSPI나 S&P500 같은 시장 지수와 비교하면 내 투자가 괜찮았는지 어느 정도 보일 거라고 생각했다. 그런데 실제로 만들어 놓고 보니 생각보다 별로였다. 종목이 많아질수록 차트는 복잡해졌고, 변동성이 큰 종목 하나가 들어오면 나머지 종목은 상대적으로 눌려 보였다. 무엇보다 현재 보유종목만 기준으로 화면을 만들다 보니 이미 전량 매도한 종목은 아예 사라졌다.

 

여기서 처음 생각이 바뀌었다. 내가 정말 보고 싶은 게 여러 종목의 수익률을 한 번에 비교하는 화면인가? 곰곰이 생각해보니 아니었다. 더 궁금한 건 내가 언제 샀고, 언제 팔았고, 그 전후로 주가는 어떻게 움직였는지였다.

투자성과의 한계

처음에는 투자성과라는 이름에 맞춰 결과를 보여주려고 했다. 수익률이 몇 퍼센트인지, 시장보다 잘했는지 못했는지를 보여주면 된다고 생각했다. 하지만 내가 직접 쓰는 앱이다 보니 숫자만 보는 것보다 과거의 판단을 다시 보는 쪽이 훨씬 중요했다. 현재 보유종목만 보여주는 방식도 목적과 맞지 않았다. 이미 팔아버린 종목은 지금 계좌에는 없지만, 내 투자 경험에서는 오히려 중요한 기록이다. 잘 팔았던 종목도 있고, 너무 일찍 팔았던 종목도 있고, 왜 샀는지 지금 봐도 이해가 안 되는 종목도 있다. 그런데 현재 잔고만 보면 그런 기록은 전부 사라진다.

 

결국 투자성과 화면을 유지한 채 기능을 조금 보완하는 방향보다, 화면의 목적 자체를 바꾸는 쪽으로 생각이 기울었다.

수익률보다 매매기록

여러 종목을 한 차트에 겹쳐 놓는 대신 왼쪽에서 실제로 거래했던 종목을 하나 선택하고, 오른쪽에서 그 종목의 가격 흐름을 보는 구조로 바꿨다. 그리고 차트 위에 내가 실제로 사고판 지점을 표시하기 시작했다.

 

이 변화는 생각보다 컸다. 단순히 차트에 점 몇 개를 추가한 것처럼 보이지만, 실제 내 거래가 찍히기 시작하니 화면의 의미가 완전히 달라졌다. “이때 왜 샀지?”, “여기서 추가매수했구나”, “이건 조금만 더 들고 있었으면 좋았겠네” 같은 생각이 바로 떠올랐다. 반대로 정말 기가 막히게 팔았던 종목도 있었다. 매도 이후 가격이 크게 떨어진 차트를 보면 괜히 뿌듯하다. 물론 이런 기억만 남기면 금방 내가 투자를 잘한다고 착각할 수 있으니 못한 매매도 똑같이 남겨야 한다. ㅋㅋ

 

그래서 이름도 투자성과보다 투자기록이 맞다고 판단했다. 성과를 평가하는 화면보다 내가 했던 투자를 다시 보는 화면에 가까웠다.

전량매도 종목

방향은 정했는데 바로 문제가 생겼다. 현재 보유종목은 계좌에서 가져오면 되지만 이미 전량 매도한 종목은 현재 잔고에 존재하지 않는다. 투자기록을 제대로 만들려면 “지금 무엇을 가지고 있는가”가 아니라 “과거에 무엇을 실제로 거래했는가”를 알아야 했다. 여기서 일이 커졌고, 과거 주문과 체결 내역을 다시 조사해야 했다. 주문을 넣었다고 실제로 산 것은 아니다. 일부만 체결될 수도 있고, 주문이 거부되거나 취소될 수도 있다. 내가 기록하고 싶은 것은 버튼을 눌렀다는 사실이 아니라 실제로 체결된 거래였다.

 

문제 상황을 ChatGPT와 계속 검토했고, 실제 저장소와 API 응답의 세부 계약은 Codex로 확인했다. 그 과정에서 주문 자체와 실제 체결 결과를 구분하고, 전량매도 종목도 다시 찾을 수 있도록 과거 체결을 DB에 남기는 방향으로 결정했다. 처음 자동갱신 문제 때문에 시작한 DB 작업이 결국 내가 과거에 사고판 기록까지 저장하는 데 도달했다. 또 DB였다. 정말 지긋지긋했다. 

체결이력과 DB

실제 데이터를 붙이면서 “그럴듯하게 보이는 화면”보다 “틀리지 않는 기록”이 더 중요해졌다. 예를 들어 거부된 주문을 매수로 표시하면 차트는 멀쩡해 보여도 내 투자기록은 거짓이 된다. 반대로 현재 보유하지 않는다는 이유로 과거 종목을 버리면 실제 경험이 사라진다. 그래서 체결수량이 실제로 발생한 주문만 기록하고, 이미 팔아서 현재 잔고에 없는 종목도 과거 체결을 기준으로 다시 찾아 과거 주가와 연결했다. 이 과정에서 DB는 단순한 속도 개선용 캐시가 아니라 내 투자 이력을 보존하는 기반이 됐다.

 

이전에는 MyStock이 “지금 내 계좌에 무엇이 있는지 보여주는 앱”에 가까웠다면, 과거 체결이 들어오고 나서는 “내가 지금까지 어떻게 투자했는지 다시 볼 수 있는 앱”으로 조금씩 성격이 달라졌다.

투자기록

현재 투자기록에서는 계좌와 기간을 선택하면 그 기간에 실제로 매매했던 종목이 목록에 나온다. 현재 보유 중인 종목과 이미 매도 완료한 종목이 함께 나타난다. 종목을 선택하면 가격 흐름과 실제 매매 지점이 표시되고, KOSPI나 KOSDAQ, S&P500 같은 기준 지수도 함께 비교할 수 있다.

첨부한 화면은 ISA 계좌의 KODEX 미국S&P500 기록이다. 1년 구간에서 매매 종목 5개가 보이고, 선택한 종목의 매수 지점들이 가격 차트 위에 표시된다. 같은 기간 S&P500 흐름도 함께 볼 수 있다. 지금은 손익 계산을 마무리하기 전이라 실현손익과 평가손익은 아직 ‘미정’으로 남겨두었다. 숫자로 수익률 몇 퍼센트를 보는 것보다 나는 이 화면이 훨씬 재미있다. 당시 시장이 어떻게 움직였는지와 내가 어느 가격에서 판단했는지를 동시에 볼 수 있기 때문이다.

IRP 매매이력

일반계좌와 ISA를 연결하고 나니 IRP가 남았다. 내 IRP는 원래 기업은행에 있었고 이후 한국투자증권으로 이전했다. 그래서 한국투자증권에서 보이는 과거 기록이 어디서부터 실제 한투 체결인지부터 확인해야 했다. 실계좌 API를 조회해보니 2025년 12월 10일부터 양수 체결 기록이 나타났다. 마침 한국투자증권 앱의 퇴직연금 매매내역을 직접 확인해보니 12월 10일과 11일에 같은 종목의 실제 체결 기록이 있었다. 더 재미있는 건 12월 9일이었다. 앱에는 주문이 있었지만 상태가 ‘거부’였다.

 

API에서도 12월 9일 주문은 체결수량이 0이었고, 10일부터 실제 체결이 발생했다. 결과적으로 MyStock에는 12월 9일 거부 주문은 매매기록으로 저장되지 않고 실제 체결된 거래부터 남는다. IRP의 최근 체결 조회는 공개 문서만으로 완전히 확정하기 어려운 부분도 있었다. 하지만 실제 계좌의 과거·최근 구간 조회와 한국투자 앱의 매매내역을 교차 확인한 뒤 현재 동작을 채택했다. 공식적으로 확인되지 않은 부분은 확인된 것처럼 포장하지 않고 개발 기록에 그대로 남겼다.

이전계좌의 흔적

IRP까지 연결하고 실제 화면을 보다가 또 예상하지 못한 기록 하나를 발견했다. RISE 배터리 리사이클링 종목은 한투에서 확인되는 총매수수량이 17주인데 총매도수량은 152주였다. 17주를 샀는데 152주를 팔 수는 없다. 기업은행 IRP에서 보유하던 물량이 이전된 뒤 한투에서 매도됐을 가능성이 자연스럽게 떠올랐다. 하지만 가능성이 높다고 해서 MyStock이 없는 매수기록을 마음대로 만들어내게 할 수는 없었다.

 

그래서 이 기록은 그대로 두었다. 정확한 이전 수량과 원가를 확인하지 않은 상태에서 135주를 임의의 매수로 만들어 넣지 않았다. 모르는 것은 모르는 상태로 두는 편이 낫다. 대신 이 사례는 다음 작업의 중요한 단서가 됐다. 손익을 제대로 계산하려면 한국투자증권에서 발생한 매수·매도만 더하는 것으로 끝나지 않을 수 있다. 다른 금융사에서 이전된 보유수량과 취득원가를 어떻게 볼 것인지까지 생각해야 한다.

남은 손익계산

현재 투자기록에서 가장 눈에 띄게 남은 것은 ‘미정’이라는 두 글자다. 실현손익, 평가손익, 종목별 수익률을 아직 채우지 않았다. 단순히 매도금액에서 매수금액을 빼면 끝날 것 같지만 실제 계좌는 그렇게 단순하지 않다. 부분매도도 있고, 다시 매수할 수도 있고, 전량매도 후 재진입할 수도 있다. IRP처럼 이전 금융사에서 넘어온 물량도 있다. 수수료와 세금을 어디까지 포함할지도 정해야 한다.

 

그래서 지금까지와 마찬가지로 모르는 값을 적당히 계산해서 보여주는 것보다는 먼저 어떤 데이터를 신뢰할 수 있는지 확인한 뒤 계산 기준을 정할 생각이다. 화면을 빨리 완성하는 것보다 나중에 내가 이 기록을 다시 봤을 때 숫자를 믿을 수 있는 쪽이 더 중요하다.

열흘간의 DB 작업

지난 열흘 정도 MyStock은 거의 DB만 만졌다. 시작은 장이 열렸는데도 시세가 자동으로 바뀌지 않던 문제였다. 데이터가 언제 준비되고 언제 갱신되는지부터 다시 보기 시작했고, 그 과정에서 일봉, 수급, 시장 데이터, ETF 구성종목, 계좌 상태, 실제 체결 기록까지 하나씩 이어졌다.

중간에는 정말 괜히 시작했다는 생각도 여러 번 했다. 나는 파이썬 개발자도 아니고 데이터베이스를 전문적으로 다루는 사람도 아니다. 주식 역시 공부하면서 투자하는 개인투자자다. 그런데 실제 내 데이터를 넣어보니 처음 생각했던 것보다 훨씬 재미있는 결과가 나왔다. 지금 투자기록에는 샘플 데이터가 아니라 내가 실제로 사고팔았던 기록이 찍혀 있다. 이미 팔아버려 현재 계좌에는 없는 종목도 다시 볼 수 있다. 당시 시장 흐름과 내가 판단했던 가격을 한 화면에서 다시 볼 수 있다.

 

그리고 과거의 나에게 한마디씩 할 수 있다.

이건 진짜 잘 팔았다.
이딴 종목을 대체 왜 샀거냐... ;;
환률 영향이 이렇게 큰거야...? 아무리 S&P500 적립식이라도 이건 너무 하잖아... ;;

아마 내가 투자기록이라는 기능에서 원했던 건 이런 것이었던 것 같다. 이제 남은 건 손익 계산이다. 그것까지 끝내면 자동갱신 문제 하나에서 시작해 열흘 넘게 이어진 DB 작업과 투자기록 작업에도 한 번은 마침표를 찍을 수 있을 것 같다.

 

제발 이번에는 진짜였으면 좋겠다....