AI 자동매매 시스템 만들기 #1 - 프로젝트의 시작과 설계

2026. 2. 11. 21:47·일상다반사/개발

오늘부터 제가 만들고 있는 AI 자동매매 시스템 프로젝트 개발기를 연재하려고 합니다. 첫 번째 글에서는 프로젝트가 어떻게 시작되었고, 어떤 기술 스택을 선택했는지 이야기해볼게요.

 

 

왜 만들게 되었나?

1. 요즘 핫한 AI. 어떻게든 활용 능력을 키워보고 싶었습니다. (그래도 내가 백엔드 개발자인데...)

2. 과거 키움 증권의 Open API를 이용해서 구현을 시도하다가 32bit 프로그램을 포함한 다양한 디펜던시와 메인 PC에 깔아야 하는 보안 프로그램(매번 로그인도 번거로웠던).. 치를 떨고 줄행랑 쳤습니다. 그런데.... REST API가 나왔었더라구요!!

 

 

"AI가 객관적으로 판단해서 자동으로 매매하면 어떨까?"

물론 시중에 자동매매 프로그램들이 많이 있지만, 개발자로서 직접 만들어보고 싶었어요. 내가 원하는 방식으로 AI를 훈련시키고, 나만의 전략을 코드로 구현하는 재미도 있고요.

프로젝트 설계 - 어떻게 만들까?

일단 작게 프로젝트의 전체 그림을 그려봤습니다.

핵심 아키텍처

간단하게 설명하면 이렇습니다:

 

  • 키움증권 REST API로 시세 정보를 가져옵니다
  • Spring Boot 서버가 중간에서 모든 로직을 처리합니다
  • vLLM으로 돌리는 로컬 AI 모델이 매매 판단을 내립니다
  • 텔레그램 봇으로 알림을 받고 명령도 내릴 수 있습니다

 

여기서 중요한 결정이 하나 있었는데요, AI 모델을 외부 API가 아닌 로컬에서 돌리기로 했습니다.

왜 로컬 AI를 선택했나?

사실 고민을 할 이유도 없이 비용이죠. 사실 사이드 프로젝트인데 돈을 쓰고 싶지 않았습니다.

제 PC도 작은 모델을 돌리기에는 훌륭한 성능이었기 때문이기도 하구요!

 

그래서 선택한 모델이 Gemma 3 12B FP8 버전입니다. 12B 모델이면 충분히 똑똑하면서도 일반 게이밍 PC에서 돌릴 수 있거든요. vLLM으로 OpenAI API와 호환되는 형식으로 서빙하면, Spring AI에서 쉽게 연동할 수 있습니다.

최종 기술 스택 선택

  • Kotlin + Spring Boot 3.x: 자바 생태계의 강력함 + 코틀린의 간결함 (사실 현재 나의 메인 기술스택...)
  • Spring AI: AI 모델과의 통신을 쉽게 해주는 프레임워크
  • SQLite: 개인 프로젝트에는 가볍고 충분한 DB
  • Spring Scheduler: 주기적으로 매매 로직을 돌리기 위해
  • Telegram Bot: 모바일에서 알림 받고 명령 내리기

리스크 관리 설정

초기 커밋 직후 바로 추가한 게 리스크 관리 기능이었습니다. 이게 왜 중요하냐면:

  • 한 종목에 너무 많은 돈을 넣으면 위험합니다
  • 손실이 커지기 전에 자동으로 손절해야 합니다
  • 수익이 나면 적당히 익절해야 합니다

실제 코드를 보시면 이런 설정들이 있어요:

@ConfigurationProperties(prefix = "trading.risk")
data class RiskProperties(
    val maxInvestmentPerStock: Long = 1_000_000,
    val stopLossRate: Double = -3.0,
    val takeProfitRate: Double = 5.0,
    val maxTotalInvestment: Long = 10_000_000,
    val buyConfidenceThreshold: Int = 70,
    val buyHighRiskConfidenceThreshold: Int = 85,
    val sellStopLossConfidenceThreshold: Int = 50,
    val sellTakeProfitConfidenceThreshold: Int = 65,
)

각 설정의 의미는:

  • 종목당 최대 투자금: 100만원
  • 총 투자 한도: 1000만원
  • 손절 기준: -3%
  • 익절 기준: +5%
  • AI 신뢰도 임계값: 매수는 70% 이상일 때만

AI가 아무리 "사라!"고 해도, 리스크 매니저가 "안 돼, 한도 초과야"라고 막을 수 있는 거죠. 중요한 안전장치입니다.

기술적 지표 계산

주식 분석에 쓰이는 기술적 지표들도 구현했습니다. AI에게 단순히 가격 데이터만 주는 게 아니라, 이미 계산된 기술적 지표를 함께 제공합니다:

  • SMA/EMA: 이동평균선 (추세 파악)
  • RSI: 과매수/과매도 판단
  • MACD: 매매 신호
  • 볼린저 밴드: 변동성 측정
  • 스토캐스틱: 모멘텀 지표

출처: https://tr.pinterest.com/pin/ema-vs-sma-understanding-the-differences--477451998010678524/

 

AI 분석 서비스 코드를 보면 이런 식으로 데이터를 수집합니다:

// 1. 종목 기본정보
val stockInfo = marketService.getStockInfo(stockCode)
val stockName = stockInfo.stockName!!
var currentPrice = KiwoomNumberParser.parseLong(stockInfo.currentPrice)

// 2. 일봉 차트 → OHLCV 데이터 추출
val dailyChart = marketService.getDailyChart(stockCode)
val candles = dailyChart?.output?.filter {
    KiwoomNumberParser.parseLong(it.closePrice).toDouble() > 0
} ?: emptyList()

