AI 자동매매 시스템 만들기 #4 - AI가 실제로 판단하는 방법

2026. 2. 12. 14:53·일상다반사/개발

나의 로컬 LLM은?

사실 첫번째엔 Gemma3를 쓰고자 하였습니다.

근데 AI가 Gemma3 보다는 qwen을 추천한데요... 저보다 똑똑한 AI가 하는 말을 믿고 모델을 변경하였습니다.

 

와 동시에 vLLM에서 Ollama로 프레임워크를 변경하였습니다.

사유는 vLLM으로 동일 모델을 Windows 환경에서 구동하기 위해서는 WSL Linux에서 구동하거나 Docker를 이용하는 것이었습니다. 하지만 Docker로 구동을 하니 GPU 액셀러레이션을 제대로 활용하지 못해 속도가 굉장히 느렸습니다. (Linux OS 였다면 vLLM으로 했을 것입니다)

 

최종적으로 Ollama를 사용해서 Qwen3 14B 모델을 로컬 서버에서 실행합니다.

ollama run qwen3:14b

 

응답 속도는 0.5초 이하, 비용은 전기세뿐. API 호출 제한도 없습니다!

 

모델 선정에는 아래 블로그를 참조하였습니다

https://www.glukhov.org/ko/post/2026/01/choosing-best-llm-for-ollama-on-16gb-vram-gpu/

AI 분석 프롬프트 설계

AI에게 "이 주식 살까요?"라고 물으면 제대로 된 답이 안 나옵니다. 구조화된 프롬프트가 필요합니다.

AI에게 필요한 모든 정보를 주고, 명확한 형식으로 답변을 요구합니다.

val prompt = """
You are an AI trading analyst for the Korean stock market.
Analyze the following stock and decide whether to BUY, HOLD, or SELL.

## Stock Information
- Name: ${stockName}
- Code: ${stockCode}
- Current Price: ${currentPrice}원
- Change: ${changeRate}%
- Volume: ${volume} (평균 대비 ${volumeRatio}배)

## Technical Indicators
- RSI(14): ${rsi} ${when {
    rsi > 70 -> "(과매수 구간)"
    rsi < 30 -> "(과매도 구간)"
    else -> ""
}}
- MACD: ${macd} / Signal: ${signal} ${if (macd > signal) "(상승 추세)" else "(하락 추세)"}
- 20일 이동평균: ${ma20}원 (현재가 대비 ${maDiff}%)

## Recent News from Channels
${channelMessages.joinToString("\n") { "- ${it.timestamp}: ${it.text}" }}

## Account Status
- Available Cash: ${availableCash}원
- Current Holdings: ${holdings.size}개 종목
- Total Portfolio Value: ${totalValue}원

## Decision Rules
- Only BUY if confidence >= 70% and riskLevel is LOW or MEDIUM
- Set SELL if technical indicators show clear downtrend
- Use HOLD for uncertain situations

## Response Format (JSON only)
{
  "decision": "BUY" | "HOLD" | "SELL",
  "confidence": 0-100,
  "riskLevel": "LOW" | "MEDIUM" | "HIGH",
  "reason": "간단한 한국어 설명 (2-3문장)",
  "targetPrice": 목표가 (매수시에만),
  "stopLoss": 손절가 (매수시에만)
}
""".trimIndent()

실제 AI 호출 코드:

@Service
class AiAnalysisService(
    private val chatClient: ChatClient
) {
    fun analyzeStock(stockCode: String): AnalysisResult? {
        val prompt = buildPrompt(stockCode)
        
        val response = chatClient.prompt()
            .user(prompt)
            .call()
            .content()
        
        return parseAiResponse(response)
    }
}

 

Spring AI 덕분에 LLM 호출이 한 줄로 끝납니다. Retry 로직, 타임아웃, 스트리밍도 쉽게 추가할 수 있어요.

JSON 파싱의 함정

AI가 항상 완벽한 JSON을 반환할까요? 아닙니다!

가끔 앞뒤로 설명을 붙이는 거죠. 그래서 파싱 로직을 견고하게 만들어야 합니다.

3단계 폴백 전략으로 AI 응답을 안정적으로 파싱합니다.

기술적 지표 계산

AI에게 차트를 그대로 보여줄 수는 없으니, 기술적 지표를 계산해서 숫자로 전달합니다.

RSI(상대강도지수), MACD(이동평균수렴확산) 같은 지표들을 계산해서 AI 프롬프트에 포함시켜서 판단 근거로 활용합니다.

