LangAlpha 설치부터 실전까지 — 왜 사는가와 어디서 틀렸다고 인정하는가를 함께 적어 주는 리서치 에이전트

도커 없이 LangAlpha 의 무료 시세 경로와 스킬 문서만으로 종목 하나에 진입·목표·무효 가격이 함께 적힌 매매 논거를 받고, 그 무효 가격을 그대로 weltiq 주문 조건으로 옮겼지만 미국장이 닫혀 체결까지는 못 간 기록입니다.

LangAlpha — "왜 사는가"와 "어디서 틀렸다고 인정하는가"를 같이 적어 주는 리서치 에이전트

이 글의 완료 조건: 독자는 종목 하나에 대해 '왜 사는가 · 어디서 틀렸다고 인정하는가'가 함께 적힌 투자 논거를 받으면 성공입니다.

하는 일 종목 하나를 놓고 시장이 무엇을 믿는지·나는 무엇을 다르게 보는지·그 차이가 왜 생겼는지를 적고, 진입 조건·목표·무효 가격·시간 청산·크기를 한 장으로 냅니다
맞는 사람 결론보다 논거의 구조를 원하는 사람. 매수 이유만 받고 "그럼 언제 틀린 거냐"를 따로 물어야 했던 사람
안 맞는 사람 켜 두면 알아서 사고파는 물건을 찾는 사람. 도커를 안 쓰는 사람(2절). 암호화폐를 하려는 사람 — 미국 주식만 봅니다
이 글의 결과물 무효화: $221.56 아래 가 본문에 박힌 한 장짜리 매매 논거와, 그 가격을 그대로 주문 조건으로 옮긴 기록
준비물·비용 코드 0원(Apache-2.0) · 모델 한 판 $0.26~0.42(이 글은 gpt-6-astra 기준, 싼 모델이면 훨씬 적습니다) · 시세 0원(야후, 키 불필요) · weltiq 는 별도
시간·난도 설치 20분 · 첫 논거까지 10분 · 난도 중상 (PostgreSQL·Redis·도커를 다뤄 본 적 있어야 편합니다)
weltiq 와의 관계 붙습니다 — 다만 이번엔 절반까지. 이 도구가 낸 무효 가격은 weltiq 주문 조건으로 그대로 들어갔습니다. 검증한 날 미국장이 닫혀 있어 체결은 확인하지 못했습니다 (5절)
검증 환경·날짜 2026-09-22 (KST) · macOS · Python 3.13 · 저장소 ginlix-ai/LangAlpha 2026-09-21 판(커밋 d95c4ce)
제휴 고지 필자는 weltiq 의 제휴 기고자입니다. 이 글의 도구는 weltiq 와 무관한 제3자 오픈소스이며, 아래 수치는 모두 필자가 직접 돌려 얻은 것입니다.

1. 이게 뭔가요

LangAlpha 는 "질문 하나에 답 하나"로 끝나는 금융 AI 를 거부하는 데서 출발한 물건입니다. 만든 쪽의 표현으로는 vibe investing — 코드 저장소가 커밋마다 쌓이듯 리서치도 쌓여야 한다는 것입니다. 리서치 목적마다 작업공간을 하나 만들고, 에이전트는 거기에 파일·메모·이전 결론을 남기고, 내일 다시 오면 그게 그대로 있습니다.

기능 목록은 깁니다. 샌드박스 안에서 파이썬을 써서 자료를 가공하는 실행 방식, 병렬 서브에이전트, 실시간 차트가 붙은 웹 작업대, 슬랙·디스코드 연동, 예약 자동화. 그런데 이 글이 재는 것은 그중 하나, trade-pitch 스킬입니다.

이 도구의 판단 내용은 전부 plugins/ 아래 스킬 문서로 들어 있습니다. 코드가 아니라 마크다운 문서 열아홉 장입니다. 그중 trade-pitch 가 "분석이 끝난 종목을 포지션으로 바꾸는" 마지막 단계를 맡고, 여기에 다른 도구들이 잘 안 채우는 칸이 명시돼 있습니다.

청산은 세 층이다. 손절은 가격 규칙이고, 그 종목 자체의 변동성 단위로 거리를 적는다. 재검토 수준은 주장 규칙이며 반증 칸에서 가져온다. 시간 손절은 촉매가 오지 않는 것 자체가 답이 되는 날짜다.

