feat: complete trading system with FastAPI backend, web frontend, and auto-analysis
This commit is contained in:
71
backend/services/sentiment_service.py
Normal file
71
backend/services/sentiment_service.py
Normal file
@@ -0,0 +1,71 @@
|
||||
"""
|
||||
舆情数据服务
|
||||
"""
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
from datetime import datetime
|
||||
from database import SentimentData
|
||||
|
||||
class SentimentService:
|
||||
def __init__(self, db: Session):
|
||||
self.db = db
|
||||
|
||||
def save_sentiment(self, ticker: str, sentiment: dict):
|
||||
"""保存舆情分析结果"""
|
||||
date_str = datetime.now().strftime('%Y-%m-%d')
|
||||
|
||||
# 检查是否已存在
|
||||
existing = self.db.query(SentimentData).filter(
|
||||
SentimentData.ticker == ticker,
|
||||
SentimentData.date == date_str
|
||||
).first()
|
||||
|
||||
if existing:
|
||||
existing.score = sentiment.get('score', 0)
|
||||
existing.label = sentiment.get('label', '中性')
|
||||
existing.factors = sentiment.get('factors', [])
|
||||
existing.outlook = sentiment.get('outlook', '')
|
||||
existing.source = sentiment.get('source', 'llm')
|
||||
else:
|
||||
new_sentiment = SentimentData(
|
||||
ticker=ticker,
|
||||
date=date_str,
|
||||
score=sentiment.get('score', 0),
|
||||
label=sentiment.get('label', '中性'),
|
||||
factors=sentiment.get('factors', []),
|
||||
outlook=sentiment.get('outlook', ''),
|
||||
source=sentiment.get('source', 'llm')
|
||||
)
|
||||
self.db.add(new_sentiment)
|
||||
|
||||
self.db.commit()
|
||||
|
||||
def get_sentiment(self, ticker: str, days: int = 30):
|
||||
"""获取最近N天的舆情数据"""
|
||||
sentiments = self.db.query(SentimentData).filter(
|
||||
SentimentData.ticker == ticker
|
||||
).order_by(SentimentData.date.desc()).limit(days).all()
|
||||
|
||||
return [{
|
||||
'date': s.date,
|
||||
'score': s.score,
|
||||
'label': s.label,
|
||||
'factors': s.factors,
|
||||
'outlook': s.outlook
|
||||
} for s in sentiments]
|
||||
|
||||
def get_latest_sentiment(self, ticker: str):
|
||||
"""获取最新舆情"""
|
||||
sentiment = self.db.query(SentimentData).filter(
|
||||
SentimentData.ticker == ticker
|
||||
).order_by(SentimentData.date.desc()).first()
|
||||
|
||||
if sentiment:
|
||||
return {
|
||||
'date': sentiment.date,
|
||||
'score': sentiment.score,
|
||||
'label': sentiment.label,
|
||||
'factors': sentiment.factors,
|
||||
'outlook': sentiment.outlook
|
||||
}
|
||||
return None
|
||||
Reference in New Issue
Block a user