InvestSkill 설치부터 실전까지 — 런타임 없이 마크다운 26장으로 된 미국 주식 분석 묶음

설치 1.7초, 의존성 0개. 프레임워크 26개가 전부 프롬프트인 도구입니다. 미국 주식으로 제대로 돌려 weltiq 전략 컨테이너까지 고리를 닫아 보고, 이 도구가 비트코인을 거절한 일도 같이 적었습니다.

9편. InvestSkill — 런타임이 없는 미국 주식 분석 프레임워크 26개

이 도구에는 실행할 코드가 없습니다. pip install 도 없고 npm start 도 없습니다. 마크다운 26장이 전부이고, 그걸 읽는 것은 여러분이 이미 쓰고 있는 AI 입니다.

이 글의 완료 조건: 독자는 26장 중 필요한 것을 도구 자신에게 고르게 한 뒤, 그 결론의 숫자를 weltiq 전략 컨테이너의 규칙과 손절로 옮겨 미국 주식 장중에 실제로 걸어 두면 성공입니다.

하는 일 미국 주식을 읽는 분석 프레임워크 26개(+리포트 생성기)를 마크다운으로 줍니다. 10-K 정독·DCF·13F·Form 4·공매도 잔고·실적 콜 분석 — 전부 미국 상장사에만 있는 서류를 다룹니다
맞는 사람 미국 주식 한두 종목을 제대로 읽고 싶은데 무엇부터 봐야 할지 막막한 사람 · 결론이 틀렸을 때 무엇을 보고 알 것인지를 숫자로 적어 두고 싶은 사람
안 맞는 사람 자료를 자동으로 끌어와 주길 기대하는 사람 · 크립토·한국 주식을 보려는 사람 · 나온 신호의 적중률이 궁금한 사람(이 도구는 자기 적중률을 재는 장치가 없습니다)
이 글의 결과물 도구가 스스로 고른 프레임워크 목록, HTML 리포트 한 장, 그리고 그 결론의 가격 세 개가 그대로 걸린 페이퍼 주문과 그 체결 기록
준비물·비용 코드 0원(MIT) · 모델 여러분이 쓰는 AI 의 호출 비용만 · 시세 이 도구는 안 받아 옵니다 · weltiq 5절을 따라 할 때만
시간·난도 설치 1.709초, 첫 분석까지 몇 분. 난도 하 — 깔 것이 마크다운뿐입니다
weltiq 와의 관계 붙습니다. 그쪽의 Thesis Invalidation 절과 이쪽의 필수 게이트가 칸이 1:1 로 맞습니다. 이 연재에서 붙이는 비용이 제일 낮았습니다 — 연산 노드 6개
검증 환경·날짜 2026-09-22 01:40~02:50 KST · Claude Code · 미국 주식 장중
제휴 고지 필자는 weltiq 로부터 이 연재의 원고료를 받습니다. 도구 평가는 필자가 직접 돌린 결과만 씁니다

주문은 전부 weltiq 페이퍼(모의)입니다. 실계좌 주문은 한 건도 없습니다. 여기 나오는 종목·수치는 기능을 확인하기 위한 예시일 뿐 어떤 매매 의견도 아닙니다. 사람 쪽 문장은 실제로 친 명령을 대화로 옮긴 것이고, 출력은 실측이며 숫자는 손대지 않았습니다. 원문 프롬프트·응답·로그는 검증 기록에 있습니다.

이 편에는 부끄러운 대목이 하나 있습니다. 제가 이 연재의 원칙으로 "미션이 참가자를 고른다"고 써 놓고, 바로 다음 회차에서 제가 그걸 어겼습니다. 4절에 그 이야기가 있습니다.


1. 이게 뭔가요

yennanliu/InvestSkill 은 미국 주식 분석 프레임워크 묶음입니다. README 첫 문단이 정체를 한 줄로 정리합니다 — "There is no runtime — every skill is a prompt"(README.md 23행).

정말로 그렇습니다. prompts/ 아래 마크다운 27장(26개 분석 프레임워크 + 리포트 생성기)이 전부고 분석을 수행하는 코드는 한 줄도 없습니다. 그래서 판단하는 자리에 있는 것은 이 저장소가 아니라 이 저장소의 마크다운을 읽은 LLM 입니다. 이 도구를 "돌린다"는 것은 그 마크다운을 원문 그대로 LLM 에 실어 보낸다는 뜻이고, 이 글에서 제가 한 것도 정확히 그것입니다.

