Skip to content

Commit

Permalink
Refactor : Stock Market
Browse files Browse the repository at this point in the history
  • Loading branch information
xxoznge committed Nov 15, 2023
1 parent 0313127 commit da8e6a7
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 31 deletions.
35 changes: 31 additions & 4 deletions Models/Sentiment Analysis for Stock Market Prediction.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
Expand Down Expand Up @@ -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])
Expand All @@ -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)
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}%")
61 changes: 34 additions & 27 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = []
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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
Expand Down
Binary file modified best_model.h5
Binary file not shown.

0 comments on commit da8e6a7

Please sign in to comment.