Streamlit, NewsAPI, Llama 3 연동 자동 주식 감성 분석 대시보드 구축: 실시간 투자 인사이트 생성

주식 투자 결정을 내리는 데 어려움을 겪고 계신가요? 이 글에서는 Streamlit을 사용하여 NewsAPI로부터 실시간 뉴스 데이터를 가져오고, Llama 3를 통해 해당 뉴스 기사에 대한 감성 분석을 수행하여 투자 결정을 지원하는 자동화된 대시보드를 구축하는 방법을 안내합니다. 이를 통해 데이터 기반의 빠른 투자 결정을 내릴 수 있습니다.

1. The Challenge / Context

주식 시장은 끊임없이 변화하며, 정보의 홍수 속에서 투자 결정을 내리는 것은 매우 어려운 일입니다. 단순히 과거 주가 데이터만으로는 미래를 예측하기 어렵고, 다양한 뉴스 기사, 소셜 미디어의 의견 등을 종합적으로 분석해야 합니다. 하지만 이러한 정보를 수동으로 분석하는 것은 시간과 노력이 많이 소요되며, 객관성을 유지하기 어렵습니다. 특히, 단기적인 투자 기회를 포착하기 위해서는 실시간으로 변화하는 뉴스에 대한 감성 분석이 필수적입니다. 본질적인 문제는 개인 투자자가 이러한 분석을 효율적으로 수행할 수 있는 도구가 부족하다는 것입니다.

2. Deep Dive: Llama 3

Llama 3는 Meta에서 개발한 최첨단 대규모 언어 모델(LLM)입니다. 이전 모델보다 훨씬 강력한 성능을 제공하며, 특히 자연어 이해, 생성, 번역, 대화 등의 분야에서 뛰어난 능력을 보여줍니다. Llama 3는 텍스트 데이터를 분석하여 긍정적, 부정적, 중립적 감성을 판단하는 데 활용될 수 있습니다. 이 모델은 방대한 양의 텍스트 데이터로 학습되었기 때문에 미묘한 감정의 차이를 감지하고, 문맥을 고려하여 정확한 분석 결과를 도출할 수 있습니다. 핵심적인 장점은 다음과 같습니다.

  • 향상된 성능: 이전 Llama 모델 대비 월등히 높은 성능을 제공합니다.
  • 다국어 지원: 한국어를 포함한 다양한 언어를 지원하여 글로벌 뉴스 데이터 분석에 용이합니다.
  • 사용 편의성: Hugging Face Transformers 라이브러리를 통해 쉽게 접근하고 사용할 수 있습니다.

3. Step-by-Step Guide / Implementation

이제 Streamlit, NewsAPI, Llama 3를 연동하여 자동 주식 감성 분석 대시보드를 구축하는 단계를 자세히 살펴보겠습니다.

Step 1: 개발 환경 설정

가장 먼저 필요한 라이브러리를 설치합니다. Python 3.7 이상이 설치되어 있어야 합니다. 터미널 또는 명령 프롬프트에서 다음 명령을 실행합니다.

pip install streamlit newsapi-python transformers torch accelerate

각 라이브러리의 역할은 다음과 같습니다.

  • Streamlit: 웹 기반 대시보드를 구축하기 위한 Python 프레임워크입니다.
  • newsapi-python: NewsAPI를 통해 뉴스 데이터를 가져오기 위한 라이브러리입니다.
  • transformers: Hugging Face의 Transformers 라이브러리는 Llama 3와 같은 사전 훈련된 모델을 쉽게 사용할 수 있도록 해줍니다.
  • torch: PyTorch는 딥러닝 모델을 실행하기 위한 프레임워크입니다.
  • accelerate: PyTorch 모델의 추론 속도를 향상시키는 라이브러리입니다.

Step 2: NewsAPI 키 설정

NewsAPI에서 API 키를 발급받아야 합니다. 무료 플랜도 있지만, 요청 제한이 있을 수 있습니다. 발급받은 API 키를 안전하게 보관하고, 코드에 직접 노출시키지 않도록 주의해야 합니다. 환경 변수를 사용하는 것이 좋습니다.

import os

NEWSAPI_KEY = os.environ.get("NEWSAPI_KEY")  # 환경 변수에서 API 키를 가져옵니다.
if NEWSAPI_KEY is None:
    raise ValueError("NewsAPI 키가 설정되지 않았습니다. 환경 변수 NEWSAPI_KEY를 설정하세요.")