항목 값 확인 방법
주소 · 라이선스 github.com/yennanliu/InvestSkill · MIT GitHub API
별 수 ★216 · 포크 51 (관측일 2026-09-22) GitHub API
마지막 푸시 2026-09-21 · 개설 2026-02-16 · 열린 이슈 11 GitHub API
배포 형태 마크다운 27장 (prompts/), 총 55,933 단어 wc -w prompts/*.md
의존성 0개 (파이썬·노드 패키지 하나도 설치하지 않습니다) 2절
대상 시장 미국 주식 전용 — 저장소가 명시합니다 FAQ.md 204행

프레임워크 목록을 보면 겨냥한 자리가 분명합니다 — 10k-digest · dcf-valuation · insider-trading(Form 4) · institutional-ownership(13F) · short-interest · earnings-call-analysis. 이 도구는 시세를 보는 도구가 아니라 기업을 읽는 도구입니다.

그리고 여기가 이 편에서 제일 중요한 대목인데, 출력 형식이 표준화돼 있습니다. 27장 중 22장이 맨 앞에 Data Verification 절을 두고("훈련 데이터의 가격을 쓰지 마라, 못 구하면 경고를 띄워라"), 21장이 맨 뒤에 Thesis Invalidation 절을 두고("이 판단이 뒤집히는 조건을 숫자로 적어라"), 18장이 Signal Output 박스로 끝납니다. 이 표준화가 5절의 전부입니다 — 미리 말씀드리면 Thesis Invalidation 이 weltiq 의 필수 게이트와 칸이 1:1 로 맞습니다.

자리로 보면 이 도구는 판단하는 쪽입니다. 주문을 내는 자리는 아예 없습니다.


2. 설치

준비물은 AI 에이전트 하나뿐입니다(Claude Code·Cursor·Gemini CLI·Copilot·Codex·OpenCode 지원). 0원입니다 — API 키도 구독도 없고, 드는 비용은 여러분 에이전트의 LLM 호출뿐입니다.

이 스킬 깔아 줘: https://github.com/yennanliu/InvestSkill

직접 치고 싶다면
curl -fsSL https://raw.githubusercontent.com/yennanliu/InvestSkill/main/install.sh | bash -s -- -a claude
`-a` 뒤를 `cursor` · `copilot` · `gemini` · `codex` · `opencode` · `any` 로 바꾸면 그 도구용으로 깔립니다. `any` 는 프롬프트 파일만 풀어 놓습니다 — ChatGPT 웹에 붙여 넣어 쓰는 경우입니다.
InvestSkill → claude (/private/tmp/a09-investskill-demo)
· Downloading yennanliu/InvestSkill@main …
✓ 26 analysis frameworks (+ report-generator) → .investskill/prompts/
✓ 27 skills → .claude/skills/

Next: run claude → "Evaluate AAPL with the stock-eval skill"

InvestSkill 설치 실측 출력

설치 명령 한 줄의 실제 출력입니다. ✓ 27 skills 두 줄이 보이면 끝난 것이고, 그 아래 real 0m01.709s 가 걸린 시간입니다. 받아 오는 것이 마크다운뿐이라 가상환경도 패키지도 만들지 않습니다.

1.709초 걸렸고 깔린 것은 마크다운 27장 + 스킬 폴더 27개, 합쳐서 1.0MB 입니다. 자랑이 아니라 구조의 결과입니다 — 설치할 것이 마크다운뿐이니 1.7초가 당연하고, 그만큼 이 도구가 여러분 기계에서 하는 일도 없습니다.

막히는 자리

증상 원인 해결
파이프 실행이 꺼림칙하다 당연합니다 install.sh 는 205줄입니다. 먼저 읽고 판단하세요. README 도 그렇게 권합니다
어느 진입점이 생기는지 모르겠다 에이전트마다 다릅니다 Claude Code 는 .claude/skills/<이름>/SKILL.md, Cursor 는 .cursor/rules/, Gemini 는 GEMINI.md
기존 지시문 파일이 걱정된다 덮어쓰지 않습니다 설치 스크립트가 append 만 합니다. 다시 돌려도 무해합니다
프로젝트가 아니라 계정 전체에 깔고 싶다 기본은 현재 폴더입니다 -g 를 붙이세요
깔았는데 스킬이 안 불린다 가장 흔한 실수 — -g 없이 깔면 그 폴더에서만 인식됩니다 그 폴더에서 에이전트를 띄우거나 -g 로 다시 깔기

3. 첫 결과

먼저 — 대시보드는 없습니다

찾지 마세요. 띄울 서버도, 열 주소도, TUI 도 없습니다. 실행할 프로세스가 없으니 포트도 로그인도 없고, 이 도구의 화면은 여러분이 쓰던 AI 의 대화창 그 자체입니다. 그림이 되는 출력은 하나뿐 — full-report 와 report-generator 가 뽑는 HTML 파일 한 장(output/<TICKER>_report_<날짜>.html).

발동했는지 무엇으로 아나

스킬형 도구는 "깔았는데 안 불린다"가 첫 관문입니다. 확인은 하나 — 제대로 불렸다면 출력 맨 앞에 Data verification 절이 나오고(22장 중 22장이 그렇게 시작합니다) 맨 끝에 Thesis Invalidation 절이나 INVESTMENT SIGNAL 박스가 붙습니다. 둘 다 없고 그냥 줄글이면 안 불린 것입니다.

발동시키는 확실한 방법은 프레임워크 이름을 문장에 넣는 것입니다(/plugin marketplace add yennanliu/InvestSkill 로 깔면 /stock-eval NVDA 같은 슬래시 명령도 씁니다). 이름을 안 대고 "엔비디아 어때?"라고만 하면 에이전트가 스킬을 안 집고 그냥 답해 버리는 일이 잦고, 그게 이 도구가 안 불린 것인지 알아채기 어려운 이유입니다.

제일 작은 예제

NVDA 를 stock-eval 프레임워크로 평가해 줘.

## Data verification

⚠️ Live fundamental and longer-term market data unavailable. Daily bars, 52-week range,
market cap, fundamentals, earnings history, analyst estimates, options data, and ownership
filings were not provided. I will not substitute stale estimates. This is therefore a
short-horizon technical evaluation only.

이렇게 나오면 성공입니다. 저는 이때 실수를 했습니다 — 봉 API 를 부르면서 limit= 이라고 썼는데 실제 파라미터는 hours= 였습니다. 기본값 24시간이 적용돼 오늘 장중 1분봉 219개만 건넸고 일봉은 한 개도 안 줬는데, 도구가 그걸 정확히 잡아냈습니다. 훈련 데이터에 있는 시가총액이나 PER 을 슬쩍 채워 넣는 대신 "그 자료는 안 받았고 나는 추측하지 않겠다" 고 적고 범위를 줄인 겁니다.

제 실수를 고치고(hours=8760) 일봉 19개를 더 줘서 다시 돌렸습니다.

일봉 없이 (1차) 일봉 19개 주고 (2차)
진입 레벨 226.60 226.60
손절 225.70 225.70
목표 228.40 228.40
근거 "세션 고가 226.55 바로 위" "최근 일봉 저항 228.54 바로 아래를 목표로. 일봉 고가 234.75 까지 쫓지는 않는다"

숫자 넷이 하나도 안 바뀌었고 근거만 바뀌었습니다. 우연히 같은 값이 나온 것이고 일봉을 안 본다는 뜻은 아닙니다만, 같은 숫자를 두 가지 근거로 설명할 수 있다는 것은 기억해 둘 만합니다.

InvestSkill 이 일하는 화면

일봉 19개를 준 2차 실행의 실제 출력입니다. 맨 위 ## Data verification 이 "이 도구가 제대로 불렸다"는 표시이고, 맨 아래 EXECUTABLE RULE 블록 다섯 줄이 5절에서 전략 컨테이너로 넘어가는 전부입니다. 가운데 평가 본문은 길어서 줄였습니다.

그림이 되는 출력 하나 — HTML 리포트

방금 분석을 report-generator 로 HTML 리포트로 만들어 줘. 숫자는 지어내지 말고 있는 것만 써.

InvestSkill HTML 리포트

실제로 생성된 HTML 파일을 브라우저로 연 화면입니다(25,764바이트, 파일 하나로 완결). 헤더의 $226.25 · 2026-09-21 12:56 ET 가 넘겨 준 실측값이고, 아래 목차 여덟 칸이 이 도구가 정해 둔 고정 서식입니다 — Data Verification 과 Thesis Invalidation 이 목차에 들어 있는 점을 보세요.

이게 이 도구가 만드는 가장 그림다운 출력입니다. 다만 LLM 이 한 번에 써 낸 HTML 이라 갱신되지 않습니다 — 한 번 찍힌 종이 한 장입니다.


4. 제일 잘 쓰는 법 — 도구에게 "이거 네 일이냐"고 먼저 묻기

프레임워크가 26개나 되면 어느 걸 써야 할지가 첫 문제인데, 이 도구는 그 질문에 자기가 답할 수 있게 돼 있습니다. 각 SKILL.md 맨 위의 한 줄짜리 description 이 곧 디스패치 표면입니다. 카탈로그를 뽑아 도구 자신에게 물었습니다.

직접 치고 싶다면 — 카탈로그 뽑기
for f in .claude/skills/*/SKILL.md; do
  echo "- $(basename $(dirname $f)): $(grep -m1 '^description:' $f | cut -d: -f2-)"