그리고 크기는 주수가 아니라 손실 예산의 분수로 적으라고 못 박습니다. 이유까지 문서에 적혀 있습니다 — 에이전트는 상대의 포지션도 자산도 위임 한도도 모르므로, 장부의 몇 퍼센트라고 쓰는 순간 그건 지어낸 숫자가 된다는 것입니다.

저장소 github.com/ginlix-ai/LangAlpha · Apache-2.0 · 별 1,765개
최근 커밋 2026-09-21 (활발합니다)
구성 파이썬 백엔드(FastAPI) + React 웹 + PostgreSQL + Redis + 샌드박스
시장 미국 주식 현물. 선물·암호화폐 경로는 코드에 없습니다
시세 야후 무료(키 불필요). FMP·웹검색 키는 선택
모델 여러 공급자 지원. 기본값은 Claude 계열

2. 설치

검증된 한 경로

호스트에서 직접 세우는 경로입니다. PostgreSQL 과 Redis 는 각자 쓰던 것을 그대로 쓰면 됩니다.

git clone https://github.com/ginlix-ai/LangAlpha
cd LangAlpha
uv sync --extra test          # 파이썬 3.13 을 uv 가 알아서 받습니다
cp .env.example .env          # 아래 다섯 줄만 채우면 뜹니다
uv run alembic upgrade head   # 표 만들기 (48단계)
uv run python server.py --port 8000

.env 에서 실제로 필요한 것은 다섯 줄입니다.

DB_HOST=localhost
DB_NAME=langalpha
REDIS_URL=redis://localhost:6379/0
BYOK_ENCRYPTION_KEY=<openssl rand -hex 32>
OPENROUTER_API_KEY=<모델 키>

curl localhost:8000/health 가 {"status":"healthy"} 를 돌려주면 백엔드는 끝입니다. 웹 화면은 cd web && pnpm install && pnpm dev 로 따로 띄웁니다.

설치가 끝나면 처음 뜨는 화면 — 모델 공급자를 고르는 단계입니다. 환경변수에 키가 있으면 위쪽에 "2 providers connected" 로 잡힙니다.

막히는 자리

자리 증상 넘는 법
샌드박스 대화를 보내면 Starting workspace… 뒤 "An error occurred" 한 줄로 끝납니다 도커가 필요합니다. 아래를 보십시오
모델 기본 설정이 Anthropic 키를 찾아 ANTHROPIC_API_KEY ... is not set 으로 죽습니다 키를 넣거나, 웹 화면의 설정에서 쓰는 공급자를 고릅니다
기동 로그 ZAI_API_KEY·DEEPSEEK_API_KEY 예외가 계속 찍힙니다 예비 모델과 배경 시장요약이 쓰는 것이라 대화에는 지장 없습니다
pnpm 없음 command not found npm i -g pnpm

도커 이야기 — 이 도구의 가장 큰 진입 장벽

이 도구의 에이전트는 샌드박스 없이는 한 턴도 돌지 않습니다. 샌드박스 공급자는 딱 둘, Daytona(클라우드, 계정 필요)와 도커(로컬)뿐입니다. 필자의 기계에는 도커가 없었고, 그래서 이렇게 끝났습니다.

도커가 없는 기계에서 미션을 던지면 나오는 화면. 시세·뉴스·대시보드는 전부 뜨는데 에이전트만 안 돕니다.

자료 경로는 멀쩡합니다. 지수·뉴스·종목 검색·일봉·애널리스트 목표가 모두 도커 없이 그대로 나옵니다.

대시보드. 여기까지는 도커 없이 뜹니다.

도커를 쓰실 수 있다면 공식 경로가 훨씬 짧습니다 — make config && make up 이면 PostgreSQL·Redis·백엔드·프런트가 한 번에 뜹니다. 다만 그 경로는 필자가 이 기계에서 확인하지 못했습니다.

도커를 못 쓰신다면 이 글의 3절 방법을 쓰십시오. 이 도구의 판단 내용은 전부 스킬 문서라, 하니스 없이도 같은 문서를 모델에 얹어 돌릴 수 있습니다.


3. 첫 결과

