개발자의 투자 고민에서 시작된 여정

ETF 포트폴리오 관리 시스템 개발기 1/4편

by 대협
프롤로그: 시간을 거슬러 올라간 기억

2006년, 그때는 모네타라는 사이트의 펀드 게시판이 투자자들의 성지였습니다. 새벽 늦게까지 모니터 앞에서 엑셀 파일의 매크로 함수들을 바꿔가며 온갖 수식을 입력하고, 그 결과가 네이버 증권 데이터와 일치하는지 확인하던 그 시절. 지금 생각해보면 참으로 원시적인 방법이었지만, 그때는 그것만으로도 충분히 흥미진진했습니다.

세월이 흘러 2024년, 격세지감을 느끼게 하는 개발 환경의 변화 속에서 저는 새로운 도구들을 발견했습니다. 유튜브를 통해 알게 된 '입코딩'이라는 개념에 흥미를 느껴 첫 실험으로 "청약홈 페이지 분양정보 수집 및 메일링 프로그램"을 작성해보았습니다. 그리고 이제는 클로드 AI와 함께 더욱 야심찬 프로젝트에 도전하고 있었습니다.

처음에는 ETF NAV 매매 전략을 구현해보려 했습니다. 하지만 곧 현실적인 한계에 부딪혔습니다. 실시간으로 변하는 정보를 바탕으로 그때그때 매매해야 한다는 것은 저의 투자 철학과 맞지 않았습니다. 저는 한 종목을 오랫동안 보유하며 장기 투자를 하는 사람이었습니다. 게다가 개인이 사용할 수 있는 API들은 실시간 데이터 수집에 한계가 있었습니다.

그렇다면 다른 접근이 필요했습니다. 저의 가장 큰 고민 중 하나였던 '직장인이 편하게 퇴직연금계좌로 주말에 잠깐 시간을 투자해서 할 수 있는 ETF 자산배분 전략'을 만들어보기로 했습니다. 클로드 AI와 함께 질문하고 답하며 놀이처럼 진행하는 프로젝트였습니다.

첫 번째 도전: 복잡함 속에서 찾은 단순함

클로드 AI와 대화를 나누다 보면 신기한 일이 일어납니다. 정말 복잡하던 저의 생각들이 조금씩 단순해지고, 하나의 체계화된 아이디어로 정리되는 것입니다. 물론 저는 퀀트투자처럼 멋진 알고리즘을 만들고자 하는 것은 아니었습니다. 다만 실생활에서 실제로 쓸 수 있는 전략의 기초 정도는 만들어보고 싶었습니다.

아이디어의 씨앗들

대화를 나누면서 이런 새로운 아이디어들이 구체화되기 시작했습니다:

"어차피 가격 데이터를 가져오는 김에 과거 데이터도 저장해두면 추세 분석도 할 수 있겠는데?"

"리밸런싱 시점도 자동으로 알려주면 좋겠는데?"

"투자 전략별로 백테스팅도 해보면 재미있을 것 같은데?"

아이디어의 폭발

그날 밤, 저는 거의 흥분 상태였습니다. 머릿속에서 아이디어들이 폭발하듯 쏟아져 나왔고, 끝없이 떠오르는 생각들을 정리해나갔습니다. 시간이 지날수록 단순한 계산기는 점점 더 야심찬 프로젝트로 변모해갔습니다:

실시간 모니터링: 장 중에도 실시간으로 포트폴리오 현황을 확인할 수 있다면?

자동 리밸런싱 알림: 목표 비중에서 벗어났을 때 자동으로 알림을 받을 수 있다면?

전략 백테스팅: 코어-새틀라이트, 리스크 패리티 같은 전략들을 과거 데이터로 검증해볼 수 있다면?

정기 리포트: 매월 자동으로 투자 성과 리포트를 받을 수 있다면?

다양한 투자 전략: 책에서 배운 여러 투자 이론들을 실제로 구현해서 비교해볼 수 있다면?

클로드 AI와 이런저런 아이디어를 나누다 보니 어느새 새로운 기능들이 추가되면서, 그냥 단순한 프로젝트가 아니라 정말 멋진 하나의 시스템 근간을 만들 수 있다는 확신이 들었습니다.

목표의 재정의

며칠간의 고민 끝에, 저는 이 프로젝트의 진짜 목표를 다시 정의했습니다. 단순히 수익률을 계산하는 도구가 아니라, 투자 여정을 함께하는 디지털 파트너를 만들고 싶었습니다. 감정적 판단을 배제하고 데이터에 기반한 의사결정을 도와주며, 지속가능한 투자 습관을 만들어주는 시스템 말입니다.

