자체 호스팅 A주 퀀트 워크벤치란
자체 호스팅 A주 퀀트 워크벤치의 구성과 한계를 설명합니다. 데이터 공급업체, 로컬 저장소, 백테스팅, 실행 환경에서 먼저 확인할 네 가지를 정리합니다.
자체 호스팅 A주 퀀트 워크벤치는 브로커 터미널이 아니라 사용자가 직접 관리하는 장비에서 시장을 스크리닝하고, 관심 종목을 모니터링하며, 백테스트를 실행하고, 장 마감 후 리뷰를 작성하는 웹페이지다. MIT 라이선스를 적용한 프로젝트인 tickflow-stock-panel은 이 기능을 단일 포트에서 제공하며, 2026년 8월 기준 GitHub 스타 약 2,800개를 확보했다. 기능 목록은 쉽게 읽힌다. 그러나 그 아래의 계층이 다음 분기에도 이 모든 기능이 작동할지를 결정한다.
자체 호스팅 A주 퀀트 워크벤치는 무엇으로 구성되는가
구조는 한눈에 파악할 수 있을 만큼 간단하다. 2026년 8월 커밋의 코드와 문서를 기준으로 보면 다음과 같다.
- React와 TypeScript로 구축한 웹 페이지
- 타이머에 따라 데이터를 갱신하는 스케줄러가 포함된 Python 서비스인 FastAPI
- 디스크에 저장된 Parquet 파일을 DuckDB로 조회하고 Polars로 계산하는 로컬 저장소
- 해당 파일을 대상으로 실행하는 백테스팅 엔진 vectorbt
- 패널에 표시되는 모든 가격을 가져오는 공급업체 SDK
빠져 있는 요소에 주목할 필요가 있다. 이 스택의 어떤 구성요소도 거래소에 연결되지 않는다. 패널은 계산을 수행하고, 공급업체는 데이터를 제공한다. ‘자체 호스팅’은 코드가 실행되는 위치를 설명할 뿐이며, 수치의 출처를 의미하지 않는다. 원천 시세 데이터를 보유하는 역할은 그 아래 계층인 로컬 A주 시장 데이터 레이크가 담당한다. 이 계층이 있어야 상위의 모든 구성요소를 교체할 수 있다.
데이터 소스의 무료 요금제가 제공하는 범위
패널이 볼 수 있는 데이터는 하나의 환경 변수로 결정된다. 공급업체 키를 비워 두면 프로젝트는 문서에서 말하는 None 모드로 실행된다. 이 모드에서는 무료 엔드포인트를 통해 과거 일별 바를 제공하며, 현재 세션 데이터는 장 마감 후 한두 시간 뒤에 도착한다. 키를 입력하면 유료 요금제에 따라 접근 권한이 열린다. 이는 장 마감 기준 작업에는 활용할 수 있는 무료 요금제다. 반면 장중 데이터에는 명확한 제약이 있다. 공급업체는 다음 갱신 시점에도 이 조건을 그대로 제시할 수 있다.
관리자는 이 구조를 명확히 설명한다.
이 프로젝트는 학습과 퀀트 연구만을 위한 것이며, 어떠한 투자 조언도 구성하지 않는다. 백테스트 결과는 미래 수익을 의미하지 않는다.
이 프로젝트는 개인이 공개한 오픈소스 프로젝트다. TickFlow 데이터 소스를 기반으로 하지만 TickFlow의 공식 프로젝트는 아니다.
README, shy3130/tickflow-stock-panel, 2026년 8월 13일 열람
즉, 이 프로젝트는 학습과 퀀트 연구를 위한 것이며 ‘투자 조언을 구성하지 않는다’. 백테스트 결과도 미래 수익을 의미하지 않는다. 또한 ‘공식 TickFlow 제품이 아닌 개인 오픈소스 프로젝트’다. 이 유형의 프로젝트에서 얻을 수 있는 핵심 교훈은 분명하다. Zero-ops는 운영 업무를 사용자의 담당 영역에서 덜어준다. 그러나 의존성 자체는 그대로 남는다. 사용자는 이 패널을 지원하기로 약속한 적이 없는 회사로부터 데이터를 임차하고 있다. README 역시 사용 목적을 학습과 연구로 제한한다. 다만 라이선스 파일은 MIT 라이선스다.
버전 번호 대신 커밋 SHA를 고정해야 하는 이유
커밋 SHA는 저장된 각 변경 사항에 대해 git이 부여하는 40자리 식별값이다. 코드의 특정 상태 하나를 영구적으로 지정한다.
2026년 8월 13일에 확인했을 때 해당 저장소의 GitHub Releases 페이지에는 아무것도 없었다. 버전 태그는 v0.1.31부터 v0.1.88까지 31개 있었지만, 번호가 중간중간 빠져 있었고 첨부된 릴리스 노트도 없었다. 최신 태그가 가리키는 커밋의 날짜는 2026년 7월 31일이었다. 반면 기본 브랜치는 2026년 8월 6일자 작업까지 진행된 상태였다. 브랜치보다 뒤처져 있고 관련 노트도 없는 태그만으로는 실제로 어떤 코드를 받게 되는지 알 수 없다.
따라서 SHA를 기록해야 한다. 2026년 8월 6일 기준 기본 브랜치의 최신 커밋은 ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33였다. 해당 커밋을 체크아웃하고, 백테스트에서 도출한 결론 옆에 그 값을 함께 기록해야 한다. 6주가 지난 뒤 “최신 버전을 실행했다”고 말하는 것은 아무런 정보를 제공하지 않는다.
문서에 제시된 시작 절차는 두 줄이다. 예시 환경 파일을 .env로 복사한 다음, docker compose up --build을 실행한다. 그러면 3018번 포트에서 패널이 실행된다. 이는 해당 커밋의 관리자가 안내한 절차일 뿐, 테스트를 거친 실행 경로는 아니다. 빌드 과정에서 이미지를 내려받아야 하며, 이 페이지에서는 네트워크 접근을 실행해 확인하지 않았다. 개발 환경에서 실행하려면 ./dev.sh을 사용한다. Windows에서는 .\dev.ps1을 사용한다. 또한 Python 3.11 이상, Node 20 이상, 그리고 uv 및 pnpm 패키지 관리자가 필요하다.
LLM 전략 기능이 전송하는 데이터와 전송 위치
전략 생성, 개별 종목 논평, 검토 문서는 선택 사항이다. AI_API_KEY을 비워 두면 전체 기능이 비활성화된 상태로 유지된다. 값을 입력하면 AI_PROVIDER(OpenAI 호환 엔드포인트 또는 Ollama), AI_BASE_URL, AI_MODEL, AI_DAILY_TOKEN_BUDGET도 설정된다. AI_DAILY_TOKEN_BUDGET는 당일 토큰 한도를 소진하면 호출을 중단한다.
데이터가 향하는 방향이 중요하다. 사용자의 프롬프트와 패널이 여기에 첨부하는 모든 맥락은 설정한 엔드포인트로 전송된다. 기본 URL을 호스팅 API로 지정하면 요청은 해당 회사로 전송된다. 자체 네트워크의 런타임을 지정하면 데이터는 외부로 나가지 않는다. 패널을 자체 호스팅한다고 해서 모델까지 자체 호스팅되는 것은 아니다. API 키는 프로젝트 루트의 평문 .env에 저장되며, 설정 페이지에서도 수정할 수 있다. 설정 페이지는 최소 여섯 자리의 대시보드 비밀번호로 보호된다. LLM이 생성한 알파 팩터에 관한 당사 문서에서는 기계가 작성한 전략이 주로 어떤 지점에서 실패하는지 다룬다.
백테스터는 거래 비용을 반영하는가?
백테스터는 T+1 처리, 수수료, 슬리피지, 손절매를 지원한다고 안내한다. 그러나 해당 옵션이 존재한다는 사실과 실제로 설정되어 있다는 사실은 다르다. 체결가를 표시된 종가로 적용하고 비용을 0으로 설정한 백테스트는 거래가 무료라는 가정이다. 실제로는 그렇지 않다. 1bp는 1%의 100분의 1이다. 아래 패널은 2026년 6월 17일 한낮의 1시간 동안 미국 상장 종목 6개의 최우선 매수호가와 최우선 매도호가 사이 평균 간격을 bp로 측정한 결과다.
모든 수치 뒤에 숨겨진 정확한 SQL
SELECT
ticker AS symbol,
round(avg(toFloat64(ask_price) - toFloat64(bid_price))
/ avg((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, 2) AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'KO', 'F')
AND sip_timestamp >= toDateTime('2026-06-17 15:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-17 16:00:00', 'UTC')
AND bid_price > 0
AND ask_price > bid_price
GROUP BY ticker
ORDER BY spread_bps패널에서 호가 간격이 가장 좁은 종목인 SPY은 해당 시간 동안 평균 0.29bp의 스프레드를 기록했다. 가장 넓은 종목인 F의 스프레드는 6.98bp였다. 진입할 때 한 번, 청산할 때 한 번 이 간격을 부담하면 수수료를 제외한 왕복 거래 비용은 표시된 수치의 약 두 배가 된다.
체결 시점도 종목을 지정하는 것만큼 비용에 영향을 준다. 다음 패널은 이 종목 중 하나를 대상으로, 하루 중 1분 동안 가격이 이동한 폭을 측정한 뒤 같은 날의 30분 단위 구간별 평균으로 집계한 결과다.
모든 수치 뒤에 숨겨진 정확한 SQL
SELECT
formatDateTime(
toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE),
'%H:%i') AS et_time,
round(avg((toFloat64(high) - toFloat64(low)) / toFloat64(close)) * 10000, 1) AS range_bps
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'KO'
AND window_start >= toDateTime('2026-06-17 12:00:00', 'UTC')
AND window_start < toDateTime('2026-06-17 21:00:00', 'UTC')
AND volume > 0
AND close > 0
GROUP BY et_time
ORDER BY et_time패널은 정규장 개장 전인 08:00에 시작한다. 이때 1분 봉의 평균 가격 이동 폭은 0bp였다. 실제로 거래가 발생한 분도 하나의 가격에 머물렀다. 마지막 구간인 16:30은 장 마감 후이며 평균 4.2bp를 기록했다. 백테스트는 각 가격 범위에서 하나의 지점을 선택해 체결가로 간주한다. 양 끝값보다 곡선의 흐름을 봐야 한다. 같은 가정이 어떤 시간대에는 유리하고 다른 시간대에는 불리하게 작용한다. A주 규정은 추가적인 제약을 만든다. T+1 규정에 따라 당일 매수한 주식은 다음 거래 세션까지 매도할 수 없고, 일일 가격 제한으로 인해 모델상 청산 자체가 불가능해질 수도 있다. 재현 가능한 백테스트에 대한 당사의 안내에서는 방어 가능한 설정에 어떤 항목을 기록해야 하는지 설명한다. 또한 룩어헤드 편향에서는 겉보기에는 깔끔한 수익 곡선이 잘못되는 또 다른 경로를 다룬다.
조정 여부와 무조정 여부: 데이터 출처의 문제
기업행동은 스크리너가 조용히 투자자를 오도하는 지점이다. 주식이 ten-for-one으로 분할되면, 누구도 단 한 푼을 잃지 않았는데 해당 거래일 수익률에는 90% 하락으로 표시된다. 아래 표는 2026년 1월 1일부터 8월 13일까지 미국 상장 종목에서 실시된 포워드 분할 중 규모가 가장 큰 열두 건을 보여준다.
모든 수치 뒤에 숨겨진 정확한 SQL
SELECT
ticker AS symbol,
formatDateTime(execution_date, '%b %e, %Y') AS effective_on,
round(any(toFloat64(split_to)) / any(toFloat64(split_from)), 2) AS shares_after_per_share
FROM global_markets.stocks_splits
WHERE execution_date >= toDate('2026-01-01')
AND execution_date <= toDate('2026-08-13')
AND split_from > 0
AND split_to > split_from
AND ticker NOT IN ('SPCX')
GROUP BY ticker, execution_date
ORDER BY shares_after_per_share DESC, execution_date DESC
LIMIT 12가장 큰 분할은 한 주를 10000주로 늘리며, Feb 10, 2026부터 적용된다. 이 정도 규모의 비율은 일반적인 four-for-one 분할이 아니다. 기업행동 데이터 피드에서는 전체 범위를 하나의 열에 담는다. 열두 건 중 가장 작은 분할도 한 주를 20주로 바꾼다. 따라서 무조정 차트에서는 폭락처럼 보일 수 있다. 원시 가격을 읽는 모멘텀 스크리너는 이들 종목을 모두 급락으로 표시한다. 중국 데이터 피드에서도 같은 문제가 자체 용어로 나타난다. 각 시계열을 무조정, 포워드 조정, 백워드 조정의 세 가지 형태로 제공한다. 패널에 어떤 형태의 데이터가 로드됐는지 확인해야 한다. 분할 조정 주가 이력에서 계산 방식을 설명한다.
이와 같은 서비스를 직접 호스팅하기 전에 확인할 사항
- 데이터 출처. 어떤 공급업체의 데이터를 사용하는지, 어떤 라이선스가 적용되는지, 무료 요금제가 사용 목적을 충족하는지 확인해야 한다.
- 키 관리. API 키가 디스크의 어디에 저장되는지, 누가 설정 페이지에 접근할 수 있는지, 해당 시스템이 자체 네트워크 외부에 노출되어 있는지 확인해야 한다.
- 비용 모델링. 백테스터가 수수료, 슬리피지, 시장 자체의 규칙을 반영하는지 확인해야 한다. 해당 항목을 별도로 설정하지 않을 때 어떤 값이 적용되는지도 점검해야 한다.
- 업데이트 경로. 배포한 정확한 커밋을 결과와 함께 기록해야 한다. 몇 달 뒤에도 동일한 환경을 재현할 수 있어야 한다.
자주 묻는 질문
자체 호스팅 A주 퀀트 워크벤치는 무료로 실행할 수 있습니까?
코드는 MIT 라이선스로 제공되며 무료입니다. 데이터는 별개의 문제입니다. 공급업체 키를 비워 두면 이 프로젝트는 무료 과거 일별 바를 사용하며, 현재 세션 데이터는 장 마감 후 한두 시간 뒤에 제공됩니다. 더 빠르거나 상세한 데이터는 공급업체의 유료 요금제를 이용해야 합니다.
여기서 자체 호스팅은 실제로 무엇을 의미합니까?
웹페이지, 스케줄러, 저장 파일, 백테스터가 모두 다른 플랫폼의 계정 없이 사용자의 컴퓨터나 서버에서 실행된다는 뜻입니다. 데이터의 소유권까지 사용자에게 있다는 의미는 아닙니다. 선택 사항인 AI 기능도 사용자가 자체 네트워크의 모델을 연결하지 않는 한 원격으로 작동합니다.
LLM 기능이 내 데이터를 제3자에게 전송합니까?
기능을 켜면 그렇습니다. 사용자가 설정한 OpenAI 호환 엔드포인트로 전송됩니다. 이 기능은 기본적으로 비활성화되어 있습니다. AI 키를 비워 두면 어떤 데이터도 기기 밖으로 나가지 않습니다.
버전 태그 대신 커밋 SHA를 고정하는 이유는 무엇입니까?
2026년 8월 13일 기준으로 이 저장소에는 공개 릴리스와 릴리스 노트가 없었습니다. 가장 최신 태그도 기본 브랜치보다 오래된 코드를 가리키고 있었습니다. 이 경우 “최신”은 저장소를 복제한 날 해당 브랜치에 있던 코드가 됩니다. 반면 커밋 SHA는 정확한 코드를 지정합니다. 이러한 원칙은 오픈 소스 퀀트 트레이딩 자료 전반에도 적용됩니다. 실제로 실행한 버전을 고정해야 합니다.
검증 참고 사항
위에 제시한 모든 아키텍처 및 설정 세부 사항은 2026년 8월 13일 공개 저장소에서 확인했습니다. 대상 커밋은 ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33이며, 2026년 8월 6일에 생성된 기본 브랜치의 최신 커밋입니다. Releases 페이지에는 항목이 없었습니다. 태그 목록에는 v0.1.31부터 v0.1.88까지 31개의 버전 태그가 있었고, 가장 최신 태그는 2026년 7월 31일자 커밋을 가리키고 있었습니다. 인용문은 요약한 내용이 아니라 관리자가 README에 직접 작성한 문구를 그대로 옮긴 것입니다. 컨테이너 시작 명령도 해당 README에서 인용했으며, 여기서 직접 실행하지는 않았습니다.
시장 패널은 미국 상장 종목을 대상으로 하며, 수치가 변하지 않도록 과거의 특정 날짜를 고정해 두었습니다. 중국 시장을 설명하기 위한 것이 아닙니다. 어느 시장에서든 적용되는 두 가지 점검 항목인 거래 비용과 기업행위 조정을 보여주기 위한 것입니다.
이 페이지의 모든 패널에는 결과를 산출한 SQL이 함께 제공되며, 아래에서 펼쳐 확인할 수 있습니다. 스크리너에 연결하기 전에 자체 종목 목록을 대상으로 동일한 스프레드 점검을 실행하려면 Strasmore 터미널에서 자연어로 요청하면 됩니다.