done

너는 InvestSkill 패키지의 디스패처다. 아래는 이 패키지 자신의 프레임워크 카탈로그다(이름 + 그 프레임워크 자신의 설명, 원문). 자기 설명이 이 요청에 해당한다고 말하는 프레임워크만 골라라. 해당하는 것이 하나도 없으면 그렇게 말하고 멈춰라.

[요청 ①] Evaluate NVDA and tell me whether to buy it.
  1. stock-eval          — "comprehensive fundamental and valuation analysis"
  2. fundamental-analysis — "Deep fundamental analysis of US stocks"
  3. stock-valuation      — "Multi-method stock valuation using DCF, ..."

[요청 ②] Trade Bitcoin and make a profit while keeping losses within -2%.
  No framework in this package applies to trading Bitcoin; the available trading
  frameworks are specifically scoped to US stocks or investment portfolios.

[요청 ③] Evaluate Samsung Electronics (005930, KOSPI) and tell me whether to buy it.
  1. full-report  2. financial-report-analyst  3. competitor-analysis
  4. stock-valuation  5. dcf-valuation  6. dividend-analysis
  7. bear-case  8. result-validator

디스패처가 스스로 고르는 화면

같은 카탈로그에 요청만 바꿔 물었을 때의 실제 출력입니다. 위쪽 초록(미국 주식)은 세 개를 정확히 골랐고, 아래쪽 노랑(한국 주식)은 여덟 개를 골랐습니다 — 저장소가 해외 종목을 제외한다고 적어 둔 것과 어긋나는 대목입니다.