실시간 손절/익절

초기에는 1분마다 폴링해서 가격을 체크했습니다. 문제는 1분 사이에 급락하면 손절 타이밍을 놓친다는 거죠.

그래서 WebSocket 실시간 체결 데이터를 활용합니다. 체결 데이터가 오는 즉시 손절/익절 조건을 체크하고, 조건이 맞으면 바로 매도합니다. 폴링 방식 대비 최대 60배 빠른 반응 속도입니다!

거래 정지 알림 - SYSTEM 메시지 활용

WebSocket에는 체결 데이터 외에도 SYSTEM 메시지가 옵니다. 거래 정지/재개 같은 중요한 이벤트죠.

거래 정지되면 즉시 텔레그램으로 알림이 옵니다. 손해를 막을 수 있는 중요한 기능이죠.

Vision AI - 이미지 뉴스 분석

텔레그램 채널에 차트 이미지나 뉴스 스크린샷이 올라오는 경우가 있습니다. 이것도 분석해야죠!

Ollama의 Vision 모델(qwen3-vl:8b)을 사용합니다. 텔레그램에서 사진이 오면 이미지 다운로드 → Vision AI로 분석 → 텍스트 추출 + 요약 → DB에 저장합니다.

이제 차트 이미지도 놓치지 않습니다!

배운 점들

1. 로컬 AI는 생각보다 강력하다

ChatGPT만 AI가 아닙니다. 로컬에서 돌리는 오픈소스 LLM도 충분히 실용적입니다.

 

2. 프롬프트 설계가 전부다

"주식 사줘"가 아니라 구조화된 정보를 주고, 명확한 형식을 요구해야 합니다.

 

3. AI 응답은 불안정하다

항상 완벽한 JSON이 오지 않습니다. 폴백 파싱 로직이 필수입니다.

 

4. 실시간은 WebSocket이 답이다

폴링으로는 빠른 시장 변화를 따라갈 수 없습니다. WebSocket 실시간 데이터가 핵심입니다.

 

5. Vision AI는 보너스

이미지 뉴스도 분석하면 정보 손실이 줄어듭니다. 생각보다 정확도가 높아요.

다음 글 예고

오늘은 AI 분석 시스템과 실시간 거래 로직에 대해 이야기했습니다. 다음 글에서는:

  • PostgreSQL + pgvector로 RAG 구축하기
  • 과거 뉴스를 벡터 검색해서 AI 컨텍스트에 추가
  • 포트폴리오 자동 리포트 생성
  • 실전 투자 전환과 최종 개선 사항
반응형
저작자표시 비영리 (새창열림)
'일상다반사/개발' 카테고리의 다른 글
  • AI 자동매매 시스템 만들기 #6 - 예외처리시간! (LLM 환각, WebSocket 재연결, API 비용 최적화)
  • AI 자동매매 시스템 만들기 #5 - RAG로 AI에게 기억력을 주다(pgvector)
  • AI 자동매매 시스템 만들기 #3 - 키움증권 API 연동과 실전 거래
  • AI 자동매매 시스템 만들기 #2 - 채널 모니터링과 5단계 매칭 시스템
Kua
Kua
정보 공유, 개인 정리 공간 입니다.
  • Kua
    Kua's Miscellaneous
    Kua
  • 전체
    오늘
    어제
    • 분류 전체보기 (192) N
      • 대문 (2)
      • Tips (1)
        • Chrome (2)
        • Windows (4)
        • IDE (3)
        • 기타 (16)
      • CodingTest (44)
      • Language (20)
        • PHP (5)
        • C# (7)
        • Java (1)
        • Kotlin (7)
      • Framework & Runtime (16)
        • SpringBoot (12)
        • Node.js (2)
        • Vue.js (1)
        • Gradle (1)
      • DevOps (13)
        • Linux (1)
        • Docker (4)
        • Kubernetes (2)
        • Apache Kafka (1)
        • AWS (1)
      • 일상다반사 (59) N
        • 도서 (1)
        • 개발 (14) N
        • 후기 - IT (7)
        • 후기 - 일상 (13)
        • 차가리 (4)
        • 방송통신대학교 (4)
        • 음식 (2)
      • Games (12)
        • Minecraft (7)
        • VR (2)
        • 그외 (3)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Kua
AI 자동매매 시스템 만들기 #4 - AI가 실제로 판단하는 방법
상단으로

티스토리툴바