파이썬을 활용한 자동 주식 거래: 자연어 처리 기반의 주식 뉴스 감정 분석 모델 개발 및 최적화 실전 사례
소개
시장 동향을 예측하기 위해 주식 관련 뉴스의 감정 분석을 활용하는 방식은 점점 중요해지고 있습니다. 자연어 처리(NLP) 기술을 통해 텍스트 데이터를 분석하고, 이를 기반으로 자동 거래 시스템을 구축할 수 있습니다. 본 문서에서는 파이썬 기반의 감정 분석 모델 개발 과정과 성능 최적화 방법을 실습 중심으로 다룹니다.
환경 구성
필요한 라이브러리 설치 및 설정:
!pip install pandas numpy nltk scikit-learn
뉴스 데이터 수집
웹 스크래핑을 통해 주식 관련 기사 수집:
import requests
from bs4 import BeautifulSoup
def get_stock_news(symbol):
base_url = "https://finance.yahoo.com/quote/"
response = requests.get(f"{base_url}{symbol}/news/")
soup = BeautifulSoup(response.text, 'html.parser')
articles = soup.select('div.C(flex) M(end)--gutter L(flex) W(100%) Wrap(6)')
news_list = []
for item in articles:
title_elem = item.select_one('a')
if title_elem:
news_list.append({
'headline': title_elem.get_text(strip=True),
'url': title_elem['href']
})
return news_list
# 샘플: 애플 주식 뉴스 수집
news_samples = get_stock_news('AAPL')
텍스트 전처리
텍스트 정제 및 토큰화 작업:
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
nltk.download('punkt')
nltk.download('stopwords')
def clean_text(text):
tokens = word_tokenize(text.lower())
tokens = [word for word in tokens if word.isalpha()]
tokens = [word for word in tokens if word not in stopwords.words('english')]
return ' '.join(tokens)
# 예시: 뉴스 제목 전처리
processed_headline = clean_text(news_samples[0]['headline'])
감정 분석 모델 구축
朴素 베이즈 분류기를 활용한 기초 모델 개발:
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
# 예시 학습 데이터
sample_data = [
("강력한 성장세로 투자자 관심 집중", "긍정"),
("관리 부실로 인한 대규모 손실 가능성", "부정"),
# 추가 데이터
]
# 데이터 분할
X, y = zip(*sample_data)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 벡터화 처리
vectorizer = CountVectorizer()
X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)
# 모델 학습
classifier = MultinomialNB()
classifier.fit(X_train_vec, y_train)
# 성능 평가
predictions = classifier.predict(X_test_vec)
print("정확도:", accuracy_score(y_test, predictions))
모델 최적화 전략
성능 향상을 위한 다양한 기법:
- 특징 선택: TF-IDF 기반의 벡터화 적용
- 모델 교체: SVM, 랜덤 포레스트 등 알고리즘 비교
- 딥러닝 접근: LSTM 네트워크 또는 BERT 기반 모델 사용
- 데이터 확장: 오버샘플링 기법 적용
TF-IDF 적용 예시
from sklearn.feature_extraction.text import TfidfTransformer
tfidf_converter = TfidfTransformer()
X_train_tfidf = tfidf_converter.fit_transform(X_train_vec)
X_test_tfidf = tfidf_converter.transform(X_test_vec)
# TF-IDF 기반 재학습
classifier.fit(X_train_tfidf, y_train)
new_predictions = classifier.predict(X_test_tfidf)
print("TF-IDF 적용 후 정확도:", accuracy_score(y_test, new_predictions))