레이블이 VIBE CODING인 게시물을 표시합니다. 모든 게시물 표시
레이블이 VIBE CODING인 게시물을 표시합니다. 모든 게시물 표시

수요일, 12월 03, 2025

LLM을 이용한 환율, 지수, 주가 비교 사이트 제작기 (5)

한달여 정도 chatGPT와 gemini에 물어보면서 개발 기획서를 정리한 내용으로 각각의 LLM들이 작성한 코드들을 한번 돌려보는 시간을 가져본 내용을 공유하려고 합니다. :)

지금까지의 요청 내용은 줄글, 풀어쓴 내용들이어서 LLM이 이해하기 쉽게 작성하라고 하니 아래처럼 작성한다고 하길래 가급적 한번 구성을 맞춰보았습니다.


# 금융 데이터 시각화/관리 웹 플랫폼 개발 기획서

## 1\. 개요

  * **목표:** MongoDB에 저장된 한국/미국 주식, 지수, 환율 데이터를 로컬 웹 환경에서 시각화하여 조회하고, 관련 메타데이터(티커명 등)를 관리할 수 있는 대시보드 구축
  * **핵심 가치:** 다양한 금융 데이터의 직관적인 차트 시각화(캔들스틱, 이동평균선) 및 상호 비교 분석 기능 제공

## 2\. 기술 스택 및 환경

  * **Language:** Python 3.12
  * **Web Framework:** Flask 3.0.3
  * **Database:** MongoDB (PyMongo 4.15.3)
  * **Data Processing:** Pandas 2.2.2, NumPy 1.26.4
  * **Frontend (권장):** Jinja2 템플릿 + 차트 라이브러리 (Plotly.js 또는 ApexCharts, Highcharts 등 금융 차트 지원 라이브러리 활용 예정)

## 3\. 데이터 모델링 (Database Schema)

finance.json 참고

## 4\. 기능 상세 명세

### 4.1. 공통 기능 (User Interface)

  * **검색 기능:**
      * 모든 뷰어 상단에 검색바 제공
      * **검색 기준:** Ticker(코드) 또는 Name(종목명)
      * **자동 완성(Autocomplete):** 키워드 입력 시 매칭되는 종목 리스트 드롭다운 제공
      * **신규 생성하는 ticker_metadata의 ticker나 name을 참조 할것

  * **차트 공통 요건 (캔들스틱):**
      * **X축(시간):** 휴장일(데이터가 없는 날)은 차트에서 제외하여 캔들이 연속적으로 보이도록 처리 (Gap 제거).
      * **기간 설정:** 기본 1개월 뷰. 마우스 휠 또는 슬라이더로 기간 축소/확대(Zoom In/Out) 가능.
      * **축소/확대:** 축소 확대 시 기본적으로 보여주는 1개월 외에 이전 정보들을 보여줘야함
      * **뷰 기간:** 차트 상단에 일주일, 1개월, 3개월, 6개월, 금년, 1년, 3년 5년 10년, 최대 등 버튼으로 초기 설정된 기간의 차트를 확인 할 수 있어야함.
      * **차트 타입:** OHLC(시가, 고가, 저가, 종가) 캔들스틱 차트.

### 4.2. 페이지별 상세 요건

#### A. 한국 주식 뷰어 (`korean_stocks`)

  * **검색:** Ticker(숫자 6자리) 및 종목명(예: 삼성전자)
  * **보조 지표 (이동평균선):** 5일, 20일, 60일, 120일 선 표시

#### B. 미국 주식 뷰어 (`us_stocks`)

  * **검색:** Ticker(영문) 및 종목명(예: Microsoft)
  * **보조 지표 (이동평균선):** 5일, 10일, 20일, 50일, 200일 선 표시

#### C. 지수 정보 뷰어 (`indices`)

  * **검색:** Ticker 및 관리자가 지정한 지수명
  * **보조 지표 (옵션 선택 가능):**
      * 옵션 1: 5, 20, 60, 120일 이평선
      * 옵션 2: 5, 10, 20, 50, 200일 이평선

#### D. 환율 정보 뷰어 (`currencies`)

  * **검색:** Ticker 및 관리자가 지정한 환율명
  * **차트:** 기본 캔들스틱 차트 (이동평균선 필수 요건 없음, 필요시 추가)

#### E. 통합 비교 뷰어 (Comparison)

  * **기능:**
      * 한국주식, 미국주식, 지수, 환율 중 2개 이상의 대상을 검색하여 추가/삭제 가능.
      * 서로 다른 스케일(가격 단위) 문제 해결 로직 적용.
  * **비교 로직 (해결 방안):**
    1.  **2개 종목 비교 시:** **Dual Y-Axis (이중 축)** 적용. 왼쪽 축은 A종목 가격, 오른쪽 축은 B종목 가격 표시.
    2.  **3개 이상 또는 스케일 차이가 극심할 때:** **정규화(Normalization)** 차트 옵션 제공.
          * 시작 시점을 0% 또는 100으로 기준 잡고 **등락률(%)** 그래프로 변환하여 비교.