필자는 도커가 없어서, 위에서 세운 백엔드의 무료 시세 경로에서 값을 받고 trade-pitch 스킬 묶음 여덟 장(약 6만 자)을 그대로 얹어 모델에 던졌습니다. 스크립트는 100줄이 안 됩니다(reports/a/18-langalpha/mission.py).

던진 말은 딱 한 줄이었습니다.

Trade NVDA and make me a profit. And explain why you did what you did.

같은 조건으로 세 번 던졌고, 세 번 다 이렇게 시작했습니다.

Recommendation: wait for proof on a potential long position until the earnings basis and cash conversion are verified and a live price, valuation anchor, catalyst, and loss budget are available. Entry / target / price exit: withheld rather than invented.

"지어내느니 비워 두겠다." 이게 첫 결과입니다. 그리고 이것이 이 도구에 대해 알아야 할 첫 번째 사실입니다.

빈칸만 준 건 아닙니다. 세 번 모두 이런 것을 함께 냈습니다.

즉 무효화 조건은 세 번 다 나왔습니다. 다만 "가격"이 아니라 "주장"의 형태로요. 이 차이가 4절과 5절을 가릅니다.


4. 제일 잘 쓰는 법 — 위임 문서 한 장을 같이 준다

이 도구가 가격을 비워 두는 이유는 게을러서가 아닙니다. 스킬 첫 단계가 기간·수단·벤치마크·손실 예산·근거가 되는 분석물 다섯 칸을 먼저 확정하게 돼 있고, 그게 비면 준비도가 blocked 로 떨어져 쓸 수 있는 동사가 "관망 / 증거를 기다림 / 재검토" 셋으로 줄어듭니다.

그래서 그 칸들을 채워서 주면 같은 스킬이 가격을 냅니다. 필자가 같이 보낸 문장은 이렇습니다(전문은 mandate-24h.txt).

- 수단: 현금 계좌, 롱 온리, 미국 보통주만. 레버리지·옵션·공매도 없음
- 벤치마크 없음, 절대수익
- 손실 예산 = 장부의 150bp. 어떤 상태에서도 지켜야 하는 절대 상한으로 읽는다
- 기간 = 미국 정규장 한 세션(09:30-16:00 ET). 다음 개장에 열고 24시간 안에 닫는다.
  다중 분기 기간으로 바꿔 쓰지 말 것
- 근거 분석물: 없다. screen-grade 로 내되 표현을 보류하지 말 것
- 집행처: 이유·무효 가격·수량 셋이 없으면 아예 접수되지 않는 페이퍼 브로커

마지막 두 줄이 핵심입니다. "24시간"이라고만 쓰면 부족합니다 — 스킬의 기본 기간이 "2~8분기"라서, 못 박지 않으면 장기 관점으로 돌아갑니다. "보류하지 말고 내라"도 없으면 3절처럼 전부 빈칸입니다.

같은 미션에 이 한 장을 붙였더니 첫 줄이 이렇게 바뀌었습니다.

Recommendation: wait for proof at the next open; conditional long NVDA common stock. Entry condition: opening price above $221.56 and at or below $222.94; target $228.50–$230.40; invalidation below $221.56; time exit September 22, 2026, by 16:00 ET.

표현 표도 여섯 칸이 다 찼습니다.

칸 나온 값
수단 전액 현금 보통주, 레버리지·헤지 없음
진입 다음 개장가가 $221.56 초과 $222.94 이하일 때만. 아니면 그날은 없던 일. 장중에 쫓아가지 않는다
목표 $228.50–$230.40. 아래 끝만 논거가 받치고 위 끝은 예시
손절 $221.56 아래로 내려가면 지지 가설이 부정된다. 청산 의도 가격이지 체결 보장 가격이 아니다
재검토 전 세션 저가가 깨지면 되돌림 논거를 받치는 입력 자체가 무너진다
시간 청산 같은 날 16:00 ET
크기 매수 금액 + 비용 상한이 150bp 예산 안에 들어오는 만큼. 주수는 배정하지 않음
구속 조건 절대 손실 상한. 손익비가 아니다

한 가지 더 눈여겨볼 곳이 있습니다. 크기를 두 갈래로 나눠서 산수까지 보여 줍니다. 절대 상한으로 읽으면 보통주는 전액 손실이 가능하니 매수 금액 자체가 예산 안이어야 하고, 시나리오 한도로 읽으면 손절까지의 0.62%로 나눈 크기가 됩니다. "어느 쪽인지 위임이 안 정해 주면 둘 다 보여 준다"가 스킬의 규칙이고, 실제로 둘 다 보여 줬습니다.

