## 📝 한줄 요약
- Codex를 활용해 주식 데이터 수집, 지표 계산, 대시보드 반영을 하나의 흐름으로 연결했습니다.
- 기존 10개 한국 자산을 한국 16개, 미국 6개로 확대해 총 22개 자산을 비교할 수 있게 됐습니다.
- 한 종목이 실패해도 나머지 수집을 계속하고 기존 데이터는 보존하도록 안전장치를 만들었습니다.
- 첫 실행에서 22개 종목이 모두 실패했지만, 가짜 데이터로 넘어가지 않고 네트워크 제한이라는 실제 원인을 확인했습니다.
- 원천 데이터 8,684행과 지표·JSON·화면의 자산 수가 모두 일치하는지 교차 검증했습니다.
- 앞으로는 목록 파일에 종목만 추가해 분석 universe를 계속 확장할 수 있습니다.
## 🎯 이런 분들께 도움돼요
- 주식·ETF 데이터 수집과 시각화를 처음 실습하는 분
- 한국과 미국 자산을 한 화면에서 비교해보고 싶은 분
- AI가 만든 결과의 숫자를 어떻게 검증해야 할지 궁금한 분
- 오류가 발생해도 기존 데이터를 안전하게 지키는 방법을 배우고 싶은 분
## 😫 문제 상황 (Before)
처음 만든 주식 공유현황판에는 한국 자산 10개만 들어 있었습니다. 가격 데이터는 데이터베이스에 저장되어 있었고 화면도 작동했지만, 새로운 종목을 추가하려면 수집 코드 안의 목록을 직접 바꿔야 했습니다. 한국 종목과 미국 종목의 시장 구분도 구조적으로 준비되어 있지 않았고, ETF 역시 일부 종목만 별도로 판별하는 방식이었습니다.
더 큰 문제는 데이터가 늘어날수록 수집부터 검증까지 각각 따로 확인해야 한다는 점이었습니다. 한 종목에서 오류가 발생하면 전체 작업이 중단되는 구조였고, 데이터베이스를 갱신한 뒤 지표와 화면까지 제대로 바뀌었는지 한 번에 확인하기도 어려웠습니다.
그래서 이번에는 단순히 종목 몇 개를 추가하는 데 그치지 않고, 데이터 수집부터 지표 계산, JSON 생성, 대시보드 반영까지 하나의 안전한 파이프라인으로 연결해보기로 했습니다.
## 🛠️ 사용한 도구
- 도구: Codex
- 모델: GPT-5 기반 Codex
- 데이터 수집: FinanceDataReader
- 데이터 저장: DuckDB
- 데이터 처리: Python, pandas
- 시각화: ECharts
- 실행 환경: uv 관리형 Python 가상환경과 로컬 웹 서버
- 특이사항: 기존 데이터와 JSON을 먼저 스냅샷으로 보존한 뒤 갱신했습니다.
## 🔧 작업 과정
### 숫자부터 다시 확인하니 시작점이 달랐다
처음에는 기존 현황판에 12개 자산이 있다고 생각했습니다. 그래서 Codex에게 현재 파이프라인을 먼저 점검하고, 수집 범위와 저장 방식, 검증 계획을 보여달라고 요청했습니다.
Codex가 실제 데이터베이스와 JSON을 교 차 확인한 결과, 기존 자산은 12개가 아니라 10개였습니다. 원천 가격은 총 3,620행이었고 기간은 2025년 1월 2일부터 2026년 6월 30일까지였습니다.
예상과 실제가 다르다는 사실을 초기에 찾은 덕분에 잘못된 숫자를 기준으로 확장 계획을 세우지 않을 수 있었습니다. AI에게 바로 구현을 맡기기 전에 “현재 상태를 실제 파일에서 확인해달라”고 요청한 것이 효과적이었습니다.
### 한국과 미국 자산을 같은 구조에 담기
추가할 종목은 직접 하나씩 고르는 대신 분석용으로 균형 있게 구성해달라고 요청했습니다.
Codex는 특정 투자 판단이 아니라 시장과 자산 유형을 비교한다는 목적에 맞춰 한국 6개와 미국 6개를 추가로 제안했습니다. 기존 종목과 합치면 한국 16개, 미국 6개로 총 22개 자산이 됐습니다. 주식은 16개, ETF는 6개였습니다.
이 과정에서 가장 어려웠던 것은 한국과 미국 데이터를 같은 구조로 다루는 일이었습니다. 한국 ticker는 005930처럼 앞자리 0을 유지해야 하지만 미국 ticker는 AAPL처럼 문자로 구성됩니다. 통화도 원화와 달러로 다르고, 시장과 자산 유형을 구분하는 기준도 필요했습니다.
Codex는 종목 목록을 수집 코드에서 분리해 별도의 universe 파일로 관리하도록 바꿨습니다. 각 자산에 시장, 유형, ticker, 표시명, 통화를 명시하면서 한국 숫자 ticker도 모두 문자열로 유지했습니다. 덕분에 앞으로는 수집 로직을 다시 고치지 않고 목록만 수정해 자산을 확장할 수 있게 됐습니다.
### 실패를 전제로 데이터를 지키는 구조 만들기
데이터를 갱신하기 전에는 기존 데이터베이스와 화면용 JSON을 먼저 복사해달라고 요청했습니다.
Codex는 갱신 전 상태를 별도 스냅샷으로 보존했습니다. 그리고 종목 하나의 수집이 실패해도 다음 종목을 계속 처리하도록 수집 흐름을 변경했습니다. 기존 종목이 실패하면 이전 데이터를 유지하고, 새 종목이 실패하면 빈 값을 만들지 않고 저장 대상에서 제외한 뒤 오류 목록에 남기도록 했습니다.
이 안전장치는 곧바로 실제 상황에서 역할을 했습니다. 첫 수집 시도에서 국내 가격 공급처와 미국 가격 공급처의 주소를 찾지 못해 22개 종목이 모두 실패했습니다. 하지만 기존 10개 종목의 3,620행은 그대로 유지됐고 신규 종목에는 가짜 가격이 들어가지 않았습니다.
Codex는 종목코드나 계산 로직이 아니라 제한된 실행 환경의 네트워크 접근이 원인이라고 진단했습니다. 네트워크 접근을 허용한 뒤 같은 작업을 다시 실행했고, 이번에는 22개 종목을 모두 정상 수집했습니다. 오류를 억지로 우회하지 않고 실제 원인을 보여달라고 요청한 것이 데이터 신뢰성을 지키는 핵심이었습니다.
### 데이터베이스와 화면의 숫자가 정말 같은지 확인하기
이번 작업에서 가장 강조하고 싶었던 부분은 수집 성공 메시지가 아니라 최종 숫자의 일치였습니다.
### 결과물
- 한국·미국 주식과 ETF 22개를 비교하는 공유현황판
- 시장과 자산 유형 필터에 함께 반응하는 KPI·산점도·막대 차트·표
- 자산 목록을 한곳에서 관리하는 universe 설정
- 종목별 실패를 격리하고 이전 데이터를 보존하는 갱신 흐름
- 데이터베이스·JSON·화면 수치를 교차 확인하는 검증 절차
## 💬 이 과정에서 배운 AI 활용 팁
### 효과적이었던 것
1. 오류가 나면 실제 원인을 보여달라고 요청하기
- “적당히 넘어가라”가 아니라 실패 종목과 오류를 그대로 보고하도록 요청하면 데이터가 조용히 왜곡되는 일을 줄일 수 있습니다.
2. 현재 상태부터 실제 파일로 확인시키기
- 예상한 자산 수는 12개였지만 실제로는 10개였습니다. 구현 전에 현황을 점검하게 하면 잘못된 전제를 초기에 바로잡을 수 있습니다.
3. 화면 숫자까지 검증 범위에 포함하기
- 데이터베이스만 맞는다고 끝내지 않고 KPI, 차트, 표가 같은 필터 결과를 보여주는지 확인해야 완성된 결과물을 믿을 수 있습니다.
4. 덮어쓰기 전에 복구 방법부터 준비하기
- 데이터 갱신 전에 스냅샷을 만들도록 요청하면 오류가 발생해도 이전 상태로 돌아갈 수 있습니다.
### 이렇게 하면 안 돼요
1. 실패한 API 대신 임의 데이터를 채우지 않기
- 화면을 완성하는 것보다 실제 데이터와 가짜 데이터를 구분하는 일이 먼저입니다. 계산할 수 없는 값은 비워두고 이유를 기록하는 편이 안전합니다.
2. “수집 성공” 메시지만 믿고 끝내지 않기
- 저장된 행 수와 기간, 결측, 중복을 다시 확인하고 화면 숫자까지 비교해야 합니다.
3. 한국과 미국 ticker를 같은 숫자 형식으로 처리하지 않기
- 한국 종목코드의 앞자리 0이 사라질 수 있으므로 ticker는 처음부터 문자열로 다루는 것이 좋습니다.
## 🌍 다른 업무에 적용한다면?
이번 방식은 주식 데이터에만 한정되지 않습니다. 여러 지역의 부동산 지표, 여러 채널의 마케팅 성과, 여러 쇼핑몰의 상품 데이터처럼 출처와 분류가 다른 데이터를 하나의 현황판으로 합칠 때도 적용할 수 있습니다.
핵심은 세 가지입니다. 첫째, 분석 대상을 별도 목록으로 관리합니다. 둘째, 하나의 대상이 실패해도 전체 작업을 계속합니다. 셋째, 원천 데이터부터 최종 화면까지 숫자가 같은지 단계별로 확인합니다.
이 구조를 갖춰두면 새로운 지역이나 상품, 캠페인을 추가할 때 전체 프로그램을 다시 만드는 대신 목록과 분류 정보만 확장할 수 있습니다.
## 🚀 앞으로의 계획
다음 단계는 universe 설정에 더 많은 한국·미국 주식과 ETF를 추가하는 것입니다. 데이터 수집과 화면 로직을 다시 수정하지 않고 목록만 확장했을 때도 같은 검증 절차가 유지되는지 확인할 계획입니다.
자산 수가 더 커지면 전체 종목을 한 화면에 나열하기보다 시장, 자산 유형, 섹터별 탐색을 강화하고 수집 실패 현황도 화면에서 확인할 수 있도록 발전시킬 수 있습니다.