### 4.3. 관리자(Admin) 페이지

  * **데이터 업데이트 관리:**
      * 각 카테고리별(한국주식, 미국주식, 지수, 환율) 데이터 수집/업데이트 실행 버튼 제공 (백엔드 크롤러/API 트리거).
      * 한국주식: update_kr.py
      * 미국주식: update_us.py
      * 지수: update_index.py
      * 환율: update_currency.py
      * 각 업데이트 버튼시 각각의 스크립트가 백그라운드에서 작동되도록 구현
      * 업데이트 시 `finance_db`내 각각의 종목 중 마지막 날짜 이후 정보만 업데이트 하도록 구성
  * **관리 리스트 편집:**
      * 데이터를 수집/관리할 대상 종목 리스트(Ticker 목록) 추가/삭제 기능.
      * 참고할 collection은 `ticker_metadata` 임.
      * 관리 리스트 편집 페이지는 한국주식, 미국주식,지수,환율운 각각 tab이나 별도의 페이지에서 리스트를 확인 할 수 있을 것
      * 한 페이지에 많은 데이터를 보여줄 수 없기에 pagination 기능이 필요
  * **메타데이터 관리 (Ticker Map):**
      * `ticker_metadata` 컬렉션에 대한 CRUD 제공.
      * Ticker에 매핑되는 `name`(사용자 표시 이름) 수정 기능.
      * 동일한 페이지에서 update할 수 있는 기능이 필요 개별 item별로 name과 marker type을 수정해서 적용하거사 해당 페이지에서 수정된 item들을 적용하도록 기능을 구현할 것.

-----

## 5\. UI/UX 제안 사항 (추가 제안)

  * **반응형 레이아웃:** 뷰어 영역을 최대한 확보하기 위해 사이드바 메뉴(Collapsible Sidebar) 형태 권장.
  * **차트 라이브러리:** `Plotly` 또는 `Lightweight Charts (TradingView)` 사용 권장. (휴장일 스킵 기능 및 줌/팬 성능이 우수함).

-----

## 6. 실행
1.  **데이터 업데이트 로직:**
      * 관리자 페이지의 '업데이트 버튼'을 눌렀을 때 실제로 데이터를 가져오는 python script는 02.mongodb_update_fix.py 파일을 참고하면 됩니다. 이 파일을 참고해서 각각의 항목에 맞도록 스크립트를 분리/작성해줘.

2. **바로 사용 가능하도록 코드 작성**
     * 지금 바로 수행가능한 app.py파일과, html, js, css 모든 파일을 flask가 작동가능한 디렉토리 구조에 맞게 작성해줘
     * 가능하면 zip으로 압축해서 한번에 다운로드 받을 수 있게 해줘


결과적으로 gemini 제외하고 zip파일을 다운로드 받을 수 있게 링크는 제공해 주었으나 그 링크를 통해서 zip파일을 다운로드 받을 수 있는 것은 없었습니다. 다만 gemini는 링크 대신에 위의 기능을 구현한 파일을 zip파일로 압축하는 python 스크립트를 제공해주었습니다. 한... 30kb짜리 파이썬 스크립트를 내놓더라구요 ㅎㅎ 

위 내용을 바탕으로 chatGPT, gemini, grok, kimi, perplexity에 코드를 작성해달라고 25년 12월 1일 월요일에 요청하였고, 모두 무료 버전의 LLM으로 한번 물어보고 테스트를 진행하였습니다.

아, pseudo zip파일 링크만 준 녀석들은 다시 코드 내놔해서 한땀 한땀 코드를 복붙 했습니다. ㅎㅎ 


gemini : flask 구동시 필요한 파일이 모두 작성되었던 유일한 모델

chatGTP: 압축파일은 못 만들었지만 GTP도 필요한 파일은 모두 제시해 줬음

grok: flask의 app.파일에는 작성되어져 있었지만 template 폴더 내 일부 html 파일이 없어서 다시 요청했었음. 필요했던 파일이 5개 였다면 2개 정도가 비어 있음

kimi: 압축파일은 못만들었지만 GTP도 필요한 파일은 모두 제시해 줬음

perplexity: grok처럼 flask의 app.py파일에는 작성되어져 있었지만 template 폴대내 대부분의 생성되어 있어야할 html 파일들이 대부분 누락(10개가 필요하다면 8개가 없음). perplexite는 별 기대 안하고 요청해본 모델이어서 별 기대 없었습니다. :)

그리고 각 flask를 한번씩 돌려본 것을 남겨보자면...

요청서가 자세하지 않아서 모델들이 제대로 이해를 못한 결과 제대로된 결과물이 나오지 않은 것으로 각각의 화면을 한땀 한땀 설명하는 프롬프트를 작성해야할듯으로 보이네요

모든 모델에서 이상하게 mongodb에서 주가정보를 load하지 못했다는 공통점이 있어서 요청서에 문제가 있어보이긴 합니다. 그래도 grok와 kimi 모델에서는 메타데이터 관리를 위한 기능은 작동되는 것이 신기하긴 했습니다. :)

