피보퀀트(PIVOQUANT): 주식 분석 사이트 개발, 수급부터 콘텐츠 자동화까지
피보퀀트 주식 분석 사이트 개발 사례입니다. 국내 주가·수급, Open DART와 SEC Form 13F 공시를 연결하고 계산 작업 큐와 OpenAI API 콘텐츠 자동화를 구성한 과정을 소개합니다.
핵심 요약
1. 기관·외국인·연기금의 거래 동향과 보유 공시를 한곳에서 비교하는 주식 분석 사이트를 개발했습니다. 2. 가격·거래량·공시 데이터를 연결하고 계산 작업 큐와 매매 신호, OpenAI API 기반 콘텐츠 자동화를 구성했습니다. 3. 개발 초기에 실제 데이터를 연결해 부하 테스트를 진행하고, 방문자가 몰리는 상황까지 고려한 운영 구조를 마련했습니다.
프로젝트 소개
주가가 올랐다는 사실만으로는 시장에서 어떤 움직임이 있었는지 알기 어렵습니다. 기관과 외국인의 거래 동향, 연기금의 보유 종목, 차트에서 발생한 신호를 함께 살펴보려면 서로 다른 화면과 자료를 오가야 합니다. 피보퀀트(PIVOQUANT)는 이 정보를 한곳에서 비교하도록 만든 트램스의 내부 서비스입니다.
주식 분석 사이트 개발의 목표는 데이터를 많이 쌓는 데 있지 않았습니다. 종목을 선택하면 누가 얼마나 거래했는지 살펴보고, 추정 매수가와 현재 가격의 관계를 비교하며, 관심 있는 신호가 발생한 종목을 찾을 수 있어야 했습니다. 반복 계산이 많은 기능을 여러 방문자가 사용해도 운영이 유지되는 구조가 필요했습니다.
현재 공개 화면에는 큰손 평단가, 오늘의 신호, 신호 성적표, 한·미 시장 상관계수와 국민연금 보유종목이 연결돼 있습니다. 사용자는 종목별 수급을 확인한 뒤 신호와 과거 흐름을 이어서 살펴볼 수 있습니다. 이 글에서는 이러한 기능을 뒷받침한 데이터 연결, 계산 작업 관리, 콘텐츠 자동화의 세 부분을 설명합니다.
추정 매수가는 공개 데이터를 자체 계산식으로 해석한 값입니다. 기관의 실제 계좌에서 확인한 취득원가나 확정 수익이 아닙니다. 공시 자료와 일별 거래 자료의 성격을 구분해 보여주는 일도 금융 데이터 서비스를 만드는 과정에 포함됩니다.
주식 데이터 통합: KRX·Open DART·SEC Form 13F 연결
첫 번째 과제는 국내 주가와 거래량, 투자자별 거래 동향, 보유 공시를 같은 종목 기준으로 연결하는 일이었습니다. 가격을 나타내는 캔들 데이터와 특정 시점의 보유 현황은 만들어지는 주기가 다르기 때문에, 단순히 하나의 표에 합치면 비교 기준이 흐려질 수 있습니다.
KRX의 공식 서비스에는 유가증권 일별매매정보와 코스닥 일별매매정보가 있습니다. 이처럼 일별 가격·거래량을 다루는 자료와 투자자별 거래실적은 구분해서 연결해야 합니다. KRX Open API 하나로 모든 수급·거래원 자료를 받을 수 있다고 가정하지 않고, 필요한 항목의 제공 범위와 이용 조건을 먼저 확인하는 방식입니다.
국민연금 보유종목을 연결하는 과정에서는 국내와 미국의 공시 체계도 나뉩니다. 피보퀀트의 국내 보유분 연결에는 Open DART의 대량보유 상황보고 자료가 사용됩니다. 기업의 고유번호와 보고 주체, 접수 시점을 확인해 같은 종목의 공시를 연결해야 이름이 비슷한 기업이나 서로 다른 보고서를 섞지 않을 수 있습니다.
미국 보유분은 SEC Form 13F의 정보표를 사용합니다. SEC EDGAR의 제출 이력에서 해당 보고서를 찾고, 보고서의 보유 종목과 수량을 연결하는 방식입니다. Form 13F는 기관투자자의 분기말 보유 보고서이며 일반적으로 분기 종료 후 45일 안에 제출됩니다. 따라서 실시간 매매 흐름을 보여주는 거래 데이터와 분기말 보유 현황을 보여주는 공시는 서로 다른 기준으로 다뤄야 합니다.
이 데이터를 제품 화면으로 바꾸는 데에는 종목 식별자와 기준일이 중요합니다. 공시의 기준 시점, 실제 접수일, 가격의 기준일을 구분하면 사용자는 보유 정보가 언제의 상태인지 이해할 수 있습니다. 값이 없거나 연결되지 않은 종목을 0으로 채우는 대신, 확인 가능한 범위를 표시하는 것도 필요한 설계입니다.
피보퀀트는 수급과 가격을 연결해 기관·외국인·연기금의 추정 매수가를 비교하도록 구성했습니다. 여기서 투자자 분류의 ‘연기금’ 전체와 개별 기관인 국민연금을 같은 주체로 취급하지 않는 것이 중요합니다. 공시로 확인한 보유 정보와 거래 통계로 추정한 변화는 서로 다른 근거를 가진 값입니다.