①은 정확합니다. ②는 다음 절의 주제입니다. ③은 틀렸습니다 — 삼성전자는 한국 종목이고 저장소 FAQ 는 "International stocks (outside US)" 를 명시적으로 제외하는데 디스패처는 여덟 개를 통과시켰습니다. 13F·Form 4 를 읽는 프레임워크가 한국 종목에서 작동할 리가 없습니다.

그래서 제일 잘 쓰는 법은 "디스패처에게 먼저 묻되, 그 답을 검산하는 것" 입니다. 카탈로그를 읽고 고르는 일은 잘하지만 시장 범위를 거르는 일은 안정적이지 않습니다.

이 도구는 비트코인을 거절했습니다 — 그리고 그게 좋은 신호입니다

여기가 이 편이 쓰이게 된 계기입니다. 같은 연재의 다른 회차 미션이 "비트코인을 거래해서 −2% 안에서 손실을 막으면서 수익을 내줘" 였고, 참가 후보를 고르면서 위와 똑같은 디스패처 프롬프트·카탈로그·모델로 물었습니다.

"No framework in this package applies to trading Bitcoin under a specified maximum loss of -2%." — InvestSkill 디스패처의 출력 원문, 2026-09-21

저장소도 같은 말을 합니다 — "Q: Can I use InvestSkill for crypto/forex/commodities? A: No. InvestSkill is designed specifically for US stocks."(FAQ.md 204~210행)

비트코인 거절 화면

같은 프롬프트에 비트코인 요청을 넣었을 때의 실제 출력입니다. 노란 줄이 도구가 스스로 내놓은 거절문이고, 그 아래가 저장소 FAQ 의 같은 취지 문장입니다. 프레임워크를 하나도 고르지 않고 멈췄다는 점을 보세요.

이건 실패담이 아닙니다. 자기 적용 범위를 알고 "그건 내 일이 아니다"라고 말할 줄 아는 도구는 드물고, LLM 트레이딩 도구 대부분은 무엇을 물어도 그럴듯한 답을 만들어 내는 쪽이라 그게 훨씬 위험합니다. 틀린 것은 도구가 아니라 저였습니다 — "재는 쪽에 그 시장·상품이 있어야 한다", "도구를 먼저 정하고 미션을 맞추면 안 된다"고 써 놓고 제가 어겼습니다. 도구가 저를 멈춰 세운 겁니다.

다만 거절은 매번 일어나지 않습니다

여기서 끝내면 저도 도구를 미화하는 셈이라 같은 질문을 오늘 여섯 번 더 던졌습니다. 프롬프트 한 글자, 카탈로그 한 줄, 모델까지 전부 같게 두고요(카탈로그는 이전 회차 것과 diff 로 대조했습니다).

횟수
"해당하는 프레임워크 없음" 으로 멈춤 2
position-ladder 를 골라 통과시킴 5
합계 (이전 1회 + 오늘 6회, 전부 같은 프롬프트) 7

