...
This commit is contained in:
@@ -174,37 +174,53 @@ object RagService {
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun processStock(currentPrice : Double , technicalAnalyzer: TechnicalAnalyzer,stockName: String,stockCode: String,result : TradingDecisionCallback) {
|
||||
// 1. 10분간의 데이터 가져오기 (API 호출)
|
||||
suspend fun processStock(currentPrice: Double, technicalAnalyzer: TechnicalAnalyzer, stockName: String, stockCode: String, result: TradingDecisionCallback) {
|
||||
val totalStartTime = System.currentTimeMillis() // 전체 시작 시간
|
||||
|
||||
coroutineScope {
|
||||
try {
|
||||
var tradingDecision: TradingDecision = TradingDecision()
|
||||
var tradingDecision = TradingDecision()
|
||||
tradingDecision.stockCode = stockCode
|
||||
tradingDecision.analyzer = technicalAnalyzer
|
||||
tradingDecision.currentPrice = currentPrice
|
||||
|
||||
var corpInfo = DartCodeManager.getCorpCode(stockCode)
|
||||
corpInfo?.stockName = stockName
|
||||
tradingDecision.stockName = stockName
|
||||
tradingDecision.corpName = corpInfo?.cName ?: ""
|
||||
|
||||
// 1. 재무 데이터 가져오기 시간 측정
|
||||
val financialStartTime = System.currentTimeMillis()
|
||||
val financialDataDeferred = async { NewsService.fetchFinancialGrowth(corpInfo?.cCode ?: "") }
|
||||
|
||||
tradingDecision.financialData = financialDataDeferred.await()
|
||||
|
||||
val financialStmt = FinancialMapper.mapRawTextToStatement(tradingDecision.financialData ?: "")
|
||||
val financialDuration = System.currentTimeMillis() - financialStartTime
|
||||
println("⏱️ [$stockName] 재무 분석 소요: ${financialDuration}ms")
|
||||
|
||||
if (FinancialAnalyzer.isSafetyBeltMet(financialStmt)) {
|
||||
// 2. 뉴스 스크래핑 및 학습 시간 측정
|
||||
val newsIngestStartTime = System.currentTimeMillis()
|
||||
corpInfo?.let {
|
||||
try {
|
||||
NewsService.fetchAndIngestNews(it)
|
||||
} catch (e: Exception) {}
|
||||
}
|
||||
val newsIngestDuration = System.currentTimeMillis() - newsIngestStartTime
|
||||
println("⏱️ [$stockName] 뉴스 수집/인덱싱 소요: ${newsIngestDuration}ms")
|
||||
|
||||
// 3. 기술적 지표 계산 시간 측정
|
||||
val techStartTime = System.currentTimeMillis()
|
||||
val financialScore = FinancialAnalyzer.calculateScore(financialStmt)
|
||||
val scores = technicalAnalyzer.calculateScores(financialScore)
|
||||
val techDuration = System.currentTimeMillis() - techStartTime
|
||||
println("⏱️ [$stockName] 기술적 지표 계산 소요: ${techDuration}ms")
|
||||
if (scores.avg() > 50) {
|
||||
result(tradingDecision, false)
|
||||
tradingDecision.techSummary = technicalAnalyzer.generateComprehensiveReport()
|
||||
result(tradingDecision, false)
|
||||
|
||||
// 4. RAG 뉴스 검색 및 임베딩 시간 측정
|
||||
val ragStartTime = System.currentTimeMillis()
|
||||
val question = "${corpInfo?.cName} $stockName[$stockCode]의 향후 실적 전망과 관련된 핵심 뉴스"
|
||||
val questionEmbedding = embeddingModel.embed(question).content()
|
||||
val searchResult = embeddingStore.search(
|
||||
@@ -214,23 +230,36 @@ object RagService {
|
||||
.build()
|
||||
)
|
||||
tradingDecision.newsContext = searchResult.matches().joinToString("\n") { it.embedded().text() }
|
||||
val ragDuration = System.currentTimeMillis() - ragStartTime
|
||||
println("⏱️ [$stockName] RAG 뉴스 검색 소요: ${ragDuration}ms")
|
||||
|
||||
result(tradingDecision, false)
|
||||
TradingLogStore.addAnalyzer(stockName,stockCode, "${FinancialAnalyzer.toString(financialStmt)}${scores.toString()}",true)
|
||||
println("${stockName}[${stockCode}] : ${FinancialAnalyzer.toString(financialStmt)}${scores.toString()}")
|
||||
result(decideTrading(stockCode, scores, financialStmt, tradingDecision), true)
|
||||
TradingLogStore.addAnalyzer(stockName, stockCode, "${FinancialAnalyzer.toString(financialStmt)}${scores.toString()}", true)
|
||||
|
||||
// 5. AI 최종 결정(LLM 호출) 시간 측정
|
||||
val aiDecisionStartTime = System.currentTimeMillis()
|
||||
val finalDecision = decideTrading(stockCode, scores, financialStmt, tradingDecision)
|
||||
val aiDecisionDuration = System.currentTimeMillis() - aiDecisionStartTime
|
||||
println("⏱️ [$stockName] AI 최종 판단 소요: ${aiDecisionDuration}ms")
|
||||
|
||||
val totalDuration = System.currentTimeMillis() - totalStartTime
|
||||
println("✅ [$stockName] 전체 분석 완료 총 소요: ${totalDuration}ms")
|
||||
|
||||
// 상세 로그 남기기
|
||||
TradingLogStore.addAnalyzer(stockName, stockCode, "분석시간 상세: 재무(${financialDuration}ms), 뉴스(${newsIngestDuration}ms), RAG(${ragDuration}ms), AI(${aiDecisionDuration}ms)", true)
|
||||
|
||||
result(finalDecision, true)
|
||||
} else {
|
||||
println("${stockName}[${stockCode}] : ${FinancialAnalyzer.toString(financialStmt)}${scores.toString()}")
|
||||
TradingLogStore.addAnalyzer(stockName,stockCode, "${FinancialAnalyzer.toString(financialStmt)}${scores.toString()}")
|
||||
println("✋ [$stockName] 기술 점수 미달로 분석 중단")
|
||||
tradingDecision.confidence = 1.0
|
||||
result(tradingDecision, false)
|
||||
}
|
||||
} else {
|
||||
TradingLogStore.addAnalyzer(stockName,stockCode, "${FinancialAnalyzer.toString(financialStmt)}")
|
||||
println("${stockName}[${stockCode}] : ${FinancialAnalyzer.toString(financialStmt)}")
|
||||
println("🚨 [$stockName] 재무 안전벨트 미달")
|
||||
tradingDecision.confidence = 1.0
|
||||
result(tradingDecision, false)
|
||||
}
|
||||
}catch (e: Exception) {
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user