Step 3: Llama 3 모델 로드

Hugging Face Transformers 라이브러리를 사용하여 Llama 3 모델을 로드합니다. 'meta-llama/Llama-3-8B' 모델을 사용합니다. (API 토큰 필요, huggingface에서 발급)

from transformers import pipeline

# Hugging Face API 토큰 설정 (필수)
os.environ["HF_TOKEN"] = "YOUR_HUGGING_FACE_API_TOKEN" # 실제 토큰으로 변경

sentiment_pipeline = pipeline(
    "text-classification",
    model="meta-llama/Llama-3-8B", # 이 모델은 예시이며, 더 작은 모델로 테스트할 수 있습니다.
    device_map="auto" # GPU가 있다면 자동으로 사용합니다.
)

device_map="auto" 옵션은 사용 가능한 GPU가 있는 경우 자동으로 GPU를 사용하도록 설정합니다. GPU를 사용하면 추론 속도를 크게 향상시킬 수 있습니다. 만약 GPU가 없다면 CPU를 사용하게 됩니다.

주의: Llama-3-8B 모델은 상당한 컴퓨팅 자원을 필요로 합니다. GPU가 없는 경우 추론 속도가 매우 느릴 수 있습니다. 작은 모델(예: `distilbert-base-uncased-finetuned-sst-2-english`)로 먼저 테스트하는 것을 권장합니다.

Step 4: 뉴스 데이터 가져오기

NewsAPI를 사용하여 특정 주식 종목에 대한 최신 뉴스 기사를 가져옵니다. 예를 들어, "삼성전자"에 대한 뉴스 기사를 가져오려면 다음과 같이 코드를 작성합니다.

from newsapi import NewsApiClient

newsapi = NewsApiClient(api_key=NEWSAPI_KEY)

def get_news(query, num_articles=5):
    try:
        articles = newsapi.get_everything(
            q=query,
            language="ko",
            sort_by="relevancy",
            page_size=num_articles
        )['articles']
        return articles
    except Exception as e:
        print(f"뉴스 가져오기 오류: {e}")
        return []

get_news 함수는 NewsAPI를 사용하여 뉴스 기사를 가져오고, 결과를 반환합니다. q 파라미터는 검색어를 지정하고, language 파라미터는 뉴스 기사의 언어를 지정합니다. sort_by 파라미터는 검색 결과의 정렬 기준을 지정하고, page_size 파라미터는 한 페이지에 표시할 뉴스 기사의 수를 지정합니다.

Step 5: 감성 분석 수행

가져온 뉴스 기사의 제목 또는 내용을 Llama 3 모델에 입력하여 감성 분석을 수행합니다. 각 기사에 대해 긍정, 부정, 중립 여부를 판단합니다.

def analyze_sentiment(text):
    try:
        result = sentiment_pipeline(text)[0]
        return result['label'], result['score']
    except Exception as e:
        print(f"감성 분석 오류: {e}")
        return "Error", 0.0

analyze_sentiment 함수는 Llama 3 모델을 사용하여 텍스트 데이터에 대한 감성 분석을 수행하고, 결과를 반환합니다. Hugging Face pipeline의 text-classification 기능을 사용하여 편리하게 감성 분석을 수행할 수 있습니다.

Step 6: Streamlit 대시보드 구축

Streamlit을 사용하여 주식 종목을 입력받고, 해당 종목에 대한 뉴스 기사를 가져와 감성 분석 결과를 시각적으로 표시하는 대시보드를 구축합니다.

import streamlit as st

def main():
    st.title("주식 감성 분석 대시보드")

    stock_symbol = st.text_input("주식 종목을 입력하세요:", "삼성전자")
    num_articles = st.slider("기사 개수:", min_value=1, max_value=10, value=5)

    if st.button("분석 시작"):
        with st.spinner("뉴스 기사를 가져오고 감성 분석을 수행 중입니다..."):
            news_articles = get_news(stock_symbol, num_articles)

            if news_articles:
                for article in news_articles:
                    title = article['title']
                    description = article['description'] or "내용 없음"
                    url = article['url']
                    
                    label, score = analyze_sentiment(title + " " + description)

                    st.write(f"**[{title}]({url})**")
                    st.write(f"감성: {label} (확률: {score:.2f})")
                    st.write("---")
            else:
                st.write("뉴스 기사를 찾을 수 없습니다.")

if __name__ == "__main__":
    main()