그 순간, 프로젝트의 이름도 자연스럽게 떠올랐습니다. ETF Portfolio Manager. 단순하지만 명확한 이름이었습니다.

두 번째 도전: 카오스를 질서로, 설계라는 마법

아이디어는 넘쳐났지만, 이제 현실적인 문제가 기다리고 있었습니다. 이 모든 기능들을 어떻게 체계적으로 구현할 것인가? 여러 프로젝트의 경험상, 처음에 구조를 잘못 잡으면 나중에 엄청난 고생을 하게 된다는 것을 잘 알고 있었습니다.

아키텍처, 그 치밀한 설계

예전 같았으면 며칠간 여러 자료를 찾아보고 다른 오픈소스 프로젝트의 구조를 검색하면서 나만의 아키텍처를 설계해야 했을 것입니다. 하지만 지금은 클로드가 그 모든 것을 대신해서 체계적인 아키텍처를 제안해줍니다. 제가 가장 중요하게 생각하는 원칙을 이야기해주면 그런 부분을 반영해서 수정해주기도 합니다.

저의 가장 중요한 원칙은 모듈화였습니다. 각 기능이 독립적으로 동작하면서도 서로 유기적으로 연결될 수 있는 구조. 마치 레고 블록을 조립하듯, 각각의 모듈이 명확한 역할을 가지고 필요에 따라 조합될 수 있는 시스템을 만들고 싶었습니다.

06.png
핵심 엔진: core 디렉토리

시스템의 심장부가 될 핵심 엔진들을 설계했습니다. 이들은 마치 자동차의 엔진, 변속기, 브레이크 시스템처럼 각각 고유한 역할을 담당하면서도 하나의 완성된 시스템을 만들어내는 부품들이었습니다:

portfolio_manager.py: 모든 것의 중심에 서는 마에스트로. 포트폴리오의 생성, 수정, 삭제부터 성과 분석까지 총괄하는 핵심 엔진입니다. 투자자의 모든 의사결정을 데이터로 뒷받침해주는 두뇌 역할을 합니다.

update_manager.py: 끊임없이 시장을 감시하는 파수꾼. 실시간으로 ETF 가격을 업데이트하고, 시장 데이터를 수집하며, 언제나 최신 정보를 유지해주는 역할을 합니다. 마치 24시간 깨어있는 트레이더처럼.

backtesting_engine.py: 시간을 거슬러 올라가는 타임머신. 과거 데이터를 이용해 투자 전략을 검증하고, "만약 그때 이렇게 투자했다면?"이라는 궁금증을 풀어주는 시뮬레이터입니다.

report_generator.py: 복잡한 데이터를 아름다운 이야기로 변환하는 스토리텔러. 차트와 표, 그래프를 통해 투자 성과를 시각화하고, 이해하기 쉬운 리포트로 만들어줍니다.

scheduler.py: 정확한 시계처럼 동작하는 스케줄링 시스템. 정해진 시간에 정해진 작업을 수행하며, 사용자가 신경 쓰지 않아도 시스템이 알아서 돌아가게 만드는 자동화의 핵심입니다.

사용자와의 만남: web 디렉토리

아무리 강력한 엔진이 있어도 사용자가 쉽게 접근할 수 없다면 의미가 없습니다. 사용자 인터페이스는 시스템과 사용자를 연결하는 다리 역할을 합니다:

dashboard.py: 조종석과 같은 역할. Streamlit을 기반으로 한 직관적인 대시보드에서 모든 정보를 한눈에 확인할 수 있습니다. 복잡한 데이터도 아름다운 차트와 그래프로 표현되어 누구나 쉽게 이해할 수 있습니다.

api_server.py: 다른 시스템과의 소통 창구. RESTful API를 통해 외부 애플리케이션이나 서비스와 연동할 수 있는 확장성을 제공합니다. 미래의 모바일 앱이나 다른 서비스와의 통합을 염두에 둔 설계입니다.

두뇌와 기억: data 디렉토리

모든 정보를 체계적으로 관리하는 데이터 레이어. 단순히 저장하는 것을 넘어서 효율적으로 조회하고 분석할 수 있는 구조를 만들었습니다:

etf_universe.py: 투자 가능한 모든 ETF들의 정보를 관리하는 백과사전. 각 ETF의 특성, 수수료, 구성 종목 등 투자 결정에 필요한 모든 정보를 담고 있습니다.

market_data_collector.py: 시장의 모든 움직임을 기록하는 기록관. 가격 데이터, 거래량, 배당 정보 등을 수집하고 정제해서 분석 가능한 형태로 저장합니다.

