moss-trade-bot-skills 설치부터 실전까지 — 말 한마디로 전략 36칸을 채워 주는 공장
미션 한 문장을 주면 Moss 가 36개 파라미터를 채우고 자기 백테스트로 채점합니다. 그 36개를 weltiq 전략 컨테이너에 실제로 옮겨 보고, 몇 개가 들어가고 몇 개가 남는지 세어 봤습니다.
15편. moss-trade-bot-skills — 말 한마디로 전략 36칸을 채워 주는 공장이 글의 완료 조건: 독자는 미션 한 문장으로 36칸짜리 전략 설정을 받아 내고, 그 설정을 수수료가 있는 다른 엔진에 옮겨 같은 30일을 다시 재 보면 성공입니다.
| 하는 일 | 자연어 한 문장을 받아 36개 파라미터를 전부 채우고, 그 설정으로 자기 백테스트를 돌려 스스로 채점합니다 |
| 맞는 사람 | 전략 아이디어는 있는데 숫자로 옮기는 게 막막한 사람. 그리고 그 초안을 비용이 있는 곳에서 한 번 더 잴 생각이 있는 사람 |
| 안 맞는 사람 | 나온 점수를 그대로 믿고 자금을 태울 사람(자기 채점에 수수료가 없습니다) · 종목을 골라 주기를 기대하는 사람 · 대시보드를 원하는 사람 |
| 이 글의 결과물 | 한 문장으로 받아 낸 36칸, 그 설정의 자기 채점 점수, 같은 30일을 수수료가 있는 엔진에서 다시 잰 결과 |
| 준비물·비용 | 코드 0원(MIT-0) · 모델 에이전트의 LLM 호출(이 글은 $0.005365) · 시세 0원 · weltiq 5절을 따라 할 때만 |
| 시간·난도 | 한 번의 대화로 36칸. 난도 중하 — 에이전트에게 폴더 하나를 놓아 주면 됩니다 |
| weltiq 와의 관계 | 판단만 하고 실행 자리를 비워 둡니다. 그 빈자리에 weltiq 를 넣어 36칸 중 몇 칸이 건너가는지 셌습니다(5절). 다만 상주 되먹임까지는 못 닫았습니다 |
| 검증 환경·날짜 | macOS 26.6.2 · arm64 · Python 3.14 · 스킬 moss-trade-bot-factory-en-1.0.3 · 2026-09-21 20:50~21:20 KST(명령·숫자) / 2026-09-22(화면) |
| 제휴 고지 | 필자는 weltiq 로부터 이 연재의 원고료를 받습니다. 도구 평가는 필자가 직접 돌린 결과만 씁니다 |
사람 쪽 문장은 실제로 친 명령을 대화로 옮긴 것이고, 출력은 실측이며 숫자는 손대지 않았습니다. 줄인 곳은 줄였다고 적었습니다. 주문은 전부 모의이고 실계좌 주문은 한 건도 없습니다. 어떤 매매 의견도 아닙니다. 원문 로그는 검증 기록에 있습니다.
1. 이게 뭔가요
moss-site/moss-trade-bot-skills 는 에이전트 스킬 묶음입니다. 파이썬 라이브러리도 MCP 서버도 아니고, SKILL.md 한 장 + 번들 스크립트로 된 물건입니다. Claude Code·Codex 같은 에이전트에게 "이 스킬 깔아 줘"라고 시키면 그 에이전트가 읽고 따라 하는 지시문이 본체입니다.
그래서 판단하는 자리에 있는 것은 이 저장소의 코드가 아니라, 이 저장소의 지시문을 읽은 LLM 입니다. 코드는 그 LLM 이 채운 숫자를 받아 백테스트를 돌리는 계산기 쪽입니다. 이 구분이 이 글 내내 중요합니다.
하는 일은 셋입니다. ① 사용자가 매매 스타일을 한 문장으로 말한다 ② LLM 이 36개 파라미터를 전부 채운다 — 항목별로 묻지 않고, "추세추종이면 양방향 0.5, 공격적이면 15~25배" 같은 추론 규칙이 지시문에 박혀 있습니다 ③ 그 파라미터로 자기 백테스트를 돌려 스스로 채점한다.
| 항목 | 값 | 확인 방법 |
|---|---|---|
| 주소 | github.com/moss-site/moss-trade-bot-skills |
|
| 라이선스 | MIT-0 (No Attribution — 저작자 표시도 필요 없습니다) | GitHub API |
| 별 수 | ★385 · 포크 34 (관측일 2026-09-21) | GitHub API |
| 마지막 푸시 | 2026-09-09 | GitHub API |
| 개설 | 2026-04-15 · 열린 이슈 2 · 아카이브 아님 | GitHub API |
| 배포 형태 | 저장소 안에 스킬 버전 폴더 12개 (1.0.21 ~ 1.0.27, en-1.0.3) |
ls |
| 파라미터 | 36개 (scripts/params_schema.json) |
아래에서 셉니다 |
저장소 설명에는 "bit-exact between backtest and live execution"(백테스트와 실전 실행이 비트 단위로 같다)이라고 적혀 있습니다. 그 주장이 사실인지는 이 글에서 다루지 않습니다 — 필자는 Moss 의 실전 플랫폼(ai.moss.site)에 붙이지 않았습니다. 잰 것은 "그 설정을 다른 실행기로 옮기면 무슨 일이 일어나는가" 입니다.
2. 설치
준비물은 둘뿐입니다 — 파이썬 3.14(스킬이 자기 폴더 안에 .venv 를 팝니다), 그리고 0원. 에이전트에게 시키는 쪽이 정식 경로입니다.
이렇게 말합니다
직접 치고 싶다면이 스킬 깔아 줘: https://github.com/moss-site/moss-trade-bot-skills/tree/v1.0.28/moss-trade-bot-factory
git clone --depth 1 https://github.com/moss-site/moss-trade-bot-skills
cd moss-trade-bot-skills/moss-trade-bot-factory-en-1.0.3
python3 scripts/setup_env.py
설치가 끝난 화면
설치가 끝난 화면입니다. 보실 곳은 셋 — 맨 위 12 는 저장소 안에 SKILL.md 를 가진 폴더가 열두 개라는 뜻이고(어느 걸 깔지는 바로 아래에서 고릅니다), 가운데 Local virtualenv ready: 와 Only packages from scripts/requirements.txt were installed. 는 이 도구가 자기 폴더 밖을 안 건드렸다는 증거입니다. 그리고 맨 아래 네 줄이 에이전트가 이 폴더를 스킬로 알아보는 자리입니다 — name: 과 user-invocable: true.
선언된 의존성은 네 줄(pandas numpy ccxt scipy)이고 딸려 온 것까지 27개입니다. 설치에 걸린 시간은 재지 않았습니다 — 미확인입니다. 시스템 파이썬에 손대지 않고, 번들 requirements.txt 밖의 패키지를 깔지 않고, 환경변수를 읽지 않습니다.
막히는 자리
| 증상 | 원인 | 해결 |
|---|---|---|
| 어느 폴더를 깔아야 할지 모르겠다 | 버전 폴더가 12개, 게다가 폴더 이름과 스킬 name: 이 따로 놀아 이름이 겹치는 짝이 셋 |
한 번에 한 판만. 영어판이면 moss-trade-bot-factory-en-1.0.3 |
| 에이전트가 스킬을 못 잡는다 | 폴더 위치 | ~/.claude/skills/ 밑에 폴더째. 세션 시작 뒤 그 디렉터리를 새로 만들었다면 껐다 켜야 합니다 |
| 잡혔는지 모르겠다 | 안 잡히면 에이전트가 자기 지식으로 그럴듯한 답을 합니다 | 자국 셋 — .venv 를 깔지 묻는다 · "주 단위 진화를 켤까요?"를 묻는다 · 되묻지 않고 36칸이 한 번에 나온다 |
data_cache/ 가 비어 있다 |
첫 실행 때 받아옵니다 | 정상입니다 |
| 백테스트가 안 돈다 | 시스템 파이썬을 썼을 때 | {스킬폴더}/.venv/bin/python |
3. 첫 결과
대시보드는 없습니다. 웹 UI 도 TUI 도 없고 대화 출력과 터미널 출력이 전부입니다 — 띄울 명령도 주소도 로그인도 없습니다. (만든 쪽의 호스팅 플랫폼 ai.moss.site 에는 대시보드가 있지만 스킬 밖이고, 이 글에서는 붙지 않았습니다.)
제일 작은 예제는 미션 한 문장 주기입니다.
이렇게 말합니다
비트코인을 거래해서 수익을 내줘. 그리고 왜 그렇게 했는지 설명해줘.
그러면 이런 게 돌아옵니다 (실측 — 36개 중 사람이 제일 먼저 보게 되는 칸만 뽑았습니다)
BTC Balanced Trend Compounding (BTC稳健趋势复利策略)
방향 long_bias 0.5 → 양방향
레버리지 base 10x / max 15x
신호 가중치 추세 0.35 · 모멘텀 0.25 · 평균회귀 0.10 · 거래량 0.15 · 변동성 0.15
진입/청산 entry 0.25 / exit 0.10
이동평균 10 / 50 RSI 14 MACD 12/26/9 볼린저 20 × 2.0
손절/익절 ATR × 2.0 / RR 3.0 추적손절 켬 (2% 발동, ATR × 1.5)
롤링 켬 (평가익 30% 에서 50% 재투입, 최대 2회)
장세 민감도 0.65, 장세 바뀌면 청산
Moss 가 36칸을 채워 내놓는 화면
이 글의 대표 그림입니다. 사람이 준 것은 파란 한 줄이 전부이고 나머지가 전부 도구의 출력입니다. 보실 곳은 셋 — 노란 entry_threshold long_bias base_leverage 가 "공격적인가 보수적인가"를 실제로 정하는 칸이고, 빨간 trend_strength_min rsi_overbought rsi_oversold 는 성실히 채워졌지만 엔진이 읽지 않는 세 칸입니다(5절에서 셉니다). 그리고 맨 아래 36 — 항목별로 되묻지 않고 한 번에 다 채워집니다.
그리고 "왜" 를 이 도구 자신의 말로 붙여 줍니다.
"사용자가 구체적인 위험 성향을 제시하지 않았기 때문에, 비트코인의 상승과 하락을 모두 거래하는 중립적 추세추종 전략으로 설정했습니다. … 10배 레버리지와 ATR 기반 손절, 이동 손절을 사용하고 수익이 난 포지션만 제한적으로 롤링해 수익 확대와 손실 관리의 균형을 맞췄습니다." — Moss 의 출력 원문 (2026-09-21)
이렇게 나오면 성공입니다. 36칸이 전부 채워지고, 빠진 칸이 없고, "왜"가 붙어 나옵니다.
이어서 스킬은 자기 백테스트로 스스로 채점합니다. 번들 CSV(2025-10-06 ~ 2026-03-03, BTC/USDT 15분봉 148일, 자본 1만) 결과입니다.
total_return 1.14% sharpe 0.125 max_drawdown 17.88%
win_rate 34.6% profit_factor 1.008 total_trades 280
Moss 자기 백테스트 실행 화면
자기 채점이 도는 화면입니다. 보실 곳은 둘 — 위쪽 2.626 total, 148일치 15분봉이 2.6초에 끝납니다. 그리고 아래쪽 빨간 profit_factor 1.0079… — 1을 겨우 넘깁니다. 이 화면은 같은 파라미터·같은 번들 CSV 로 다음 날 다시 돌려 얻은 것인데, 전날 값과 소수점 끝자리까지 같았습니다. 이 계산기 자체는 결정론입니다.
승률 34.6%, 손익비 1.008. 이 숫자를 기억해 두세요. 바로 다음 절에서 다시 나옵니다.
4. 제일 잘 쓰는 법 — 자기 채점을 한 번 더 재기
이 도구의 진짜 값은 "36칸을 채워 준다"가 아니라 "채우고 스스로 채점한다" 입니다. 그런데 그 채점이 어떤 가정 위에 서 있는지는 아무도 안 봅니다. scripts/core/backtest.py 전체에서 수수료·슬리피지·호가 관련 문자열이 한 건도 나오지 않습니다.
grep -rniE "fee|commission|slippage|taker|maker" core/*.py *.py
# (출력 없음 — 종료 코드 1)
즉 자기 채점은 수수료 0, 슬리피지 0 이고, 손절·익절은 봉 안에서 그 가격에 정확히 체결됩니다. 3절의 손익비 1.008 은 그 세계의 숫자이고, "수수료를 한 푼이라도 내면 마이너스"라는 뜻입니다.
그래서 같은 파라미터·같은 종목·같은 30일을 두 엔진에 넣어 봤습니다. Moss 의 fetch_data.py 로 2026-08-22~09-20 을 새로 받아 Moss 백테스트를 돌리고, 같은 구간을 weltiq 리플레이로 돌렸습니다.
| Moss 자기 채점 | weltiq 리플레이 | |
|---|---|---|
| 기간·종목·봉 | 2026-08-22 ~ 09-20 · BTC/USDT · 15분 | 같음 (2,877봉) |
| 레버리지 | 10배 | 없음 (전략 컨테이너에 칸이 없습니다) |
| 수수료 | 0 | 거래소 프로필 (USDT-M taker 5bp) |
| 체결 | 봉 안에서 손절·익절 가격 그대로 | 봉 마감 기준, 보호 손절만 봉 사이 집행 |
| 거래 수 | 65 | 52 |
| 결과 | −3.02% (PF 0.866, 승률 26.2%) | 실현손익 −98.02 · 수수료 −247.83 → 순 −345.86 (−3.46%) |
수수료 문자열 0건과 두 엔진 대조
보실 곳은 맨 위 한 줄입니다 — 백테스트 엔진 전체에 fee commission slippage taker maker 가 한 건도 없습니다(344줄짜리 파일입니다). 그 아래가 같은 설정을 두 세계에 넣은 결과인데, -3.02% 와 -3.46% 는 비슷해 보여도 각 줄 밑의 작은 글씨가 완전히 다릅니다.
두 숫자가 비슷해 보이지만 속은 완전히 다릅니다. Moss 쪽 −3.02% 는 10배 레버리지로 크게 움직여서 난 손실이고, weltiq 쪽 −3.46% 는 레버리지 없이 냈는데 손실의 70%가 수수료입니다(−345.86 중 −247.83).
체결 시각·수량·가격은 그대로 두고 요율만 갈아 끼워 보면 구조가 더 또렷해집니다(실측, 줄였습니다).
체결 497건 · 회전 237,578 USDT · 실제 수수료 137.68 (평균 5.795bp)
binance-usdm taker 5.0bp → 118.79 (실제 대비 −13.7%)
bybit-linear taker 5.5bp → 130.67 (실제 대비 −5.1%)
전부 메이커로 채워졌다면 → 47.52
가정: 같은 가격·같은 수량, 체결 자체는 다시 시뮬레이션하지 않음
전부 메이커였다면 수수료가 3분의 1 입니다. 즉 이 전략의 비용 구조는 요율보다 시장가로 자주 친다는 쪽이 지배적입니다. 다만 메이커 가정은 계산일 뿐이고 그 호가에 실제로 걸렸을지는 답하지 않습니다(execution_resimulation: false).
안 되는 것 하나: Moss 쪽에 수수료를 넣어 볼 방법이 없습니다. 파라미터에도 코드에도 그 칸이 없습니다.
5. weltiq 로 옮기기 — 통합 실험
사람이 옮기는 순서
Moss 의 결론은 파라미터 36개이지 주문이 아닙니다. 옮기는 일은 "그 숫자들을 규칙 문서로 다시 쓰는 것"이고, 넷이면 끝납니다.
① 규칙 문서로 쓴다 POST /v1/strategy-rules
② 근거를 내 말로 쓴다 POST /v1/ai/thesis
③ 중지 조건을 건다 POST /v1/containers (stop_max_loss · stop_after_hours 필수)
④ 돈다 무인. 사람도 Moss 도 꺼져 있어도 전략 컨테이너가 규칙을 지킵니다
②와 ③은 건너뛸 수 없습니다. 빼고 던지면 중지 조건 쪽은 {"loc":["body","stop_max_loss"],"msg":"Field required"} 가, 근거 쪽은 {"code":"thesis_required"} 와 함께 세 질문이 돌아옵니다 — "이 전략이 수익을 내는 이유를 한 문장으로", "어떤 시장 조건에서 이 논리가 깨집니까", "무효 조건을 숫자로". 이 두 게이트가 자율의 테두리입니다.
36개 중 몇 개가 옮겨지나 — 2개에서 25개로
처음 36개를 템플릿 기반 컨테이너에 옮겼을 때 건너간 것은 fast_ma_period 10 과 slow_ma_period 50 둘뿐이었습니다. 나머지 34개는 근사하지 않고 "칸 없음"으로 기록했습니다.
그 뒤 내부 규칙 문법을 API 키로 제출하는 입구(POST /v1/strategy-rules)가 열려서 같은 36개를 다시 옮겨 봤습니다. Moss 의 결정 함수 core/decision.py 를 읽고 각 파라미터가 실제로 무슨 계산에 들어가는지 확인한 뒤 같은 계산을 weltiq 연산 그래프로 다시 썼습니다 — 값을 눈대중으로 옮긴 것이 아니라 수식을 옮긴 것입니다. 나온 문서는 노드 277개, 주문 규칙 4개 로, 다섯 신호의 가중 합성·장세 변조·ATR 손절·RR 익절·추적 손절이 전부 그 안에 들어 있습니다.
| 개수 | 어떤 칸 | |
|---|---|---|
| 옮겨진 것 | 25 | 신호 가중치 5 · 진입/청산 임계 2 · 방향(long_bias) · 이평 2 · RSI 기간 · MACD 3 · 볼린저 2 · 거래당 위험 · 최대 비중 · ATR 손절 · RR 익절 · 추적손절 3 · 장세 2 |
| 옮기지 못한 것 | 11 | 아래 |
옮기지 못한 11개는 세 종류이고, 이 구분이 중요합니다.
| 개수 | 칸 | 왜 | |
|---|---|---|---|
| Moss 자신도 안 쓰는 칸 | 3 | trend_strength_min rsi_overbought rsi_oversold |
스키마에 있고 LLM 이 채우지만 엔진 코드 어디에서도 읽지 않습니다(참조 0건). 옮길 것이 애초에 없습니다 |
| weltiq 에 칸이 없는 것 | 3 | base_leverage max_leverage supertrend_mult |
레버리지 칸이 없고, 슈퍼트렌드는 재귀 밴드라 허용 연산 목록에 대응이 없습니다 |
| 뜻이 달라지는 것 | 5 | rolling_* 5개 |
단계 진입(최대 3단)은 문법에 있지만, Moss 의 롤링 트리거는 레버리지 증거금 대비 평가익 30% 라 레버리지가 없는 쪽에서는 같은 말이 아닙니다. 게다가 단계 진입은 고정 수량 사이징을 요구해 risk_per_trade 와 둘 중 하나만 됩니다 |
2개 → 25개. 그리고 못 옮긴 11개 중 3개는 Moss 자신의 손실도 아닙니다. 실질적인 빈칸은 8개입니다.
근사한 세 자리는 정확히 적어 둡니다. -
max_position_pct 0.5는 관측일 가격 기준 고정 수량 상한(0.0602 BTC)으로 옮겼습니다. Moss 쪽은 자본 대비 비율이라 가격이 크게 움직이면 어긋납니다 - 볼린저 표준편차가 Moss 는 표본(÷n−1), weltiq 는 모집단(÷n)입니다. 기간 20에서 차이는 작지만 0은 아닙니다 - 장세 판정의 평활(192봉)은 옮기지 않았습니다. Moss 는 장세가 바뀌어도 192봉을 버텨야 인정하고, weltiq 문서는 바뀐 봉에서 바로 인정합니다
그래서 제일 나은 조합은 이것입니다. Moss 에게는 "36칸을 채우는 일"만 시키고, 비용과 체결이 있는 세계에서의 채점을 weltiq 에 맡기는 것. 이 조합이 해 주지 않는 것은 레버리지입니다. Moss 가 낸 10배는 weltiq 쪽에서 1배가 되고, 그래서 두 결과의 손익 크기는 애초에 비교 대상이 아닙니다.
어디까지 돌았나 — 그리고 어디서 멈췄나
옮긴 25개로 규칙 문서를 만들고 테두리를 친 뒤(BTC/USDT 선물, 자본 1만, 누적 손실 200 에서 중지, 2시간 뒤 자동 종료) 컨테이너를 올렸습니다. 30일 리플레이 결과입니다.
n_bars 2877 · n_fills 105 · n_trades 52
pnl -98.02 fees 247.83 (실현손익과 수수료를 나눠 돌려줍니다)
이 원문을 가공 없이 Moss 에게 되돌려주고 다시 판단받았습니다. 사람이 한 일은 옮긴 것뿐입니다.
"외부 기록에서는 52개 거래와 105회 체결로 총 수수료 247.83이 발생했고, 총손익 98.02의 손실보다 수수료 부담이 커 비용과 과도한 거래 빈도가 핵심 문제로 보였다. 레버리지는 해당 venue에서 적용되지 않았고 supertrend와 rolling도 실행되지 않았으므로, 이번 조정은 실제로 적용된 신호와 위험관리 파라미터에 집중했다. 진입 임계값과 이동평균 기간을 소폭 높여 저확신 신호를 줄이고, 손실 위험 및 최대 포지션을 낮췄다. 목표 위험보상비는 조금 높여 거래당 비용을 감당할 수 있는 수익 여지를 확보했다." — Moss 의 출력 원문 (2026-09-21 21:15 KST)
weltiq 기록을 받은 Moss 가 여섯 칸을 고치는 화면
고치는 장면입니다. 위 파란 한 줄이 넘겨준 전부이고(가공 없이 그대로 넘겼습니다), 아래가 도구의 답입니다. 보실 곳은 노랗게 걸린 수수료 라는 말 — 자기 백테스트에는 존재하지도 않는 항목이 여섯 칸 중 다섯 칸의 이유에 들어가 있습니다. 빨간 risk_per_trade 와 max_position_pct 는 Moss 자신이 "반성 때 잠근다"고 적어 둔 칸인데도 바뀌었습니다.
| 칸 | 전 | 후 | Moss 가 밝힌 이유 |
|---|---|---|---|
entry_threshold |
0.25 | 0.275 | "낮은 확신도의 진입과 불필요한 체결을 줄인다" |
fast_ma_period |
10 | 11 | "단기 노이즈에 대한 반응을 소폭 늦춘다" |
slow_ma_period |
50 | 55 | "추세 확인을 강화해 잦은 방향 전환을 줄인다" |
risk_per_trade |
0.08 | 0.072 | "외부 실행에서 손실이 확인된 만큼 거래당 위험을 낮춘다" |
max_position_pct |
0.5 | 0.45 | "포지션 상한을 낮춰 변동성 및 체결 비용 노출을 제한한다" |
tp_rr_ratio |
3.0 | 3.3 | "높은 수수료 부담을 감안해 이익 실현 시 비용을 흡수할 여지를 늘린다" |
여섯 칸 중 다섯 칸의 이유에 "수수료"가 들어 있습니다. 자기 백테스트에는 존재하지도 않는 비용을 보고 고친 것이고, 자기 세계에서는 영원히 나올 수 없는 되먹임입니다. (risk_per_trade 와 max_position_pct 는 Moss 자신의 진화 규칙에서 "성격 파라미터 — 바꿔도 코드가 되돌린다" 로 잠겨 있는 칸인데 Moss 의 LLM 이 바꿨습니다. 필자는 도구가 낸 결정을 고치지 않는다는 원칙대로 그대로 옮겼습니다.)
고친 25칸으로 문서를 다시 만들어 제출하고, 새 근거를 적고, 새 컨테이너를 올렸습니다.
weltiq 전략 컨테이너 상세 — 고친 25칸이 규칙 한 줄로
weltiq 쪽 화면은 이 한 장이면 됩니다. Moss 가 고친 25칸이 규칙 한 줄로 굳어 컨테이너에 붙은 모습입니다. 보실 곳은 셋 — 제목 밑 회색 줄의 0.275 와 × 3.3 이 방금 Moss 가 올린 값 그대로이고, 보호 손절 12% 는 문법상 강제되는 테두리입니다. 그 아래 ai 딱지는 이 컨테이너가 사람 손이 아니라 도구 경로(source=ai)로 만들어졌다는 표시입니다. ORDERS 0 FILLS 0 과 Auto-stop 칸의 user 는 꾸미지 않은 그대로입니다 — 2시간 한도가 차기 전에, 15분봉 워밍업이 끝나기도 전에 사람이 정지시켰다는 뜻입니다.
여기까지가 이 글에서 확인된 것입니다. 판단 → 규칙 → 리플레이 기록 → 다시 판단 → 새 컨테이너 생성.
「고리가 닫혔다」고는 못 씁니다. Moss 에게 되먹인 것은 상주 실행이 남긴 기록이 아니라 30일 리플레이 결과이고, 올린 컨테이너 둘은 둘 다 체결 0 입니다 — 두 번째 것은 15분봉 워밍업이 끝나기도 전에 필자가 정지시켰습니다. 「상주 실행이 남긴 기록을 받아 다시 상주로 실행했다」는 이 글에서 미확인입니다.
고친 설정이 정말 나아졌는지도 재 보지 못했습니다. 두 번째 리플레이부터 주문이 대량 거절됐습니다(1차 accepted 105 → 2차 accepted 55, direction_conflict 166). 같은 종목에 롱과 숏을 동시에 들 수 없게 하는 잠금이 계정 단위로 남는데, 1차가 미청산 포지션으로 끝나면서 롱 쪽 잠금이 풀리지 않았습니다. 오염된 상태에서 나온 두 숫자를 나란히 놓는 것은 비교가 아니므로 미확인으로 둡니다 — weltiq 쪽 알려진 문제입니다.
6. 써 보니
좋았던 것
- 한 문장으로 36칸이 채워집니다. 항목별로 묻지 않는 설계가 과감하고, 실제로 빈칸 없이 나옵니다
- 자기 폴더 밖을 안 건드립니다. 번들
requirements.txt밖의 패키지를 깔지 않고 환경변수를 읽지 않습니다 - "왜"를 항상 붙여 줍니다. 고칠 때도 칸마다 이유를 답니다. 되먹임을 돌리기에 이보다 좋은 출력 형태가 없습니다
- 빠르고 결정론입니다. 148일치 15분봉 백테스트가 2.6초이고, 다음 날 다시 돌려도 소수점 끝자리까지 같았습니다. MIT-0 라 저작자 표시 의무도 없습니다
아쉬웠던 것
- 자기 채점에 수수료와 슬리피지가 없습니다. 손익비 1.008 이 나오는 이유이고, README 나 출력 어디에도 그 사실을 밝히지 않습니다. 제일 큰 약점입니다
- 손절·익절이 봉 안에서 그 가격에 정확히 체결됩니다. 실제 체결과 제일 크게 갈리는 지점인데 가정이 드러나지 않습니다
- 36개 중 3개는 쓰이지도 않습니다.
trend_strength_minrsi_overboughtrsi_oversold를 LLM 이 성실히 채우지만 엔진이 읽지 않습니다. 사용자는 튜닝했다고 믿게 됩니다 - 자기 진화 규칙을 자기 LLM 이 어깁니다. 성격 파라미터는 잠겨 있다고 써 두고 반성 단계에서 두 칸을 바꿨습니다. 밖으로 옮길 때는 사람이 봐야 합니다
비용
| 항목 | 값 |
|---|---|
| 코드·시세 | 0원 (MIT-0) |
| 모델 | 이 글 전체 $0.005365 (에이전트 LLM 호출) |
| 시간 | 미션 한 문장 → 36칸 한 번의 대화 · 자기 백테스트 148일 2.6초 |
안 맞는 분은 나온 점수를 그대로 믿고 자금을 태우실 분입니다. 이 도구의 점수는 수수료가 없는 세계의 점수이고, 그건 도구를 탓할 일이 아니라 점수의 출처를 아는 일입니다.
7. 다음 편 예고
16편은 OpenAlice(★7.1k)입니다.
Moss 가 "36칸을 채워 주고 실행은 자기 플랫폼에 두는" 쪽이었다면, OpenAlice 는 README 가 스스로 "시뮬레이터·페이퍼로 시작하라" 고 적어 둔 물건입니다. 들어가는 자리가 다릅니다 — Moss 는 판단의 출력 형식이 맞물렸고, OpenAlice 는 실행 단계의 순서가 맞물립니다. 그리고 이번 편에서 못 한 왕복 체결이 16편에서는 실제로 납니다.
weltiq 준비 — 3줄 1. 가입: {{CTA_URL}} 2. 마이 → 연결 관리에서 API 키 발급 3.
claude mcp add weltiq --header "Authorization: Bearer <키>" https://weltiq.ai/mcpMoss 가 채운 36칸을 수수료가 있는 세계에서 다시 재 보고 싶으시면 그때 보실 자리입니다.
이 글의 모든 명령·출력·숫자는 2026-09-21(명령)과 2026-09-22(화면)에 실제로 돌려서 얻었습니다. 실제 돈이 오간 주문은 없고 전부 모의입니다. 어떤 매매 의견도 아닙니다. 여기 적지 않은 시행착오·원문 로그·옮기지 못한 칸의 상세는 검증 기록에 있습니다.