7번 중 2번만 거절했습니다. 디스패처가 규칙이 아니라 LLM 이니 당연한 결과이고, FAQ 의 단호한 "A: No." 와 실제 동작 사이에 이만큼 틈이 있다는 뜻입니다.

그런데 통과된 쪽을 따라가니 문이 하나 더 있었습니다. 디스패처가 고른 position-ladder 를 원문 그대로 실어 같은 요청을 넣었더니 이번엔 프레임워크 자신의 Data Verification 절이 막았습니다.

"⚠️ Live data unavailable. I cannot verify the current Binance BTCUSDT price, 52-week range, market cap, ATR, or recent market data from this chat. I will not assume a price." — InvestSkill position-ladder 의 출력 원문 (2026-09-22)

이어서 "−2% 가 계좌 전체인지 거래당인지부터 정의해 달라", "BTCUSDT 현물은 마진·파생 없이는 숏을 못 친다"까지 적고 실행 규칙을 끝내 내놓지 않았습니다.

둘째 문 — 프레임워크 자신의 자료 검증

디스패처가 통과시킨 position-ladder 를 실제로 실어 보냈을 때의 출력입니다. 첫 줄 ⚠️ Live data unavailable 이 둘째 문이고, 그 아래로 "−2% 의 정의부터 달라"·"현물은 숏이 안 된다"를 되묻습니다. 채워 넣을 자리(BTCUSDT spot price: …)를 비워서 되돌려준 것이 화면 아래쪽입니다.

문이 둘인 셈입니다. 첫 문(디스패처)은 7번 중 5번 열렸지만 둘째 문(Data Verification)은 닫혀 있었고, 결과적으로 이 도구로 비트코인 규칙을 뽑아낸 적은 없습니다.


5. weltiq 로 옮기기 — 그쪽 서식과 이쪽 게이트가 같은 모양입니다

여기가 이 편의 본론입니다. InvestSkill 의 결론은 글이지 주문도 파라미터 묶음도 아닙니다. 옮기는 일은 "그 글에서 숫자를 꺼내 규칙 문서로 다시 쓰는 것"이고 순서는 넷입니다.

① 규칙 문서로 쓴다   POST /v1/ai/formalize 또는 POST /v1/strategy-rules → 문서 해시
② 근거를 내 말로 쓴다  POST /v1/ai/thesis
③ 중지 조건을 건다    POST /v1/containers (stop_max_loss · stop_after_hours 필수)
④ 돈다              무인. 사람도 InvestSkill 도 꺼져 있어도 컨테이너가 규칙을 지킵니다

②와 ③은 건너뛸 수 없습니다. 실제로 빼고 던져 봤습니다.

# 중지 조건을 빼면
{"detail":[{"type":"missing","loc":["body","stop_max_loss"],"msg":"Field required"},
           {"type":"missing","loc":["body","stop_after_hours"],"msg":"Field required"}]}

# 근거를 안 쓰면
{"detail":{"code":"thesis_required",
 "questions":["이 전략이 수익을 내는 이유를 한 문장으로 쓰세요 (본인의 말로).",
              "어떤 시장 조건에서 이 논리가 깨집니까?",
              "무효 조건(가격 레벨 또는 시점)을 숫자로 지정하세요."]}}

이 두 게이트가 "자율의 테두리"입니다. 그리고 여기가 핵심인데 — 저 세 질문을 InvestSkill 은 이미 자기 서식으로 갖고 있습니다.

게이트가 묻는 것 InvestSkill 이 이미 쓰는 칸
이 전략이 수익을 내는 이유를 한 문장으로 Output Format 1번 Investment Thesis Summary ("2–3 sentences capturing the core bull or bear case")
어떤 시장 조건에서 이 논리가 깨집니까 Thesis Invalidation — "thesis breaks if:"
무효 조건을 숫자로 지정하세요 같은 절이 가격 레벨로 적게 돼 있습니다

실제로 받아 본 출력입니다. 시킨 것은 "네 프레임워크가 정한 마무리 두 절을 채워라"가 전부였고 숫자는 손대지 않았습니다.

## Thesis Invalidation

**If signal is BULLISH — thesis breaks if:**
- NVDA fails to break and hold above $226.60, or closes below the nearby support zone at $225.70.
- Price loses the intraday SMA200 at approximately $224.62 with sustained selling pressure.
- The breakout triggers but reverses below $225.70 before reaching the $228.40 target.
- The order does not trigger before the 2026-09-21 16:00 ET close; cancel the setup rather
  than open a late position.

