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

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

월요일, 10월 27, 2025

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

오늘은 머리속으로만 생각해오던 Vibe coding 작업을 한번 해본 것 한번 끄적끄적 적어 올립니다.

이번 작업은 아마 좀 그럴듯해지는 결과물이 나올때 까지 시리즈로 올릴 계획입니다.

첫번째로 올리는게 LLM을 활용하고 AI를 도입한 무슨 무슨 유전체 분석 파이프라인이면 좋았을 수 도 있겠지만 자본주의 시장에서 Cash is King이니 환율, 주식, 지수를 한눈에 볼 수 있도록 하는 그럴듯한 차트를 만들어보는 것을 첫번째 주제로 잡아보았습니다.

당연히 제가 수정할 수 있도록 python, flask를 사용해서 작업해달라고 하고 있습니다.

지금은 chatGPT와 gemini에게 만들어달라고 해보고 있는데 grok와 perplexity를 이용할 예정입니다.

작성된 코드는 업데이트하여 계속 아래 제 github에 commit하도록 하겠습니다. :)

github: dashboard_poc


chatGPT에게 요청

나는 환율가격정보와 여러국가의 증권시장 지수 정보, 한국에 상장되어 있는 상장사들의 주가정보, 미국에 상장되어 있는 상장사들의 주가정보를 일자별로 개시가, 종가, 고가, 저가, 거래량 정보를 가지고 있습니다. 나는 이 정보들을 실시간으로 특정 기간 동안 또는 확인 할 수 있는 전체 기간 동안 비교 하고 싶어. 예를 들어 달라/원 환율정보, 한국의 삼성전자 주가, 미국의 나스닥 지수를 한국의 코스피 지수를 한 화면에 비교하면서 보고 싶어 환율가격정보와 여러국가의 증권시장 지수 정보, 한국에 상장되어 있는 상장사들의 주가정보, 미국에 상장되어 있는 상장사들의 주가정보들은 각각 sqlite3 데이터베이스 파일로 저장되어 있어.
환율가격정보는 finance_currency.db 파일에 currency라는 테이블에
symbol TEXT,
date DATE, open REAL,
high REAL,
low REAL,
close REAL,
volume INTEGER,
dividends REAL,
stock_splits TEXT 구조로 되어 있어. 
여러국가의 증권시장 지수 정보는 finance_index.db 파일에 stocks라는 테이블에, 한국에 상장되어 있는 상장사들의 주가정보는 finance_stock_kr.db파일에 stocks라는 테이블에, 미국에 상장되어 있는 상장사들의 주가정보는 finance_stock.db 파일에 stocks라는 테이블에 stocks라는 테이블에 저장되어 있습니다. 
stocks 테이블은 
symbol TEXT,
date DATE, open REAL,
high REAL,
low REAL,
close REAL,
volume INTEGER,
dividends REAL,
stock_splits TEXT 구조로 되어 있어. 
나는 Python 3.12 기준으로 FLASK를 사용해서 데이터베이스에 있는 환율가격정보와 여러국가의 증권시장 지수 정보, 한국에 상장되어 있는 상장사들의 주가정보, 미국에 상장되어 있는 상장사들의 주가정보들을 실시간으로 확인할 수 있는 웹페이지를 개발해줘.




gemini에게 요청
1. 환율, 인덱스지수, 한국주식종목, 미국주식종목은 각 데이터베이스에서 로딩하여 항목들을 보여주면 좋겠습니다. flask를 시작할 때 환율, 인덱스지수, 한국주식종목, 미국주식종목 의 데이터베이스에서 symbol 항목들을 먼저 불어와서 선택시 지연이 생기지 않으면 합니다.

2. 화면에서 환율, 인덱스지수, 한국주식종목, 미국주식종목 을 선택하는 하는 방법은 드랍다운 메뉴를 통해서 환율, 인덱스지수, 한국주식종목, 미국주식종목 을 선택 할 수 있으면 좋겠습니다. 동일한 화면에서 여러개의 항목을 보여주어야합니다. 추가할 때는 "추가"버튼 또는 "+" 아이콘을 클릭하면 추가 할 수 있으면 좋겠습니다. 그리고 추가한 항목을 삭제할 떄는 "-" 버튼을 클릭하여 항목을 언제나 추가, 삭제할 수 있어 사용자가 편리하게 환율, 인덱스지수, 한국주식종목, 미국주식종목의 항목을 조회할 수 있으면 좋겠습니다.

3. 환율, 인덱스지수, 한국주식종목, 미국주식종목 등 한 chart화면에 다양한 단위의 정보를 부여줘야합니다. Y축의 척도를 환율, 인덱스지수, 한국주식종목, 미국주식종목등 선택한 항목에 따라 동적(dynamic)으로 단위를 자동으로 확인하여 표시해주면 좋겠습니다.

환율은 교환하는 통화의 단위에 따라 표시가 어렵기에 인덱스지수 처럼 단위가 없이 표시해주면 됩니다.

한국주식종목은 원화 기준이기에 달라 기준인 미국주식종목과 단위가 없는 환율, 인덱스지수와 함께 표시할 때 상대적으로 큰 숫자로 표시되어 다른 항목들의 값이 정상적으로 표현되지 않을 수 있습니다.

사용자가 각 항목을 확인 할 때 불편하지 않도록 항목에 따라 Y축의 척도, 단위를 자동으로 구성해주면 좋겠습니다.

4. 환율, 인덱스지수, 한국주식종목, 미국주식종목 등 여러가지 그래프를 하나의 chart화면에서 보여 줄 때 모든 정보들이 보이지 않고 마지막으로 추가한 항목의 그래프만 보이는 오류가 발생할 수 있습니다. 이런 오류가 발생하지 않도록 코드를 오류 없이 작성해주세요.

