
지난 주 사용했던 데이터인 미국 주식 데이터(yfinance)를 바탕으로 스트림릿을 이용해 주린이들을 위한 대시보드를 만들었다.
모두 어떤 제품이 만족스러워서 투자를 하고 싶을때, 제작사나 회사를 몰라서 "@@@ 관련주" 등으로 검색했던 경험이 있었기 때문에 제품을 입력하면 해당 제품 제작 회사 및 관련 회사 종목 코드를 노출 하는 방향으로 제작을 했다.
관련 회사는 GPT를 통해 작업했다.

import openai
import streamlit as st
# OpenAI API 키 설정
openai.api_key = ''
# GPT로 제품명을 기반으로 기업 찾기 함수
def gpt_find_companies(product_name):
# GPT 모델에 보낼 메시지 설정 (chat completions 방식 사용)
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": f"Please provide a list of companies related to the product '{product_name}' and whether they are publicly traded in the US. Return the company's name, stock ticker (if publicly traded), and whether they are listed on a US stock exchange."}
]
# OpenAI API의 ChatCompletion 엔드포인트 호출
response = openai.ChatCompletion.create(
model="gpt-4o-mini", # gpt-4o-mini 모델 사용
messages=messages,
max_tokens=150, # 응답의 길이를 조정 가능
temperature=0
)
# GPT의 응답 처리 (응답은 JSON 형식으로 받아와서 텍스트 추출)
result_text = response['choices'][0]['message']['content']
# 응답을 파싱해서 리스트로 변환
return parse_gpt_response(result_text)
# GPT 응답을 파싱해서 기업 리스트로 변환하는 함수
def parse_gpt_response(response_text):
# 간단하게 줄 단위로 분리해서 리스트로 반환하는 예시
companies = []
lines = response_text.split("\n")
for line in lines:
parts = line.split(",") # 컴마로 구분된 경우
if len(parts) >= 3:
name = parts[0].strip()
ticker = parts[1].strip() if 'Ticker' in parts[1] else None
listed = 'Yes' in parts[2]
companies.append({'name': name, 'ticker': ticker, 'listed': listed})
return companies
# Streamlit 앱 시작
st.title('Product to US Stock Ticker Lookup (Powered by GPT)')
# 제품명을 입력 받음
product_input = st.text_input('Enter a product name:')
# 입력된 제품명을 GPT로 분석해서 관련 기업 찾기
if product_input:
companies = gpt_find_companies(product_input)
if companies:
# 각 기업 정보를 화면에 표시
for company in companies:
logo = 'https://logo.com/default.png' # 로고 URL을 GPT로부터 받을 수 있으면 추가 가능
name = company['name']
ticker = company['ticker']
listed = company['listed']
# 상장된 회사는 클릭 가능한 링크로 표시
if listed and ticker:
st.image(logo, width=50)
st.markdown(f"[{name} (Ticker: {ticker})](https://www.nasdaq.com/market-activity/stocks/{ticker})")
# 상장되지 않았거나 티커가 없는 경우는 클릭 비활성화
else:
st.image(logo, width=50)
st.write(f"{name} (Not Listed or No Ticker)")
else:
st.error(f'No companies found related to "{product_input}".')
내가 맡은 부분은 '기업소개' 영역으로 동적 크롤링을 통해 네이버 증권>기업소개를 가져왔다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup as bs
import time
import streamlit as st
# 크롬 드라이버 설정 및 옵션 구성
def get_driver():
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ['enable-logging'])
options.add_argument("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36")
options.add_argument('lang=ko_KR')
# 크롬 웹브라우저 드라이버 자동 다운로드
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=options)
driver.set_window_size(1920, 1080) # 웹브라우저 해상도 조절
return driver
# 네이버 주식 페이지에서 기업 소개 정보 크롤링
def get_company_info(ticker):
driver = get_driver()
url = f"https://m.stock.naver.com/worldstock/stock/{ticker}.O/overview"
driver.get(url)
time.sleep(3) # 페이지 로딩 대기
# 페이지 소스를 가져와 BeautifulSoup으로 파싱
soup = bs(driver.page_source, 'html.parser')
# p 태그와 특정 클래스를 가진 요소 선택
company_info_section = soup.select('p.OverviewContainer_desc__ipokP')
driver.quit() # 크롬 드라이버 종료
if company_info_section:
# <br> 태그를 newline으로 대체
for br in company_info_section[0].find_all('br'):
br.replace_with('\n')
# 텍스트만 추출하여 반환
return company_info_section[0].get_text(strip=True)
else:
return "기업 정보를 찾을 수 없습니다."
################# streamlit_app ###############
# Streamlit UI 구성
st.title("기업 소개")
# 티커 심볼 입력 받기
ticker = st.text_input("종목 티커 심볼을 입력하세요 (예: AAPL - 애플, TSLA - 테슬라):", "AAPL")
# 기업 정보를 가져와서 표시
if ticker:
info = get_company_info(ticker)
st.subheader(f"{ticker} 기업 정보")
st.write(info)



다른 팀원이 관심 회사 주식 분석 내용은 아래와 같이 프롬프트를 구성했다.
초등학생이 이해할 수 있도록 아래에 제공된 주식 분석 내용을 설명해줘.
2. 어려운 용어는 쉽게 설명하고, 일상생활의 예시를 사용해 이해를 돕도록 해줘.
3. 예를 들어, '주식 가격'을 '물건의 가격'으로 설명하고, 'RSI'와 같은 기술적 지표는 '게임에서 체력 게이지'처럼 설명해줘.
4. 이모티콘들도 적절하게 사용해줘.
5. 이런글 넣지 말아줘: 주식 분석 내용을 초등학생이 이해할 수 있도록 쉽게 설명해볼게요! 😊
6. 그리고 이건 미국 주식이라 "원"이 아닌 "달러"로 설명해줘.
설명이 필요한 주식분석내용: {insight_text}
예시:
1. 지난 3년 동안 주식의 평균 가격은 170.79원이었는데, 지금은 228.61원으로 많이 올랐어. 가격이 오르고 있다는 뜻이야.
2. **RSI**라는 지표는 주식이 너무 많이 팔렸는지, 너무 많이 샀는지를 보여줘. 이 숫자가 70을 넘으면 '너무 많이 샀다'는 뜻인데, 지금은 60.10이라 아직 더 오를 수 있어.
3. **MACD**라는 지표는 주식이 더 오를지, 내릴지를 알려줘. 지금 MACD 값은 0.0039인데, 신호선보다 조금 낮아. 하지만 두 값이 가까워지고 있어서 주식이 더 오를 가능성이 있어.
4. **볼린저 밴드**라는 것은 주식의 움직임을 예측하는데 쓰는 도구야. 지금 주식 가격이 거의 이 밴드의 상단에 다다르고 있어서, 더 오를 가능성이 있어.
""")