diff --git a/Models/Sentiment Analysis for Stock Market Prediction.py b/Models/Sentiment Analysis for Stock Market Prediction.py index 39c3654..665d654 100644 --- a/Models/Sentiment Analysis for Stock Market Prediction.py +++ b/Models/Sentiment Analysis for Stock Market Prediction.py @@ -277,8 +277,8 @@ def calculate_sentiment_score(noun_list): "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } -start_date = datetime.datetime.now() - datetime.timedelta(days=30) -end_date = datetime.datetime.now() - datetime.timedelta(days=5) +start_date = datetime.datetime.now() - datetime.timedelta(days=5) +end_date = datetime.datetime.now() - datetime.timedelta(days=1) current_date = start_date news_data = [] @@ -322,7 +322,7 @@ def calculate_sentiment_score(noun_list): else: print("미래 주식 시장은 부정적으로 움직일 것으로 예상됩니다.") - # 각 뉴스의 감성 점수를 바탕으로 긍정적 및 부정적 뉴스 개수 확인 및 출력 +# 각 뉴스의 감성 점수를 바탕으로 긍정적 및 부정적 뉴스 개수 확인 및 출력 sent_mean = news_df['sent_score'].mean() pos_news = len(news_df[news_df['sent_score'] > sent_mean]) @@ -338,4 +338,31 @@ def calculate_sentiment_score(noun_list): print("\n부정적 뉴스 예시:") for title in news_df[news_df['sent_score'] <= sent_mean]['title'].head(5): - print("-", title) \ No newline at end of file + print("-", title) + + +weight_bilstm = 0.7 # Bi-LSTM 모델에 부여할 가중치 +weight_sentiment = 0.3 # 감성 사전에 부여할 가중치 + +# Bi-LSTM 모델의 예측 결과와 감성 사전의 점수를 각각 가져오기 +bilstm_scores = predicted.flatten() +sentiment_scores = news_df['sent_score'].values + +# 이진 분류 문제라면 임계값을 설정하여 긍정/부정으로 분류 +threshold = 0.7 + +# 각 비율 계산 +bilstm_positive_ratio = (bilstm_scores > threshold).mean() +sentiment_positive_ratio = (sentiment_scores > sent_mean).mean() + +# 가중 평균 계산 +final_positive_ratio = (weight_bilstm * bilstm_positive_ratio) + (weight_sentiment * sentiment_positive_ratio) + +# 결과 출력 +if final_positive_ratio > 0.5: + print("종합적으로 긍정적인 결과가 나왔습니다.") +else: + print("종합적으로 부정적인 결과가 나왔습니다.") + +print(f"종합적인 긍정 비율: {final_positive_ratio * 100:.2f}%") +print(f"종합적인 부정 비율: {100 - final_positive_ratio * 100:.2f}%") diff --git a/app.py b/app.py index fbe951a..e5def1a 100644 --- a/app.py +++ b/app.py @@ -914,8 +914,8 @@ def calculate_sentiment_score(noun_list): "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } - start_date = datetime.datetime.now() - datetime.timedelta(days=30) - end_date = datetime.datetime.now() - datetime.timedelta(days=5) + start_date = datetime.datetime.now() - datetime.timedelta(days=5) + end_date = datetime.datetime.now() - datetime.timedelta(days=1) current_date = start_date news_data = [] @@ -951,38 +951,46 @@ def calculate_sentiment_score(noun_list): # 훈련된 Bi-LSTM 모델로 예측 predicted = model.predict(X_test_padded) news_df['predicted_label'] = (predicted > 0.5).astype(int) + + weight_bilstm = 0.7 # Bi-LSTM 모델에 부여할 가중치 + weight_sentiment = 0.3 # 감성 사전에 부여할 가중치 - # 결과 출력 - positive_news_ratio = news_df['predicted_label'].sum() / len(news_df) - if positive_news_ratio > 0.5: - print("미래 주식 시장은 긍정적으로 움직일 것으로 예상됩니다.") - else: - print("미래 주식 시장은 부정적으로 움직일 것으로 예상됩니다.") + # Bi-LSTM 모델의 예측 결과와 감성 사전의 점수를 각각 가져오기 + bilstm_scores = predicted.flatten() + sentiment_scores = news_df['sent_score'].values + + # 임계값을 설정하여 긍정/부정으로 분류 + threshold = 0.7 - # 각 뉴스의 감성 점수를 바탕으로 긍정적 및 부정적 뉴스 개수 확인 및 출력 - sent_mean = news_df['sent_score'].mean() + # 각 비율 계산 + bilstm_positive_ratio = (bilstm_scores > threshold).mean() + sentiment_positive_ratio = (sentiment_scores > sent_mean).mean() - pos_news = len(news_df[news_df['sent_score'] > sent_mean]) - neg_news = len(news_df[news_df['sent_score'] <= sent_mean]) - total_news = len(news_df) + # 가중 평균 계산 + final_positive_ratio = (weight_bilstm * bilstm_positive_ratio) + (weight_sentiment * sentiment_positive_ratio) - print(f"긍정적 뉴스 수: {pos_news} ({pos_news/total_news*100:.2f}%)") - print(f"부정적 뉴스 수: {neg_news} ({neg_news/total_news*100:.2f}%)") + # 결과 출력 + if final_positive_ratio > 0.5: + print("종합적으로 긍정적인 결과가 나왔습니다.") + else: + print("종합적으로 부정적인 결과가 나왔습니다.") - print("\n긍정적 뉴스 예시:") - for title in news_df[news_df['sent_score'] > sent_mean]['title'].head(5): - print("-", title) + print(f"종합적인 긍정 비율: {final_positive_ratio * 100:.2f}%") + print(f"종합적인 부정 비율: {100 - final_positive_ratio * 100:.2f}%") - print("\n부정적 뉴스 예시:") - for title in news_df[news_df['sent_score'] <= sent_mean]['title'].head(5): - print("-", title) + if final_positive_ratio > 0.5: + prediction_result = "미래 주식 시장은 긍정적으로 예측됩니다 ." + else: + prediction_result = "미래 주식 시장은 부정적으로 예측됩니다.." + positive_percentage = final_positive_ratio * 100 + negative_percentage = 100 - positive_percentage + + # API 응답 형식 구성 response_market = { - "prediction": "positive" if positive_news_ratio > 0.5 else "negative", - "positive_news_count": pos_news, - "negative_news_count": neg_news, - "positive_news_examples": list(news_df[news_df['sent_score'] > sent_mean]['title'].head(5)), - "negative_news_examples": list(news_df[news_df['sent_score'] <= sent_mean]['title'].head(5)) + "prediction_result": prediction_result, + "positive_percentage": f"{positive_percentage:.2f}%", + "negative_percentage": f"{negative_percentage:.2f}%" } return jsonify(response_market) @@ -1092,7 +1100,6 @@ def risk_parity_objective(weights, volatilities): return jsonify(response_portfolio) @app.route("/recommend_stock", methods = ['POST']) - def recommend_stock(): if request.method == 'POST': data = request.json diff --git a/best_model.h5 b/best_model.h5 index f781c21..ce1109d 100644 Binary files a/best_model.h5 and b/best_model.h5 differ