╔══════════════════════════════════════════════╗
║              INVESTMENT SIGNAL               ║
╠══════════════════════════════════════════════╣
║ Signal: BULLISH   Confidence: LOW            ║
║ Horizon: SHORT    Score: 6.2 / 10            ║
║ Action: BUY       Conviction: WEAK           ║
╚══════════════════════════════════════════════╝

Thesis Invalidation 과 Signal 박스

3절에서 뽑은 HTML 리포트의 아래쪽입니다. 빨간 The thesis breaks if: 다섯 줄이 게이트의 2·3번 질문에 그대로 들어가는 칸이고, 그중 $225.70 이 아래에서 손절가가 됩니다. 아래 검은 박스는 이 도구의 고정 신호 서식이고 — weltiq 쪽으로는 한 칸도 넘어오지 않습니다.**

위 박스의 BULLISH · BUY · 6.2/10 은 전부 그 도구의 출력입니다. weltiq 는 신호도 점수도 내지 않고 저 값이 맞는지에 대해 아무 말도 하지 않습니다 — 하는 일은 저 판단을 비용과 체결이 있는 곳에 놓고 재는 것뿐입니다. 그리고 Confidence: LOW 를 스스로 적었다는 점을 짚어 둡니다. 제가 깎은 것이 아닙니다.

붙이는 비용이 얼마나 낮은가 — 세어 봤습니다

15편의 Moss 와 같은 자로 재 봤습니다. 그 도구는 파라미터 36개를 내놓았고 규칙 문법으로 다시 쓰는 데 연산 노드 277개가 들었는데, InvestSkill 의 결론은 노드 6개였습니다.

nodes=6 rules=2 qty=1 entry>226.60 stop=225.70 tp=228.40

차이는 도구의 우열이 아니라 출력의 종류입니다. Moss 는 "지표와 가중치로 된 전략 엔진"을 내놓고 InvestSkill 은 "가격 세 개와 그게 틀렸다고 판단할 조건" 을 내놓는데, 뒤엣것이 옮기기에는 압도적으로 쌉니다. 대신 잃는 것이 있습니다 — 표준 출력 10칸 중 넘어온 것은 5칸(Investment Thesis Summary · Key Risks · Price Targets · Recommended Entry Zone · Thesis Invalidation)이고, 못 넘어온 5칸(Valuation Assessment · Quality Score · Management Assessment · Analyst Consensus · Signal Output 박스) 중 넷은 기업 가치 판단입니다. 전략 컨테이너는 가격과 수량만 받으므로 "저평가/고평가"나 "Piotroski 점수"를 넣을 칸이 애초에 없고, 다섯 번째인 Signal Output 박스는 칸이 없는 게 아니라 안 쓰는 것입니다 — weltiq 는 의견·점수·등급을 취급하지 않습니다.

그래서 제일 나은 조합은 이것입니다. InvestSkill 에게는 "무엇이 이 판단을 뒤집는가"를 숫자로 적게 하는 일만 시키고 그 숫자를 그대로 중지 조건과 손절로 옮기는 것. 기업 분석 쪽 결론은 넘어오지 않으니 여러분이 읽고 판단할 몫입니다. 이 조합이 해 주지 않는 것은 자료 조달입니다 — 시세도 재무제표도 가져오지 않고, Data Verification 절은 "네가 가져와라"라고 말할 뿐입니다.

한 바퀴 돌려봤습니다 — 미국 주식 장중에

점검 시점은 돌리기 전에 두 번으로 정해 뒀습니다.

① 테두리를 칩니다 — us-equity NVDA 1분봉, 자본 1만 달러, 누적 손실 300 달러에서 중지, 3시간 뒤 자동 종료.

여기서 한 번 막혔습니다. 첫 규칙은 44주였는데(1만 달러의 99.7%) 그대로 올렸더니 주문이 한 건도 안 나갔고, 30일 리플레이로 돌려 보니 원인이 나왔습니다.

"warning": "execution:rejected:1159/1159 — 주문 의도의 80% 넘게 체결되지 않음 (주요 사유: DENY 1159)"
"intent_outcomes": {"DENY": 1159}

진입 의도 1,159건이 전부 거절됐습니다. 당시 기본 주문 한도가 1 로 박혀 있어서입니다. 비트코인 1개는 큰 주문이라 그 숫자가 말이 되지만 주식 1주는 그렇지 않습니다. 그때는 API 키로 올린 전략 문서에 이 한도를 지정할 칸이 아예 없었고, 이 글을 쓰다가 드러난 weltiq 쪽 문제였습니다.

그 뒤 (2026-09-23): 고쳤습니다. 이제 규칙 문서가 선언한 sizing.qty 가 곧 주문 상한입니다 — qty: 44 로 올리면 max_order_qty 도 44 가 됩니다. 아래에 남은 「1주로 줄여서 다시 냈다」는 그날의 실측 그대로 둡니다. 지금 같은 문서를 올리면 44주가 그대로 나갑니다.