결론: 요청서나 설명하는 문장을 좀 더 다듬어 보는 걸로 



출처: @ye._.vely618

화요일, 11월 04, 2025

LLM을 이용한 환율, 지수, 주가 비교 사이트 제작기 (2)

기존에 사용하던 sqlite3 기반으로는 매주 없데이트 하는데 시간이 오래 걸려서 mongodb로 한번 변경해보는 작업을 진행하였는데 만족스러웠습니다. 

※ mongodb가 상장되어 있는지도 몰랐는데 이번 Dan ives의 ETF(IVES, IVE아닙니다. 물론 IVE도 있고 IVE도 있습니다.)에 mongodb(MDB)가 포함되어 있어 간만에 다시 mongodb를 사용해보기로 하여 아래와 같이 환율, 지수, 주가 정보를 업데이트하는 코드를 수정해 보았습니다.


첫번째 수정작업(Gemini)

(기존에 sqlite3로 사용하던 스크립트 업로드) 첨부한 파일은 기존에 sqlite3를에 테이블을 생성해서 파이썬으로 야후 파이낸스에서 각 ticker 정보를 검색해서 sqlite3로 저장하는 스크립트들 입니다.
환율과 지수, 한국주식, 미국주식 정보를 가져와서 sqlite3 테이블에 저장하는 것입니다.
나는 이 스크립트를 mongodb와 python을 사용해서 작동하도록 하고 싶습니다.
몽고디비는 내 컴퓨터에 설치하였습니다.
첨부한 파일의 스크립트를 참고하여 데이터베이스와 table을 생성하는 코드를 작성해줘 그리고 두번째로는 설치한 몽고DB(mongodb://localhost:27017)에 ticker를 업데이트하는 파이썬 코드를 작성해줘.
현재는 sqlite3에서 table lock로 한번에 한개의 정보만 다운로드 받아 insert하도록 되어있습니다. 환율,야후파이낸스에서 지수,한국주식,미국주식정보를 빠르게 받을 수 있도록 개선된 파이썬 코드를 작성해줘.
python 3.12 버전, yfinance 0.2.61 기준으로 코드를 작성해줘


아쉽게도 기존에 LLM으로는 해결하지 못했던 Session 문제가 그대로 노출되어서 아래와 같이 기존에 문제없이 사용하는 Session 코드를 그대로 보여주고 참고하라고 해서 다행이 잘 해결되었네요

두번째 수정작업(chatGPT)

(생성한 파일 중 update.py파일을 업로드)오류가 발생하여 정상적으로 db에 정보가 쌓이지 않고 있습니다. 문제가 있는 부분을 확인해서 수정해줘.

그리고
# 세션 생성 및 User-Agent 설정 headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36'} session = requests.Session(impersonate="chrome", headers=headers, verify=False)
이 코드를 참고해서 세션 연결을 ticker 다운로드 할 떄마가 하는것이 아니라 스크립트 시작시 세션을 연결하고 모든 작업이 끝나면 세션을 닫으세요


chatGPT가 확인해준 원인들 
(일부 원인이 될 수 있지만 정확하게 해결해주지는 못하더라구요) 

구분 원인 설명
1 requests.Session()yfinance.download()의 호환성 문제 yfinance.download()requests가 아닌 yfinance.shared._session 기반으로 동작합니다. curl_cffi.requests.Session을 전달하면 TypeError 또는 AttributeError가 발생할 수 있습니다.
2 ❌ MongoDB date 필드 처리 오류 datetime.date 객체는 PyMongo가 BSON 변환 시 오류를 일으킬 수 있습니다. datetime.datetime 객체로 저장해야 합니다.
3 latest_dates 집계 시 strftime() 호출 오류 doc['max_date']datetime이 아닌 str로 들어오는 경우 .strftime() 호출 시 AttributeError 발생 가능성이 있습니다.
4 ⚠️ 중복 삽입 방지 미비 insert_many()를 단순 실행하면 중복 데이터가 계속 쌓이거나 오류로 중단될 수 있습니다.
5 ⚠️ 병렬 실행 시 세션 공유 문제 ThreadPoolExecutor 내부에서 yfinance.download() 호출 시 세션/캐시 충돌 가능성이 있습니다.
6 ⚠️ 한국 주식 Ticker 일부 .KQ 종목이 오류 발생 코스닥 종목이 .KS로 지정되어 다운로드 실패 가능성 있습니다.



그래서 아래와 같이 정상 적동하는 2개의 스크립트를 얻게 되었습니다. 

01.mongodb_setup.py

02.mongodb_update.py

다음에는 국내 부동산시세 정보도 알아서 모아올 수 있는 방법이 있는지 확인해보도록 하겠습니다. 물론 다른 서비스들이 있는것으로 봐서는 방법이 없지는 않겠지만 저는 실시간까지는 필요없으니 평이한 방법으로 시도해보도록 하겠습니다. :)



출처: @ye._.vely618