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

수요일, 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월 25, 2025

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

지난주에 작업한 공공데이터포털에서 API를 활용하여 아파트 매매 데이터를 수집하는 코드를 작성해보았는데... 이게 생각보다 시간이 많이 걸리는 작업이더라구요.

그래서 일단 불편하지만 국토교통부 실거래가 공개시스템(https://rt.molit.go.kr/pt/xls/xls.do)을 통해서 한땀 한땀 엑셀 또는 CSV로 파일을 다운로드 받는게 더 빨라서 구분해서 작업을 하기로 했습니다. Orz

우선 국토교통부 실거래가 공개시스템에서 서울시와 경기도의 실거래가와 전월세 데이터를 CSV로 파일을 받습니다.

※참고1, 시도단위는 1년단위로 받을 수 있고, 전체 데이터는 월단위로 받을 수 있습니다.

※참고2, 매매 거래가는 2005년부터, 전월세 거래가는 2011년부터 존재합니다. 참고하시기 바랍니다.

이번 작업은 grok(자동)를 사용해봤습니다.

아파트 실거래가 CSV 파일을 mongodb에 업로드 하는 스크립트를 작성해줘
--
□ 본 서비스에서 제공하는 정보는 법적인 효력이 없으므로 참고용으로만 활용하시기 바랍니다.
□ 신고정보가 실시간 변경, 해제되어 제공시점에 따라 공개건수 및 내용이 상이할 수 있는 점 참고하시기 바랍니다.
□ 본 자료는 계약일 기준입니다. (※ 7월 계약, 8월 신고건 → 7월 거래건으로 제공)
□ 통계자료 활용시에는 수치가 왜곡될 수 있으니 참고자료로만 활용하시기 바라며, 외부 공개시에는 반드시 신고일 기준으로 집계되는 공식통계를 이용하여 주시기 바랍니다.

* 국토교통부 실거래가 공개시스템의 궁금하신 점이나 문의사항은 콜센터 1533-2949로 연락 주시기 바랍니다.
□ 검색조건
계약일자 : 2005-01-01 ~ 2005-12-31
실거래구분 : 아파트(매매)
주소구분 : 지번주소
시도 : 경기도
시군구 : 전체
읍면동 : 전체
면적 : 전체
금액선택 : 전체
NO 시군구 번지 본번 부번 단지명 전용면적(㎡) 계약년월 계약일 거래금액(만원) 동 층 매수자 매도자 건축년도 도로명 해제사유발생일 거래유형 중개사소재지 등기일자
1 경기도 광주시 신현동 588-1 588 1 현대모닝사이드2 84.778 200512 31 24,000 - 4 - - 2001 새말길 93 - - - -
2 경기도 부천시 소사구 송내동 372 372 0 푸르지오 84.874 200511 30 23,650 - 3 - - 2005 중동로 64 - - - -
3 경기도 안성시 원곡면 반제리 743 743 0 산수화 59.76 200511 30 5,000 - 16 - - 2003 벚꽃길 73 - - - -
4 경기도 광주시 곤지암읍 삼리 125-1 125 1 곤지암킴스빌리지 35.63 200511 30 3,200 - 17 - - 2001 평촌길 20 - - - -
5 경기도 부천시 소사구 소사본동 135 135 0 소사에스케이뷰 84.9841 200511 30 18,800 - 18 - - 2004 소삼로 62 - - - -
6 경기도 오산시 원동 826-1 826 1 대우푸르지오 84.616 200511 30 17,630 - 14 - - 2005 남부대로 411-15 - - - -
7 경기도 오산시 원동 826-1 826 1 대우푸르지오 84.616 200511 29 7,800 - 8 - - 2005 남부대로 411-15 - - - -
8 경기도 오산시 원동 826-1 826 1 대우푸르지오 84.557 200511 29 17,480 - 3 - - 2005 남부대로 411-15 - - - -
9 경기도 광주시 곤지암읍 곤지암리 459 459 0 쌍용1 84.97 200511 29 13,000 - 16 - - 1998 곤지암로 120 - - - -
10 경기도 시흥시 대야동 275 275 0 삼보 70.71 200511 29 8,150 - 6 - - 1991 은행로 188-15 - - - -
11 경기도 광주시 곤지암읍 삼리 125-1 125 1 곤지암킴스빌리지 35.63 200511 29 3,300 - 10 - - 2001 평촌길 20 - - - -
12 경기도 부천시 소사구 송내동 336-6 336 6 동신(336-6) 69.48 200511 29 7,100 - 5 - - 1985 경인로29번길 73 - - - -
13 경기도 부천시 소사구 송내동 372 372 0 푸르지오 59.8 200511 29 15,950 - 5 - - 2005 중동로 64 - - - -

--
CSV를 파싱해서 파이썬 3.12버전을 문법에 맞춰 mongodb에 insert하는 스크립트를 작성해줘
NO 컬럼은 mongodb에 insert/update하지 않아도 돼
csv파일은 첫번째부터 15번째행 까지 파일에 대한 설명이 적혀있고, 16번째 행에는 컬럼 이름들이 있어 그리고 17번째 행부터 실제 매매 정보가 표시되
단 16번째 행에 컬럼들이 나오기는 하지만 꼭 동일하지는 않을 수 있으니, 컬럼 이름이 나올 때 까지의 행은 mongodb에 insert/update하면 안되야해
그리고 컬럼중 해제사유발생일 이라는 컬럼이 있어
이 컬럼은 아파트 매매를 계약 했는데 해제했을 때 값이 채워지는 컬럼이야
예를 들어 계약년월 200512, 계약일 12에 계약을 했는데 2006년 1월 12일에 계약이 해제될 수 있어 이때 "해제사유발생일"이라는 컬럼이 업데이트 될꺼야
해제사유발생일은 언제 발생될지 모르기 때문에 row를 insert할 때 해제사유발생일 컬럼 외에 다른 정보들이 동일한 행이 있다면 그 row에 해제사유발생일 정보만 업데이트하도록 코드를 작성해줘

그리고 전월세 실거래가 정보를 업데이트 하는 코드는 아래와 같이 이어서 생성해달라고 하였습니다.

아래는 아파트 전월세 실거래가 기록을 저장한 CSV 파일의 일부입니다. 위의 아파트 매매 실거래가 정보를 mongodb에 insert/update하는 스크립트와 동일한 기능을 가지는 python 스크립트 작성해줘. 전월세 실거래가에서는 "해제사유발생일"이라는 컬럼이 없어.


>아파트 매매 실거래가 파일<

>아파트 전월세 실거래가 파일<


그래서 기본 데이터는 한땀 한땀 다운받은 CSV로 만들어 놓고 한달에 한번씩 서울시와 경기도 구별로 API로 mongoDB에 적재하는 식으로 사용해보고자 합니다. 

그럼에도 불구하고 API를 사용한 적재 방법이 느리다면 걍 매달 한번씩 업데이트 해야겠죠;; 

조만간 mongoDB에 적재된 데이터 이후에 대로 증분이 필요한 데이터만 끌고오도록 API를 사용한 스크립트를 생성해서 올려보겠습니다. :)



출처: @ye._.vely618