화수분에이아이
인턴·신입근거: 화수분AI는 2025년 설립되어, 리서치/운용 자동화 시스템을 개발중인 스타트업입니다.
※ 실제 산출물이 아닌 AI 예측 시안입니다.
화수분AI 는 2025년에 세워져 리서치·운용 자동화 시스템을 만들고 있고, 개발자 5명과 펀드매니저·애널리스트 10여 명이 함께 일하며 이 자리에 매매에 직접 쓰이는 시스템과 데이터 수집 파이프라인, LLM 워크플로우를 맡깁니다. 운용과 리서치가 한 회사 안에 있어 보유 종목표와 커버리지 애널리스트의 추정치가 같은 곳에 모이므로, 공시 하나를 받자마자 누가 무엇을 얼마나 들고 있고 누구의 추정과 어긋났는지 한 번에 가르는 판정이 이 회사에서 성립합니다. 이 포트폴리오는 공시 실적과 추정치를 단위·기간을 맞춰 견주는 규칙과 그 결과를 여럿이 함께 보는 화면을 보여줍니다. 기업 실적을 추정하는 분석 역량이나 매매 판단에 대한 전문성은 주장하지 않습니다.
화수분AI 는 리서치·운용 자동화 시스템을 만드는 회사이고, 이 자리는 전문 투자자와 붙어 일하며 매매에 직접 쓰이는 시스템을 설계합니다. 보유 종목의 실적 공시를 추정치와 견주는 일은 펀드매니저의 아침 매매 판단 바로 앞에 있습니다.
업무 목록에 데이터 수집 파이프라인 구축, LLM 기반 워크플로우와 에이전트 개발, 리서치·운용 자동화 툴 제작이 나란히 있습니다. 공시를 모으고 추정치와 맞춰 판정한 뒤 회의 메모를 쓰는 흐름이 이 세 업무를 한 줄로 잇습니다.
개발자보다 운용·리서치 인력이 두 배 많은 조직이라 도구의 사용자가 바로 옆자리에 있습니다. 모호한 문제를 간결한 시스템으로 설계하는 역량과 주식시장에 대한 기본 이해를 함께 요구합니다.
밤사이 나온 잠정실적 공시와 사내·외부 애널리스트의 영업이익 추정치, 펀드별 보유 종목표를 받아 보유 종목 공시마다 다섯 판정 중 하나를 붙입니다. 공시는 억원이나 백만원으로, 추정치는 십억원으로 적혀 있고 기간도 「2026.2Q」와 「2Q26」처럼 다르게 쓰여 있어 먼저 단위를 억원으로, 기간을 한 꼴로 맞춥니다. 같은 애널리스트가 추정을 고쳐 여러 줄이 있으면 가장 최근 줄만 남겨 평균을 내고, 가장 최근 추정이 공시일보다 90일 넘게 앞서면 크기 판정을 미룹니다. 펀드매니저와 커버리지 애널리스트는 장 시작 전 회의에서 어느 종목부터 비중을 다시 볼지 이 화면으로 정합니다.
아침마다 보유 종목 공시를 함께 보고 매매를 정하는 화수분AI 펀드매니저와 커버리지 애널리스트
보유 종목 잠정실적 공시가 몰리는 실적 시즌에는 펀드매니저가 DART 알림을 하나씩 열어 애널리스트 추정치 파일과 머릿속으로 견줍니다. 이때 단위가 다른 숫자를 그대로 비교하거나 석 달 넘게 안 고친 추정치를 기준으로 삼아 서프라이즈 크기를 잘못 읽습니다. 단위·기간을 맞추고 애널리스트별 최신 추정만 평균 내어 공시와 견주면, 크게 벗어난 보유 종목과 기준이 낡은 종목이 회의 전에 따로 섭니다.
펀드매니저가 잠정실적 공시 목록과 애널리스트 추정치, 보유 종목표를 올리면 보유 종목 공시마다 다섯 판정 중 하나와 견준 추정치가 나오는 관리자 페이지입니다. 단위를 억원으로 바꾸는 계산, 기간 표기를 맞추는 규칙, 애널리스트별 최신 추정만 남기는 평균이 이 주에 들어갑니다. 공시는 파일로 받는 것으로 시작하고 OpenDART 수집은 3주차로 둡니다.
지난 네 분기 보유 종목 공시 200건을 되돌려 돌리고, 제가 적어 둔 판정과 어긋난 종목을 판정별로 모읍니다. 크게 벗어난 종목마다 비중과 커버리지 애널리스트 이름을 담은 아침 회의 메모 한 줄이 붙습니다.
OpenDART 에서 잠정실적 공시를 밤사이 모으는 수집 파이프라인을 붙여 매일 아침 8시 30분 전에 판정을 돌립니다. 판정 엔진과 수집기는 Docker 로 묶어 사내 서버에서 예약 실행합니다.
펀드매니저가 공시 목록과 추정치, 보유 종목표를 올리면 추정을 크게 밑돈 보유 종목이 비중과 함께 맨 위 묶음에 서는 과정을 시연합니다.
백만원으로 공시한 종목과 「2Q26」으로 적힌 추정치가 억원·「2026.2Q」로 맞춰져 견줘지는지, 추정을 한 번 고친 애널리스트의 옛 추정이 평균에서 빠지는지 한 종목을 펼쳐 읽습니다.
영업이익이 적자인 종목, 서프라이즈가 정확히 10.0% 인 종목, 추정일이 정확히 90일 전인 종목, 추정치가 한 줄도 없는 보유 종목, 보유하지 않은 종목의 공시를 섞은 입력에서 판정이 어디로 가는지 보여주고, 금액 칸에 쉼표·괄호 음수가 섞인 파일 10종을 올려도 화면이 서는지 확인합니다.
지난 네 분기 공시 200건을 두고, 제가 먼저 적어 둔 판정과 도구가 낸 판정이 몇 건 같은지 판정별로 셉니다. 합성 데이터 기준이라 이 수는 투자 판단이 맞았는지와 관계가 없고, 단위 환산과 문턱 비교가 적은 대로 도는지만 보여 줍니다.
위 수치는 더미데이터 자가채점이며, 이 판정이 실제 매매 결정을 앞당겼는지는 화수분AI 의 실제 보유 내역과 공시 뒤 매매 기록이 있어야 측정됩니다. 매매 기록 표를 같은 종목 코드로 붙일 자리는 정답 표 서식에 비워 두었습니다.
공시값·추정치·정답이 전부 제 손에서 나왔으므로, 판정이 정답과 맞는 비율은 규칙이 제 의도대로 돈다는 것까지만 말해 줍니다. 면접에서는 추정이 90일 넘게 안 고쳐진 종목에서 크기 판정을 왜 하지 않는지, 공시일 뒤에 고친 추정을 왜 버리는지를 보여 드리는 데 씁니다.
공시값과 정답을 한 사람이 지으면 규칙이 헷갈릴 종목을 빼먹기 쉽습니다. 적자 종목, 10.0% 와 90일 경계에 딱 걸친 종목, 단위가 백만원인 공시, 공시 다음 날 고친 추정, 추정이 없는 보유 종목을 더미에 일부러 넣어 쉬운 공시만 통과하지 않게 했습니다.
잠정실적은 확정 실적이 아니고, 영업이익 하나만 견주면 일회성 비용으로 벗어난 공시도 크게 밑돎으로 갑니다. 판정은 매매 신호가 아니라 회의에서 먼저 열어 볼 순서로만 씁니다.
여기서 쓰는 추정치 평균은 애널리스트마다 같은 무게를 줍니다. 추정을 자주 고치는 애널리스트와 드물게 고치는 애널리스트를 어떻게 다룰지는 실제 추정 이력을 본 뒤 정할 도입 과제로 둡니다.
OpenDART 는 개인도 인증키를 받아 쓰는 공개 API 라 수집 단계를 혼자 만들 수 있습니다. 증권사 컨센서스 원자료는 유료라 이 포트폴리오에서는 추정치를 직접 지은 표로 대신합니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
기업이 낸 분기 잠정실적 공시에서 영업이익을 옮긴 표입니다. 종목명과 수치는 모두 가상입니다. op_income 은 공시에 적힌 단위 그대로라 억원과 백만원이 섞이고, fiscal_period 는 「2026.2Q」 꼴입니다. 영업이익이 적자인 종목과 펀드가 보유하지 않은 종목의 공시를 일부러 담았습니다.
| corp_code | corp_name | fiscal_period | op_income | unit | disclosed_at |
|---|---|---|---|---|---|
| 310100 | 한빛반도체 | 2026.2Q | 8,100 | 억원 | 2026-07-24 |
| 310200 | 세진전자부품 | 2026.2Q | 1,150 | 억원 | 2026-07-28 |
| 310300 | 온누리플랫폼 | 2026.2Q | 1,320 | 억원 | 2026-08-06 |
| 310400 | 대한케미칼 | 2026.2Q | 312,000 | 백만원 | 2026-07-30 |
| 310500 | 새봄바이오 | 2026.2Q | -180 | 억원 | 2026-08-13 |
아래 JSON Schema 에 맞는 잠정실적 공시 행을 더 만들어 주세요. {"type":"object","properties":{"corp_code":{"type":"string","description":"종목코드 6자리입니다."},"corp_name":{"type":"string"},"fiscal_period":{"type":"string","description":"YYYY.nQ 꼴입니다."},"op_income":{"type":"number","description":"공시에 적힌 영업이익입니다. 적자면 음수입니다."},"unit":{"type":"string","enum":["억원","백만원"]},"disclosed_at":{"type":"string","description":"공시일 YYYY-MM-DD 입니다."}},"required":["corp_code","corp_name","fiscal_period","op_income","unit","disclosed_at"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) unit 이 백만원이라 억원보다 100배 큰 숫자로 적힌 공시, (2) op_income 이 음수인 적자 종목, (3) 추정 평균과 견줘 정확히 10% 차이가 나는 공시, (4) holdings 에 없는 종목의 공시. 종목명은 실존 회사와 겹치지 않는 가상 이름으로 쓰고, 생성한 행은 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"corp_code":{"type":"string","description":"종목코드 6자리입니다."},"corp_name":{"type":"string"},"fiscal_period":{"type":"string","description":"YYYY.nQ 꼴입니다."},"op_income":{"type":"number","description":"공시에 적힌 영업이익입니다. 적자면 음수입니다."},"unit":{"type":"string","enum":["억원","백만원"]},"disclosed_at":{"type":"string","description":"공시일 YYYY-MM-DD 입니다."}},"required":["corp_code","corp_name","fiscal_period","op_income","unit","disclosed_at"]}사내 애널리스트와 외부 증권사가 낸 분기 영업이익 추정치입니다. op_income_est 는 십억원 단위이고 fiscal_period 는 「2Q26」 꼴이라 공시와 다르게 적혀 있습니다. 같은 애널리스트가 추정을 고쳐 두 줄이 있는 종목, 공시 다음 날 실적을 보고 고친 추정, 추정일이 공시보다 146일 앞선 종목, 정확히 90일 앞선 추정을 일부러 담았습니다.
| corp_code | fiscal_period | analyst | op_income_est | updated_at |
|---|---|---|---|---|
| 310100 | 2Q26 | 김도윤(사내) | 1,020 | 2026-05-10 |
| 310100 | 2Q26 | 김도윤(사내) | 960 | 2026-07-10 |
| 310100 | 2Q26 | 박서연(가나증권) | 950 | 2026-07-15 |
| 310100 | 2Q26 | 이준호(다라증권) | 980 | 2026-06-28 |
| 310200 | 2Q26 | 정하은(사내) | 98 | 2026-07-01 |
아래 JSON Schema 에 맞는 애널리스트 추정치 행을 더 만들어 주세요. {"type":"object","properties":{"corp_code":{"type":"string"},"fiscal_period":{"type":"string","description":"nQYY 꼴입니다."},"analyst":{"type":"string","description":"이름(소속) 꼴입니다."},"op_income_est":{"type":"number","description":"십억원 단위 추정 영업이익입니다. 적자 추정이면 음수입니다."},"updated_at":{"type":"string","description":"추정을 낸 날 YYYY-MM-DD 입니다."}},"required":["corp_code","fiscal_period","analyst","op_income_est","updated_at"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 같은 analyst·corp_code·fiscal_period 에 updated_at 이 다른 고친 추정 두 줄, (2) 공시일보다 90일 넘게 앞선 추정만 있는 종목, (3) 공시일에서 정확히 90일 전 추정, (4) 음수 적자 추정, (5) 공시일 뒤에 실적을 보고 고친 추정. op_income_est 는 반드시 십억원 단위로 쓰고, 생성한 행은 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"corp_code":{"type":"string"},"fiscal_period":{"type":"string","description":"nQYY 꼴입니다."},"analyst":{"type":"string","description":"이름(소속) 꼴입니다."},"op_income_est":{"type":"number","description":"십억원 단위 추정 영업이익입니다. 적자 추정이면 음수입니다."},"updated_at":{"type":"string","description":"추정을 낸 날 YYYY-MM-DD 입니다."}},"required":["corp_code","fiscal_period","analyst","op_income_est","updated_at"]}펀드별 보유 종목과 비중 표입니다. 한 종목을 두 펀드가 함께 들고 있는 경우와, 커버리지 애널리스트가 없어 추정치가 한 줄도 없는 보유 종목을 일부러 담았습니다.
| fund_id | corp_code | weight |
|---|---|---|
| FUND-A01 | 310100 | 7.2 |
| FUND-A01 | 310200 | 4.1 |
| FUND-A01 | 310300 | 3.5 |
| FUND-A01 | 310600 | 2.9 |
| FUND-A01 | 310900 | 1.5 |
아래 JSON Schema 에 맞는 펀드 보유 행을 더 만들어 주세요. {"type":"object","properties":{"fund_id":{"type":"string"},"corp_code":{"type":"string"},"weight":{"type":"number","minimum":0,"maximum":100,"description":"펀드 순자산 대비 비중(%)입니다."}},"required":["fund_id","corp_code","weight"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 두 펀드가 함께 보유한 종목, (2) analyst_estimates 에 한 줄도 없는 보유 종목, (3) 비중이 0.5% 아래인 소액 보유. 한 펀드 안 비중 합은 100 을 넘기지 말고, 생성한 행은 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"fund_id":{"type":"string"},"corp_code":{"type":"string"},"weight":{"type":"number","minimum":0,"maximum":100,"description":"펀드 순자산 대비 비중(%)입니다."}},"required":["fund_id","corp_code","weight"]}| Python | 단위 환산, 기간 표기 맞추기, 애널리스트별 최신 추정 고르기, 평균과 서프라이즈 비율 계산, 판정 차례를 담은 규칙 엔진의 언어입니다. |
| 데이터 수집 파이프라인 | 3주차에 OpenDART 공시 목록 API 에서 잠정실적 공시만 골라 밤사이 모으고, 보유 종목 공시만 판정 엔진에 넘깁니다. |
| LLM 기반 워크플로우 | 판정이 정해진 뒤 비중과 커버리지 애널리스트를 담은 아침 회의 메모 한 줄을 씁니다. |
| 리서치 및 운용 자동화 툴 | 펀드매니저와 애널리스트가 판정별 종목 묶음을 펼쳐 공시값과 추정치를 보는 관리자 페이지입니다. |
| DevOps | 판정 규칙이 바뀔 때마다 정답 세트 대조를 자동으로 돌린 뒤에만 사내 서버 이미지를 갱신합니다. |
| On-Premise 개발 인프라 | 3주차에 수집기와 판정 엔진을 Docker 이미지로 묶어 사내 서버에서 매일 아침 예약 실행합니다. |
| SQLite | 공시·추정치·보유 종목과 판정 결과를 담는 저장소입니다. 종목코드와 기간으로 조회합니다. |
✗ fail → 맞추지 못한 공시가 1할을 넘으면 기간·단위 규칙을 먼저 넓히고, 그때까지 그 공시는 판정 없이 따로 세웁니다.
✓ pass → 지난 네 분기 공시 200건 정답 대조와 아침 회의 메모로 2주차를 엽니다.
✗ fail → 어긋난 공시만 모아 10% 문턱과 90일 기준, 애널리스트별 최신 추정을 고르는 규칙을 다시 잡습니다.
✓ pass → 3주차 OpenDART 수집과 사내 서버 예약 실행으로 넘어갑니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · corp_code + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
추정치를 크게 밑돎크게 밑돎추정치를 크게 웃돎크게 웃돎추정치가 오래됨추정 낡음추정치 없는 보유 종목추정 없음추정치 범위 안범위 안보유 종목 공시 하나가 단위 환산과 기간 맞추기, 애널리스트별 최신 추정 평균을 거쳐 어떤 서프라이즈 판정을 받는지 남기는 형식입니다. 판정은 규칙이 정하고 아침 회의 메모만 모델이 씁니다.
{"type":"object","properties":{"corp_code":{"type":"string"},"corp_name":{"type":"string"},"fiscal_period":{"type":"string","description":"YYYY.nQ 꼴로 맞춘 기간입니다."},"op_income_eok":{"type":"number","description":"공시 op_income 을 억원으로 바꾼 값입니다. 백만원이면 100 으로 나눕니다."},"analyst_count":{"type":"integer","minimum":0,"description":"같은 corp_code·기간에서 analyst 별로 updated_at 이 가장 늦은 줄만 남긴 추정 수입니다."},"consensus_eok":{"type":["number","null"],"description":"남긴 추정의 op_income_est 평균에 10 을 곱해 억원으로 바꾸고 소수 첫째 자리로 반올림한 값입니다. 추정이 없으면 비웁니다."},"surprise_pct":{"type":["number","null"],"description":"op_income_eok 에서 consensus_eok 를 빼고 consensus_eok 의 절댓값으로 나눈 뒤 100 을 곱해 소수 첫째 자리로 반올림한 값입니다."},"latest_est_updated_at":{"type":["string","null"]},"est_age_days":{"type":["integer","null"],"description":"disclosed_at 에서 latest_est_updated_at 을 뺀 날수입니다."},"held_weight_total":{"type":"number","minimum":0,"description":"그 종목을 보유한 모든 펀드의 weight 합입니다."},"verdict":{"type":"string","enum":["추정치 범위 안","추정치를 크게 웃돎","추정치를 크게 밑돎","추정치가 오래됨","추정치 없는 보유 종목"]},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{}},"required":["field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["corp_code","corp_name","fiscal_period","op_income_eok","analyst_count","held_weight_total","verdict","evidence","summary"]}[
{
"corp_code": "310100",
"corp_name": "한빛반도체",
"fiscal_period": "2026.2Q",
"op_income_eok": 8100,
"analyst_count": 3,
"consensus_eok": 9633.3,
"surprise_pct": -15.9,
"latest_est_updated_at": "2026-07-15",
"est_age_days": 9,
"held_weight_total": 7.2,
"verdict": "추정치를 크게 밑돎",
"evidence": [
{
"field": "op_income",
"value": 8100
},
{
"field": "op_income_est",
"value": 960
},
{
"field": "op_income_est",
"value": 950
},
{
"field": "op_income_est",
"value": 980
},
{
"field": "analyst",
"agg": "count",
"value": 3
},
{
"field": "weight",
"value": 7.2
}
],
"summary": "한빛반도체 2분기 영업이익 8,100억원이 추정 평균 9,633억원보다 15.9% 낮고 FUND-A01 비중이 7.2% 라 김도윤 님께 하반기 추정부터 확인합니다.",
"hedge": "김도윤 애널리스트가 5월에 낸 1,020 십억원 추정은 7월에 고친 960 으로 대신해 평균에서 뺐습니다."
},
{
"corp_code": "310500",
"corp_name": "새봄바이오",
"fiscal_period": "2026.2Q",
"op_income_eok": -180,
"analyst_count": 2,
"consensus_eok": -120,
"surprise_pct": -50,
"latest_est_updated_at": "2026-08-02",
"est_age_days": 11,
"held_weight_total": 1.2,
"verdict": "추정치를 크게 밑돎",
"evidence": [
{
"field": "op_income",
"value": -180
},
{
"field": "op_income_est",
"value": -12
},
{
"field": "analyst",
"agg": "count",
"value": 2
},
{
"field": "weight",
"value": 1.2
}
],
"summary": "새봄바이오는 적자 추정 120억원보다 손실이 180억원으로 커져 50.0% 밑돌았고 비중은 1.2% 입니다.",
"hedge": "추정 평균이 음수라 절댓값으로 나눠 손실이 커진 쪽을 밑돎으로 읽었습니다."
},
{
"corp_code": "310200",
"corp_name": "세진전자부품",
"fiscal_period": "2026.2Q",
"op_income_eok": 1150,
"analyst_count": 2,
"consensus_eok": 1000,
"surprise_pct": 15,
"latest_est_updated_at": "2026-07-20",
"est_age_days": 8,
"held_weight_total": 4.1,
"verdict": "추정치를 크게 웃돎",
"evidence": [
{
"field": "op_income",
"value": 1150
},
{
"field": "op_income_est",
"value": 98
},
{
"field": "op_income_est",
"value": 102
},
{
"field": "weight",
"value": 4.1
}
],
"summary": "세진전자부품 2분기 영업이익 1,150억원이 추정 평균 1,000억원보다 15.0% 높고 비중은 4.1% 라 정하은 님께 이익 지속 여부를 묻습니다.",
"hedge": "정하은 애널리스트가 공시 다음 날 고친 115 십억원 추정은 실적을 보고 낸 값이라 평균에서 뺐습니다."
},
{
"corp_code": "310400",
"corp_name": "대한케미칼",
"fiscal_period": "2026.2Q",
"op_income_eok": 3120,
"analyst_count": 2,
"consensus_eok": 2850,
"surprise_pct": 9.5,
"latest_est_updated_at": "2026-07-24",
"est_age_days": 6,
"held_weight_total": 5.8,
"verdict": "추정치 범위 안",
"evidence": [
{
"field": "op_income",
"value": 312000
},
{
"field": "unit",
"value": "백만원"
},
{
"field": "op_income_est",
"value": 280
},
{
"field": "op_income_est",
"value": 290
}
],
"summary": "대한케미칼은 백만원으로 공시한 312,000 을 3,120억원으로 바꿔 추정 평균 2,850억원과 견줬고 9.5% 높아 범위 안입니다.",
"hedge": "10% 문턱에 가까워 비중 5.8% 인 FUND-B02 회의에서 한 번 더 봅니다."
},
{
"corp_code": "310600",
"corp_name": "동해조선",
"fiscal_period": "2026.2Q",
"op_income_eok": 2200,
"analyst_count": 2,
"consensus_eok": 2000,
"surprise_pct": 10,
"latest_est_updated_at": "2026-07-19",
"est_age_days": 6,
"held_weight_total": 2.9,
"verdict": "추정치 범위 안",
"evidence": [
{
"field": "op_income",
"value": 2200
},
{
"field": "op_income_est",
"value": 200
},
{
"field": "analyst",
"agg": "count",
"value": 2
}
],
"summary": "동해조선은 추정 평균 2,000억원보다 정확히 10.0% 높아 넘게 벗어난 것이 아니라 범위 안에 둡니다.",
"hedge": null
},
{
"corp_code": "311000",
"corp_name": "미래모빌리티",
"fiscal_period": "2026.2Q",
"op_income_eok": 1780,
"analyst_count": 2,
"consensus_eok": 1725,
"surprise_pct": 3.2,
"latest_est_updated_at": "2026-04-30",
"est_age_days": 90,
"held_weight_total": 2.4,
"verdict": "추정치 범위 안",
"evidence": [
{
"field": "updated_at",
"value": "2026-04-30"
},
{
"field": "disclosed_at",
"value": "2026-07-29"
},
{
"field": "op_income",
"value": 1780
},
{
"field": "op_income_est",
"value": 175
},
{
"field": "op_income_est",
"value": 170
}
],
"summary": "미래모빌리티는 가장 최근 추정이 정확히 90일 전이라 아직 기준으로 쓰고, 추정 평균 1,725억원보다 3.2% 높아 범위 안입니다.",
"hedge": "하루만 늦게 공시됐어도 추정치가 오래됨으로 갔을 종목이라 김도윤 님께 추정 갱신을 요청합니다."
},
{
"corp_code": "310900",
"corp_name": "태평양물산",
"fiscal_period": "2026.2Q",
"op_income_eok": 410,
"analyst_count": 1,
"consensus_eok": 450,
"surprise_pct": -8.9,
"latest_est_updated_at": "2026-03-20",
"est_age_days": 146,
"held_weight_total": 1.5,
"verdict": "추정치가 오래됨",
"evidence": [
{
"field": "updated_at",
"value": "2026-03-20"
},
{
"field": "disclosed_at",
"value": "2026-08-13"
},
{
"field": "op_income",
"value": 410
},
{
"field": "op_income_est",
"value": 45
}
],
"summary": "태평양물산은 가장 최근 추정이 146일 전이라 서프라이즈 크기를 판정하지 않았습니다.",
"hedge": "낡은 추정과 견주면 8.9% 밑돈 것으로 나오지만 그 사이 업황이 바뀌었을 수 있어 정하은 님의 추정 갱신 뒤 다시 봅니다."
},
{
"corp_code": "310700",
"corp_name": "누리게임즈",
"fiscal_period": "2026.2Q",
"op_income_eok": 85,
"analyst_count": 0,
"consensus_eok": null,
"surprise_pct": null,
"latest_est_updated_at": null,
"est_age_days": null,
"held_weight_total": 1.1,
"verdict": "추정치 없는 보유 종목",
"evidence": [
{
"field": "corp_code",
"value": "310700"
},
{
"field": "op_income",
"value": 85
},
{
"field": "analyst",
"agg": "count",
"value": 0
},
{
"field": "weight",
"value": 1.1
}
],
"summary": "누리게임즈는 FUND-B02 가 1.1% 들고 있지만 2분기 추정을 낸 애널리스트가 없어 영업이익 85억원을 견줄 기준이 없습니다.",
"hedge": "커버리지 애널리스트를 새로 정할지 펀드매니저가 정합니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 다섯 값 중 하나인지 확인합니다. 규칙이 정한 값이라 모델이 새 값을 지어내면 그 응답을 버립니다. 2. corp_code·corp_name·fiscal_period·op_income_eok·analyst_count·held_weight_total·verdict·evidence·summary 필드가 빠짐없이 존재하는지 확인합니다. 3. analyst_count 가 0 이상이고 held_weight_total 이 0 에서 100 사이인지 확인합니다. 4. op_income_eok 를 다시 계산합니다. unit 이 억원이면 op_income 그대로, 백만원이면 100 으로 나눈 값입니다. 5. fiscal_period 를 다시 맞춥니다. 「nQYY」는 「20YY.nQ」로 바꿔 공시와 같은 꼴로 읽습니다. 6. consensus_eok 를 다시 계산합니다. 같은 corp_code·기간에서 updated_at 이 disclosed_at 보다 늦은 줄을 먼저 버리고, 남은 줄에서 analyst 마다 updated_at 이 가장 늦은 줄만 골라 op_income_est 평균에 10 을 곱합니다. 공시일 뒤에 낸 추정은 실적을 보고 고친 값이라 기준에 넣지 않습니다. latest_est_updated_at 과 analyst_count 도 버리고 남은 줄로 셉니다. 7. surprise_pct 가 op_income_eok 와 consensus_eok 로 다시 계산한 값과 같은지 확인합니다. 8. est_age_days 가 disclosed_at 에서 latest_est_updated_at 을 뺀 날수와 같은지 다시 계산합니다. 9. held_weight_total 이 holdings 에서 같은 corp_code 의 weight 합과 같은지 다시 계산합니다. holdings 에 없는 종목의 공시는 출력하지 않습니다. 10. 추정치 없는 보유 종목은 같은 기간 analyst_estimates 에 그 corp_code 줄이 하나도 없는지 다시 셉니다. 11. 추정치가 오래됨은 est_age_days 가 90 을 넘는지 다시 계산합니다. 90 과 같으면 그대로 기준으로 씁니다. 12. 추정치를 크게 웃돎은 surprise_pct 가 10 을 넘는지, 추정치를 크게 밑돎은 -10 보다 작은지, 추정치 범위 안은 -10 이상 10 이하인지 다시 계산합니다. 문턱 비교는 반올림하기 전 값으로 합니다. 10.04% 는 화면에 10.0 으로 보여도 크게 웃돎입니다. 13. evidence 의 field 이름이 earnings_disclosures·analyst_estimates·holdings 에 있는 컬럼인지 대조합니다. 없는 이름을 인용하면 메모를 버리고 기본 문장으로 되돌립니다. 14. evidence 의 value 가 수록된 행의 원문 값과 같은지 확인합니다. 여러 줄을 세거나 더한 값은 agg 를 적습니다. 15. summary 가 존댓말로 끝나는지 확인합니다. [판정 차례 · 위 규칙이 둘 이상 동시에 걸릴 때] 공시 한 건에는 판정을 하나만 남깁니다. ① 추정치 없는 보유 종목 → ② 추정치가 오래됨 → ③ 추정치를 크게 웃돎 또는 크게 밑돎 → ④ 추정치 범위 안. 추정이 90일을 넘긴 종목은 괴리가 커도 크기 판정을 하지 않습니다. 석 달 넘게 안 고친 추정으로 서프라이즈를 읽지 않기 위해서입니다. [하드 케이스 · 판정이 갈리는 이유] 온누리플랫폼(310300)은 FUND-A01 3.5% 와 FUND-B02 2.0% 를 더해 held_weight_total 이 5.5 이고, 추정 3개 평균 1,280억원 대비 3.1% 높아 범위 안으로 갑니다. 은하소재(310800)는 추정 대비 크게 웃돌지만 어느 펀드도 보유하지 않아 출력하지 않습니다. 세진전자부품(310200)은 정하은 애널리스트가 공시 다음 날인 7월 29일 추정을 115 로 올렸는데, 이 줄을 넣으면 평균이 1,085억원이 되어 6.0% 로 범위 안에 들어갑니다. 공시일 뒤 줄을 버리면 7월 1일 추정 98 이 남아 15.0% 로 크게 웃돎입니다. [평가 러너 · 2주차] 지난 네 분기 보유 종목 공시 200건에 손으로 매긴 정답 판정과 자동 판정을 대조해 판정별 일치율을 내고, 어긋난 공시는 따로 모아 10% 문턱과 90일 기준, 애널리스트별 최신 추정 고르기를 다시 봅니다. [수동 검증 · 사람이 봅니다] 1. 크게 밑돎으로 간 공시 20건을 열어 일회성 비용 때문인지 커버리지 애널리스트가 판단합니다. 2. 추정치 없는 보유 종목을 모아 누가 커버리지를 맡을지 펀드매니저가 정합니다.
근거: 화수분AI는 2025년 설립되어, 리서치/운용 자동화 시스템을 개발중인 스타트업입니다.