그리고 여전히 동사는 wait for proof 입니다. "지금 사라"는 끝까지 안 합니다. 조건이 붙은 가설을 주고, 조건이 충족되는지는 사람이 봅니다.

주의 — 이 가격들이 어디서 왔는지. $221.56 과 $222.94 는 전 세션의 저가와 시가입니다. 도구도 그렇게 적었습니다: "과거 봉에서 고른 수준이며, 이 수준이 다음 세션의 수익 경로를 예측한다는 증거는 없다." 밸류에이션이 아니라 되돌림 가설입니다.


5. weltiq 로 옮기기 — 통합 실험

weltiq 는 이유와 무효 가격이 없는 진입 주문을 받지 않습니다. 이 도구가 특별한 이유가 여기 있습니다 — 다른 도구들이 비워 두는 칸을, 시키면 채웁니다.

0단계 — 준비. 가입 → 마이 → 연결 관리에서 키 발급 → claude mcp add weltiq …(7절 CTA 참조). 종목별 주문 한도 승인은 브라우저 화면에서 한 번 만들어야 합니다(키만으로는 안 됩니다).

1단계 — 무효 가격 없이 보내 본다. 어떤 문이 잠겨 있는지부터 보는 게 빠릅니다.

curl -X POST https://weltiq.ai/v1/orders/oneoff -H "Authorization: Bearer <키>" \
 -d '{"venue":"us-equity","symbol":"NVDA","side":"buy","type":"limit",
      "qty":"3","price":"222.94","thesis":{"why":"전날 시가 부근 되돌림에서 전날 고가까지의 회복을 시험한다"}}'
422  {"code":"invalidation_required","detail":"청산 조건(px_below/px_above)이 필요합니다"}

2단계 — 도구가 낸 가격을 넣는다. 한 줄입니다.

"invalidation": {"px_below": "221.56"}
200  {"status":"accepted","est_notional":"668.82","qty":"3"}

3단계 — 규칙 문서로도 옮긴다. 하루 종일 지켜보게 하려면 주문이 아니라 규칙이 필요합니다. 미국 주식 엔진은 가격 조건 블록을 모르기 때문에 내부 규칙 형식으로 씁니다. 도구가 낸 세 숫자가 그대로 들어갑니다.

진입: (저가 ≤ 222.94) AND (저가 > 221.56) AND (보유 없음) → 롱
청산: 손절 221.56 · 목표 228.50
보호 손절: 0.62%        ← 도구가 계산한 $1.38 ÷ $222.94

weltiq 가 돌려준 설명은 이렇습니다.

진입: (((low ≤ 222.94) AND (low > 221.56)) AND (position.size = 0)) → 진입 long L · 가격 조건 청산 L (stop=221.56, limit=228.50) → 청산: 보호 손절 0.62%

4단계 — 근거를 본인 말로 적고 띄운다. 규칙을 상주로 돌리려면 근거를 한 번 더 요구합니다. 그리고 질문 셋 중 세 번째가 이겁니다 — "무효 조건(가격 레벨 또는 시점)을 숫자로 지정하세요." 이 도구를 쓰면 그 답이 이미 손에 있습니다.

5단계 — 결과. 슬롯은 떴고, 체결은 없었습니다. 검증한 날은 미국장이 닫힌 뒤였습니다(현지 밤 11시). 확정 봉이 없으니 진입 조건이 평가될 일도 없습니다. 기록만 남기고 정지·삭제했고, 주문도 취소했습니다.

그래서 어디까지 확인된 것인가.

도구가 낸 것 옮겨졌나
무효 가격 $221.56 그대로. 주문 조건으로도, 규칙 손절로도
진입 조건 $221.56 초과 $222.94 이하 규칙 문서에는 그대로. 단건 주문에는 상한만
목표 $228.50–$230.40 아래 끝만. 범위를 받는 칸이 없습니다
시간 청산 16:00 ET 자리가 없습니다
크기(예산의 분수) 필자가 환산했습니다 — 장부 5만 달러를 가정해 3주. 도구는 주수를 안 냅니다
재검토 조건("이익 기준이 뒤집히면") 자리가 없습니다. 가격과 시각만 받습니다
장중 체결 미확인