위 코드는 Streamlit 대시보드의 기본적인 구조를 보여줍니다. 사용자는 주식 종목을 입력하고, 기사 개수를 선택할 수 있습니다. "분석 시작" 버튼을 클릭하면, 뉴스 기사를 가져오고 감성 분석을 수행하여 결과를 표시합니다.

Step 7: 대시보드 실행

작성한 Python 스크립트를 실행하여 Streamlit 대시보드를 실행합니다. 터미널 또는 명령 프롬프트에서 다음 명령을 실행합니다.

streamlit run your_script_name.py

your_script_name.py는 작성한 Python 스크립트의 파일 이름으로 바꿔야 합니다. 웹 브라우저가 자동으로 열리고, 대시보드가 표시됩니다.

4. Real-world Use Case / Example

개인 투자자 A씨는 삼성전자 주식 투자를 고려하고 있습니다. 과거 주가 데이터만으로는 확신이 서지 않아, 뉴스 기사를 통해 투자 심리를 파악하고자 합니다. A씨는 이 대시보드에 "삼성전자"를 입력하고 분석을 시작합니다. 대시보드는 최근 뉴스 기사를 가져와 감성 분석을 수행하고, 긍정적인 기사가 많다는 것을 보여줍니다. A씨는 이 정보를 바탕으로 삼성전자 주식 매수를 결정하게 됩니다.

또한, 퀀트 투자자 B씨는 여러 종목에 대한 실시간 감성 분석을 수행하여 투자 전략을 자동화하고자 합니다. B씨는 이 대시보드를 수정하여 여러 종목에 대한 감성 분석 결과를 한 번에 표시하고, 특정 기준(예: 긍정적인 감성 비율)을 충족하는 종목을 자동으로 매수하는 시스템을 구축할 수 있습니다. 이 경우 뉴스기사를 요약하는 과정을 추가하면 더욱 효율적인 분석이 가능합니다.

5. Pros & Cons / Critical Analysis

  • Pros:
    • 실시간 뉴스 데이터를 기반으로 투자 심리를 파악할 수 있습니다.
    • 데이터 기반의 객관적인 투자 결정을 내릴 수 있습니다.
    • 시간과 노력을 절약할 수 있습니다.
    • 다양한 종목에 대한 분석을 쉽게 수행할 수 있습니다.
  • Cons:
    • Llama 3 모델의 추론 속도가 느릴 수 있습니다. 특히 GPU가 없는 경우 더욱 그렇습니다.
    • NewsAPI의 무료 플랜은 요청 제한이 있을 수 있습니다.
    • 감성 분석 결과의 정확도가 100%는 아닙니다. 모델의 한계로 인해 오탐이 발생할 수 있습니다.
    • 모델 실행에 많은 컴퓨팅 자원이 필요합니다.

6. FAQ

  • Q: Llama 3 외에 다른 언어 모델을 사용할 수 있나요?
    A: 네, 물론입니다. Hugging Face Transformers 라이브러리에서 제공하는 다양한 언어 모델을 사용할 수 있습니다. 다만, 모델의 성능과 한국어 지원 여부를 고려해야 합니다.
  • Q: 감성 분석 결과의 정확도를 높이는 방법은 무엇인가요?
    A: 더 많은 데이터로 모델을 파인튜닝하거나, 다른 감성 분석 모델을 함께 사용하여 결과를 종합하는 앙상블 기법을 사용할 수 있습니다. 또한, 뉴스 기사 외에 소셜 미디어 데이터, 기업 실적 발표 등 다양한 정보를 함께 분석하면 정확도를 높일 수 있습니다.
  • Q: NewsAPI 외에 다른 뉴스 API를 사용할 수 있나요?
    A: 네, 그렇습니다. GNews API, AYLIEN Text Analysis API 등 다양한 뉴스 API를 사용할 수 있습니다. API의 기능과 가격 정책을 비교하여 자신에게 맞는 API를 선택하세요.

7. Conclusion

이 글에서는 Streamlit, NewsAPI, Llama 3를 연동하여 자동 주식 감성 분석 대시보드를 구축하는 방법을 자세히 살펴보았습니다. 이 대시보드는 개인 투자자와 퀀트 투자자 모두에게 유용한 도구가 될 수 있습니다. 지금 바로 이 코드를試用해보고, 데이터 기반의 스마트한 투자를 시작해보세요. 더 나아가, 이 대시보드를 기반으로 자신만의 투자 전략을 개발하고 자동화하는 것을 고려해보세요. 투자 성공의 지름길이 열릴 것입니다!