# A축 15편 증적 — moss-trade-bot-skills (2026-09-21)

글: [`docs/tutorials/a/15-moss-trade-bot-skills.md`](../../../docs/tutorials/a/15-moss-trade-bot-skills.md)
짝이 되는 글: `docs/tutorials/b/01-mission-btc-24h.md` (B축 1회차 — 같은 도구가 참가자)

실행 시각 2026-09-21 20:50~21:20 KST. 환경: macOS 26.6.2 / arm64, weltiq 웹 `http://localhost:8741`(pid 9827), 엔진 pid 11535.
**B축 1회차 슬롯 4개(`ct_f7a7bec2268493f8` `ct_ccc260c5cbedc733` `ct_a611c6216c9eeb59` `ct_582616181ba60dcc`)는 읽지도 건드리지도 않았습니다** — `76-containers-after.txt` 에 넷 다 `running` 으로 남아 있는 것을 확인했습니다.

## 재사용한 기록 (다시 설치하지 않음)

| | 출처 |
|---|---|
| 설치 로그 (27개 패키지) | `reports/b/01/moss-setup.log` |
| 1차 판단 프롬프트·응답 | `reports/b/01/22-moss-cp0-prompt.txt` · `22-moss-cp0-answer.txt` |
| 1차 파라미터 36개 | `reports/b/01/22-moss-cp0-params.json` |
| Moss 자기 백테스트 (번들 148일 CSV) | `reports/b/01/22-moss-cp0-backtest.json` — return 1.14% · PF 1.008 · 280거래 |
| "36개 중 2개만 옮겨졌다" 기록 | `reports/b/01/23-entrants-and-slots.json` |

## 이 편에서 새로 돌린 것

| 파일 | 무엇 |
|---|---|
| `00-openrouter-key-start.json` · `99-openrouter-key-end.json` | OpenRouter usage 15.359732 → 15.365098 (**실지출 $0.005365**, 상한 $1) |
| `01-github.json` | ★385 · 포크 34 · MIT-0 · pushed 2026-09-09 · 개설 2026-04-15 · 열린 이슈 2 |
| `build_rules.py` | Moss `core/decision.py` 를 weltiq `slot_rules` 연산 그래프로 옮기는 변환기 (노드 277 · 주문 규칙 4) |
| `10-rules-doc-cp0.json` · `11-rules-submit-cp0.json` | 1차 36칸 → doc_hash `981c8477…` |
| `20-btc15m-30d.csv` | Moss `fetch_data.py` 로 받은 2026-08-22~09-20 BTC/USDT 15m 2,880봉 (Binance UM) |
| `21-moss-own-backtest-30d.json` | **Moss 자기 채점, 같은 30일**: −3.02% · PF 0.866 · 승률 26.2% · 65거래 |
| `12-backtest-720h.json` | **weltiq 리플레이, 같은 30일** (오염 전 1회차): 2,877봉 · 105체결 · 52거래 · 실현 −98.02 · 수수료 247.83 · `intent_outcomes {accepted:105}` |
| `30-thesis.json` · `31-container.json` · `32-export-t0.json` · `33-slot-stop.json` | 점검용 슬롯 `ct_1e6e7e2a18582e38` 생성 → 내보내기 → **정지** |
| `40-moss-cp1-prompt.txt` · `40-moss-cp1-answer.txt` · `40-moss-cp1-raw.json` | 우리 기록을 가공 없이 물려준 Moss 의 재판단 (모델 `openai/gpt-5.6-luna`, 비용 $0.00254875) |
| `41-moss-cp1-params.json` | 고쳐진 36칸 (6칸 변경) |
| `10-rules-doc-cp1.json` · `11-rules-submit-cp1.json` | 2차 36칸 → doc_hash `cf298083…` |
| `50-backtest-cp0.json` · `50-backtest-cp1.json` | **오염된 재측정** — 아래 「방향권 잔류」 참조 |
| `60-fees-compare.json` | S9: 체결 497건 · 실제 수수료 137.68 · 전부 메이커 가정 47.52 |
| `70-no-stop-condition.json` · `71-no-thesis.json` | 게이트 확인 — 중지 조건 없으면 422, 근거 없으면 `thesis_required` |
| `72-thesis-cp1.json` · `73-container-cp1.json` · `74-export-cp1.json` · `75-stop-cp1.json` | 재주문 슬롯 `ct_6639c43c171b4234` 생성 → **정지** |
| `76-containers-after.txt` | 정지 확인 + B축 슬롯 4개 무사 확인 |

## 36개 중 25개 — 세부

**옮겨진 25개**: `trend_weight` `momentum_weight` `mean_revert_weight` `volume_weight` `volatility_weight` `entry_threshold` `exit_threshold` `long_bias` `fast_ma_period` `slow_ma_period` `rsi_period` `macd_fast` `macd_slow` `macd_signal` `bb_period` `bb_std` `risk_per_trade` `max_position_pct` `sl_atr_mult` `tp_rr_ratio` `trailing_enabled` `trailing_activation_pct` `trailing_distance_atr` `regime_sensitivity` `exit_on_regime_change`