portfolio_tracker.py: 개인의 투자 이력을 추적하는 일기장. 매수, 매도, 배당 수령 등 모든 거래 내역을 기록하고 성과를 추적합니다.

전략의 실험실: strategies 디렉토리

투자 이론을 실제 코드로 구현하는 가장 흥미로운 부분이었습니다. 책에서 배운 다양한 투자 전략들을 실제로 구현해서 비교해볼 수 있다는 생각만으로도 설렜습니다:

core_satellite.py: 안정성과 수익성의 균형. 안정적인 코어 자산(전체 시장 ETF)을 중심으로 하고, 특정 섹터나 테마의 새틀라이트 자산으로 추가 수익을 노리는 전략.

global_diversified.py: 전 세계를 아우르는 분산투자. 미국, 유럽, 아시아, 신흥국 등 전 세계에 걸쳐 위험을 분산시키는 글로벌 전략.

03.png

risk_parity.py: 위험의 균등 배분. 각 자산이 포트폴리오 전체 위험에 기여하는 정도를 동일하게 맞추는 정교한 전략.

lifecycle_strategy.py: 인생과 함께 변화하는 전략. 나이에 따라 위험 성향을 조절하며, 젊을 때는 공격적으로, 나이가 들수록 보수적으로 변화하는 전략.

보조 시스템들: utils 디렉토리

화려하지는 않지만 없어서는 안 될 유틸리티들. 이들이 있어야 전체 시스템이 원활하게 돌아갑니다:

data_validator.py: 데이터의 신뢰성을 검증하는 감시자. 잘못된 데이터나 이상한 값들을 걸러내어 시스템의 안정성을 보장한다.

cost_calculator.py: 투자의 숨은 비용을 계산하는 회계사. 거래 수수료, 환전 비용, 세금 등을 정확하게 계산하여 실제 수익률을 제공한다.

performance_metrics.py: 성과를 다각도로 분석하는 분석가. 단순한 수익률을 넘어 샤프 비율, 최대 낙폭, 변동성 등 다양한 지표를 계산한다.

설계의 완성

예전 혼자 하는 프로젝트였다면 한 달이 아니라 직장을 다니며 몇 년을 해도 완성되지 않고 첫 의지가 사라져 흐지부지되었을 설계가, 클로드와 함께 대화하며 1주일도 되지 않아 전체적인 그림으로 완성되었습니다. 각 모듈이 명확한 역할을 가지면서도 서로 유기적으로 연결되는 구조. 새로운 기능을 추가하거나 기존 기능을 수정할 때도 다른 부분에 영향을 주지 않는 안정적인 아키텍처였습니다.

마치 교향악단처럼, 각 악기(모듈)가 자신의 파트를 완벽하게 연주하면서도 전체적으로는 하나의 아름다운 하모니를 만들어내는 시스템이었습니다.


� 관련 링크

GitHub: etf-portfolio-manager

라이브 데모: streamlit.app


다음 편 예고

설계는 완성되었지만, 이제 진짜 도전이 기다리고 있었습니다. 아름다운 설계도를 현실의 코드로 바꾸는 과정에서 수많은 예상치 못한 문제들이 기다리고 있었기 때문입니다.

다음 편에서는 실제 개발 과정에서 마주한 현실적인 문제들을 다룰 예정입니다. API의 제한, 데이터의 불완전성, 한국 ETF 정보의 부족함 등 이상과 현실 사이의 간극을 어떻게 메워나갔는지, 그리고 사용자가 실제로 사용하기 편한 인터페이스를 만들기 위해 어떤 고민들을 했는지에 대한 이야기가 펼쳐질 것입니다.

개발자의 이상이 현실과 맞닥뜨리는 순간, 그곳에서 벌어지는 치열한 문제해결의 과정을 함께 따라가보겠습니다.

다음 편: "이상과 현실 사이: 개발 과정의 시행착오"에서 계속...

ETF 포트폴리오 관리 시스템 개발기
1편 | 개발자의 투자 고민에서 시작된 여정 ✓
2편 | 이상과 현실 사이: 개발 과정의 시행착오 (다음 편)
3편 | 한 단계 더 나아가기: 고급 기능과 실전 투입
4편 | 완성에서 시작으로: 성과 정리와 미래 비전


이 글 또한 클로드 AI가 제안하고 제가 제 상황에 맞추어 수정하고 그 글을 다시 클로드가 편집해서 작성한 글입니다.

keyword
이전 04화이론편-초보 투자자의 가장 강력한 무기 ETF