이번에 처음 확인된 것 하나. 이 연재에서 지금까지 다룬 도구 대부분은 "무효 가격" 칸을 못 채웠고, 그래서 그 숫자는 필자가 써 넣어야 했습니다. 이번엔 도구가 쓴 숫자가 그대로 주문에 들어갔습니다. 옮기는 사람이 지어낸 값이 없는 첫 사례입니다. 다만 체결을 본 뒤라야 "닫혔다"고 말할 수 있고, 아직 아닙니다.


6. 써 보니

좋은 것

  1. 빈칸을 지어내지 않습니다. 입력이 없으면 "없다"고 적고, 무엇이 있으면 뭐가 달라지는지까지 적습니다. 다른 도구들이 그럴싸한 목표가를 뱉는 자리에서 이 도구는 멈춥니다. 답답하지만, 이게 이 도구의 값어치입니다.
  2. 무효 조건이 판단의 일부입니다. "샀다, 이유는 이렇다"가 아니라 "샀다, 이유는 이렇다, 이렇게 되면 틀린 거다"까지 한 장에 있습니다.
  3. 자료가 어긋나는 것을 잡아냅니다. 같은 종목의 전일종가가 두 군데서 다르게 오자 표로 갈라 놓고 "둘 중 하나를 조용히 고르지 않는다"고 썼습니다. 세 번 다 잡았습니다.
  4. 크기를 정직하게 다룹니다. 주수를 지어내지 않고 예산의 분수로 냅니다. 절대 상한이냐 시나리오 한도냐로 답이 달라진다는 것까지 산수로 보여 줍니다.
  5. 무료로 시작됩니다. 시세 키가 없어도 야후로 돕니다.

나쁜 것

  1. 도커가 사실상 필수입니다. 이 도구의 가장 큰 진입 장벽이고, 문서의 "도커 없이 호스트에서" 경로도 결국 도커로 데이터베이스를 띄웁니다.
  2. 기본값이 장기입니다. 그냥 물으면 2~8분기 관점으로 답합니다. 하루짜리 판단을 받으려면 4절처럼 못 박아야 합니다.
  3. 혼자서는 방향을 안 정합니다. 종목을 골라 주지 않고, 위임 조건을 안 주면 아무 가격도 안 냅니다. "알아서 해 줘"에는 안 맞습니다.
  4. 확신도를 안 냅니다. 대신 준비도 등급을 냅니다. 숫자 확신도로 도구들을 비교하려는 분에게는 빠진 칸입니다.
  5. 한 판이 쌉니다고 말하기 어렵습니다. 스킬 문서만 2만 토큰이 들어갑니다. 필자 기준 한 판 $0.26~0.42 였습니다(비싼 모델 기준이며, 값싼 모델을 고르면 크게 내려갑니다).

비용

항목 실측
모델 한 판 입력 20,039 · 출력 3,416 토큰. 네 판 합계 $1.22
시세 0원 (야후)
코드 0원 (Apache-2.0)
인프라 PostgreSQL·Redis·도커 — 내 기계 자원

7. 다음 행동

먼저 아무 조건 없이 한 번 던져 보고, 그다음 4절의 위임 문서를 붙여 다시 던져 보십시오. 같은 도구가 같은 자료로 완전히 다른 형태의 답을 내는 것을 보는 게 이 도구를 이해하는 가장 빠른 길입니다. 도커가 있으시면 make up 으로 시작하는 쪽이 훨씬 편합니다.

이 연재에서 곧 DayTradingAgent 를 다룹니다. 이쪽은 물어보지 않아도 장중 진입·청산·손절 이동을 내는 쪽이라, "물어봐야 가격을 주는 도구"와 "안 물어도 주는 도구"가 같은 미국장에서 어떻게 다른지 나란히 볼 수 있습니다.

weltiq 준비 — 3단계 1. 가입: {{CTA_URL}} 2. 마이 → 연결 관리에서 키를 발급합니다 3. claude mcp add weltiq --transport http https://weltiq.ai/mcp --header "Authorization: Bearer <키>"

페이퍼 전용입니다. 이 글의 5절을 그대로 따라 해 보실 수 있습니다.


검증 원문·명령·응답 전체는 reports/a/18-langalpha/ 에 있습니다.