**못 옮긴 11개**

| 종류 | 칸 | 이유 |
|---|---|---|
| Moss 자신도 안 씀 (참조 0건) | `trend_strength_min` `rsi_overbought` `rsi_oversold` | 스키마에만 있고 엔진 코드가 읽지 않음 |
| 우리 칸 없음 | `base_leverage` `max_leverage` | 슬롯에 레버리지 필드가 없음 |
| 우리 문법 없음 | `supertrend_mult` | 슈퍼트렌드는 재귀 밴드 — 허용 연산 목록에 대응 없음 |
| 뜻이 달라짐 | `rolling_enabled` `rolling_trigger_pct` `rolling_reinvest_pct` `rolling_max_times` `rolling_move_stop` | 트리거가 증거금 대비 평가익이라 무레버리지에서 같은 말이 아님. 또한 `add` 단계 진입은 고정 수량 사이징을 요구해 `risk_per_trade` 와 배타 |

**옮기면서 생긴 차이 (근사한 곳)**

- `max_position_pct 0.5` → 관측일 가격 83,000 기준 고정 수량 상한 0.0602 BTC. Moss 는 자본 대비 비율
- 볼린저 표준편차: Moss = 표본(pandas `.std()`, ÷n−1) / weltiq = 모집단(÷n)
- 장세 평활 `--regime-min-duration 192` 미적용
- 추세 하위신호의 슈퍼트렌드 표(0.30)는 **빼고** EMA(0.40) + DI(0.30) 두 표만 사용

## 제품 과제 — 방향권 잔류 (재현됨)

같은 `doc_hash` 를 같은 구간에 두 번 리플레이하면 두 번째부터 주문이 대량 거절됩니다.

```
1회차: {"accepted": 105}
2회차: {"accepted": 55,  "direction_conflict": 166}
3회차: {"accepted": 43,  "direction_conflict": 126}   # cp1 문서
```

원인: `Gateway._acquire_lease` 의 방향권이 `(portfolio_id, mode, venue, symbol)` 로 DB 에 지속되고, `portfolio_id` 는 **계정당 하나**입니다(`mode=backtest`). 1회차 리플레이가 미청산 포지션으로 끝나면서 롱 방향 임대의 노출이 0으로 내려가지 않아, 이후 모든 리플레이의 숏 진입이 `direction_conflict` 로 거절됩니다. 상주 슬롯과는 무관합니다(슬롯을 정지시킨 뒤에도 같았습니다).

**결과**: 고친 설정(cp1)이 정말 나아졌는지는 **미확인**. 글에도 그렇게 적었습니다.

## 다른 한계

- `POST /v1/backtest` 는 합계만 돌려주고 **청산 사유별 내역을 주지 않습니다.** Moss 의 반성 절차(`evolution_guide.md`)가 요구하는 `exit_reasons` 를 물려줄 수 없었습니다. 내역을 주는 `POST /v1/backtests` 작업 API 는 이 환경에서 워커가 안 떠 있어 `queued` 에서 진행되지 않았습니다(작업은 취소했습니다)
- 15분봉 전략이라 워밍업(느린 이평 50봉 + 장세 48봉)이 24시간을 넘어, 상주 슬롯에서 난 체결은 **0건**입니다. S5·S7 은 그래서 못 했습니다

## 화면 캡처 (2026-09-22 추가 — BLOG_GUIDE §3.3)

`make_shots.py` 로 만든다. 터미널 캡처는 **실측 출력 원문**을 고정폭으로 그린 것이고 글자는 손대지 않았다.

| 파일 | 자리 | 출처 |
|---|---|---|
| `shots/01-install.png` | 2절 | `reports/b/01/moss-setup.log` + 스킬 폴더 실측 (`ls -d */SKILL.md \| wc -l` → 12, `head -4 SKILL.md`) |
| `shots/02-params-36.png` | 3절 **대표 그림** | `reports/b/01/22-moss-cp0-answer.txt` 원문 |
| `shots/03-self-backtest.png` | 3절 | 번들 `run_backtest.py` 를 2026-09-22 에 같은 params·같은 148일 CSV 로 **재실행** — `2.626 total`, 결과는 `22-moss-cp0-backtest.json` 과 소수점 끝자리까지 동일 |
| `shots/04-no-fee-in-engine.png` | 4절 | `grep -rniE` 실측(0건) + `21-moss-own-backtest-30d.json` · `12-backtest-720h.json` |
| `shots/05-moss-revision.png` | 5-3 | `40-moss-cp1-answer.txt` 원문 |
| `shots/06-weltiq-slot.png` | 5-3 | weltiq 웹 UI 실제 화면 (`ct_6639c43c171b4234`, 읽기 프록시 9030). 계정 식별자 블러 |