수급·매매 신호 분석: 계산 작업 큐와 초기 부하 테스트
두 번째 과제는 연산량이 많은 분석 기능을 방문자의 화면 요청과 어떻게 연결할지였습니다. 같은 종목이라도 기간과 투자자 구분이 달라지면 계산 범위가 달라집니다. 신호 분석까지 더해지면 모든 요청이 도착한 순간에 계산을 끝내는 방식만으로는 부하를 관리하기 어렵습니다.
이 프로젝트에는 계산 작업을 순서대로 처리하는 대기 큐가 사용됐습니다. 큐는 처리해야 할 일을 잠시 모아두고, 실행 가능한 작업부터 꺼내 처리하는 구조입니다. 화면 요청이 한꺼번에 들어오는 상황과 서버가 실제로 계산할 수 있는 속도 사이를 조절하는 역할을 합니다.
이 구조를 구현할 때는 종목, 기준일, 분석 기간, 신호 조건을 하나의 작업 단위로 정리할 수 있습니다. 같은 조건의 요청을 식별하면 이미 계산한 결과를 재사용하는 설계로 확장할 수 있고, 실패한 작업만 다시 처리하는 기준도 세울 수 있습니다. 큐를 도입했다는 사실보다 무엇을 같은 작업으로 볼지가 운영 효율에 더 큰 영향을 줍니다.
사용자 화면에서는 대기 중인 요청과 계산이 끝난 결과를 구분해야 합니다. 특히 이전 기준일의 결과가 남아 있는 경우 최신 분석처럼 보이지 않게 하는 것이 중요합니다. 계산을 비동기로 옮겼더라도 화면에 표시하는 기준일과 완료 여부를 연결하지 않으면 사용자는 오래된 수치를 새 결과로 오해할 수 있습니다.
피보퀀트는 스마트머니컨셉을 포함한 매매 신호를 연결하고, 공개 화면에서 MACD·RSI·볼린저밴드 등의 신호를 확인할 수 있게 구성돼 있습니다. 신호 성적표는 과거 같은 조건이 발생한 뒤의 가격 흐름을 살펴보는 기능입니다. 이를 앞으로의 수익을 약속하는 지표로 바꾸기보다 조건과 관찰 기간이 있는 분석 결과로 다루는 것이 맞습니다.
개발 과정에서는 데이터를 초기에 연결한 상태에서 스트레스 테스트를 수행했습니다. 화면만 완성한 뒤 마지막에 부하를 확인하는 대신, 계산이 많이 발생하는 조건을 개발 중에 확인한 점이 짧은 일정 안에서 운영 구조를 정리하는 데 도움이 됐습니다.

