stockauto 개별 종목 에이전트 설계 메모
시작
stockauto의 개별 종목 에이전트를 생각할 때 처음에는 단순한 자동매매 봇을 떠올리기 쉽다. 특정 종목을 정해두고, 가격이 떨어지면 사고, 오르면 파는 프로그램처럼 말이다.
하지만 Dev Support에 남겨진 두 문서를 함께 읽어보니 핵심은 조금 달랐다. 개별 종목 에이전트는 매수·매도 버튼을 대신 누르는 도구라기보다, 한 종목을 둘러싼 사건의 시간표를 만들고 그 시간표가 바뀔 때 포지션 계획을 다시 해석하는 시스템에 가깝다.
즉 에이전트의 중심에는 가격이 아니라 “마일스톤”이 있다.
에이전트가 봐야 하는 것
개별 종목 에이전트가 먼저 해야 할 일은 공시를 보는 것이다. 특히 미국 주식이라면 SEC EDGAR에 올라오는 공시가 가장 기본 데이터가 된다. 여기서 중요한 문서는 크게 세 종류로 나뉜다.
첫째는 Form 8-K다. 이것은 정기 보고서가 아니라 중요한 사건이 생겼을 때 제출되는 수시 공시에 가깝다. 대형 계약, CEO 교체, 파산 위기, 임상 결과, 규제 승인 같은 이벤트가 여기에 담길 수 있다. 개별 종목 에이전트가 가장 민감하게 감시해야 할 문서다.
둘째는 Form 10-K와 Form 10-Q다. 각각 연간 보고서와 분기 보고서다. 이 문서들은 당장의 급등락 신호라기보다 회사의 현금 보유량, 사업 계획, 앞으로의 일정, 마일스톤을 확인하는 데 더 적합하다.
셋째는 Form 4다. 임원이나 주요 주주가 자기 회사 주식을 사고팔았을 때 보고하는 문서다. 내부자 매수·매도는 단독 매매 신호로 쓰기에는 위험하지만, 기존 타임라인과 함께 보면 좋은 보조 신호가 될 수 있다.
공시 추적기는 타임라인 생성기다
공시 추적기의 결과물은 단순 요약문이면 부족하다. 사람에게 읽히는 문장도 필요하지만, 에이전트가 다시 읽고 판단할 수 있는 구조화된 데이터가 더 중요하다.
예를 들면 아래와 같은 형태다.
1
2
3
4
5
6
disclosure_date = 공시가 올라온 날짜
form_type = 8-K, 10-K, 10-Q, Form 4
summary = 공시 내용 요약
milestone_date = 공시에서 추출한 미래 일정
milestone_status = 대기 중, 진행 중, 완료, 지연, 취소
source_url = 원문 공시 링크
이 데이터가 쌓이면 개별 종목마다 하나의 “메인 타임라인”이 생긴다. 에이전트는 새 공시를 볼 때마다 타임라인에 이벤트를 추가하거나, 기존 이벤트의 날짜와 상태를 수정한다.
중요한 점은 새 공시가 항상 새 이벤트만 만드는 것은 아니라는 점이다. 예를 들어 기존에는 “2024년 3분기 임상 데이터 발표 예정”이라고 되어 있었는데 새 공시에서 “2025년 1분기로 연기”라고 나오면, 에이전트는 새 줄을 추가하는 것에 그치면 안 된다. 기존 마일스톤의 상태를 지연으로 바꾸고 D-Day를 다시 계산해야 한다.
매매 전략은 타임라인 위에서 움직인다
두 번째 문서는 분할 매수와 분할 매도 전략을 다룬다. 여기서도 핵심은 가격 하나가 아니라 시간이다.
매집기에는 매일 같은 금액을 나누어 사는 정액 분할 매수를 기본으로 둔다. 이렇게 하면 특정 하루의 가격에 과하게 노출되는 위험을 줄일 수 있다. 다만 매집 기간 중 주가가 기준 가격보다 크게 급등하면 매수를 멈춰야 한다. 이미 소문이 퍼져 가격이 비싸진 상태에서 계속 사면 평균 단가가 오염될 수 있기 때문이다.
매도기에는 뉴스 예정일 직전부터 단계적으로 비중을 줄인다. 예를 들어 일주일 전 30%, 3일 전 40%, 당일 아침 30%처럼 기대감이 커지는 구간에서 수익을 확정하는 방식이다. 목표 수익률에 먼저 도달했다면 날짜를 기다리지 않고 일부를 덜어내는 안전장치도 필요하다.
이 구조를 코드 관점에서 보면 에이전트는 아래 상태들 사이를 이동한다.
1
WATCHING -> ACCUMULATING -> HOLDING -> DISTRIBUTING -> CLOSED
그리고 공시나 가격 이벤트가 들어오면 상태가 바뀐다.
1
2
3
4
5
마일스톤이 충분히 가까워짐 -> ACCUMULATING
주가가 매수 상한선 초과 -> ACCUMULATING 일시 중단
소문 선반영으로 목표 수익률 도달 -> DISTRIBUTING 조기 진입
공시로 일정 연기 확인 -> WATCHING 또는 LOCKED
D-3까지 반응 없음 -> 방어적 포지션 축소
예외 상황이 진짜 전략이다
개별 종목 에이전트에서 어려운 부분은 정상 시나리오가 아니다. 정상 시나리오에서는 일정에 맞춰 천천히 사고, 일정 직전에 천천히 팔면 된다. 진짜 전략은 타임라인이 어긋날 때 드러난다.
첫 번째 예외는 소문 선반영이다. 뉴스 예정일이 한참 남았는데 주가가 이미 목표 수익률 이상으로 급등하면, 에이전트는 매집을 중단하고 매도 상태로 전환해야 한다. 시장이 이벤트 에너지를 미리 소비했다면 정작 뉴스 당일에는 “뉴스에 판다”가 작동할 가능성이 커진다.
두 번째 예외는 일정 연기다. 공시에서 마일스톤이 뒤로 밀렸다면 기존 계획은 더 이상 유효하지 않다. 이때 에이전트는 매수를 멈추고, 새 D-Day를 기준으로 타임라인과 매집 구간을 다시 계산해야 한다.
세 번째 예외는 시장 소외다. 뉴스 예정일이 가까워졌는데도 가격과 거래량이 전혀 반응하지 않는 경우다. 기대감 매매는 결국 시장이 기대감을 가격에 반영한다는 전제 위에 있다. D-3까지도 반응이 없다면 포지션 일부를 줄여 이벤트 실패 리스크를 낮추는 쪽이 더 안전하다.
필요한 데이터 모델
이 에이전트는 하나의 거대한 함수보다 몇 개의 테이블이 분리되어 있을 때 이해하기 쉽다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
watchlist
- ticker
- cik
- company_name
- enabled
disclosures
- ticker
- form_type
- filed_at
- source_url
- raw_text_path
- summary
milestones
- ticker
- milestone_date
- title
- status
- confidence
- source_disclosure_id
agent_states
- ticker
- state
- base_price
- buy_start_date
- buy_end_date
- d_day
- updated_at
position_plans
- ticker
- daily_buy_amount
- buy_ceiling_pct
- target_return_pct
- sell_schedule
action_logs
- ticker
- action_type
- reason
- before_state
- after_state
- created_at
이렇게 나누면 공시 추적기와 매매 판단기가 서로 느슨하게 연결된다. 공시 추적기는 disclosures와 milestones를 갱신하고, 매매 판단기는 milestones, agent_states, position_plans를 읽어 다음 행동을 결정한다.
처음부터 자동매매로 가면 안 된다
이 구조에서 가장 조심해야 할 점은 에이전트가 너무 빨리 실제 주문까지 맡는 것이다. 초기 버전은 주문 실행기가 아니라 리서치와 알림 에이전트에 가까워야 한다.
가장 안전한 순서는 아래와 같다.
1
2
3
4
5
6
7
1. SEC EDGAR에서 특정 종목의 최신 공시 목록 가져오기
2. Form 8-K 본문 텍스트 추출하기
3. LLM으로 마일스톤 후보만 한국어 요약하기
4. CSV 또는 DB에 타임라인 누적하기
5. 새 공시가 기존 마일스톤을 바꾸는지 판정하기
6. Slack으로 변경 사항과 권장 상태 전환 알리기
7. 충분히 검증된 뒤에만 주문 실행과 연결하기
처음에는 “매수하라”가 아니라 “이 종목의 D-Day가 바뀌었고, 현재 상태는 매수 중단으로 전환하는 것이 맞아 보인다” 정도를 알리는 편이 좋다. 사람이 판단을 확인하고, 에이전트의 기록이 충분히 쌓인 뒤에야 실행 자동화를 논의할 수 있다.
핵심 인사이트
이번 두 문서를 함께 읽으며 정리된 핵심은 이것이다.
개별 종목 에이전트는 가격 반응기가 아니라 사건 추적기여야 한다. 가격은 행동을 촉발하는 중요한 신호지만, 가격만 보고 움직이면 왜 사고 왜 파는지 설명하기 어렵다. 반대로 공시에서 추출한 마일스톤, 그 마일스톤을 기준으로 한 상태, 상태별 행동 규칙이 분리되어 있으면 에이전트의 판단을 나중에 다시 검증할 수 있다.
결국 좋은 에이전트는 아래 질문에 답할 수 있어야 한다.
1
2
3
4
5
이 종목에서 기다리고 있는 이벤트는 무엇인가?
그 이벤트의 날짜와 신뢰도는 어떻게 바뀌었는가?
현재 포지션 상태는 그 이벤트 타임라인과 일치하는가?
가격이 먼저 움직인 것인가, 공시가 먼저 바뀐 것인가?
지금 필요한 행동은 매수, 매도, 관망, 중단 중 무엇인가?
결론
stockauto의 개별 종목 에이전트는 “좋은 종목을 골라주는 AI”보다 “한 종목의 사건과 포지션 계획을 계속 동기화하는 운영자”에 가깝다.
공시 추적기는 에이전트의 눈이고, 타임라인 DB는 기억이며, 분할 매수·분할 매도 규칙은 손발이다. 여기에 상태 전환 로그가 붙으면 나중에 왜 그런 판단을 했는지 되짚을 수 있다.
처음 만들 버전은 작아야 한다. SEC 공시를 가져오고, 마일스톤을 추출하고, 타임라인을 갱신하고, Slack으로 알려주는 것. 그 작은 루프가 안정적으로 돌기 시작하면, 그때부터 개별 종목 에이전트는 단순한 자동화 스크립트가 아니라 검증 가능한 투자 운영 시스템에 가까워질 수 있다.