
시작은 야심 찼다
"AI 에이전트들이 팀을 이뤄서 주식을 대신 매매해준다면?"
처음 구상은 이랬다. 실제 증권사 트레이딩 데스크가 어떻게 돌아가는지부터 찾아봤다. 리서치센터가 지표와 데이터를 분석해 리포트를 내면, 그 리포트를 두고 서로 다른 입장의 심사역들이 토론하고, 트레이딩 데스크가 주문을 실행하고, 리스크관리팀이 최종 승인·거부를 결정하는 구조였다. 이 흐름을 그대로 AI 에이전트로 옮겨보기로 했다.
스토캐스틱(주가의 상대적 위치를 보여주는 보조지표)을 보는 애널리스트 에이전트, 이동평균선을 보는 애널리스트 에이전트, 캔들 패턴을 보는 애널리스트 에이전트가 각자 리포트를 쓴다. 그 리포트를 놓고 낙관론자(Bull) 에이전트와 비관론자(Bear) 에이전트가 마치 심사역들처럼 토론을 벌인다. 토론 결과를 받아 트레이더 에이전트가 주문 초안을 짜고, 마지막으로 리스크 매니저 에이전트가 실제 증권사 리스크관리팀처럼 승인·거부를 결정한다.
분석 → 토론 → 결정 → 리스크 승인. 실제 증권사 조직을 그대로 흉내 낸 파이프라인이었다.
각 에이전트에게 역할극을 시키듯 프롬프트를 짜면서, "이거 되게 그럴듯한데" 싶었다. AI가 서로 논쟁하면서 더 나은 결론에 도달한다는 그림 자체가 매력적이었다.
그런데 한 가지 질문이 계속 걸렸다
"이 에이전트들이 왜 그런 판단을 내렸는지, 나중에 설명할 수 있나?"
이동평균선이 골든크로스(단기 이동평균선이 장기 이동평균선을 아래에서 위로 뚫고 올라가는, 매수 신호로 흔히 해석되는 현상)를 냈다는 사실은 코드로 확인 가능하다. 그런데 "Bull 에이전트가 Bear의 반박을 인정하고도 매수 의견을 유지했다"는 결정은 어떻게 검증하나. 같은 입력을 넣었을 때 항상 같은 결론이 나온다는 보장이 있나. 오늘 통과한 로직이 내일도 똑같이 작동한다고 믿을 근거가 있나.
없었다. LLM은 같은 질문에도 미묘하게 다른 답을 낼 수 있고, "그럴듯한 이유"를 만들어내는 데는 능하지만 그 이유가 진짜 인과관계인지는 보장하지 않는다. 내 돈이 걸린 자동매매 시스템에서, 결정의 근거가 재현 불가능하다는 건 치명적인 결함이었다.
그래서 실제로 확인해보기로 했다. 설계 문서에 있던 Bull 리서처 에이전트 프롬프트를 그대로 가져와서, 실제 종목(신한지주)의 진짜 지표 데이터를 넣고, 완전히 똑같은 입력으로 두 번 물었다.
입력부터 재밌었다. 스토캐스틱과 이동평균선은 HOLD를 냈는데, 하이킨아시는 SELL을 냈다. 세 지표부터 서로 모순되는 상황 — 딱 Bull과 Bear가 토론할 만한 애매한 케이스였다.
같은 입력, 같은 모델, 온도(temperature) 0.2로 낮게 설정하고 두 번 실행한 결과:
| 1회차 | 2회차 | |
| 매수 확신도 | 0.2 | 0.2 |
| 제시한 근거 | 1 | 2 (스토캐스틱 관련 근거가 새로 등장 ) |
| 인정한 리스크 | 2 | 3 ( 거래량 비율 리스크가 새로 등장 ) |
확신도 숫자는 우연히 같았다. 그런데 그 숫자에 도달한 과정, 즉 어떤 근거를 들었고 어떤 리스크를 인정했는지는 매번 달랐다. 더 황당한 건 마지막 줄이었다 — 프롬프트에 "한국어로 쓰라"고 분명히 적어놨는데, 두 번째 실행에서는 절반이 영어로 나왔다. 지시사항조차 매번 똑같이 따르지 않는다는 뜻이다.
이게 자동매매 시스템이라면, 오늘 이 로직이 리스크를 3개 짚었는데 내일은 2개만 짚을 수도 있다는 얘기다. 그것도 왜 그런지 예측할 방법 없이. 내 돈이 걸린 시스템에서, 결정의 근거가 재현 불가능하다는 건 치명적인 결함이었다.
그래서 규칙을 다시 짰다
결론은 단순했다. 판단은 코드가, 설명은 AI가.
- 스토캐스틱, 이동평균선, 하이킨아시(캔들의 노이즈를 줄여 추세를 더 명확히 보여주는 차트 기법) 같은 지표 계산과 매매 신호 판정은 전부 순수 파이썬 함수로 짠다. 입력이 같으면 출력도 항상 같다.
- LLM 호출은 딱 한 곳, src/agents/ 폴더 안에서만 허용한다. 그리고 이 에이전트가 만드는 결과물은 매매 로직 어디에도 연결되지 않는다. 사람이 읽는 화면에만 나간다.
- 실주문 코드는 아예 작성하지 않는다. 지금은 페이퍼 트레이딩(가상 매매)만 한다. 그리고 시스템 전체를 즉시 멈출 수 있는 킬 스위치를 루트 디렉토리에 파일 하나로 만들어뒀다.
이 세 줄이 프로젝트의 헌법이 됐다. 이후 몇 달간 이 규칙을 어긴 적은 한 번도 없다. 코드를 새로 짤 때마다 "이거 판단에 관여하는 코드인가, 설명에 관여하는 코드인가"를 먼저 물었다.

그럼 AI는 이 프로젝트에서 뭘 하나
역설적으로, AI를 매매 결정에서 빼고 나니 AI를 쓸 곳이 오히려 명확해졌다.
- 보유 종목이 하루에 3% 넘게 움직이면, 관련 뉴스 헤드라인을 모아서 "왜 이렇게 움직였는지" 1~2문장으로 요약해준다. 근거가 없으면 "특별한 뉴스는 안 보임"이라고 정직하게 쓰도록 프롬프트에 강제했다.
- 특정 종목을 물어보면 가격 이력·재무 지표 같은 사실을 파이썬이 먼저 수집하고, AI는 그 사실만 갖고 설명한다. 데이터에 없는 걸 지어내는 건 금지.
- 백테스트 결과를 정리하고, 다음에 뭘 검증해야 할지 같이 고민하는 리서치 파트너 역할.
전부 "표시용" 아니면 "대화 상대"다. 주문 버튼 근처에는 얼씬도 못 하게 했다.
다음 편 예고
원칙은 세웠는데, 문제는 이제부터였다. 판단을 전부 코드로 짜기로 했으면, 그 코드가 실제로 돈을 버는지 확인해야 한다. 처음 백테스트를 돌렸을 때 결과는 나쁘지 않았다. 아니, 꽤 좋아 보였다.
그런데 그건 착각이었다. 종목 5개로 테스트한 결과였기 때문이다. 40개로 늘리자 이야기가 완전히 달라졌다 — 다음 편에서 이어간다.
이 글은 투자 권유가 아니며, 개인적인 AI·자동매매 시스템 개발 과정을 기록한 글입니다. 실제 투자 판단은 본인의 책임 하에 신중히 결정하시기 바랍니다.