关于 Bamsai
Bamsai 根据 Hyperliquid 永续合约提供韩国股票的全天候韩元价格,并展示历史开盘方向吻合率和扣除成本后的套利价差。它通过网页应用、API 和 MCP 端点服务投资者及 AI 交易机器人运营者。
主要功能
- 01韩国股票 24/7 韩元价格
- 02历史开盘方向吻合率
- 03扣除交易成本后的套利价差
- 04查询新闻与价格收敛历史
- 05预览配对订单但不提交
适用场景
- 01在韩国市场开盘前查看海外价格
- 02向交易机器人提供价格和历史数据
- 03评估扣除费用等成本后的跨市场价差
- 04预览配对订单而不下单
MCP 相关
提供 Streamable HTTP 和本地 stdio MCP 端点。工具可查询开盘预测、套利价差、价格收敛历史和新闻,并预览配对订单但不会提交订单。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://bamsai.kr/api/mcpclaude mcp add --transport http eddyparkgg-bamsai https://bamsai.kr/api/mcp{"mcpServers":{"eddyparkgg-bamsai":{"type":"http","url":"https://bamsai.kr/api/mcp"}}}在 Cursor 中打开{"servers":{"eddyparkgg-bamsai":{"type":"http","url":"https://bamsai.kr/api/mcp"}}}在 VS Code 中打开{"mcpServers":{"eddyparkgg-bamsai":{"type":"http","url":"https://bamsai.kr/api/mcp"}}}{"mcpServers":{"eddyparkgg-bamsai":{"serverUrl":"https://bamsai.kr/api/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
夜间
即使在国内市场收盘后的夜间和周末,也通过 Hyperliquid 韩国股票永续合约的价格,告知用户: ① 夜间海外价格,以及过去国内市场开盘时跟随该方向的比例,② 两个市场之间是否存在价差交易机会。开盘价由用户自行判断
- Web 应用:https://bamsai.kr
- API 文档:bamsai.kr/api/openapi.json · MCP:
https://bamsai.kr/api/mcp· 页面指南:bamsai.kr/developers - 1~2 页摘要 PRD:docs/prd-summary.md
English — Bamsai prices Korean blue chips (Samsung Electronics, SK hynix, Hyundai Motor) 24/7 from their Hyperliquid perps (trade.xyz), converted to KRW at the Upbit KRW/USDC rate. While the Korean market is closed it shows the overseas price, how often past Korean opens followed it at the same stage of the US session, and the gap between the two markets net of fees, tax, FX, funding, slippage and order lag. MCP endpoint
https://bamsai.kr/api/mcp(Streamable HTTP, no key) ornpm run mcp:stdiolocally. Tools:predict_open,get_arbitrage,get_convergence_history,get_news,preview_pair_order(preview only, never sends orders). REST: OpenAPI, 300 requests/min per IP. MIT licensed. The rest of this README is in Korean.
核心摘要
| 项目 | 内容 | 详情 |
|---|---|---|
| 要解决的问题 | 个人投资者无法得知国内市场收盘期间(即使包含 NEXTRADE,也占每周 168 小时中的 65%)发生的事件会如何反映在次日开盘价上。这段时间的价格由 Hyperliquid 韩国股票永续合约决定,但以美元计价,难以直接换算成韩元进行比较 | 第 1 章 |
| 目标客户 | 初期:使用 LLM 运营韩国股票自动交易机器人的个人投资者(包括同时交易 Hyperliquid 韩国股票永续合约的人)。机器人通过 API·MCP 获取夜间价格、命中率和扣除成本后的价差,在开盘前(06~08 时)以及价差扩大的时刻进行判断 → 扩展:三星电子、SK 海力士等韩国股票的普通投资者。决策时刻是早上 8 点 NEXTRADE 开盘时,立即交易还是等待(夜间波动超过 1% 时,08~09 时韩国价格跟随 Hyperliquid 价格变动的情况占 72~75%) | 第 2 章 |
| 核心假设 | H1:如果在国内市场(常规交易时段·NEXTRADE)均收盘的 20:00~08:00 期间,Hyperliquid 上的交易量足够大(超过 100 万美元),那么次日 08:00 国内市场会朝同一方向开盘(80% 以上)→ 三星电子 88.2%·SK 海力士 85.4% 通过,现代汽车暂缓判断。同一时期,国内市场上涨开盘的日期只有 52~53%,所以如果每天都判断“会上涨”,命中率只有一半左右(跟随 Hyperliquid 则为 85~88%)。不过,EWY·KOSPI 200 永续合约的方向预测准确率也相近,为 83~87%,因此价值在于按个股以韩元展示收盘期间的价格,而非“仅针对个股的方向预测能力” / H5(初期目标客户):向机器人运营者开放 API·MCP 后,他们会每周重复调用 / H2(扩展目标客户):展示夜间海外价格及“跟随该方向开盘的比例”后,用户会在开盘前再次访问 | 第 3 章 |
| 验证指标 | North Star:每周调用夜间 API·MCP 的外部调用者数量(初期目标客户)。11/6 登记至官方 MCP Registry·Glama,并向 2 个 awesome MCP 列表提交收录 PR。扩展目标客户:美国市场收盘后、国内市场开盘前(06:00~08:00)查看夜间价格的周用户数。首轮实验持续 2 周(11/5~11/19,共 10 个国内交易日),在 3 个 DC 股票论坛按不同时间和形式持续发帖,并查看各帖浏览量·评论数以及 GA 引流·开盘前回访情况。开盘前回访率达到 15% 以上即通过 | 第 4 章 |
| 原型 | https://bamsai.kr · 核心功能(可集成至证券应用的范围):首页股票卡片(国内价格 vs 全球价格、跟随该方向开盘的比例)、过去的开盘记录、介绍(计算方法)/ 扩展方向:个股详情(图表 | 订单簿 | 下单三步、价差交易机会)、API·MCP。使用 Toss Securities·Hyperliquid·Upbit 实时数据 | 第 5 章 |
| 产品方向 | ① 使用 AI 发现问题并亲自构建;② 通过 API·MCP 开放产品,让客户的 AI Agent 能直接使用相同的数据。金融数据由真实行情和统计计算,而非 LLM 生成 | AI 使用过程 |
| AI 使用情况 | 使用 Claude Code 进行调研·数据验证·模型回测·实现·浏览器 QA·线上故障分析。产品中的数据由统计计算生成,而非 LLM。开放 API·MCP,方便初期目标客户(使用 LLM 运营自动交易机器人的人)直接接入,让 AI 工具为其打造个性化投资工具 | AI 使用过程 |
PRD
概述
即使在国内市场收盘的 65% 时间里(包含 NEXTRADE),三星电子·SK 海力士·现代汽车的价格仍会在海外 24 小时市场波动。 将这些价格换算成韩元展示,并同时提供过去国内市场跟随该方向开盘的比例和通常的开盘范围。通过 API·MCP 开放相同数据,让使用 LLM 运营自动交易机器人的个人投资者(初期目标客户)的机器人可直接用于判断。对于在两个市场都配置资金的用户,则计算扣除成本后的价差交易机会,并可进一步连接至下单界面(计划推出)。
1. 해결하려는 문제
| # | 누가 | 문제 | 지금은 어떻게 하나 |
|---|---|---|---|
| P1 | 삼성전자·하이닉스 보유 개인 | "내일 아침 오를까, 내릴까?"에 답할 근거가 없음. 미국장 끝난 뒤, 주말·연휴 동안 생긴 뉴스가 다음 날 장 시작 가격에 얼마나 반영될지 모름 | 미국 지수, ADR, 커뮤니티 분위기로 짐작 |
| P2 | 주식·코인 같이 하는 트레이더 | 두 시장 차이를 보려면 창 3개(하이퍼리퀴드, HTS, 업비트 환율)를 띄우고 직접 계산. 수수료·세금·환전·펀딩비를 빼면 실제로 남는지 알 수 없음 | 엑셀, 감으로 판단 |
| P3 | 자동매매·AI 에이전트 사용자 | 두 시장 시세·가격 차이·예측을 한 번에 조회하는 API가 없음 | 거래소별 API 따로 붙여서 직접 구현 |
문제를 보게 된 계기 — 투자자들이 이미 하고 있던 행동
토스증권 커뮤니티, 디시 국내·해외 주식 갤러리 같은 주식 커뮤니티에서 개장 전과 주말마다 하이퍼리퀴드 가격 이야기가 계속 올라왔음. 디시에서 '하이퍼리퀴드 삼전'으로만 찾아도 2026년 2~10월 국내 주식·미국 주식·나스닥·차트 갤러리 등에 15건 넘게 나옴(글마다 조회 50~400회)
| 실제 글 (디시, 2026) | 보이는 불편 |
|---|---|
| "하이퍼리퀴드 현재가격 삼전27.9 하닉184" (5/17 일 19시), "하이퍼리퀴드 삼전 24.4 하닉 170 / 월요일 서킷 확정" (7/19 일 새벽) | 주말·새벽에 달러 가격을 직접 원화로 바꿔 공유함 |
| "어제 새벽에 삼전 390000원이라길래 말이 되나 싶었는데 아니다 다를까 음전 ㅋㅋ 괜히 날 잠못자게 만들었어" (6/4) | 언제 본 가격이 맞는지 모름 → 이후 '언제 본 가격이냐' 분석의 출발점 |
| "삼성 갭락이라고 생각하면 … 하이퍼리퀴드에 삼전선물 숏치세요" (8/22), "주식사고 하이퍼리퀴드에서 공매도쳐서 헷징" (9/15) | 두 시장을 함께 쓰는 사람이 이미 있음 → 가격 차이 거래·API 고객 |
| "하닉 삼전 가끔 오류로 -30퍼 찍을 때 있잖아, 하이퍼리퀴드에도 반영되냐" (8/6) | 오류 가격과 진짜 움직임을 구분하지 못함 → 오라클 위험 |
→ 사람들은 이미 이 가격을 보고 있지만 직접 환산하고, 언제 본 가격이 맞는지 모르고, 오류 가격과 구분하지 못함. 밤사이는 이 세 가지를 풀려고 시작함
문제의 크기 (2026-11-05 직접 조회)
- 국내 시장은 넥스트레이드(08:00–08:50, 15:30–20:00)를 포함해도 하루 11시간 50분, 주 약 59시간(168시간의 35%). 정규장만 보면 주 32.5시간(19%)
- 하이퍼리퀴드
xyz:SKHX(SK하이닉스) 24시간 거래대금 약 5.4억 달러,xyz:SMSN(삼성전자) 약 0.9억 달러 - 하이퍼리퀴드 상장(2026-02-20 한국 시간 새벽) 이후 국내 시장 개장 174번 중 39번이 주말·연휴 뒤 개장
2. 타겟 고객
| 구분 | 고객 | 이 고객을 고른 이유 | 주로 쓰는 것 |
|---|---|---|---|
| 초기 타겟 | LLM으로 국내 주식 자동매매 봇을 운영하는 개인 투자자. 어떤 LLM·에이전트를 쓰든 API·MCP로 숫자를 받아 봇이 판단. 하이퍼리퀴드에서 한국 주식 perp를 함께 거래하는 사람 포함 | 이미 자동주문·전략·분석 도구를 직접 만들어 쓰고 있어 설명 비용이 낮음. 하이퍼리퀴드 달러 가격, 원/USDC 환율, 국내 시세(정규장·넥스트레이드)를 직접 모아 맞추고 적중률 검증·비용 계산까지 해야 하는 불편이 가장 큼. 쓰는지 안 쓰는지가 호출 수로 바로 보여 검증이 빠름 | API · MCP, 웹 화면(봇이 쓰는 숫자를 눈으로 확인) |
| 확장 타겟 | 삼성전자·SK하이닉스 등 국내 주식을 거래하는 일반 투자자 | 개인 보유자가 많은 대표 종목이고 perp 거래대금도 가장 큼. 아침 8시 국내 시장이 열리기 전에 판단할 일이 매일 있음. 초기 타겟이 숫자를 꾸준히 쓰면 그 근거로 증권 앱 화면으로 넓힘 | 홈 · 종목 상세 |
초기 타겟의 결정의 순간 — 봇이 무엇을 보고 언제 움직이나
- 국내 주식 봇: 미국장이 닫힌 뒤(06~08시) 개장 전 포지션과 장전 주문 가격을 정할 때 (
predict_open) - 두 시장을 함께 거래하는 봇: 가격 차이가 평소보다 벌어졌을 때 (
get_arbitrage, 비용 뺀 금액) - 하이퍼리퀴드 perp 봇: 국내 장중에 국내 가격·투자자 동향이 바뀔 때 (원화 환산 가격, 지난 개장 기록)
확장 타겟의 결정의 순간 — 아침 8시 넥스트레이드가 열릴 때 바로 사고팔지, 기다릴지
- 보유자는 갭이 생기기 전(밤)에 팔 수 없음. 할 수 있는 결정은 '08시에 바로 거래할지, 가격이 자리 잡을 때까지 기다릴지'와 '장전 주문을 얼마에 걸지'
- 하이퍼리퀴드가 밤새 1% 넘게 움직인 날, 08~09시에 국내 가격이 하이퍼리퀴드 가격 쪽으로 가서 만난 경우가 삼성전자 72%·SK하이닉스 75%, 반대(하이퍼리퀴드가 국내 쪽으로)는 11%·10% (2026-04~11, 105·108번). 개장 직후 국내 가격이 하이퍼리퀴드 원화 가격과 크게 벌어져 있으면 그쪽으로 좁혀질 가능성이 큼
- 예: 11/6 삼성전자는 하이퍼리퀴드 07시 −9.5%, 08:00~08:10 평균 −11.9%로 과하게 시작한 뒤 10:28 −7.4%로 되돌아옴
일반 투자자 화면과 perp의 경계: 홈 카드·지난 개장 기록·소개는 국내 주식 판단까지만. 해외 perp는 국내 투자자 보호 대상이 아니라서(금융위·금감원 2026-10-16 유의사항 발표) perp 경험·web3 지갑이 없는 사람에게 권하지 않음. 가격 차이 거래와 perp 주문은 이미 하이퍼리퀴드를 쓰는 사용자용 별도 트랙이고, 증권 앱 버전에서는 국내 주문만 연결
주문 화면과 출시 알림 신청: 해외 가격과의 차이를 보다가 그 자리에서 주문까지 하고 싶은 사용자가 있는지 확인하려고, 종목 상세에 주문 화면(차트 | 호가 | 주문)과 출시 알림 신청(이메일)까지 만듦. 대상이 넓어지는 방향이라 핵심 범위와 나눈 별도 트랙으로 두고, 실제 주문은 보내지 않음. 주문 버튼 클릭과 알림 신청 수로 수요를 잼(H4)
3. 가설
가장 위험한 가정부터 순서대로 검증. 번호는 처음 정한 그대로 둠(GA 이벤트·실험 기록과 맞추려고).
| # | 가설 | 위험도 | 이 가설이 틀리면 |
|---|---|---|---|
| H1 신호 | 국내 시장이 모두 닫힌 동안(20:00~08:00) 하이퍼리퀴드에서 충분히 거래됐다면, 그 가격이 움직인 방향대로 다음 날 08:00 국내 시장도 80% 이상 같은 방향으로 시작한다 | 가장 높음 | 서비스 존재 이유가 없음 |
| H5 에이전트 (초기 타겟) | LLM 자동매매 봇 운영자에게 밤사이 숫자를 API·MCP로 열면 봇이 매주 반복해서 호출한다 | 높음 | 초기 타겟 가정이 틀림. 웹 화면 중심(확장 타겟)으로 순서를 바꿈 |
| H2 가치 (확장 타겟) | 보유 종목의 밤사이 해외 가격과 "그 방향대로 열린 비율"을 보여주면 장 시작 전에 다시 찾아온다 | 높음 | 신기한 숫자로 끝나고 습관이 안 됨 |
| H3 신뢰 | 지난 개장 기록을 같이 보여줘야 숫자를 믿고 행동한다 | 중간 | 숫자만 보고 떠나거나, 반대로 맹신 |
| H4 전환 (확장 트랙) | 수수료·세금까지 뺀 가격 차이 거래(시세차익) 기회를 보여주면 조회가 주문 버튼 클릭으로 이어진다 (주문은 출시 전이라 클릭 시 출시 알림 신청) | 중간 | 종목 상세가 구경용에 그침 |
H1은 출시 전 과거 데이터로 먼저 검증
왜 이 기준인가
- 개인 투자자는 정규장(09:00–15:30)뿐 아니라 넥스트레이드(08:00–08:50, 15:30–20:00)에서도 거래함 → '국내 시장'은 둘을 합친 08:00–20:00
- 국내가 정말 닫힌 시간은 20:00 → 다음 거래일 08:00(평일 12시간, 주말·연휴는 더 김). 이때 움직이는 건 하이퍼리퀴드뿐
- 그래서 기준 = 20:00 국내 마지막 가격, 맞힐 대상 = 08:00 국내 시장이 다시 열렸을 때 개인이 거래할 수 있는 가격
- 08:00 첫 체결 한 건은 거래가 적어 들쭉날쭉함 → 08:00~08:10 거래량 가중 평균을 씀 (아래 비교표에서 5분·10분 평균이 가장 안정적)
채점 방법
- 하이퍼리퀴드 움직임 = 08:00 직전(07:00~07:59 1시간 봉 종가, 그 시각 환율로 원화 환산) 하이퍼리퀴드 가격 ÷ 전날 20:00 국내 가격 − 1. 08:00 넥스트레이드 첫 체결이 오라클로 들어가 perp가 튀는 경우(2026-07-28)를 피하려고 08:00 직전 가격을 씀
- 국내 움직임 = 08:00~08:10 평균 가격 ÷ 전날 20:00 국내 가격 − 1
- 둘의 방향(+/−)이 같으면 '따라감'. 둘 중 하나라도 ±0.05% 안쪽이면 '거의 그대로'로 따로 표시하고 비율에서 뺌
- 조건: 그날 밤(20:00~08:00) 하이퍼리퀴드 거래대금 100만 달러 이상. 거래가 적으면 몇 건의 주문으로도 가격이 흔들려 '시장의 판단'으로 보기 어려움 (아래 근거)
| 종목 | 방향대로 (거래 충분한 밤) | 전체 밤 | 80% 구간 실제 포함 | 예상 가격 오차 | 비교: 어제 20:00 가격 그대로 |
|---|---|---|---|---|---|
| 삼성전자 (2026-11-05 기준, 매일 다시 계산) | 88.2% (119번 중 105번) | 85.8% (134번 중 115번) | 83.2% | 1.22%p | 2.40%p |
| SK하이닉스 | 85.4% (130번 중 111번) | 85.4% (137번 중 117번) | 89.1% | 1.10%p | 2.84%p |
| 현대차 | 판단 보류 (7번 중 5번) | 66.7% (135번 중 90번) | 88.2% | 1.26%p | 1.53%p |
거래대금 조건의 근거 (같은 기간, 세 종목 합산)
| 밤사이 하이퍼리퀴드 거래대금 | 해당 밤 | 방향대로 열림 |
|---|---|---|
| 100만 달러 미만 | 150 | 67.3% |
| 100만 달러 이상 | 256 | 86.3% |
| (참고) 50만 / 200만 달러 이상 | 290 / 232 | 84.8% / 87.1% |
- 한 종목 안에서도 거래가 많은 밤이 더 잘 맞음: 삼성전자 78.8% → 92.6%, SK하이닉스 81.2% → 89.7% (각자 중간값 아래/위)
- 현대차는 밤사이 거래대금 중간값이 23만 달러(삼성전자 1,760만, SK하이닉스 9,700만)라 거의 모든 밤이 기준 미만
- 기준선은 백테스트에서 거래대금 구간별로 적중률을 비교해 정함 (100만 달러 미만 67.3% vs 이상 86.3%로 차이가 가장 뚜렷한 지점)
- 같은 데이터로 기준을 고르고 같은 데이터로 채점하면 성적이 실제보다 좋게 보일 수 있음 → 기준을 0~500만 달러로 바꿔도 결과가 거의 같은지 확인함 (아래 표). 숫자 하나에 기대는 결과가 아님. 앞으로 쌓이는 밤으로 계속 다시 확인
| 밤사이 거래대금 기준 | 0 (조건 없음) | 25만 달러 | 50만 달러 | 100만 달러 | 200만 달러 | 500만 달러 |
|---|---|---|---|---|---|---|
| 삼성전자 | 85.9% (135) | 85.6% (132) | 86.2% (130) | 88.3% (120) | 88.9% (108) | 89.3% (103) |
| SK하이닉스 | 85.5% (138) | 85.5% (138) | 86.0% (136) | 85.5% (131) | 86.3% (124) | 86.3% (117) |
(2026-11-06 기준, 괄호는 채점한 밤 수. 하이퍼리퀴드 방향대로 열린 비율)
- 화면: 그날 밤 거래가 기준 미만으로 보이면(지금까지 밤 거래와 최근 20일 밤 거래의 중간값 중 큰 쪽) 예측 옆에 '거래 적어 덜 정확' 표시
어느 시점 가격으로 채점할지 비교 (조건 없이 전체 밤, 하이퍼리퀴드 방향대로 열린 비율)
| 종목 | 08:00 첫 체결 | 08:00~08:05 평균 | 08:00~08:10 평균 | 08:00~08:30 평균 | 정규장 09:00 |
|---|---|---|---|---|---|
| 삼성전자 | 80.5% | 85.3% | 85.8% | 84.6% | 83.5% |
| SK하이닉스 | 85.9% | 85.4% | 85.4% | 84.2% | 84.1% |
| 현대차 | 70.1% | 66.9% | 66.7% | 69.9% | 73.3% |
- 기간: 2026-04-13 ~ 2026-11-05, 종목별 139번. 80% 구간·오차는 앞 20번을 학습에만 쓰고 나머지 119번으로 채점. 하이퍼리퀴드 상장은 2026-02-20(한국 시간 새벽 5시, SK하이닉스 기준)이지만, API가 1시간봉을 최근 5,000개(약 7개월)만 보관해서 08:00 가격이 있는 4월 13일부터 채점 가능. 시간이 지나면 표본이 계속 늘어남
- 이전 기준(정규장 15:30 종가 → 09:00 시가)에서는 91.2 / 90.8 / 85.5%였음. 15:30~20:00 넥스트레이드에서 이미 보이는 움직임까지 '예측'으로 쳤기 때문에 높게 나온 것 → 서비스 전제와 맞지 않아 기준을 바꿈
- 표본은 2026년 4~11월 한 시기라, 다른 장세(긴 횡보·강세장)에서도 같은지는 쌓이는 밤으로 계속 확인해야 함
다른 신호와 비교 (같은 기간·같은 채점, 조건 없이 전체 밤, 2026-11-06 계산)
| 신호 | 삼성전자 | SK하이닉스 |
|---|---|---|
| 국내가 오르며 열린 비율 (항상 '오른다'로 찍기) | 53.3% | 52.2% |
| 종목 perp (하이퍼리퀴드 삼성전자·SK하이닉스) | 85.9% | 85.5% |
| EWY perp (하이퍼리퀴드 MSCI 한국 ETF) | 87.2% | 85.3% |
| 코스피200 perp (하이퍼리퀴드) | 84.3% | 83.1% |
- 매일 '오른다'고 찍기만 해도 맞는 비율은 52~53%(같은 기간 국내 시장이 오르며 시작한 날의 비율). 하이퍼리퀴드를 따른 85~88%와의 차이가 신호의 값
- 방향만 보면 종목 perp가 한국 지수 perp보다 낫지 않음 → 이 서비스의 가치는 '종목 perp만의 방향 예측력'이 아니라 국내가 닫힌 시간에 정해지는 가격을 종목별 원화 가격으로 보여주는 것
- 아직 못 한 비교: 코스피200 야간선물(무료 분봉 데이터 없음), 시작 가격 '크기' 오차를 신호별로 비교
- 결론: 삼성전자·SK하이닉스 통과, 현대차 판단 보류. 현대차는 하이퍼리퀴드 거래가 너무 적어 기준을 넘는 밤이 거의 없음 → 예측에 '거래 적어 덜 정확' 표시
- 화면에서도 같은 숫자를 매일 다시 계산해 공개 (H3 검증 장치)
언제 본 가격이냐: 미국장 전·중·후
밤사이 하이퍼리퀴드는 미국장(겨울 23:30~06:00, 여름 22:30~05:00 한국 시간)이 열려 있는 동안 가장 크게 움직임. 저녁 9시에 본 가격과 새벽 6시에 본 가격은 믿을 수 있는 정도가 완전히 다름.
밤의 시각별로 '그때 하이퍼리퀴드 가격을 그대로 봤다면' 다음 날 국내 시장이 그 방향으로 열렸는지 (2026-04-13~11-06 평일 밤, 종목별 108번)
| 시각 | 삼성전자 | SK하이닉스 | 1% 넘게 움직인 날만 | 평균 오차 |
|---|---|---|---|---|
| 21시 | 49.1% | 48.6% | 46% | 2.5~3.0%p |
| 23시 | 66.0% | 62.6% | 63~68% | 2.3~2.6%p |
| 01시 | 71.7% | 72.9% | 76~79% | 1.9~2.1%p |
| 03시 | 83.0% | 79.4% | 86~89% | 1.7~1.8%p |
| 06시 (미국장 마감 뒤) | 85.8% | 86.9% | 91~95% | 1.3%p |
| 07시 | 88.7% | 89.7% | 94~95% | 1.3~1.4%p |
- 상장(2/20)부터 4시간봉으로 본 133번도 같은 모양: 21시 49~53%, 01시 70~74%, 05시 83~86%
- 화면은 지금이 미국장 전·중·후 중 어디인지에 따라, 같은 단계에서 봤던 지난 개장일의 적중률을 보여줌 (개장일마다 한 번씩 셈. 주말 60시간이 평일 12시간보다 많이 세어지지 않게)
| 평일 밤 | 미국장 열리기 전 | 열려 있는 동안 | 닫힌 뒤 |
|---|---|---|---|
| 삼성전자 | 54.7% | 75.0% | 87.4% |
| SK하이닉스 | 52.5% | 73.9% | 88.0% |
| (주말·연휴 닫힌 뒤) | 삼성전자 68.5%, SK하이닉스 75.6% |
- 그래서 화면은 '오를 확률'처럼 앞으로를 약속하는 숫자 대신 "미국장 마감 때 하이퍼리퀴드 가격 / 지금 가격 / 과거 이 시간대엔 n%가 이 방향대로 열렸어요" 를 보여줌. 틀릴 수 있는 숫자를 확률로 포장하지 않기 위해서
- 발견 경위: 커뮤니티 첫 글(11/5 21시)에 '내일 시초가 +0.3%'를 썼는데, 새벽 미국장에서 하이퍼리퀴드가 −9.5%까지 내려가 실제 시작은 −11.9%. 저녁 숫자를 내일 가격처럼 보여준 게 문제였음
보통 시작 범위 계산법
화면의 '보통 이 안에서 시작(80% 구간)'과 지난 개장 기록 채점은 아래 순서로 계산함. API에는 예상 가격·probUp도 남아 있지만 화면에서는 쓰지 않음 (확률이 약속처럼 읽혀서). 사용자용 설명은 소개 페이지('밤사이는 이렇게 계산해요')에 있음. 모델은 일부러 단순하게 둠 (표본이 종목별 140번 남짓이라 복잡하면 과적합되고, 초보도 이해할 수 있어야 해서)
- 밤사이 차이
g= 지금 하이퍼리퀴드 가격(원화) ÷ 어제 20:00 국내 가격 − 1 - 예상 움직임
μ= α + β × g- β = 과거 개장에서 국내가 하이퍼리퀴드 움직임을 평균 몇 배 따라갔는지. 1(그대로 따라감) 쪽으로 당겨서 급락일 몇 번에 흔들리지 않게 함
- α = 하이퍼리퀴드와 상관없이 생기는 평균 차이 (거의 0)
- 불확실성
σ= √(과거 예측이 빗나간 폭² + β² × 하이퍼리퀴드 시간당 변동성² × 장 열리기까지 남은 시간)- 빗나간 폭은 평일 밤 / 주말·연휴를 따로 계산 (주말이 더 큼)
- 남은 시간이 길수록 하이퍼리퀴드가 더 움직일 수 있으니 범위를 넓힘
- 결과
- 예상 가격 = 어제 20:00 가격 × (1 + μ)
probUp(API 전용, 화면에는 안 씀) = 정규분포에서 0보다 클 확률 Φ(μ / σ)- 예상 범위(80% 구간) = μ ± 1.28σ. 10번 중 8번은 이 안에서 시작하도록 잡은 범위
- 검증: 그날 이전 데이터로만 2~4를 계산해 그날 결과와 비교 (walk-forward). 미래 정보가 섞이지 않음
예시: SK하이닉스, 2026-11-04 아침 (실제 채점과 같은 방식: 11월 3일까지 137번 개장으로 맞춘 계수 α −0.22%, β 0.875, 평일 밤 σ 1.36%)
| 단계 | 값 |
|---|---|
| 어제(11/3) 20:00 국내 가격 | 1,414,000원 |
| 11/4 08:00 직전(07:59) 하이퍼리퀴드 가격 (원화) | 1,461,621원 → g = +3.37% |
예상 움직임 μ = −0.22% + 0.875 × 3.37% | +2.73% → 예상 가격 약 1,452,600원 |
불확실성 σ (08:00이라 남은 시간 0) | 1.36% |
probUp Φ(2.73 / 1.36) (API 전용) | 약 98% (97.8%) |
| 예상 범위 2.73% ± 1.74% | +0.99% ~ +4.47% → 약 1,428,000원 ~ 1,477,200원 |
| 실제 08:00~08:10 평균 | 1,451,776원 (+2.67%) → 방향 맞음, 예상 범위 안 |
- 지금(11/5) 기준 계수는 α −0.24%, β 0.88, σ 1.37%로 매일 조금씩 바뀜. 예시는 그날 아침 실제로 썼을 계수로 계산함 (서버 채점 값 +2.7289%와 일치)
4. 검증 지표
North Star: 밤사이 API·MCP를 호출한 주간 외부 호출자 수 (초기 타겟) → 선정 이유: 초기 타겟의 봇이 밤사이 숫자를 실제 판단에 쓰고 있다는 가장 직접적인 신호. 한 번 붙여 보고 마는지, 매주 다시 부르는지가 핵심
- 정의: 실제로 데이터를 가져간 호출(REST
/v1조회, MCP 도구 호출)만 남기는 GA 이벤트api_data_call의 주간 고유 호출자. 연결 확인(initialize·tools/list), 목록 사이트 점검, 오류 응답, 우리 쪽 확인 호출은 제외 - 호출자 구분: IP와 User-Agent를 비밀 값과 섞은 해시(
caller_id, 2026-11-07부터). IP 원문은 GA로도 로그로도 남기지 않음. 같은 망에서 같은 도구를 쓰면 한 명, IP가 바뀌면 두 명으로 셀 수 있는 근사값. 그 전 기록은 User-Agent로만 구분돼 사람 수를 알 수 없음 - 신규·재사용자: 그날 처음 본
caller_id면 신규, 이전 날에 본 적 있으면 재사용자 - 보조: 개장 전(06~08시)
predict_open호출 수, 2주 연속 호출한 호출자 비율 - 유입: 2026-11-06 공식 MCP Registry(
io.github.eddyParkGG/bamsai)와 Glama에 등록(원격 연결kr.bamsai/bamsaiA등급, 소스 빌드 검사 통과한 서버eddyParkGG/bamsaikrB등급), awesome-mcp-servers·awesome-remote-mcp-servers 목록에 추가 PR(자동 검사 통과, 관리자 머지 대기). 로컬 프로세스로 붙이는 클라이언트용 stdio 실행(npm run mcp:stdio) 지원
확장 타겟 지표: 미국장이 닫힌 뒤 국내 시장 시작 전(06:00~08:00)에 밤사이 가격을 실제로 본 주간 사용자 수 → 선정 이유: H2(습관)와 H1(하이퍼리퀴드 신호)이 둘 다 맞아야 오르는 숫자. 06시 이후가 하이퍼리퀴드 가격이 가장 정확한 시간대(위 표)이고, 08시에 넥스트레이드가 열리기 전 판단하는 순간이라 이 시간대만 셈
- 정의: GA
prediction_view이벤트 중kst_window = preopen(06:00~08:00 KST)인 고유 사용자. 홈·종목 페이지에 들어왔을 뿐인page_view는 세지 않음 - 측정 상태: 2026-11-06에 GA 맞춤 측정기준(
kst_window등)을 등록해 그날부터 측정 가능. 그 전 데이터로는 계산할 수 없음 - 다음 단계에서 이어 볼 것: 같은 사용자의 주간 재방문률, (주문 출시 후) 개장 직후 주문 전환
확장 타겟 첫 실험: 커뮤니티 게시
| 항목 | 내용 |
|---|---|
| 목적 | H2(개장 전에 다시 오나)를 가장 싸게, 가장 빨리 확인 |
| 채널 | 디시 주식 갤러리. 종목별 마이너 갤러리는 글이 거의 없어서(SK하이닉스 하루 몇 건, 하이퍼리퀴드·삼성전자 주주 갤러리는 몇 달째 0건) 제외. 네이버 종목토론방은 운영원칙상 광고·홍보 금지라 첫 글이 몇 분 만에 삭제됐고 본문 링크도 클릭되지 않아 제외 |
| 시점 | 처음에는 저녁 8시 넥스트레이드 마감 후(21~22시) 게시. 이후 미국장 마감 뒤 아침, 점심, 장 마감 직후, 주말 밤으로 넓혀 시간대별 반응을 비교. 목·금·일 저녁 → 금·월 개장 전 재방문 측정 (주말 갭 포함). 첫날(목)은 A형·B형 1개씩 시간 간격을 두고 게시(연속 게시는 도배로 보일 수 있음) |
| 기간 | 2주 (11/5 목 ~ 11/19 목, 국내 개장 10번). 개장 전 재방문은 개장일마다 쌓여야 판단할 수 있어서, 주말이 두 번 들어가고 평일 개장이 충분히 쌓이는 2주로 둠 |
| 메시지 A/B | A 예측형 / B 사실형 "지금 해외에선 삼성전자 -2.6%". 1차(11/5)는 A에 저녁 숫자와 '오를 확률'을 썼는데, 저녁 숫자가 거의 동전 던지기 수준이라(위 '언제 본 가격이냐') 이후 A는 미국장 마감 뒤 숫자 + '과거 이 시간대엔 n%가 이 방향대로 열렸어요' 로 바꿈 |
| 추적 | 글마다 utm_source(dc_stock 등) + utm_content(종목_요일_A/B). 첫 유입 채널을 사용자 속성으로 저장. 게시 기록은 docs/experiments/community/posts.md. 11/8 오후 글부터는 링크를 홈 대신 글에서 다룬 종목의 상세 페이지(/s/SKHX 등, utm_content 끝에 _detail)로 걸어, 홈 링크 글과 밤사이 가격 확인 비율·체류·다음 날 재방문을 비교 |
| 측정 범위 | 첫 글 다음 날인 11/6 0시 이후 전체 방문(내부 트래픽 제외). 글 링크로 처음 온 사람도 나중엔 주소를 직접 쳐서 다시 올 수 있어, 출처(UTM)가 남은 방문만 세지 않음. UTM은 글·메시지별 유입 비교용 |
| 판단 최소 표본 | 방문자 200명. 2주가 지나도 미만이면 같은 방식으로 게시를 이어 가며 표본을 채운 뒤 판단 |
| 진행 방식 | 갤러리 3곳(주식, 한국 주식, 미국 주식)에 하루 1~3번, 같은 갤러리는 2~3시간 이상 간격. 형식을 돌려 가며 씀(사실형, 검증형 '최근 N주 월요일 맞춰봄', 질문·투표형, 흐름 정리형, 비교형). 글마다 서비스 화면 스크린샷 2장(홈 카드, 종목 상세 차트). 한국 주식 갤러리는 자기 사이트 홍보 금지라 링크 없이 게시. 글별 조회·추천·댓글 수와 댓글 내용 요지를 게시 기록에 남김. 클릭률 3%를 가정하면 방문 200명에 조회 약 6,700회가 필요 |
| 단계 | 지표 | 성공 기준 | 근거 | GA4 |
|---|---|---|---|---|
| 유입 | 게시글 조회 대비 방문 | ≥ 3% | 커뮤니티 링크 클릭률 통상 1~3% 가정. 3%를 넘으면 문제 자체에 관심 있다고 판단 | session_start × first_source |
| 활성화 | 방문 → 예측 확인 | ≥ 70% | 첫 화면에 바로 보여서 이보다 낮으면 첫 화면 문제 | prediction_view |
| 활성화 | 예측 → 종목 상세 | ≥ 30% | 숫자 하나 보고 이탈하는지, 근거를 더 보는지 | prediction_detail_open |
| 핵심 리텐션 | 첫 방문 다음 개장 전 재방문 (밤사이 가격을 실제로 본 경우만) | ≥ 15% | 커뮤니티발 일회성 유입의 D1 재방문은 보통 5~10% 수준으로 가정. 그 두 배면 '습관' 신호 | prediction_view (kst_window=preopen) |
| 리텐션 | 기간 중 2일 이상 방문 | ≥ 20% | 주말 갭이 있는 월요일까지 다시 오는지 | 코호트 탐색 |
| 신뢰 | 근거 확인 (개장 전 가격·지난 개장 기록 탭 열람) | ≥ 10% | 숫자만 보고 믿는지, 근거를 확인하는지 | model_explain_open |
판단 규칙
- 개장 전 재방문 15% 이상 → 개장 전 알림(웹 푸시) 바로 개발. 알림이 리텐션을 더 올릴 여지가 큼
- 5~15% → 메시지(A/B 중 나은 쪽)와 게시 시각을 바꿔 1회 재실험
- 5% 미만 → '매일 보는 습관' 가설 기각. 주말·연휴 갭 리포트처럼 이벤트성 콘텐츠로 방향 전환
- A/B는 채널 간 차이보다 메시지 차이를 먼저 봄 (채널은 2개뿐이라 비교 의미가 약함)
주의할 점
- 커뮤니티 홍보 금지 규정: 정보 공유 형식(주말 갭 수치 + 그래프 캡처)으로 쓰고 링크는 1개만
- 특정 종목 매수·매도 권유 문구 금지 (유사투자자문 오해 방지)
중간 현황 (2026-11-08 11시 기준, 측정 범위 11/6 0시부터, 내부 트래픽 제외)
| 항목 | 값 |
|---|---|
| 게시 | 18건(갤러리 3곳), 누적 조회 약 1,540회. 그중 링크가 있는 글 13건이 약 930회 |
| 웹 방문자 | 74명(신규 72명, 다른 날 다시 온 사람 4명). 판단 최소 표본 200명 전이라 판단 전 |
| 첫 유입 | 직접 입력 54명, 디시 링크 12명(주식 5, 미국 주식 7), bing 8명 |
| 디시 링크 클릭률 | 약 1.3% (링크 있는 글 조회 약 930회 → 12명) |
| 밤사이 가격 확인 | 48명(방문자의 65%) → 종목 상세로 이어짐 4명 |
| 개장 전(06~08시) 확인 | 첫 평일 개장 전인 11/9(월)부터 집계 (시간대 측정 기준은 11/6 등록) |
API·MCP (초기 타겟, 같은 기간)
| 항목 | 값 |
|---|---|
실제 데이터 조회 (api_data_call) | 사람·AI 에이전트 호출자 0명. 기록된 5건은 모두 목록 사이트 점검이었음(BrickBlueBot 3건, agent-index-prober 1건, verifymcp 인증 확인 1건) |
연결 확인만 한 호출 (api_check, 11/7부터) | 57곳, 294건. 모두 도구는 부르지 않음. 그중 30분마다 반복하는 주기 점검 1곳이 76건 |
| 호출자 구분 보강 | 11/8부터 MCP 연결 때 클라이언트가 밝히는 이름(mcp_client, 예: Claude·Cursor)을 기록해 AI 앱 연결과 점검 스크립트를 이름으로 나눔 |
| 판단 시점 | 초기 타겟 유입 경로인 awesome MCP 목록 PR 2건(#18872, #4148)이 머지된 뒤부터 판단 |
출시 후 지표 (실험 통과 시)
| 가설 | 지표 | 목표 (4주) | GA4 이벤트 |
|---|---|---|---|
| H1 | 하이퍼리퀴드 방향대로 열린 비율 (보조: 80% 구간 포함률) | ≥ 80% / 75~85% | 서버 계산, 화면 공개. 4주 연속 75% 미만이면 노출 중단 |
| H3 | 근거 확인한 사람의 재방문율 차이 | +10%p | model_explain_open |
| H4 | 시세차익 기회 조회 → 주문 버튼 클릭 | ≥ 5% | arb_view → (arb_cta_click: 차트의 '시세차익 내기') → order_submit |
| H4 | 주문 버튼 → 출시 알림 신청 (주문 열리기 전 수요 측정) | ≥ 20% | order_submit → launch_notify_signup |
| H5 | 주간 데이터 호출자 수와 호출 수 | 주 1,000회 | 서버가 GA로 보내는 이벤트: api_data_call(실제 도구·REST 조회만), api_check(연결 확인·점검·오류), 둘을 합친 api_call. 매개변수 caller_id(사람 구분), is_bot(점검 봇), ua_head(UA 앞 40자). GA mcp_copy |
가드레일 (나빠지면 바로 멈춤)
- 예측 오차 3%p 이상인 날의 비율 (오라클 이상, 상한가·하한가 날 포함)
- 주문 버튼 클릭 중 하이퍼리퀴드·레버리지 5배 이상 비중 (
order_submit의market,leverage,lev_bucket=gte5) - 홈에서 들어와 종목 상세 주문까지 간 비율 (초보의 고위험 상품 유입 감시)
5. 해결 방법
| 홈 | 종목 상세 | |
|---|---|---|
| 질문 | "밤사이 해외에선 얼마나 움직였어요? 믿을 만해요?" / "지금 시세차익 기회 있어요?" | 두 시장이 어디서, 얼마나, 왜 벌어졌나 |
| 화면 | 종목 카드 3개 (누르면 종목 상세). 장중: 위 '국내 지금' / 아래 '미국장 닫힌 뒤 · 국내 개장 직전 글로벌 가격'. 장 마감 후: 위 '국내 종가' / 아래 '지금 글로벌 가격'(실시간) + 미국장 단계 + '과거 이 시간대 n%가 이 방향대로 열렸어요'. 아래에 해외 가격과 시세차익 기회(1천만원 기준) | 차트 | 호가 | 주문 3단(경계를 끌어 너비 조절, 기본 340px, 페이지 스크롤 없음), 차트 위 '하이퍼리퀴드 지금 · [자세히]'와 그 아래 미국장 단계·과거 적중률 한 줄·'시세차익 · 1천만원이면 약 N원 [시세차익 내기]', 차트 전체화면, 탭 줄 끝 오늘의 이슈, 개장 전 가격·지난 개장 기록·투자자 동향 탭 |
| 용어 | perp → "하이퍼리퀴드", KRX·넥스트레이드 → "국내 시장", 시가 → "장 시작 가격" | 같음 (원화 환산 기준) |
종목 상세 차트
- 두 시장 캔들/라인 겹침, 시장별 on/off, 시장별 거래량
- 배경색으로 국장 개장(정규장·넥스트레이드)·휴장(하이퍼리퀴드만 거래) 구분, 일봉 포함
- 하이퍼리퀴드 일봉은 국내 거래일과 같은 저녁 8시~저녁 8시 기준으로 다시 묶음 (거래소 일봉은 UTC 하루라 13시간 어긋남)
- 가격 차이 패널: 장중은 진하게, 휴장 중(직전 종가 대비)은 연하게. 하이퍼리퀴드 상장일 세로선
- 따라간 정도 패널: 하이퍼리퀴드가 1% 이상 움직인 날, 그 움직임을 국내 시장이 몇 % 따라 시작했는지 막대로 (100 점선 = 같은 만큼)
- 보조 패널(거래량·가격 차이·따라간 정도·펀딩비·RSI·MACD)마다 제목과 물음표 설명, 지표를 켜면 자동으로 붙음
- 휴장 중에는 보통 시작 범위(점선 2개), 시세차익이 생기면 그 가격에 '시세차익 내기' 버튼
- 뉴스 말풍선 (하루 1건, 출처 확인된 것만) → 누르면 요약과 원문 링크
- 이동평균, 그물망, 볼린저, 일목균형, VWAP, RSI, MACD, 펀딩비
따라간 정도 지표 ('지난 개장 기록' 표·차트·API 공통)
따라간 정도= 08:00~08:10 국내 움직임 ÷ 밤사이 하이퍼리퀴드 움직임. 100%면 그대로 따라 시작. 차트에는 하이퍼리퀴드가 1% 이상 움직인 날만 표시 (작은 움직임은 비율이 의미 없음)만난 지점= 08:00~09:00 동안 두 가격이 만난 위치. 0이면 하이퍼리퀴드가 국내 쪽으로, 1이면 국내가 하이퍼리퀴드 쪽으로 이동
가격 차이 거래 (화면 이름 '시세차익')
- 전제: 하이퍼리퀴드 지갑(USDC)과 국내 증권 계좌에 미리 자금을 둔 상태. 원화를 USDC로 바꿔 옮기는 시간은 거래 순간에 들지 않음
- 방법: 두 가격 차이가 평소보다 벌어졌을 때 비싼 쪽을 팔고 싼 쪽을 산 뒤, 차이가 평소 수준으로 돌아오면 둘 다 정리
- 성격: 무위험 차익이 아니라 평소 차이로 돌아온다는 데 거는 거래(통계적 차익). 같은 순간에 사고팔아 확정되는 이익이 아님
- 아직 반영 못 한 위험: 차이가 언제 좁혀질지 모름(펀딩비는 1시간 보유로 가정), 양쪽에 자금을 묶어 두는 부담
순차익 = |가격 차이 − 평소 차이| − 슬리피지 − 주문 간 시차 비용 − 주식 수수료·세금 − perp 수수료 − 환전 비용 − 보유 중 펀딩비
- 두 시장 가격 차이는 0으로 돌아가지 않고 '평소 수준'에서 움직임. 정규장 시간 월별 중간값이 2026년 9월 약 −0.7~+0.1%, 10월 +0.9~1.0%, 11월 +0.5% (세 종목 비슷)
- 그래서 평소 차이 = 최근 5거래일 정규장 1시간 가격 차이의 중간값으로 두고, 지금 차이가 평소보다 더 벌어진 만큼만 기회로 봄. 처음에는 0을 기준으로 계산해서, 평소 수준인 날에도 '1천만원 기준 약 17,000원 남아요'로 보였던 문제를 고침
- 화면 목록은 두 경우만: 비용을 빼고 남으면 '+N원', 아니면 '아직 시세차익 기회가 없어요'. 이유(평소 수준·비용이 더 큼·주식 매도 필요)는 차트 위 설명에서 봄
- 호가 기준 체결가: 1천만원(
notionalKrw)만큼 하이퍼리퀴드는 매수 호가를, 국내는 매도 호가를 쌓아 평균 체결가를 계산. 중간 가격과의 차이가 슬리피지. 보이는 호가로 다 못 채우면 '호가 잔량이 부족해 최대 N만원까지'로 표시하고 채울 수 있는 금액으로 계산 - 주문 간 시차: 두 주문은 동시에 체결되지 않음. 최근 60분 1분 변동성 × √(시차/60초), 시차 기본 3초(
lagSec) - 오라클이 튀는 순간에도 숨기지 않고 실제 호가 그대로 계산 (그 가격에 실제로 체결되므로). 대신 아래 '오라클 이상 구간'에는 '오라클 이상 구간: 추가 급변 시 청산 위험 · 레버리지는 1~2배로 낮게' 경고를 목록 행과 주문 박스에 붙임
오라클 이상 구간 방어 (server/services/oracle.ts, 2026-07-28 사례는 한계 메모 참고)
- 판단(최근 30분, 10초 캐시)
- ① 호가 중간값이나 표시 가격(mark)이 오라클과 3% 이상 차이
- ② 1분봉 하나가 직전 종가보다 5% 이상 움직임(체결 3건 이하면 2% 이상)
- ③ 같은 1분에 EWY·코스피200 perp와 4%p 이상 다르게 움직이면 이유에 추가. EWY·코스피200도 같이 움직였으면 시장 전체 움직임으로 보고 ②는 표시하지 않음
- 밤사이 가격·적중률: 이상 구간에는 순간 가격 대신 최근 30분 1분봉 종가의 중간값을 씀(거래가 드물어 30분 안에 봉이 5개 미만이면 최근 1분봉 30개). 급변 봉은 거래량이 폭증해서(청산) 거래량 가중 평균은 오히려 튄 가격 쪽으로 끌려가기 때문. 새 가격이 15분 넘게 이어지면 중간값도 그 가격으로 옮겨 가서, 진짜 움직임은 늦게라도 반영됨. 홈 카드·차트 위 '하이퍼리퀴드 지금'·개장 전 가격 탭에 '가격 불안정' 표시와 설명
- 시세차익: 숫자는 그대로, 경고만 붙임
- API·MCP:
predict·arb응답의oracle(active,reasons,since,robustKrw,predict는liveKrw·usedRobust도). 최근 3.6일 1분봉(세 종목 약 5,200개씩)에 돌려 본 결과 표시된 구간 0건(최대 1분 움직임 −3.0%)
| 항목 | 기본값 | 근거 |
|---|---|---|
| 주식 | 왕복 수수료 0.03% + 매도세 0.20% | 2026년 코스피 증권거래세·농특세 합계로 가정 |
| perp | 왕복 0.018% | HL 기본 0.045% × HIP-3 배수 2 × growth mode 0.1 |
| 환전 | (0.05% + 호가 스프레드 절반) × 2 ÷ 레버리지 | 업비트 원화마켓 수수료, 증거금만 환전 |
| 펀딩 | 시간당 펀딩 × 1시간 | 숏이면 받고 롱이면 냄 |
| 슬리피지 | 1천만원어치 호가를 쌓은 평균 체결가 − 중간 가격 | 두 시장에서 받아 오는 호가 단계까지 |
| 주문 간 시차 | 1분 변동성 × √(3초/60초) | 최근 60분 원화 환산 1분봉 |
- 개인은 주식 공매도가 어려워서 perp가 쌀 때(주식 매도 필요)는 기회로 세지 않음
- 모든 비용은 API 파라미터로 바꿀 수 있음
6. 주요 결정과 이유
| 결정 | 이유 |
|---|---|
| 환율은 원/USDC (업비트 실시간) | perp는 USDC로 정산. 국내 투자자가 실제로 돈을 옮기는 경로가 원 → USDC라서, 은행 원/달러 환율보다 체결 가능한 값에 가까움 |
| 증권사 API는 토스증권 Open API | 카카오페이증권은 오픈 API가 없어서, 발급이 쉬운 토스증권 Open API를 사용. 실시간 체결·호가 웹소켓, 1분봉(넥스트레이드 포함 통합 시세), 투자자 동향, 장 운영 캘린더, 주문까지 한 곳에서. 브라우저가 직접 못 붙는 웹소켓(헤더 인증·허용 IP)은 서버가 하나만 열어 나눠줌 |
| 예측·시세차익은 국내 주식 3종만, 나머지는 하이퍼리퀴드 가격만 | 하이퍼리퀴드의 한국 상품 7개(삼성전자·SK하이닉스·현대차·SK하이닉스 ADR·코스피200·EWY·KORU)를 다 보여주되, 같은 기초자산의 국내 가격이 있는 국내 주식 3종만 예측·시세차익을 계산. ADR은 보통주로 바꿀 수 없고, 코스피200은 증권사 API에 실시간 지수가 없고, EWY·KORU는 미국 ETF라 비교 대상이 없음 |
| 화면은 Vercel, API 서버는 Fly.io (고정 IP 서버 1대) | 토스증권 Open API는 허용 IP에서만 호출되고, 토큰을 새로 받으면 이전 토큰이 바로 무효가 됨. 그래서 고정 출구 IP를 가진 서버가 항상 1대만 떠 있어야 함. Vercel·Firebase 같은 서버리스 함수는 요청마다 인스턴스가 여러 개 뜰 수 있어 토큰이 서로를 끊고, 고정 IP는 유료 옵션. Fly는 머신 1대 + 고정 출구 IP(월 $3.6)로 월 $8 안팎. 화면(정적 파일)은 Vercel이 내보내고 /api만 Fly로 넘김 |
| 국내 실주문은 기본 꺼둠 | 토스증권은 모의투자가 없어서 실제 돈이 나감. 공개 서버(bamsai.kr)는 꺼두고 미리보기만 함. 남의 계좌로 대신 주문하지 않음. 실주문은 각자 이 저장소를 직접 띄우고 본인 토스증권 키·허용 IP·TOSS_LIVE_ORDERS=1·API_TOKEN을 넣었을 때만, 그 본인 계좌로 |
| '국내 시장' = 정규장 + 넥스트레이드 (08:00–20:00) | 개인이 실제로 거래할 수 있는 시간 전체. 15:30~20:00 넥스트레이드 움직임은 이미 국내에서 보이는 정보라, 이걸 예측으로 치면 실력이 부풀려짐. 그래서 기준은 20:00 마지막 가격, 대상은 08:00 재개장 가격 |
| 08:00~08:10 평균 가격으로 채점 | 첫 체결 한 건은 거래가 적어 튐. 5·10·30분 평균과 정규장 09:00을 비교해 가장 안정적인 10분 평균 선택 |
| 보통 시작 범위 모델은 단순 선형 + 정규분포 | 표본이 종목별 140번 남짓이라 복잡한 모델은 과적합. 설명할 수 있어야 초보가 믿음(H3). 계수 β는 1(하이퍼리퀴드 그대로) 쪽으로 당겨서 급락일 몇 번에 휘둘리지 않게 함. 계산법은 3장 '보통 시작 범위 계산법' |
| 장 열리기까지 남은 시간만큼 범위를 넓힘 | 금요일 밤 예측과 월요일 07:59 예측의 확신이 같으면 안 됨. 닫힌 시간대 하이퍼리퀴드 변동성 × 남은 시간 반영 |
| 홈 → 종목 상세 한 갈래 | 요약/상세 모드를 따로 두면 같은 정보가 두 번 나오고 '뭐가 다르지?' 고민이 생김. 초보 질문 2개("밤사이 해외에선 얼마나 움직였어?", "지금 남는 돈 있어?")는 홈 카드에서 답하고, 종목 상세에서는 같은 답을 차트 위 해당 가격에 붙여 보여줌 |
| 예측시장은 v2로 미룸 | 국내 사행성 규제 소지, 금융당국이 해외 perp 이용에 경고한 상황. 먼저 예측 정확도와 신뢰를 쌓는 게 순서 |
| 화면 주문은 '출시 예정' + 알림 신청, API는 기본 미리보기(dryRun) | 프로토타입에서 실수 주문 0건이 우선. 대신 주문 버튼 클릭과 알림 신청으로 실제 수요(H4)를 잼. API 실주문은 서버 토큰 + 명시적 전환 필요, perp는 테스트넷 기본 |
| API의 perp 주문은 에이전트 키로만 서명 | 메인 지갑 키가 서버에 들어오지 않음. 에이전트는 주문만 가능, 출금 불가 |
| MCP는 조회 + 미리보기만 | 에이전트 오작동이 실제 돈으로 이어지지 않게 |
| 뉴스는 하루 1건, 출처 있는 것만 | 차트가 뉴스로 덮이면 안 됨. 틀린 뉴스 1건이 신뢰를 다 깎음 |
| 차트는 TradingView lightweight-charts | Skia(CanvasKit)는 wasm만 수 MB라 첫 화면이 느려짐. 캔버스 기반, 약 57KB(gzip), 거래소에서 검증된 라이브러리. 종목 상세에서만 내려받음 |
| 디자인 토큰은 토스증권 PC, 키컬러·CTA만 카카오페이 | 카카오페이증권은 PC 버전이 없어서, 간편한 UX로 잘 알려진 토스증권 PC를 참고. 증권 사용자가 이미 익숙한 정보 밀도와 컴포넌트(패널, 칩, 호가, 검색, 필터). 하이퍼리퀴드는 그쪽 키컬러에 가까운 민트로 구분. 브랜드 구분은 노랑(#FFEB00) 하나로 충분. 폰트는 토스 전용 서체 대신 가장 가까운 공개 서체 Pretendard |
| React 19.3.1 / Vite 8.3.5 | 최신 패치 버전이면서 실사용 2위 버전. 2025~26년 React 보안 이슈는 서버 컴포넌트 한정이라 SPA는 해당 없음. Vite는 10월 보안 패치 포함 버전 |
7. GTM
| 단계 | 기간 | 대상 | 채널 | 넘어가는 조건 |
|---|---|---|---|---|
| 0-A. MCP 목록 등록 | 상시 | LLM 자동매매 봇 운영자 (초기 타겟) | 공식 MCP Registry·Glama 등록(11/6), awesome-mcp-servers·awesome-remote-mcp-servers 추가 PR, AI 검색 유입(GEO·llms.txt) | 주간 외부 호출자 증가 (H5) |
| 0-B. 커뮤니티 실험 | 2주 | 디시 주식 갤러리 사용자 (확장 타겟) | 갤러리 3곳에 시간대·형식을 바꿔 꾸준히 게시 (UTM 분리) | 개장 전 재방문 15% |
| 1. 홈 공개 | 4주 | 삼성전자·하이닉스 보유자 | 개장 전 07:00 알림(미국장 마감 뒤: "삼성전자 하이퍼리퀴드 −2.1%, 과거 이 시간대엔 87%가 이 방향대로 열렸어요"), 증권 앱 종목 페이지 진입점 | North Star 주 1만 명, H2 재방문 30% (가정. 첫 실험·인터뷰 결과로 다시 정함) |
| 2. 종목 상세 주문 | 4주 | 주식·코인 겸업 트레이더 | 업비트·하이퍼리퀴드 커뮤니티, 주말 갭 리포트 콘텐츠 | H4 전환 5% |
| 3. 봇 운영자 확대 | 상시 | 초기 타겟 | 하이퍼리퀴드·퀀트 커뮤니티, 예제 봇 저장소 | H5 주 1,000회 |
- 메시지: "장 열리기 전에 먼저 보세요" (가격 정보가 아니라 '시간'을 파는 서비스)
- 훅 콘텐츠: 연휴 끝 개장 전날 "연휴 동안 해외에서 삼성전자 -3.7%, 내일 장 시작 가격은?" (2026-10-18 주말 사례처럼 큰 갭이 생기는 날이 가장 강한 획득 시점)
- 증권사 입장에서의 가치: 해외 perp로 빠져나가는 수요를 '국내 주식 장 시작 가격 판단' 쪽으로 되돌림. 주문은 국내 주식으로 연결
검색·AI 검색 유입 (SEO · GEO · llms.txt)
장 시작 전 "삼성전자 야간 시세", "하이닉스 장전", "하이퍼리퀴드 삼성전자"를 검색하거나 AI에게 묻는 사람이 그대로 들어오게 함
| 항목 | 한 것 |
|---|---|
| 페이지별 정적 HTML | 빌드할 때 홈·소개·API·종목 7개 페이지마다 제목·설명·canonical·공유 미리보기·크롤러용 요약이 다른 HTML을 만듦(scripts/prerender.ts). JS를 실행하지 않는 네이버·AI 크롤러도 페이지별 내용을 읽음. 이전에는 모든 페이지가 홈과 같은 HTML이고 canonical도 홈이라 종목 페이지가 색인되지 않는 구조였음 |
| 구조화 데이터 | 홈: WebApplication + FAQ(서비스 설명·적중률·환산 방식·API). 나머지: WebPage + 경로(Breadcrumb) |
| sitemap · robots | sitemap은 빌드마다 갱신일을 새로 씀. robots는 주문·계좌 API만 막고 GPTBot·ClaudeBot·PerplexityBot·Google-Extended를 명시적으로 허용 |
| llms.txt | 서비스 요약, 지원 종목, 계산 방법과 수치(기준일 표기), API·MCP 사용법, 페이지 안내를 AI가 읽기 쉬운 형식으로 공개 |
| 에이전트 접근 | OpenAPI 문서(/api/openapi.json)와 MCP 서버(/api/mcp)를 열어 AI 답변이 숫자를 직접 가져가 인용할 수 있게 함 |
| 검색엔진 등록 | 2026-11-06 구글 서치콘솔(도메인 속성, DNS 확인)과 네이버 서치어드바이저(HTML 태그 확인)에 등록. 구글은 sitemap 등록 성공, 페이지 10개 발견 |
8. 다음 액션 (개선 포인트 아이디어)
- 예측시장: "월요일 장 시작 가격 +2% 이상?" 같은 질문에 사용자 예측을 받아 모델과 비교 (포인트 기반, 현금 없음)
- 개장 전 알림 (웹 푸시 / 카카오 알림톡)
- 개인 주문 이벤트 실시간 구독 (토스증권
personal:order웹소켓) - 예측 대상 확대: 지금은 가격만 보여주는 코스피200·EWY·KORU·ADR에도 국내 비교 기준을 만들어 예측 적용 (예: 코스피200 선물·ETF 시세)
- 자동 시세차익용 안전장치: 사용자의 AI 에이전트가
get_arbitrage로 감시하다 직접 띄운 서버(본인 키)의 페어 주문 API로 실행하는 흐름은 지금도 가능함. 빠진 것은 안전장치라, 주문 API에 1회·하루 금액 한도, 레버리지 상한, 국내 장 마감 전 청산 규칙, 승인 대기 모드를 추가
AI 활용 과정
Claude Code(Opus 5.5)와 대화하며 기획부터 배포까지 진행
AI로 만든 것과 제품 안의 계산은 다름
- AI는 개발 도구로만 씀: 리서치, 데이터 검증, 백테스트 코드 작성·분석, 구현, QA
- 화면과 API의 숫자는 전부 실제 시세 데이터로 통계 계산이 만듦. 서비스 실행 중에 LLM API를 부르지 않고, LLM이 금융 수치를 만들거나 바꾸지 않음
| 단계 | AI가 한 일 | 사람이 한 일 |
|---|---|---|
| 리서치 | 하이퍼리퀴드 API를 직접 호출해 한국 종목 perp 목록·상장일·호가 확인. 토스증권 OpenAPI·AsyncAPI 스펙을 받아 엔드포인트·웹소켓 확인. HIP-3 수수료 구조 문서 확인 | 아이디어(perp ↔ 국장 차익, 개장 예측), 범위 결정 |
| 사실 확인 | 서브 에이전트가 2026년 주요 이슈 25건을 출처와 함께 조사 → 차트 뉴스로 사용 | 사용할 이슈 기준 결정 (하루 1건) |
| 검증 | 삼성전자 perp 환산가(204,919원)와 KRX 현재가(204,750원)를 비교해 환산 방식 검증. 토스 일봉이 넥스트레이드 포함 통합 시세라 KRX 종가와 다르다는 점(218,000원 vs 221,500원)을 찾아 분봉 기준으로 수정 | 원/USDC(업비트) 사용 결정 |
| 모델 | walk-forward 백테스트 작성, 사전분포 강도 5가지 비교 후 선택. 채점 기준을 넥스트레이드 포함 '국내 시장'으로 다시 정하면서 시작 가격 정의 5가지(08:00 첫 체결·5분·10분·30분 평균·09:00)를 같은 기간으로 다시 채점해 비교 | 지표 해석, 공개 방식 결정. "개인이 거래할 수 있는 가장 이른 시간부터 가장 늦은 시간까지가 국내 시장"이라는 기준 제시 |
| 디자인 | 토스증권 PC 화면에서 디자인 토큰(배경 #101013, 패널 #17171c·16px, 칩 13px/600·7px, 라벨 12px/500)을 브라우저로 직접 추출. 카카오페이 CSS에서 키컬러 #FFEB00, CTA 색 추출 | 토스 PC 기준·키컬러만 카카오페이로 방향 지정, 로고 콘셉트(구름·초승달·호버 시 노란 화살표) 제안 |
| 구현·QA | 서버·프론트 구현. 바꿀 때마다 AI가 Chrome을 직접 띄워 화면을 누르고 스크린샷·콘솔·네트워크 요청을 확인(예: 1분봉 3분 관찰로 새 봉이 밀리는지, iPhone Safari 조건으로 로딩되는지, 아이폰 폭에서 5초 동안 화면 속성이 몇 번 바뀌는지 세어 지표 줄 깜빡임 원인 확인) → 차트 새 봉·깜빡임, 마커 과밀, 아이폰 지표 줄 깜빡임 등 수정. 이 확인 흐름을 E2E 테스트로 옮겨 PR마다 자동 실행 | 문구·UX 리뷰 |
| 보안 | React·Vite 버전별 보안 권고(GitHub Advisory) 조회 후 버전 선택 | 최종 승인 |
| 판단 교정 | 처음 화면은 저녁 하이퍼리퀴드 가격으로 계산한 '내일 오를 확률'을 보여줬음. 커뮤니티 글에 저녁 9시 '내일 시초가 +0.3%'를 썼다가 실제 −11.9%로 시작 → 밤 시각별 적중률을 상장 이후 전체로 다시 계산해 21시 49% vs 06시 86~87%를 찾음 | "미국장 끝난 뒤 가격으로 봐야 한다", "오를 확률 대신 담백하게 과거 비율로" 방향 결정 |
| 채택·거절 | 외부 AI 리뷰 피드백을 근거로 하나씩 검토: North Star 시간대 불일치(채택), 거래대금 기준 민감도 표(채택), 확률 보정 검증(다음 단계로 분리), AI 야간 브리핑(거절: LLM API 운영 비용과 수치 생성 위험) | 최종 선택 |
| 운영 버그 | 아이폰 사파리 조건으로 API를 반복 요청해 CDN이 zstd 응답을 잘못 내보내는 문제를 찾고, 서버가 직접 gzip 압축하도록 수정. 토스 한도 초과는 1분 단위 그룹별 호출 집계 로그를 만들어 원인(지수 미니차트가 며칠치 분봉을 10초마다 다시 받음)을 찾고 고침 (README '오픈 후 고친 것') | 배포 승인, "접속자가 늘면?" 관점 제시 |
| 사용자 관점 점검 | API 14개·MCP 도구 5개를 실서버에서 직접 호출해 문서와 대조 → MCP 종목 검증 누락(ADR에 +48%), OpenAPI의 잘못된 출처 표기 등 수정 | "우리 계좌로 주문이 나가면 안 된다" 기준 제시, 실주문 경로 확인 지시 |
| 데이터 출처 검토 | KRX·공공데이터·한국은행·증권사 API를 조사해 비교, 토스 약관(시세는 본인 매매 목적만)을 찾아 한계로 문서화 | 공개 화면 축소는 보류, 문서 명시로 결정 |
실행 방법
npm install
cp .env.example .env.local # TOSS_CLIENT_ID / TOSS_CLIENT_SECRET 입력 (토스증권 WTS > 설정 > Open API)
npm run dev # 웹 http://localhost:5173 (API는 배포 서버 bamsai-api.fly.dev 사용)
npm run dev:local # 서버 코드 수정 시: 로컬 API http://localhost:8787/api 도 실행. 켜는 동안 배포 서버의 토스 토큰이 끊김 (토스 키는 하나뿐이고 새 토큰이 이전 토큰을 무효화)
npm run mcp:stdio # MCP를 표준 입출력으로 실행 (Claude Desktop 등 로컬 프로세스로 붙이는 클라이언트용). 조회 도구는 키 없이 동작
npx tsx --env-file=.env.local server/scripts/backtest.ts # 백테스트 결과 출력 (서버를 끄고 실행: 토스 토큰이 서로를 무효화함. 서버가 켜져 있으면 /api/v1/convergence로 확인)
npx tsx --env-file=.env.local server/scripts/build-sessions.ts # 지난 국내 시장 하루 가격(20:00 마지막 가격·08:00~08:10 평균·정규장 시작·종가) 저장 (배포 전, 서버를 끄고 실행)
| 환경변수 | 용도 | 없으면 |
|---|---|---|
TOSS_CLIENT_ID TOSS_CLIENT_SECRET | 토스증권 Open API (국내 시세·호가·실시간·주문) | 국내 시세 없음 |
TOSS_LIVE_ORDERS | 1이면 API 국내 실주문 허용 (실제 돈). 화면은 항상 '출시 예정' | API는 미리보기만 |
HL_AGENT_KEY HL_ACCOUNT | 서버 API로 perp 주문 | API perp 주문은 미리보기만 |
HL_ALLOW_MAINNET | 1이면 메인넷 주문 허용 | 테스트넷만 |
API_TOKEN | 실주문·주문 취소·계좌 조회 API 인증. 화면에서 보낸 것처럼 보이는 요청도 예외 없이 필요 (sec-fetch-site 헤더는 누구나 꾸밀 수 있어서) | 실주문 불가 |
VITE_GA_ID | GA4 측정 | 이벤트 전송 안 함 |
VITE_NOTIFY_URL | 주문 출시 알림 이메일을 쌓는 구글 시트(Apps Script 웹앱, docs/launch-notify) | 신청 수만 GA에 기록 |
GA_API_SECRET | 서버가 외부 API·MCP 호출을 GA4 api_call·api_data_call로 보냄 (Measurement Protocol). 호출자 해시(caller_id)를 만들 때 섞는 비밀 값으로도 씀 | 서버 로그에만 남음 |
GA4 설정
가설별 실험 계획·결과 기록과 GA 이벤트·파라미터 전체 목록(어느 화면에서 언제 보내는지)은
docs/experiments/에 정리함
- Google Analytics → 관리 → 속성 만들기 → 웹 스트림 추가 → 측정 ID(
G-…) 복사 - Vercel 환경변수
VITE_GA_ID에 넣고 재배포 - 관리 → 맞춤 정의에 등록
- 이벤트 범위:
kst_window,asset,from,market,tab,mode,side,lev_bucket,api_path,api_status,caller,caller_id,is_bot,ua_head,mcp_call,mcp_client - 측정항목:
leverage - 사용자 범위:
first_source,first_content - 주요 이벤트(전환):
launch_notify_signup,order_submit,model_explain_open
- 이벤트 범위:
- 탐색 → 코호트 탐색: 코호트 =
first_source, 재방문 조건 =prediction_view중kst_window = preopen(4장 확장 타겟 지표와 같은 정의) - 커뮤니티 글 링크 예시:
https://bamsai.kr/?utm_source=dc_stock&utm_medium=community&utm_campaign=bamsai_test1&utm_content=smsn_thu_A
사용한 외부 API
| 출처 | 쓰는 곳 |
|---|---|
| 토스증권 Open API | 현재가, 호가, 1분봉·일봉, 지수(코스피·코스닥), 장 운영 캘린더, 투자자별 매매, 실시간 체결·호가(웹소켓), 주문·취소, 보유 주식, 매수 가능 금액, 계좌 |
| 하이퍼리퀴드 (trade.xyz HIP-3) | perp 시세·펀딩·미결제약정, 나스닥 100·S&P 500(국내 정규장 밖 상단 지표), 캔들, 호가, 펀딩 이력, 실시간 WS, 주문·취소·레버리지·에이전트 승인 |
| 업비트 | 원/USDC 호가·캔들, 실시간 WS |
구조
server/ Hono API (Fly.io, 고정 IP). sources=외부 API, services=차익·예측·주문
shared/ 서버·브라우저 공통 (종목, 장 시간, HL 주문 서명)
src/ React 웹앱. pages=홈·종목 상세·소개(계산 방법)·API, pro=차트·호가·주문
docs/ experiments=가설별 실험 계획·결과·GA 이벤트 연결
테스트와 장애 대응
| 구분 | 내용 |
|---|---|
| AI 브라우저 QA | 화면을 바꿀 때마다 AI(Claude Code)가 Chrome을 직접 띄워 누르고, 스크린샷·콘솔 에러·네트워크 요청으로 확인한 뒤 PR을 올림 |
| 단위 테스트 (vitest, 19개 파일·170개) | 오라클 급변 감지(7/28 재현 포함), 시세차익(호가 체결가·부분 체결·주문 간 시차), 장 시간·휴장일, 미국장 단계(서머타임), IP당 호출 제한, 토스 그룹별 한도, 헬스체크, 토큰 없는 실주문·계좌 조회 거절(화면 요청으로 꾸며도), API 호출자 구분·데이터 호출 판별 |
| E2E (Playwright, 11개, 약 9초) | 녹화한 API 응답, 테스트가 직접 보내는 시세 웹소켓, 고정한 시계로 시장 상황과 무관하게 같은 결과. ① 홈 카드·시세차익 줄 ② 금 19:59 → 20:00 넘기면 장중 라벨이 '국내 종가'·'지금 글로벌 가격'으로 바뀜 ③ 차트 드래그·휠 확대·1시간봉·시장 끄기/켜기·RSI 패널 ④ 1분봉 다음 분 tick → 새 봉이 생기고 오른쪽 여백을 유지한 채 밀림, 늦게 온 서버 분봉이 새 봉을 지우지 않음 ⑤ 매수 버튼 → 출시 알림 신청, 실제 주문 요청 0건 ⑥ 소개 페이지 계산 설명 ⑦ API 페이지 MCP 설정 복사 ⑧ 국내장이 닫히면 주문 박스 시세차익 탭에 수익 숫자 대신 안내 ⑨ 서버 재시작 중 API가 503을 돌려줘도 오류 문구 없이 기다렸다가 화면이 채워짐 ⑩ 아이폰 크기(393×852)에서 가로 넘침 없음, 헤더 검색·하단 바가 화면 안에 들어옴 ⑪ 아이폰 크기 종목 상세: 지표 줄이 멈춰 있고, 지표 메뉴가 잘리지 않으며, 차트 크게 보기가 화면 전체를 채움 매 테스트마다 콘솔 에러 0건 확인 |
| CI (GitHub Actions) | PR·push마다 타입 검사 → 단위 테스트 → 빌드 → E2E |
| 커버리지 | 전체 소스(src·server·shared) 기준 문장 약 12%. 돈이 걸린 계산(시세차익)과 시간 처리(장 시간·미국장 단계) 위주로 단위 테스트를 두고, 화면 흐름은 E2E로 확인. 다음: 예측·채점(predict.ts) 단위 테스트 |
| 헬스체크 | GET /api/health: 하이퍼리퀴드·업비트·토스 마지막 성공 시각. 하이퍼리퀴드나 업비트가 5분 넘게 응답이 없으면 503. Fly 점검은 서버가 1대라 프로세스 생존(?live=1)만 봄 |
| 장애 대응 런북 | docs/ops/runbook.md: 증상 → 확인 → 조치 (화면 로딩 멈춤, 국내 시세 비어 있음, 오라클 급변, 환율 없음, 서버 다운, API 남용) |
오픈 후 고친 것
오픈 후 실제로 돌려 보며 찾은 문제와 고친 방법. 숫자는 Fly 서버 로그와 직접 측정 기준.
| 날짜 | 문제 | 원인 | 고친 방법 | 결과 |
|---|---|---|---|---|
| 11/6 | iPhone 등 일부 브라우저에서 화면이 계속 로딩 | Vercel CDN이 zstd로 압축된 API 응답을 캐시해서, zstd를 못 읽는 브라우저에도 그대로 줌 | API 서버가 직접 gzip으로 압축 | iPhone Safari 프로필 15회 요청 모두 정상 |
| 11/6 | 봇·과도한 호출에 비용 위험 | 호출 제한 없음 | IP당 1분 300회(REST·MCP 합산), 넘으면 429 | 화면 하나가 1분 약 55회라 여러 탭도 여유 |
| 11/6 | 국내 시세가 가끔 비거나 502 | 토스 API는 그룹별 초당 한도(캔들 20, 지수 캔들 5 등)가 있는데, 화면 하나가 여러 API를 동시에 부르고 접속자가 겹치면 넘침 | 토스 호출을 API 그룹별 대기열로 공개 한도보다 낮게 보냄(지수 캔들 4/초, 캔들 15/초 …). 한도 초과 시 1·2·3초 간격 재시도. 1분마다 그룹별 호출·초과 수를 로그로 남김 | 1~2초마다 나던 한도 초과 → 분당 0~2회. 재시작 직후 1분에 캔들 423회도 초과 0 |
| 11/6 | 접속자가 늘면 토스 호출도 늘까 | 분봉을 몇 초마다 며칠치 통째로 다시 받음(지수 미니차트만 1분 약 50회) | 서버 캐시는 모든 접속자가 공유. 과거 봉은 10분(일봉 1시간) 캐시하고 최신 200개만 10초마다 받아 합침. 같은 요청은 한 번만 | 토스 호출은 접속자 수가 아니라 종목 × 봉 간격 수에 비례 |
| 11/6 | '개장 직전 글로벌 가격'이 낮 동안 바뀜 | 8시 달러 가격에 '지금' 환율을 곱함 | 그 시각의 업비트 USDC 시간봉 환율로 환산 | 삼성 8시 가격 181,791 → 182,326원(8시 환율 1,364원)으로 고정, 백테스트 기록과 일치 |
| 11/6 | 차트 새 봉이 안 밀리고 가격표에 가려짐, 직전 봉 깜빡임 | 시작 위치가 마지막 봉을 오른쪽 끝에 붙임 / 실시간 봉이 미래 빈칸을 채움 / 늦게 오는 서버 분봉이 실시간 봉을 덮어씀 | 오른쪽 여백 화면 폭 12%(80~160px), 새 봉마다 같은 간격으로 밀기, 실시간 봉을 보관해 서버 데이터에 이어 붙이기 | 1분봉 3분 관찰: 여백 유지, 봉 사라짐 없음 |
| 11/6 | MCP에 SK하이닉스 ADR을 넣으면 '+48%' 같은 엉터리 값 | REST는 막았지만 MCP는 종목 검증이 없었음 | REST와 같은 규칙으로 국내 주식만 받음 | 이유와 함께 오류 응답 |
| 11/6 | 토스 토큰 발급 429 때 API 서버가 종료 | 캔들 두 요청 중 하나를 기다리는 동안 다른 쪽 실패가 처리되지 않은 오류가 됨 | 두 요청을 함께 기다리도록 수정 | 실패해도 오류 응답만 내고 서버는 유지 |
| 11/6 | 화면이 서버보다 먼저 배포되면 시세차익이 '+NaN원' | 새 응답 필드가 없을 때 대비가 없었음 (E2E가 발견) | 이전 필드로 대신 표시 | E2E 통과 |
| 11/6 | API·MCP를 누가 얼마나 쓰는지 모름 (H5) | 서버 로그에만 잠깐 남음 | 외부 호출을 GA4 api_call 이벤트로 전송(경로·응답 코드·호출 종류·MCP 도구, IP 없음) | GA 실시간에서 확인 |
| 11/7 | 서버 배포·재시작 중 화면에 오류 문구('요청 실패', JSON 오류)가 뜸 | 프록시가 502·503이나 HTML 오류 페이지를 돌려주면 그 오류를 그대로 보여줌 | 5xx·429·네트워크 오류·JSON이 아닌 응답은 일시적 오류로 보고 기존 화면(또는 스켈레톤)을 유지한 채 1·2·4…10초 간격으로 다시 시도. 400 같은 요청 오류만 오류로 표시 | 사용자는 열리는 데 시간이 조금 더 걸리는 것으로만 느낌. E2E로 확인 |
| 11/7 | 실주문을 켠 서버라면 토큰 없이 주문이 들어올 수 있음 | '같은 사이트 화면에서 온 요청'이면 토큰을 건너뛰었는데, 그 판단 헤더(sec-fetch-site)는 누구나 꾸밀 수 있음 (운영 서버는 실주문이 꺼져 있어 해당 없었음) | 실주문·취소·계좌 조회는 항상 API_TOKEN 필요 | 꾸민 요청 403 테스트 통과 |
| 11/7 | 주말에도 '내일 아침 가격', 국내장이 닫혔는데 주문 박스에 시세차익 수익 표시 | 개장일·장 상태를 문구와 주문 박스가 따로 보지 않음 | 개장일(오늘·내일·월요일)로 표시, 장이 닫히면 주문 박스도 '국장 중에만 가능' 안내 | E2E로 확인 |
| 11/7 | API·MCP 사용자를 사람 수로 셀 수 없음 (H5) | User-Agent로만 구분해 같은 도구를 쓰는 사람이 한 명으로 묶이고, 연결 확인 수백 건과 실제 조회, 우리 확인 호출이 섞임 | IP+User-Agent 해시(caller_id)로 호출자 구분, 데이터 조회만 api_data_call로 따로 기록, x-bamsai-internal 헤더가 붙은 우리 확인 호출 제외 | 날짜별 신규·재사용자 집계 가능 |
| 11/8 | 아이폰 크롬에서 종목 상세 지표 줄(하이퍼리퀴드 환산·종가 대비 아래)이 계속 깜빡이고, 상단 검색창·하단 고정 바가 깨짐 | 줄 맨 앞 그룹의 구분선을 빼면 폭이 줄어 윗줄로 올라가고, 그러면 다시 넓어져 내려가는 반복을 ResizeObserver가 계속 다시 실행함(화면 내용 변경 없이 5초에 클래스 변경 3,588번). 하단 바는 좁은 화면에서 넘친 부분을 숨김 | 모든 그룹 폭을 같게 두고 줄 맨 앞 구분선은 clip-path로 잘라 숨김(판정 JS 제거), 좁은 화면에서 검색은 아이콘으로·하단 바는 홈 인디케이터 여백과 가로 스크롤 | 아이폰 폭에서 5초간 클래스 변경 0번·레이아웃 고정, E2E 통과 |
| 11/8 | 아이폰에서 차트 '지표' 버튼을 누르면 툴바 안에 얇은 박스만 생기고, '크게 보기'를 눌러도 화면 전체로 안 커짐 | 폰에서는 차트 툴바가 가로 스크롤이라 그 아래로 열리는 메뉴가 툴바 높이(28px)로 잘림 / 폰용 차트 높이(520px) 규칙이 크게 보기 규칙을 덮어써서 위쪽 520px만 고정됨 | 폰에서는 지표 메뉴를 화면 위 시트로 열고 바깥을 누르면 닫힘, 크게 보기는 화면 전체 높이(노치·홈 인디케이터 여백 포함) | 402px 폭에서 메뉴 전체 표시, 크게 보기 874/874px. 아이폰 크기 E2E 추가 |
| 11/8 | 차트 '하이퍼리퀴드 지금' 상자가 최근 하루 반 구간 선과 오른쪽 가격 칩을 덮어, 주말 움직임이 안 보이고 '차트가 안 움직인다'로 보임. 뉴스 말풍선도 그 상자 아래로 깔림 | 상자를 지금 가격 높이 중앙, 축 바로 옆에 고정했고, 아래 설명 글은 한 줄로 약 380px 뻗음. 말풍선과 상자의 겹침 순서가 같았음 | 상자가 덮는 구간의 최근 선과 가격 칩을 보고 덜 겹치는 쪽(위/아래)에 배치, 설명 글은 상자 폭 안에서 줄바꿈, 말풍선을 상자 위로 | 1440px·402px 1시간 봉에서 주말 선·칩이 보임 |
| 11/8 | 배포 직후 열려 있던 페이지에서 종목 화면으로 가면 '이 영역을 불러오지 못했어요. 새로고침해 주세요.' | 배포되면 화면 파일 이름이 바뀌는데, Vercel이 없는 파일에도 HTML(200)을 돌려줘 화면 파일 로딩이 깨졌고 페이지 오류 경계가 문구를 띄움. API 재시도는 이 경우를 다루지 않았음 | 없는 /assets 파일은 404, 화면 파일 오류면 자동 새로고침(30초에 한 번까지), 그 외 화면 오류도 문구 대신 스켈레톤을 두고 1·2·4…10초 간격으로 다시 그림 | 없는 화면 파일 요청 404 확인, E2E 통과 |
| 11/8 | 오라클에 얇은 체결이 들어가 perp가 튀면 밤사이 가격·예상이 그대로 따라 튐 (2026-07-28 SK하이닉스 −17.9%) | 순간 중간값만 썼고 오라클·체결 수·시장 전체 방향을 보지 않음 | 오라클 차이 3%·1분 5%(체결 3건 이하 2%)·EWY/코스피200 대비 4%p 기준으로 이상 구간 판단, 그동안 최근 30분 중간값을 쓰고 '가격 불안정' 표시. 시세차익은 숫자 그대로 청산 위험 경고 | 07-28 재현 테스트에서 표시·이전 가격 유지, 최근 3.6일 실제 1분봉에선 오탐 0건 |
한계 메모
- 국내 시세 이용 조건: 토스증권 오픈 API 약관(제3조 ③)은 시세를 "개인투자자 본인의 매매 목적에 한하여" 쓰고 제3자 제공·배포·상업적 활용을 하지 않도록 정함. 공개 사이트로 국내 시세를 보여주는 이 프로토타입은 이 조건을 넘을 수 있음. 실제로 출시한다면 증권사가 이미 계약한 정식 시세(코스콤 등 시세 제공업체)를 써야 함. 무료 공공 출처(KRX Open API, 공공데이터포털 금융위 주식시세)는 일별·T+1 데이터라 저녁 8시 넥스트레이드 종가와 아침 8:00~8:10 분봉을 대신할 수 없음
- 하이퍼리퀴드 한국 주식 perp와 오라클: 2026년 2월 상장 후 거래가 성장세(SK하이닉스 perp 월 거래대금 3월 1.2억 달러 → 10월 70억 달러, 시장 상황에 따라 월별 변동. 11/6 기준 trade.xyz 주식 perp 전체 24시간 거래대금 약 96억 달러). 다만 perp 가격은 오라클(기초 시장이 열려 있을 땐 외부 체결가, 닫혀 있을 땐 자체 계산 가격)에 묶여 있음. 2026-07-28 08:00 넥스트레이드 프리마켓에서 SK하이닉스 1주가 하한가(127만 2천 원, −29.99%)에 체결되자 이 가격이 오라클에 들어가 perp가 17.9% 급락했고, 약 5,700만 달러의 롱이 청산됨(보도 기준). 거래가 얇은 시점의 체결 하나로 청산을 일으키고 반대편에서 이익을 내는 것이 구조적으로 가능하다는 뜻(국내에서는 시세조종에 해당할 수 있음). 밤사이의 비교 시점(08:00)과 같은 시각이라, 비교 가격은 08:00 직전(07:59) 가격을 씀. 이후 급변 구간을 '가격 불안정'으로 표시하고 최근 30분 중간값으로 보정(5. 해결 방법 '오라클 이상 구간 방어'). 다만 지난 개장 기록 채점은 1시간봉 07:59 종가 그대로라(1분봉은 최근 약 3.5일만 남음) 07:00대에 급변이 있던 날은 걸러지지 않음. 이상 구간 판단 자체의 한계: 최근 30분만 보므로 튄 가격이 30분 넘게 유지되면 정상 가격으로 받아들이고(15분 넘게 이어지면 중간값도 따라감), 기준값(오라클 차이 3%·1분 5%·체결 3건 이하 2%·지수 대비 4%p)은 7/28 사례와 최근 1분봉에 맞춰 정한 값이라 다른 형태의 이상은 놓칠 수 있음
- 토스증권 API는 그룹별 초당 한도(캔들 20, 현재가 15, 지수 캔들 5 등)가 있어 서버가 그룹마다 한도 아래로 줄 세움. 몰리면 국내 시세 갱신이 잠깐 늦어질 수 있음
- 시세차익의 호가 잔량은 받아 오는 호가 단계까지만 반영(보이지 않는 잔량은 모름). 주문 간 시차 비용은 변동성 기반 근사값
- 토스증권 API는 허용 IP에서만 호출 가능. 서버 IP가 고정이어야 함
- 토스증권 토큰은 새로 발급하면 이전 토큰이 바로 무효 → 서버는 한 대(한 프로세스)로 운영
- 토스증권은 동시호가 예상체결가를 주지 않아 개장 직전 예상가는 perp 기준만 표시
- 서버 메모리 캐시라 인스턴스가 바뀌면 백테스트를 다시 계산함 (첫 요청 수 초)
- 하이퍼리퀴드 API는 간격별로 최근 캔들 5,000개만 보관 → 08:00 가격이 필요한 1시간봉은 약 7개월치. 그래서 채점 기간이 2026-04-13부터이고, 서버가 매일 쌓으면 길어짐
- 넥스트레이드 08:00 직후는 거래가 적어 10분 평균도 가끔 튈 수 있음. 현대차처럼 거래가 적은 종목은 영향이 더 큼
- 투자 권유가 아닌 참고 정보. 해외 perp는 국내 투자자 보호 대상이 아님
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。