5. 업로드한 파일은 초기에 작성한 python FLASK로 작성한 파일입니다. 참고하여 위의 요청사항들을 반영하여 사용자가 사용하기 편리하고 오류없는 python기반의 FLASK 사이트를 작성해줘.


첫번째는 chatGPT에게 대략적인 내용을 설명하고 코드를 작성해달라고 하였고, 이후 gemini에게 chatGPT가 작성한 코드를 바탕으로 추가 요청사항을 알려주었습니다.


그래서 아래와 같이 결과물이 나왔는데... 

물론 아직 멀었습니다. 일단 이쁘지가 않습니다. 그리고 Y축의 척도가 선택한 항목에 따라 동적으로 scale이 조정되면 좋을 것 같은데... 그렇지 않다보니 숫자가 작은 항목을 선택하면... 바닥에 기어가는 그래프들만 볼때가 있네요..


그래도 머리에 있는 내용을 타이핑해서 상대방에게 알려주는 것이 얼마나 어려운것인지 다시한번 느끼고 있으며 그럼에도 불구하고 이 내용을 A부터 Z까지 python이라지만 내가 코드를 작성할 수 있었을까? 라는 생각을 가지고 감탄하고 있습니다. :)


아이디어와 설명, 표현을 LLM에게 잘 한다면 사실 못할게 없을것 같네요. :)

그리고 위에서 얘기한것과 같이 다른 LLM들도 사용할 예정인데 품질 향상을 위해서가 아니라 무료 버전을 사용하고 있어서 하나의 모델에게 많은 일을 시키지 못해서 그렇습니다. :) 

음... 좀 번거롭긴 하지만 생각보다 약간씩 모델에 차이가 있다보니 여러 LLM을 돌려사용하면 품질이 조금 더 향상되지 않을까 합니다. ㅎㅎ
더 업데이트해서 지금보다 나은 결과물을 가지고 두번째 글을 쓰도록 하겠습니다. :)




출처: @ye._.vely618

월요일, 9월 23, 2024

개인 프로젝트를 시작해보자

여윽시....

돌아다니다보니 자산배분전략에 대해서 한곳에 정리해놓은 페이지가 있었네요!!

https://quantist.co.kr/


이전에는 위 사이트에서 언급된 전략 중 DAA, VAA을 엑셀로 어떻게든 하려고 했는데

굳이 파이썬을 할 줄 아는데 미련하게 엑셀로 한다는게 말이 안되는것 같아서...


jupyter, flask와 sqlite를 활용해서 웹 기반에서 원하는 내용들을 확인 할 수 있도록 하는 프로젝트를 하나 진행하려고 합니다.

개인 루틴으로 LLM들을 이용해서 논문이나 기사들 톺아보기를 꾸준히 해오고 있었느데, 코딩이나 실생활에 더 도움이될 프로젝트를 하나더 가동해보려고 합니다.

LLM을 이용한 논문이나 기사들 톺아보기는 격일로 어떻게 하고 있는데 이 프로젝트는 꾸준히 잘 될지 모르겠지만 일주일에 한번씩은 업데이트 할 수 있지 않을까 합니다. 근데 사실 OpenAI나 gemini가 90%를 하지 않을까 하네요 ㅎㅎ

여튼 꾸준히 코드 업데이트를 해보도록 하겠습니다. :)




출처: @ye._.vely618


월요일, 5월 27, 2024

flask에서 파일 접근 방법

지금까지 열심히 모아놓은 sotck db를 활용해서 flask를 통해 보기 좋게 화면을 하나 만들어보려고 작업중에 있는데 예상치 못한 난관에 부딪혀서 몇일을 해메였는데...

결국은 별거 아니었다는...


그래서 준비했습니다.

!!Flask를 사용해서 sqlite3 접근시 주의사항!!

플랫폼은 Windows 10 (Home), 파이썬은 3.12, flask, jinja2 등등 필요한 라이브러리는 pip3 default로 설치하였고, jupyter-notebook를 사용해서 개발중에 있습니다.

문제가 되었던 것은 

C:\WORK\jupyter 폴더에 flask의 Home 폴더가 되어 해당 폴더 밑에 index.py와 stocks.db 이름을 가지는 sqlite3 db를 위치해 두었습니다.

이전에 github에 올려두었던 python script를 사용해서 매주 업데이트 하고 있고, 최근에는 dart 정보도 추가해 놓은 터였죠.

index.py파일에서 "con = sqlite3.connect('stocks.db')" 코드로 접근해서 stock라는 테이블에서 자료를 뽑아오는 거였는데 no such table stock라고 stock 테이블이 없다고 에러를 뿜어대는데.. 

당연히 index.py와 같은 디렉토리 안에 있었기 때문에 

con = sqlite3.connect('stocks.db')

적어준것이 었는데,

con = sqlite3.connect('C:\WORK\jupyter\stocks.db')

이렇게 절대 경로를 모두 넣어줘야지 정상적으로 작동이 되는 것이었습니다.


No such table 에러를 구글에 검색해보니... migration이 제대로 안되어서 blablabla

도움이 하나도 안되는... (일반적인 경우 저 검색결과가 도움이 되었겠지만, 나는 아무것도 안했단말이다. ㅋ)


결국 connect 시 절대 경로를 모두 포함된 파일명을 사용하면 되는 것이었습니다.

다음에는 좀 더 유용한 내용으로 돌아오도록 하겠습니다.



출처: @ye._.vely618