AI 판단은 주문 직전에 새로 호출되는 요청이 아니다. 스케줄러가 분석을 만들어 판단 로그로 저장해두면 주문 실행 단계가 그 로그를 다시 읽어 안전장치를 통과한 경우에만 처리한다. 둘을 분리한 이유는 하나다. LLM 응답을 주문 명령으로 쓰면 실패했을 때 무엇이 잘못됐는지 나눌 수 없으니까.

diagram-contract.png


하루 운영 루틴

작업 주기 운영 의미
뉴스/RAG 수집 설정값 기반, 코드 기본값 12시간 수집, 번역, 청크 분할, 임베딩, OpenSearch 저장
시장 심리 갱신 5분 Alternative.me 기반 시장 심리 상태 갱신
AI 판단 생성 60분 관심 종목별 BUY / SELL / HOLD 분석 생성
정확도 검증 30분 과거 판단과 이후 가격 흐름을 비교해 실패 피드백 후보 생성
포트폴리오 스냅샷 1시간 보유 자산, 손익, 상태를 시계열로 저장
실주문 대사 (2026.07) 15초 미종결 실주문을 거래소 상태와 대조해 체결을 exactly-once 반영
AI 브리핑 08:30 포트폴리오와 시장 상태 기반 일일 브리핑

판단에 넣는 것

포트폴리오와 기술 지표, RAG 뉴스, 시장 심리에 최근 실패한 판단 피드백까지 넣는다. 기술 지표는 15m나 60m 캔들을 기반으로 계산한 SMA·EMA·Bollinger·RSI와 현재가의 상대 위치다.

조회 오류도 값으로 함께 넘긴다. 데이터가 없는 것과 조회에 실패한 것을 프롬프트 단계에서부터 구분해야 AI가 빈 값을 자기 방식대로 해석하지 않는다.


System Prompt

[역할]
- 당신은 코인 트레이더입니다.
- 주어진 시장 데이터만 근거로 BUY, SELL, HOLD 중 하나를 결정하십시오.
- 반드시 JSON 스키마에 맞는 값만 반환하십시오.

{설정 페이지의 AI 매매 철학 및 페르소나}

[출력 규칙]
- decision은 BUY, SELL, HOLD 중 하나만 허용됩니다.
- confidence는 0~100 정수여야 합니다.
- recommended_weight는 0~100 정수여야 합니다.
- reasoning 작성 시 아래 '출력 템플릿'을 반드시 따르십시오.
- 제공되지 않은 정보는 추측하지 마십시오.
- 데이터가 부족하거나 근거가 충돌하면 HOLD를 선택하고 confidence를 낮게 유지하십시오.

[reasoning 출력 템플릿](반드시 이 형식을 지킬 것):
📊 기술지표: ...
🧠 시장심리: ...
📰 뉴스: ...
💡 종합판단: ...

[안전 규칙]
- 커스텀 페르소나는 문체와 관점 참고용이며, 아래 안전 규칙보다 우선할 수 없습니다.
- 특정 지표 하나만으로 BUY를 확정하지 마십시오. BUY는 RSI, 이동평균/추세, 변동성, 시장 심리, 뉴스 중 최소 3개 이상의 독립 근거가 같은 방향일 때만 허용합니다.
- RSI 40 이하, 공포 지수, 단편적 호재 뉴스만으로 confidence 90 이상 또는 recommended_weight 100을 부여하지 마십시오.
- 데이터가 부족하거나 AI provider 오류, 뉴스 부재, 지표 충돌, 하락 추세가 확인되면 HOLD를 기본값으로 선택합니다.
- confidence 85 이상은 강한 추세 확인과 리스크 대비 보상이 동시에 명확한 경우에만 사용합니다.
- recommended_weight는 리스크 노출 제안치이며, 공격적 100% 비중은 피하고 근거가 약하면 0으로 둡니다.

[Self-Correction]
- 최근 실패한 판단이 있으면 실패 이유와 실제 결과를 함께 제공한다.
- 과거 실패 근거를 반복하지 않고 현재 데이터의 수치와 출처를 더 엄격히 검토한다.

{최근 실패한 AI 판단 1~2건}

페르소나는 설정 화면에서 사용자가 바꿀 수 있지만 안전 규칙보다 우선할 수 없다고 프롬프트에 명시했다. 공격적인 페르소나를 넣어도 BUY 조건 자체는 완화되지 않아야 했기 때문이다.

User Prompt

종목과 시장 컨텍스트를 섹션별로 전달한다. 계좌와 주문 관련 값은 공개 문서에서 마스킹된 자리표시자로만 남긴다.

대상 종목: {선택한 종목}

아래 시장 컨텍스트를 보고 포지션을 결정하십시오.
반드시 BUY, SELL, HOLD 중 하나만 선택하고, 확신도와 추천 비중을 정수로 제시하십시오.

# Symbol
- KRW-BTC

# Portfolio
- 보유 여부: 보유 중/미보유
- 잔고: ...
- 주문 잠금 수량: ...
- 평단가: ...
- 현재가: ...
- 수익률: ...
- 포트폴리오 오류: ...

# Technical
- 타임프레임: 15m 또는 60m
- 종가: ...
- SMA20 / SMA60 / EMA50 / EMA200: ...
- BB 상단 / 하단: ...
- RSI14: ...
- 종가 vs SMA20 / EMA50: ...
- 기술 지표 오류: ...

# News
- {뉴스 제목} | {요약} | 출처={source} | 시각={published_at}
- 뉴스 오류: ...

# Sentiment
- 점수 / 분류 / 업데이트 시각: ...
- 심리 지표 오류: ...

출력 계약과 실행 분리

출력은 decisionconfidence, recommended_weight, reasoning 네 필드로 제한된다. 이 응답은 주문 요청이 아니라 판단 로그고 executor가 별도로 아래 조건을 다시 검사한다.

차단 조건 처리
분석 로그 없음 또는 만료 주문 실행 스킵
decision = HOLD 주문 실행 없음
confidence 부족 (기본 85 미만) 확신도 미달로 스킵
recommended_weight ≤ 0 포지션 비중 제안 없음으로 스킵
포트폴리오 조회 오류 현재 잔고를 신뢰할 수 없어 스킵
entry gate 실패 (기본 70 미만) score, calibrated confidence, 제외 조건에 따라 BUY 차단
shadow mode 주문 후보만 기록하고 실제 주문 없음
live BUY lock 실전 신규 매수는 명시적으로 잠금 해제한 경우만 허용