블로그·SNS 콘텐츠 자동화: OpenAI API로 분석 결과 설명하기
세 번째 기능은 매일 신호가 발생한 종목을 블로그와 SNS 콘텐츠로 연결하는 자동화입니다. 분석 결과를 사용자가 읽을 수 있는 글로 다시 설명하려면 종목명과 기준일, 발생한 신호, 그 신호가 의미하는 조건을 정리해야 합니다. 같은 정보를 매일 사람이 옮겨 적는 작업을 줄이는 것이 목적이었습니다.
피보퀀트는 OpenAI API를 이용한 콘텐츠 생성과 자동 게시 기능을 구성했습니다. 이때 AI가 시장 데이터를 대신 계산하는 것이 아니라, 서비스에서 계산한 결과를 입력받아 설명 문장으로 바꾸는 역할을 맡습니다. 데이터 분석과 문장 생성의 책임을 나누면 잘못된 수치가 들어갔을 때 확인할 지점도 분명해집니다.
이 기능을 구현하는 방법은 먼저 종목·날짜·신호·참고 수치를 정해진 형식으로 묶는 것입니다. 다음으로 OpenAI API에 전달할 설명 범위와 글의 형식을 지정하고, 생성한 문장이 입력 데이터와 일치하는지 확인합니다. 제목과 본문에 같은 기준일이 들어가는지, 신호 이름과 방향이 바뀌지 않았는지가 검토 대상입니다.
게시 연동은 글 생성과 별도로 다뤄야 합니다. 생성이 끝났다는 사실과 실제 채널에 글이 올라갔다는 사실은 다르기 때문입니다. 종목·기준일·채널을 기준으로 발행 대상을 구분하고 결과 주소를 남기면, 연결 오류가 생겼을 때 동일한 글이 중복 게시되는 문제를 줄이는 구조를 만들 수 있습니다.
이러한 자동화의 가치는 글의 양을 늘리는 데만 있지 않습니다. 서비스의 계산 결과와 설명 콘텐츠가 같은 데이터를 바라보게 만드는 데 있습니다. 새 데이터가 들어오는 단계부터 분석, 문장 생성, 게시까지 연결하면 운영자가 반복 입력에 쓰던 시간을 결과 확인과 기능 개선에 사용할 수 있습니다.

성공 요소
가장 큰 제약은 빠른 개발 일정과 많은 계산량이 동시에 존재했다는 점입니다. 피보퀀트는 데이터 연결을 뒤로 미루지 않고 초기에 진행했으며, 실제 데이터가 들어온 상태에서 부하를 확인했습니다. 덕분에 어떤 요청이 연산을 많이 사용하는지 파악하면서 계산 작업의 처리 구조를 조정할 수 있었습니다.
두 번째 요소는 데이터마다 다른 시간 기준을 제품의 구조에 반영한 것입니다. 일별 가격, 투자자별 거래실적, 보유 공시는 같은 시점의 정보가 아닙니다. 기준일과 추정 여부를 함께 다루면 기능을 추가하더라도 데이터의 의미가 흔들리지 않습니다. 주식 데이터 서비스를 확장할 때 필요한 것은 새로운 지표뿐 아니라 이런 공통 기준입니다.
세 번째는 분석과 콘텐츠 제작을 연결한 운영 방식입니다. 계산한 결과를 다시 사람이 옮겨 적지 않고 OpenAI API와 게시 기능으로 이어가도록 구성했습니다. 데이터 수집, 연산, 설명, 발행을 각각의 역할로 나눈 것이 기능 추가와 운영 문제를 구분하는 데 도움이 됐습니다.
이 사례는 주가를 예측하는 모델 하나를 만드는 작업보다 넓은 범위를 다룹니다. 공개 데이터를 연결하고, 조건에 따라 계산하고, 결과를 화면과 콘텐츠로 전달하는 전체 흐름을 제품으로 만든 사례입니다.
개발 기간 · 비용 · 투입 인력
피보퀀트의 개발 기간은 2개월, 투입 인원은 2명, 개발비는 2,500만 원입니다. 데이터 연결과 분석 기능, 계산 작업 큐, 콘텐츠 자동화 등 이 프로젝트의 구축 범위를 기준으로 한 금액입니다.
다른 주식 분석 서비스를 제작할 때는 확보한 데이터와 연결할 기능, 운영 규모에 따라 필요한 범위가 달라집니다. 이 비용을 모든 금융 서비스에 적용되는 고정 견적으로 보지는 않습니다.
참고 자료
- https://pivoquant.com/
- https://opendart.fss.or.kr/intro/main.do
- https://openapi.krx.co.kr/contents/OPP/INFO/service/OPPINFO004.cmd
- https://www.sec.gov/search-filings/edgar-application-programming-interfaces
- https://www.investor.gov/introduction-investing/investing-basics/glossary/form-13f-reports-filed-institutional-investment
개발 문의
주식 분석 사이트나 금융 데이터 서비스를 준비하고 있다면, 연결하려는 데이터와 필요한 분석·자동화 기능을 알려주세요. 트램스가 구현 범위와 개발 일정부터 함께 검토하겠습니다.