그래서 근사하지 않고 도구에게 사실대로 말하고 다시 물었습니다 — "이 엔진은 1주가 넘는 주문을 거절한다". 돌아온 규칙은 가격 세 개가 그대로고 수량만 1주였습니다. 도구의 판단을 제가 고친 것이 아니라, 잘못된 테두리를 고쳐서 도구가 다시 정하게 한 것입니다.

② 도구가 판단하고 weltiq 가 주문을 냅니다 — 규칙 문서(노드 6개) → 근거 → 전략 컨테이너 running(stop={"max_loss":"300","until":"…T19:58:56Z"}). ③ 결과를 받아 읽습니다 — 7분 뒤 조건이 맞아 체결됐습니다.

02:06:11 KST  buy 1 NVDA @ 226.662662  (expected_px 226.63, taker, fee 0E-8 USD)
02:06:11 KST  sell 1 stop_market @ 225.70  (reduce_only, acked)

진입 주문과 보호 손절이 같은 순간에 나갔습니다. 손절가 225.70 은 InvestSkill 이 Thesis Invalidation 에 적은 그 숫자이고 사람이 다시 계산하지 않았습니다.

weltiq 전략 컨테이너 — 고리가 이어진 화면

체결 직후의 컨테이너 상세입니다. 제목 아래 한 줄(진입: (close > 226.60) → … stop=225.70, limit=228.40)이 InvestSkill 의 숫자 그대로이고, running 옆 초록불과 Holding — watching exit conditions 가 무인으로 돌고 있다는 표시입니다. ORDERS 두 줄 중 위가 자동으로 붙은 보호 손절입니다. 계정 식별자는 가렸습니다.

점검 1 (02:42, 미결제 상태) — 기록을 가공 없이 result-validator 프레임워크에 그대로 넣었습니다.

"The position was still open, so the stop-loss and take-profit decisions have not been tested." "No rule change is warranted. The current rule is repeated unchanged below." — result-validator 출력 원문 (신뢰도 63/100 · MEDIUM)

도구가 "안 바꾸겠다"고 답했습니다. 거래가 끝나지도 않았는데 평가익 조금 났다고 규칙을 손대는 건 근거가 없다는 것이고, 대신 숙제를 냈습니다 — "같은 구조를 의미 있는 표본으로 백테스트해 보라."

④ 그 숙제를 그대로 했습니다 — 같은 문서를 30일 리플레이로.

n_bars 7661 · n_fills 709 · n_trades 354
pnl -26.5200280   fees 1.68068977
intent_outcomes: {"accepted": 709, "market_closed": 2}

354번 거래해서 −26.52 달러. 한 주씩만 샀으니 금액은 작지만 부호가 분명하고, ①에서 전부 거절당하던 주문이 수량 1 에서는 709건 전부 체결됐다는 것도 확인됐습니다.

점검 2 (02:44) — 이 기록을 다시 가공 없이 넣었습니다. 이번엔 도구가 바꿨습니다.

"Because the replay invalidates the original rule's demonstrated edge, the validated action is to avoid initiating another long position under that rule. The executable rule below therefore uses a deliberately unreachable breakout threshold as a halt condition rather than pretending the original signal remains investable."

칸 점검 1 점검 2
Signal · Score · Action BULLISH · 6.2/10 · HOLD BEARISH · 2.5/10 · SELL
entry_level 226.60 234.76
stop_loss · take_profit 225.70 · 228.40 234.00 · 235.50

234.76 은 발동하지 않으라고 고른 숫자입니다. 준 일봉 최고가가 234.75 였고, 도구는 그 바로 위 한 틱에 진입선을 올려 자기 규칙을 스스로 정지시켰습니다. 이런 출력을 받으면 손이 근질거립니다 — "이건 사실상 거래 안 하겠다는 거잖아, 좀 완화해 볼까". 안 했습니다. 도구가 낸 결정을 고치지 않았기 때문에 이 표가 의미가 있습니다.

⑤ 다시 주문을 냅니다 — 고친 숫자로 문서를 다시 만들고(노드 6개, 같은 모양), 새 근거를 적고, 새 전략 컨테이너를 올렸습니다. 신호등 초록, "진입 조건 미충족 — 정상 대기". 고리가 닫혔습니다 — 판단 → 규칙 → 상주 실행 → 기록 → 다시 판단 → 다시 상주 실행. 이 고리에서 InvestSkill 이 켜져 있어야 했던 시간은 세 번의 판단 순간뿐입니다. (새 컨테이너는 대기하는 것까지 확인한 뒤 정지·삭제했습니다 — 발동 불가능한 진입선이라 그대로 뒀어도 거래는 나가지 않았을 규칙입니다.)