도구 화면 5 : 우리 화면 1. 돌고 있는 슬롯 12개는 읽지도 건드리지도 않았다.

## 2026-09-22 본문 정정 두 건

1. **4절 `grep` 명령** — `grep -rni "fee|commission|…"` 로 적혀 있었다. BRE 라 `|` 가 리터럴로 잡혀 **출력이 없는 이유가 달라진다**(찾는 문자열 자체가 없어서가 아니라, 다섯 단어를 한 번도 안 찾아서). `-E` 를 넣어 `grep -rniE` 로 고쳤다. 고친 명령으로 다시 돌려도 결과는 같다 — `core/*.py *.py` 전체에서 0건, 종료 코드 1.
2. **5-3 ② 의 `doc_hash`** — `981c84…` 로 적혀 있었으나 슬롯 `ct_1e6e7e2a18582e38` 이 실제로 들고 뜬 문서는 `f980faf8…` 이다(`30-thesis.json` · `32-export-t0.json` · 현재 `GET /v1/containers/{id}` 모두 일치). `11-rules-submit-cp0.json` 의 `981c84…` 는 같은 변환기를 한 번 더 돌려 남긴 기록이다 — `10-rules-doc-cp0.json` 을 2026-09-22 에 재제출하니 `981c8477…` 이 그대로 나왔다. 본문은 슬롯이 들고 있는 값으로 고치고, 어긋남을 각주로 남겼다. (cp1 쪽 `cf2980…` 은 제출·thesis·컨테이너가 모두 일치해 그대로 둔다.)

## 2026-09-24 v2 재편 때 본문에서 내린 것

기사를 독자판(≤3,000어절)으로 재편하면서 본문에서 뺀 사실들. **숫자·명령·실패 기록은 하나도 버리지 않았고, 여기로 옮겼다.**

### 스킬 발동 조건 (3절에서 요약만 남김)

- `skill.yaml` 이 선언한 방아쇠 단어 **여섯**: `create bot` · `backtest` · `trading bot` · `evolve` · `strategy tuning` · `live trading`. 한국어 입력도 발동하지만 "봇"·"백테스트"·"전략" 중 하나를 넣는 쪽이 안전하다
- **이름이 겹치는 짝 셋** (폴더명 ≠ 스킬 `name:`)
  - `1.0.21` · `1.0.22` → 둘 다 `moss-trade-bot-factory-1.0.22-zh`
  - `1.0.23` · `1.0.23.1` → 둘 다 `moss-trade-bot-factory-1.0.3`
  - `1.0.26` · `1.0.27` → 둘 다 `moss-trade-bot-factory`
- 저장소를 받은 자리에 두고 경로만 알려 줘도 동작하지만 매번 경로를 말해 줘야 한다
- 막히는 자리 한 줄 삭제: **검증 업로드가 거절된다** — 이중언어 필드(`*_i18n.zh/en`)가 없으면 서버가 거절한다. 이 글에서는 업로드를 하지 않았다

### 돌리지 않은 시나리오 (4절 목록 통째로 내림)

| | 판정 |
|---|---|
| S6 고리 한 바퀴 | **일부만** — 되먹인 것은 30일 리플레이 기록이고 상주 기록이 아니다 |
| S5 주문 한 번 왕복 | 컨테이너 생성으로 갈음. 15분봉 워밍업(느린 이평 50봉 + 장세 48봉)이 24시간을 넘어 상주 체결 **0건** |
| S7 중지 조건 발동 | 위와 같은 이유로 손실이 안 나 **발동 못 시킴**. 중지 조건이 없으면 컨테이너가 아예 안 뜬다는 것만 확인 |
| S8 끊고 다시 붙이기 | 이 편에서는 안 함 |
| S1·S2 종목 보기 | 시세를 보여 주는 도구가 아님 — 해당 없음 |
| S3 내 기록 복기 | 5절 되먹임이 그 자리를 대신 |
| S4 여러 종목 훑기 | 종목을 고르지 않는다(`BTC/USDT` 고정) — 해당 없음 |
| S10 나란히 비교 | 다른 트랙 |

### 그 밖에 뺀 문장

- 6절 단점에서 뺀 한 줄: 저장소가 **수익률 리더보드**를 운영한다. weltiq 는 그것을 하지 않는다 — 우열이 아니라 방침의 차이
- 5절에서 뺀 한 줄: "Moss 의 레버리지 판단을 재고 싶으면 이 조합으로는 안 된다"
- 5-3 의 `doc_hash` 어긋남 각주(`981c84…` vs `f980faf8…`)는 위 「2026-09-22 본문 정정 두 건」 2번에 이미 있으므로 본문에서 뺐다