val closes = candles.map { KiwoomNumberParser.parseLong(it.closePrice).toDouble() }
val highs = candles.map { KiwoomNumberParser.parseLong(it.highPrice).toDouble() }
val lows = candles.map { KiwoomNumberParser.parseLong(it.lowPrice).toDouble() }
val volumes = candles.map { KiwoomNumberParser.parseLong(it.volume).toDouble() }

// 3. 기술적 지표 계산
val indicators = if (closes.size >= 5) {
    TechnicalIndicator.analyzeWithOhlcv(closes, highs, lows, volumes)
} else {
    emptyMap()
}

이렇게 모은 데이터를 AI에게 프롬프트로 전달하면, AI는 이걸 보고 "지금 사야 할지 말지"를 판단합니다. 마치 사람이 차트를 보고 판단하는 것처럼요.

AI 분석 프롬프트 구조

AI에게 정보를 줄 때는 체계적으로 정리해서 줍니다:

private fun buildAnalysisPrompt(
    stockName: String,
    stockCode: String,
    currentPrice: Long,
    indicators: Map<String, Any?>,
    candles: List<DailyCandle>,
    holding: StockBalance?,
    pastDecisions: List<AiDecision>,
    channelMessages: List<ChannelMessage>,
    braveNews: List<BraveNewsResult>,
): String = buildString {
    appendLine("## 종목: $stockName ($stockCode)")
    appendLine("현재가: ${currentPrice}원")
    
    appendLine("## 기술적 지표")
    indicators.forEach { (k, v) -> appendLine("- $k: $v") }
    
    appendLine("## 최근 일봉 데이터")
    candles.take(10).forEach { c -> appendLine(formatCandle(c)) }
    
    if (holding != null) {
        appendLine("## 현재 보유")
        appendLine("- 수량: ${holding.holdingQty}")
        appendLine("- 평균매입가: ${holding.avgBuyPrice}")
        appendLine("- 수익률: ${holding.profitLossRate}%")
    }
    
    appendLine("## 텔레그램 채널 뉴스/소식")
    channelMessages.forEach { m -> 
        appendLine("- [${m.createdAt}] @${m.channelName}: ${m.content}")
    }
}

이렇게 정리된 정보를 받은 AI는 JSON 형식으로 판단을 내려줍니다:

{
  "decision": "BUY",
  "confidence": 75,
  "reasoning": "RSI가 30 이하로 과매도 구간이며, MACD 골든크로스 발생...",
  "targetPrice": 50000,
  "riskLevel": "MEDIUM"
}

개발 단계별 계획

처음 설계할 때 Phase별로 나눠놨습니다:

Phase 1-2: 프로젝트 기본 설정, 키움 인증
Phase 3-4: 시세 조회, 주문 실행
Phase 5-6: 기술적 지표 계산, AI 분석
Phase 7-8: 자동매매 스케줄러, REST API
Phase 9-10: 텔레그램 봇 (알림 + 자연어 명령)

각 단계를 명확하게 나누니까 개발하기가 훨씬 수월했습니다. "오늘은 Phase 3만 완성하자!" 이런 식으로 집중할 수 있었거든요.

실제 커밋 히스토리

첫날 커밋 로그를 보면:

c48b099 - Initial commit
  └─ 프로젝트 기본 구조, Spring Boot 설정
     AI 분석 서비스, 대시보드 컨트롤러
     키움/텔레그램 설정 파일들

b10a85f - Add risk management enhancements
  └─ 리스크 관리 설정 추가
     기술적 지표 확장

초기 커밋에서 이미 2,462줄의 코드가 들어갔네요. 미리 구조를 잘 잡아놓으니까 나중에 기능 추가하기가 훨씬 쉬웠습니다.

다음 글 예고

오늘은 프로젝트의 시작과 전체 설계에 대해 이야기했습니다. 다음 글에서는:

  • 키움증권 API 연동 삽질기
  • 텔레그램 봇 구현 과정
  • 실제로 AI가 어떻게 판단하는지
  • 텔레그램 채널 모니터링 구현

이런 내용들을 다뤄볼 예정입니다. 실제 코드와 함께 더 재미있는 이야기를 들려드릴게요!

혹시 궁금한 점이 있으시면 댓글로 남겨주세요. 다음 글에서 답변드리겠습니다! 😊

반응형
저작자표시 비영리 (새창열림)
'일상다반사/개발' 카테고리의 다른 글
  • AI 자동매매 시스템 만들기 #2 - 채널 모니터링과 5단계 매칭 시스템
  • Jetbrains 가격 인상 공지와 저의 선택
  • Java 17.0.1 버그를 경험한 후기
  • 갤럭시 S22+ 삼성단독 컬러 사전구매가 너무 하고 싶었던 개발자의 개발
Kua
Kua
정보 공유, 개인 정리 공간 입니다.
  • Kua
    Kua's Miscellaneous
    Kua
  • 전체
    오늘
    어제
    • 분류 전체보기 (188) 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)
      • 일상다반사 (55) N
        • 도서 (1)
        • 개발 (10) N
        • 후기 - IT (7)
        • 후기 - 일상 (13)
        • 차가리 (4)
        • 방송통신대학교 (4)
        • 음식 (2)
      • Games (12)
        • Minecraft (7)
        • VR (2)
        • 그외 (3)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Kua
AI 자동매매 시스템 만들기 #1 - 프로젝트의 시작과 설계
상단으로

티스토리툴바