그 한 주는 어떻게 끝났나

점검 2 에서 새 규칙으로 갈아타면서 이전 컨테이너를 정지시켰고, 정지는 보유분을 청산합니다.

02:06:11 KST  buy  1 @ 226.662662   (expected 226.63)  fee 0E-8
02:45:20 KST  sell 1 @ 227.217274   (expected 227.25)  fee 0.00468068 USD
realized_pnl 0.554612 · fees 0.00468068 → 순 +0.54993132 (+0.0055%)

39분 보유, 한 주, 순이익 55센트입니다. 이 숫자로는 아무것도 증명되지 않습니다 — 도구 자신이 그렇게 적었습니다("a small unrealized gain should not be treated as proof that the rule was profitable"). 값어치 있는 것은 그 옆의 숫자들입니다.

값
왕복 슬리피지 진입 +0.032662 (1.44bp) · 청산 −0.032726 (1.44bp) — 양쪽 다 불리한 쪽
기대 차익 대비 예상대로 됐다면 0.62, 실제 0.554612 → 슬리피지가 10.5%를 가져갔습니다
수수료 매수 0, 매도 0.00468068 USD — 미국 주식은 매도에만 붙는 요율이라 한쪽만 붙습니다

이게 InvestSkill 의 세계에는 없는 숫자입니다. 그쪽은 가격 셋을 내놓을 뿐, 그 가격에 정말 체결되는지·얼마나 밀리는지·비용이 어디서 붙는지는 말할 방법이 없습니다 — 체결기가 없으니까요.

돌리면서 걸린 것들 — 전부 weltiq 쪽입니다

걸린 것 무슨 일이 어떻게 했나
주문 한도 1 당시 기본 주문 상한이 1 이라 44주가 1,159건 전부 거절 테두리를 사실대로 고쳐 도구가 1주로 다시 결정. 그 뒤 2026-09-23 에 고쳤습니다 — 지금은 문서의 sizing.qty 가 곧 주문 상한입니다
상주 엔진이 새 블록을 모름 /v1/ai/formalize 가 고른 price_level·price_exit 블록을 돌고 있던 엔진이 몰라 KeyError: 'price_level' 로 붙지 못함 그 엔진이 아는 문법(노드 6개)으로 같은 규칙을 다시 씀. 엔진이 그 블록이 추가되기 전 코드로 돌고 있었습니다
원장 통화 표기 미국 주식 체결인데 내보내기의 ledger 가 "ccy": "USDT" 로 나옵니다. reconciliation.matched 도 false 이 글에서는 고치지 않았고 그대로 싣습니다. 손익·수수료 숫자 자체는 performance 와 체결 기록이 맞습니다

그리고 제 실수도 하나 — 3절에 적은 대로 봉 API 파라미터를 limit 으로 잘못 써서 도구에게 일봉을 안 줬습니다. 도구가 그걸 잡아 줘서 알았습니다.


6. 써 보니

좋았던 것

아쉬웠던 것

비용

항목 값
코드 0원 (MIT · API 키 0개 · 구독 없음)
모델 여러분 에이전트의 LLM 호출 비용만
시간·디스크 설치 1.709초 · 마크다운 27장 1.0MB

7. 다음 행동

10편은 NautilusTrader(★29.2k)입니다. InvestSkill 이 "런타임이 없는 쪽"의 극단이라면 NautilusTrader 는 정반대 끝 — Rust 코어에 나노초 단위 이벤트 버스를 얹은 실행 엔진이고 프롬프트는 한 장도 없습니다. 다루는 이유는 성능이 아니라 백테스트와 라이브가 같은 코드로 돌아야 한다는 원칙을 먼저 구현해 뒀고, 무엇보다 그렇게 하고도 남는 차이를 자기 문서에 스스로 적어 뒀기 때문입니다.

weltiq 준비 — 3줄 1. 가입: {{CTA_URL}} 2. 마이 → 연결 관리에서 API 키 발급 3. claude mcp add weltiq --header "Authorization: Bearer <키>" https://weltiq.ai/mcp

InvestSkill 이 낸 가격 세 개를 실제 비용과 체결 위에 올려 보실 자리입니다.


모든 명령·출력·숫자는 2026-09-22 에 실제로 돌려서 얻었습니다. 주문은 전부 모의이고 어떤 매매 의견도 아닙니다. 원문 프롬프트·응답·로그는 검증 기록에 있습니다.

토니 브라운 · 2026-09-24