docs: consolidate implementation audit updates and add restructure plan
Some checks failed
Gitea CI / test (push) Has been cancelled
Some checks failed
Gitea CI / test (push) Has been cancelled
This commit is contained in:
564
docs/ouroboros/80_implementation_audit.md
Normal file
564
docs/ouroboros/80_implementation_audit.md
Normal file
@@ -0,0 +1,564 @@
|
|||||||
|
<!--
|
||||||
|
Doc-ID: DOC-AUDIT-001
|
||||||
|
Version: 1.0.0
|
||||||
|
Status: active
|
||||||
|
Owner: strategy
|
||||||
|
Updated: 2026-02-28
|
||||||
|
-->
|
||||||
|
|
||||||
|
# v2/v3 구현 감사 및 수익률 분석 보고서
|
||||||
|
|
||||||
|
작성일: 2026-02-28
|
||||||
|
대상 기간: 2026-02-25 ~ 2026-02-28 (실거래)
|
||||||
|
분석 브랜치: `feature/v3-session-policy-stream`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 계획 대비 구현 감사
|
||||||
|
|
||||||
|
### 1.1 v2 구현 상태: 100% 완료
|
||||||
|
|
||||||
|
| REQ-ID | 요구사항 | 구현 파일 | 상태 |
|
||||||
|
|--------|----------|-----------|------|
|
||||||
|
| REQ-V2-001 | 4-상태 매도 상태기계 (HOLDING→BE_LOCK→ARMED→EXITED) | `src/strategy/position_state_machine.py` | ✅ 완료 |
|
||||||
|
| REQ-V2-002 | 즉시 최상위 상태 승격 (갭 대응) | `position_state_machine.py:51-70` | ✅ 완료 |
|
||||||
|
| REQ-V2-003 | EXITED 우선 평가 | `position_state_machine.py:38-48` | ✅ 완료 |
|
||||||
|
| REQ-V2-004 | 4중 청산 로직 (Hard/BE/ATR Trailing/Model) | `src/strategy/exit_rules.py` | ✅ 완료 |
|
||||||
|
| REQ-V2-005 | Triple Barrier 라벨링 | `src/analysis/triple_barrier.py` | ✅ 완료 |
|
||||||
|
| REQ-V2-006 | Walk-Forward + Purge/Embargo 검증 | `src/analysis/walk_forward_split.py` | ✅ 완료 |
|
||||||
|
| REQ-V2-007 | 비용/슬리피지/체결실패 모델 필수 | `src/analysis/backtest_cost_guard.py` | ✅ 완료 |
|
||||||
|
| REQ-V2-008 | Kill Switch 실행 순서 (Block→Cancel→Refresh→Reduce→Snapshot) | `src/core/kill_switch.py` | ✅ 완료 |
|
||||||
|
|
||||||
|
### 1.2 v3 구현 상태: ~75% 완료
|
||||||
|
|
||||||
|
| REQ-ID | 요구사항 | 상태 | 갭 설명 |
|
||||||
|
|--------|----------|------|---------|
|
||||||
|
| REQ-V3-001 | 모든 신호/주문/로그에 session_id 포함 | ⚠️ 부분 | 아래 GAP-1, GAP-2 참조 |
|
||||||
|
| REQ-V3-002 | 세션 전환 훅 + 리스크 파라미터 재로딩 | ⚠️ 부분 | 아래 GAP-3 참조 |
|
||||||
|
| REQ-V3-003 | 블랙아웃 윈도우 정책 | ✅ 완료 | `src/core/blackout_manager.py` |
|
||||||
|
| REQ-V3-004 | 블랙아웃 큐 + 복구 시 재검증 | ⚠️ 부분 | 아래 GAP-4 참조 (부분 해소) |
|
||||||
|
| REQ-V3-005 | 저유동 세션 시장가 금지 | ✅ 완료 | `src/core/order_policy.py` |
|
||||||
|
| REQ-V3-006 | 보수적 백테스트 체결 (불리 방향) | ✅ 완료 | `src/analysis/backtest_execution_model.py` |
|
||||||
|
| REQ-V3-007 | FX 손익 분리 (전략 PnL vs 환율 PnL) | ⚠️ 코드 완료 / 운영 미반영 | `src/db.py` 스키마·함수 완료, 운영 데이터 `fx_pnl` 전부 0 |
|
||||||
|
| REQ-V3-008 | 오버나잇 예외 vs Kill Switch 우선순위 | ✅ 완료 | `src/main.py:459-471` |
|
||||||
|
|
||||||
|
### 1.3 운영 거버넌스: ~20% 완료
|
||||||
|
|
||||||
|
| REQ-ID | 요구사항 | 상태 | 갭 설명 |
|
||||||
|
|--------|----------|------|---------|
|
||||||
|
| REQ-OPS-001 | 타임존 명시 (KST/UTC) | ⚠️ 부분 | DB 기록은 UTC, 세션은 KST. 일부 로그에서 타임존 미표기 |
|
||||||
|
| REQ-OPS-002 | 정책 변경 시 레지스트리 업데이트 강제 | ❌ 미구현 | CI 자동 검증 없음 |
|
||||||
|
| REQ-OPS-003 | TASK-REQ 매핑 강제 | ❌ 미구현 | PR 단위 자동 검증 없음 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 구현 갭 상세
|
||||||
|
|
||||||
|
### GAP-1: DecisionLogger에 session_id 미포함 (CRITICAL)
|
||||||
|
|
||||||
|
- **위치**: `src/logging/decision_logger.py:40`
|
||||||
|
- **문제**: `log_decision()` 함수에 `session_id` 파라미터가 없음
|
||||||
|
- **영향**: 어떤 세션에서 전략적 의사결정이 내려졌는지 추적 불가
|
||||||
|
- **요구사항**: REQ-V3-001
|
||||||
|
|
||||||
|
### GAP-2: src/main.py 거래 로그에 session_id 미전달 (CRITICAL)
|
||||||
|
|
||||||
|
- **위치**: `src/main.py` line 1625, 1682, 2769
|
||||||
|
- **문제**: `log_trade()` 호출 시 `session_id` 파라미터를 전달하지 않음
|
||||||
|
- **현상**: 시장 코드 기반 자동 추론에 의존 → 실제 런타임 세션과 불일치 가능
|
||||||
|
- **요구사항**: REQ-V3-001
|
||||||
|
|
||||||
|
### GAP-3: 세션 전환 시 리스크 파라미터 재로딩 없음 (HIGH)
|
||||||
|
|
||||||
|
- **위치**: `src/main.py` 전체
|
||||||
|
- **문제**: 리스크 파라미터가 시작 시 한 번만 로딩되고, 세션 경계 변경 시 재로딩 메커니즘 없음
|
||||||
|
- **영향**: NXT_AFTER(저유동) → KRX_REG(정규장) 전환 시에도 동일 파라미터 사용
|
||||||
|
- **요구사항**: REQ-V3-002
|
||||||
|
|
||||||
|
### GAP-4: 블랙아웃 복구 시 재검증 부분 해소, DB 기록 미구현 (HIGH)
|
||||||
|
|
||||||
|
- **위치**: `src/core/blackout_manager.py:89-96`, `src/main.py:694-791`
|
||||||
|
- **상태**: `pop_recovery_batch()` 자체는 단순 dequeue이나, 실행 경로에서 부분 재검증 수행:
|
||||||
|
- stale BUY 드롭 (포지션 이미 존재 시) — `src/main.py:713-720`
|
||||||
|
- stale SELL 드롭 (포지션 부재 시) — `src/main.py:721-727`
|
||||||
|
- `validate_order_policy()` 호출 — `src/main.py:729-734`
|
||||||
|
- **잔여 갭**: 가격 유효성(시세 변동), 세션 변경에 따른 파라미터 재적용은 미구현
|
||||||
|
- **신규 발견**: 블랙아웃 복구 주문이 `log_trade()` 없이 실행되어 거래 DB에 기록되지 않음 → 성과 리포트 불일치 유발
|
||||||
|
- **요구사항**: REQ-V3-004
|
||||||
|
|
||||||
|
### GAP-5: 시간장벽이 봉 개수 고정 (MEDIUM)
|
||||||
|
|
||||||
|
- **위치**: `src/analysis/triple_barrier.py:19`
|
||||||
|
- **문제**: `max_holding_bars` (고정 봉 수) 사용, v3 계획의 `max_holding_minutes` (캘린더 시간) 미반영
|
||||||
|
- **요구사항**: REQ-V2-005 / v3 확장
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 실거래 수익률 분석
|
||||||
|
|
||||||
|
### 3.1 종합 성적
|
||||||
|
|
||||||
|
| 지표 | 값 |
|
||||||
|
|------|-----|
|
||||||
|
| 총 실현 손익 | **-52,481** (KRW + USD 혼합, 통화 분리 집계는 3.4 참조) |
|
||||||
|
| 총 거래 기록 | 19,130건 (BUY 121, SELL 46, HOLD 18,963) |
|
||||||
|
| 집계 기준 | UTC `2026-02-25T00:00:00` ~ `2026-02-28T00:00:00`, SELL 45건 (기간 외 1건 제외) |
|
||||||
|
| 승률 | **39.1%** (18승 / 46매도, 0손익 포함 기준) |
|
||||||
|
| 평균 수익 거래 | +6,107 |
|
||||||
|
| 평균 손실 거래 | -7,382 |
|
||||||
|
| 최대 수익 거래 | +46,350 KRW (452260 KR) |
|
||||||
|
| 최대 손실 거래 | -26,400 KRW (000370 KR) |
|
||||||
|
| 운영 모드 | LIVE (실계좌) |
|
||||||
|
|
||||||
|
### 3.2 일별 손익
|
||||||
|
|
||||||
|
> 주의: 아래 초기 집계 건수는 DB 실측치와 일부 불일치 (02-26: 문서 10건 vs DB 14건, 02-27: 문서 21건 vs DB 22건).
|
||||||
|
> 정확한 재현은 3.8 표준 집계 SQL 참조.
|
||||||
|
|
||||||
|
| 날짜 | 매도 수 (초기 집계) | 승 | 패 | 일간 손익 |
|
||||||
|
|------|---------------------|----|----|-----------|
|
||||||
|
| 02-25 | 9 | 8 | 1 | +63.21 (USD, 미세 수익) |
|
||||||
|
| 02-26 | 10 | 5 | 5 | **-32,083.40** (KR 대량 손실) |
|
||||||
|
| 02-27 | 21 | 5 | 16 | **-20,461.11** (고빈도 매매, 대부분 손실) |
|
||||||
|
|
||||||
|
### 3.3 시장별 손익
|
||||||
|
|
||||||
|
| 시장 | 매도 수 | 승률 | 총 손익 |
|
||||||
|
|------|---------|------|---------|
|
||||||
|
| **KR** | 17 | 38.5% (0손익 제외, 5/13) | **-56,735 KRW** |
|
||||||
|
| US_AMEX | 12 | 75% | +4,476 USD |
|
||||||
|
| US_NASDAQ | 4 | 0% | -177 USD |
|
||||||
|
| US_NYSE | 13 | 30.8% | -45 USD |
|
||||||
|
|
||||||
|
**KR 시장이 손실의 주 원인.** US는 AMEX 제외 시 대체로 손실 또는 보합.
|
||||||
|
|
||||||
|
### 3.4 재계산 주석 반영 (통화 분리)
|
||||||
|
|
||||||
|
> 산식 주석: 기존 표의 `총 실현 손익 -52,481`은 KRW/USD를 단순 합산한 값으로, 회계적으로 해석 불가.
|
||||||
|
> 아래는 같은 기간(2026-02-25~2026-02-27, SELL 45건)을 통화별로 분리한 결과.
|
||||||
|
|
||||||
|
| 통화 | 매도 수 | 승/패 | 실현 손익 |
|
||||||
|
|------|---------|-------|-----------|
|
||||||
|
| KRW | 17 | 5승 / 8패 (4건 0손익) | **-56,735 KRW** |
|
||||||
|
| USD | 28 | 13승 / 14패 (1건 0손익) | **+4,253.70 USD** |
|
||||||
|
|
||||||
|
### 3.5 재계산 주석 반영 (기존 보유 청산 성과 분리)
|
||||||
|
|
||||||
|
> 분리 기준: 각 SELL의 직전 BUY가 `rationale LIKE '[startup-sync]%'` 인 경우를
|
||||||
|
> `기존 보유(시작 시점 동기화 포지션) 청산`으로 분류.
|
||||||
|
|
||||||
|
| 구분 | 통화 | 매도 수 | 손익 |
|
||||||
|
|------|------|---------|------|
|
||||||
|
| 기존 보유 청산분 | KRW | 10 | **+12,230 KRW** |
|
||||||
|
| 기존 보유 청산분 | USD | 2 | **+21.03 USD** |
|
||||||
|
| 신규/전략 진입분만 | KRW | 7 | **-68,965 KRW** |
|
||||||
|
| 신규/전략 진입분만 | USD | 26 | **+4,232.67 USD** |
|
||||||
|
|
||||||
|
추가로, 요청 취지(“기존 보유 수익 종목 정리 수익 제외”)에 맞춰 **기존 보유 청산 중 수익(+PnL)만 제외**하면:
|
||||||
|
|
||||||
|
- KRW: `-56,735` → **-113,885 KRW** (기존 보유 수익 +57,150 KRW 제거)
|
||||||
|
- USD: `+4,253.70` → **+4,232.67 USD** (기존 보유 수익 +21.03 USD 제거)
|
||||||
|
|
||||||
|
즉, 기존 성과표는 기보유 청산 이익(특히 KR 452260 +46,350 KRW)을 전략 성과에 포함해
|
||||||
|
전략 자체 손익을 과대평가한 상태다.
|
||||||
|
|
||||||
|
### 3.6 데이터 무결성 점검 (모의투자 혼합 여부 + USD 과대수익 원인)
|
||||||
|
|
||||||
|
- `mode` 점검 결과: `live` 19,130건, `paper` 0건
|
||||||
|
→ **모의투자 혼합은 확인되지 않음**.
|
||||||
|
- 다만 USD 손익에는 **체결 매칭 이상치 1건**이 존재:
|
||||||
|
- `CRCA` SELL(15주, $35.14, +4,612.15 USD) vs 직전 BUY(146주, $3.5499)
|
||||||
|
- BUY/SELL 수량 불일치(146→15) 상태에서 PnL이 계산되어, 역분할/동기화 이슈 가능성이 큼.
|
||||||
|
|
||||||
|
보수적 재집계(2026-02-25~2026-02-27, USD SELL 28건):
|
||||||
|
|
||||||
|
| 집계 기준 | USD 손익 | 환산 KRW (참고) | KRW 합산 참고값 |
|
||||||
|
|-----------|----------|-----------------|-----------------|
|
||||||
|
| 원집계 | **+4,253.70 USD** | +6,167,865 | -56,735 + 6,167,865 = **+6,111,130** |
|
||||||
|
| 기존보유(startup-sync) 제외 | **+4,232.67 USD** | +6,137,372 | -68,965 + 6,137,372 = **+6,068,407** |
|
||||||
|
| 수량 일치 체결만 포함 | **-358.45 USD** | -519,753 | -56,735 + (-519,753) = **-576,488** |
|
||||||
|
| 기존보유 제외 + 수량 일치 체결만 포함 | **-379.48 USD** | -550,246 | -68,965 + (-550,246) = **-619,211** |
|
||||||
|
|
||||||
|
> 가정 환율: **1 USD = 1,450 KRW** (2026-02-28 기준 참고 환율).
|
||||||
|
> 환산 KRW 및 합산값은 비교용 보조지표이며, 회계/정산 기준값과는 분리해 해석해야 한다.
|
||||||
|
|
||||||
|
결론적으로 USD 구간의 플러스 성과는 실질적으로 `CRCA` 이상치 1건 영향이 지배적이며,
|
||||||
|
해당 거래를 무결성 필터로 제외하면 USD 성과는 손실 구간으로 전환된다.
|
||||||
|
|
||||||
|
### 3.7 데이터 품질 이슈 및 집계 정의
|
||||||
|
|
||||||
|
#### 3.7.1 기간/건수 표기 (반영 완료)
|
||||||
|
|
||||||
|
- 3.1에 UTC 기준 기간 명시 + SELL 45건(기간 외 1건 제외) 주석 추가.
|
||||||
|
- 3.2 일별 표에 DB 실측치 불일치 주의 문구 추가. 정확한 재현은 3.8 SQL 참조.
|
||||||
|
|
||||||
|
#### 3.7.2 승률 정의 (반영 완료)
|
||||||
|
|
||||||
|
- 종합 승률 39.1%(18/46): 0손익 포함 기준 — 3.1에 명시.
|
||||||
|
- KR 시장 승률 38.5%(5/13): 0손익 제외 기준 — 3.3에 명시.
|
||||||
|
|
||||||
|
#### 3.7.3 startup-sync 중복 기록
|
||||||
|
|
||||||
|
- `BUY + [startup-sync]`가 76건 기록됨(동일 종목 반복 동기화 다수).
|
||||||
|
- `BUY price=0`도 38건 존재해, PnL 매칭 시 원가 기준이 흔들릴 여지가 큼.
|
||||||
|
- 성과 집계 시 `startup-sync`는 별도 레이어(초기 포지션 인식 이벤트)로 분리 저장 권장.
|
||||||
|
- 3.5에서 startup-sync 분리 집계 제공.
|
||||||
|
|
||||||
|
#### 3.7.4 티커-거래소 드리프트 (ROOT-7 반영 완료)
|
||||||
|
|
||||||
|
- 예: `CCUP/CRCA/FIGS/LLY` 등 동일 티커가 `US_AMEX/US_NASDAQ/US_NYSE`에 혼재 기록.
|
||||||
|
- 포지션 키를 `(ticker)`로만 쓰면 오매칭 위험 → ROOT-7으로 등재.
|
||||||
|
|
||||||
|
#### 3.7.5 FX PnL 분리 항목 미활성 (1.2 반영 완료)
|
||||||
|
|
||||||
|
- 스키마상 `strategy_pnl`, `fx_pnl` 컬럼이 있으나 SELL 전체 기준 `fx_pnl`은 전부 0.
|
||||||
|
- 1.2에서 REQ-V3-007 상태를 "⚠️ 코드 완료 / 운영 미반영"으로 변경.
|
||||||
|
|
||||||
|
### 3.8 표준 집계 SQL (재현용)
|
||||||
|
|
||||||
|
아래 SQL을 기준 쿼리로 고정하면, 성과표를 항상 같은 규칙으로 재생산할 수 있다.
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Base: 기간 + LIVE + SELL + 직전 BUY 메타 매칭
|
||||||
|
WITH base AS (
|
||||||
|
SELECT *
|
||||||
|
FROM trades
|
||||||
|
WHERE mode='live'
|
||||||
|
AND action='SELL'
|
||||||
|
AND timestamp >= '2026-02-25T00:00:00+00:00'
|
||||||
|
AND timestamp < '2026-02-28T00:00:00+00:00'
|
||||||
|
),
|
||||||
|
labeled AS (
|
||||||
|
SELECT
|
||||||
|
s.id,
|
||||||
|
s.timestamp,
|
||||||
|
s.stock_code,
|
||||||
|
s.market,
|
||||||
|
s.exchange_code,
|
||||||
|
s.quantity AS sell_qty,
|
||||||
|
s.price AS sell_price,
|
||||||
|
s.pnl,
|
||||||
|
COALESCE((
|
||||||
|
SELECT b.rationale
|
||||||
|
FROM trades b
|
||||||
|
WHERE b.mode='live'
|
||||||
|
AND b.action='BUY'
|
||||||
|
AND b.stock_code=s.stock_code
|
||||||
|
AND b.market=s.market
|
||||||
|
AND b.timestamp < s.timestamp
|
||||||
|
ORDER BY b.timestamp DESC, b.id DESC
|
||||||
|
LIMIT 1
|
||||||
|
), '') AS prev_buy_rationale,
|
||||||
|
(
|
||||||
|
SELECT b.quantity
|
||||||
|
FROM trades b
|
||||||
|
WHERE b.mode='live'
|
||||||
|
AND b.action='BUY'
|
||||||
|
AND b.stock_code=s.stock_code
|
||||||
|
AND b.market=s.market
|
||||||
|
AND b.timestamp < s.timestamp
|
||||||
|
ORDER BY b.timestamp DESC, b.id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) AS prev_buy_qty
|
||||||
|
FROM base s
|
||||||
|
)
|
||||||
|
SELECT * FROM labeled;
|
||||||
|
```
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Q1) 통화 분리 손익 (혼합 금지)
|
||||||
|
WITH base AS (
|
||||||
|
SELECT * FROM trades
|
||||||
|
WHERE mode='live' AND action='SELL'
|
||||||
|
AND timestamp >= '2026-02-25T00:00:00+00:00'
|
||||||
|
AND timestamp < '2026-02-28T00:00:00+00:00'
|
||||||
|
),
|
||||||
|
labeled AS (
|
||||||
|
SELECT s.*,
|
||||||
|
s.quantity AS sell_qty,
|
||||||
|
COALESCE((SELECT b.rationale FROM trades b
|
||||||
|
WHERE b.mode='live' AND b.action='BUY'
|
||||||
|
AND b.stock_code=s.stock_code AND b.market=s.market
|
||||||
|
AND b.timestamp < s.timestamp
|
||||||
|
ORDER BY b.timestamp DESC, b.id DESC LIMIT 1), '') AS prev_buy_rationale,
|
||||||
|
(SELECT b.quantity FROM trades b
|
||||||
|
WHERE b.mode='live' AND b.action='BUY'
|
||||||
|
AND b.stock_code=s.stock_code AND b.market=s.market
|
||||||
|
AND b.timestamp < s.timestamp
|
||||||
|
ORDER BY b.timestamp DESC, b.id DESC LIMIT 1) AS prev_buy_qty
|
||||||
|
FROM base s
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
CASE WHEN market='KR' THEN 'KRW' ELSE 'USD' END AS ccy,
|
||||||
|
COUNT(*) AS sells,
|
||||||
|
ROUND(SUM(pnl),2) AS pnl_sum
|
||||||
|
FROM labeled
|
||||||
|
GROUP BY ccy
|
||||||
|
ORDER BY ccy;
|
||||||
|
```
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Q2) 기존 보유(startup-sync) 제외 성과
|
||||||
|
WITH base AS (
|
||||||
|
SELECT * FROM trades
|
||||||
|
WHERE mode='live' AND action='SELL'
|
||||||
|
AND timestamp >= '2026-02-25T00:00:00+00:00'
|
||||||
|
AND timestamp < '2026-02-28T00:00:00+00:00'
|
||||||
|
),
|
||||||
|
labeled AS (
|
||||||
|
SELECT s.*,
|
||||||
|
s.quantity AS sell_qty,
|
||||||
|
COALESCE((SELECT b.rationale FROM trades b
|
||||||
|
WHERE b.mode='live' AND b.action='BUY'
|
||||||
|
AND b.stock_code=s.stock_code AND b.market=s.market
|
||||||
|
AND b.timestamp < s.timestamp
|
||||||
|
ORDER BY b.timestamp DESC, b.id DESC LIMIT 1), '') AS prev_buy_rationale,
|
||||||
|
(SELECT b.quantity FROM trades b
|
||||||
|
WHERE b.mode='live' AND b.action='BUY'
|
||||||
|
AND b.stock_code=s.stock_code AND b.market=s.market
|
||||||
|
AND b.timestamp < s.timestamp
|
||||||
|
ORDER BY b.timestamp DESC, b.id DESC LIMIT 1) AS prev_buy_qty
|
||||||
|
FROM base s
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
CASE WHEN market='KR' THEN 'KRW' ELSE 'USD' END AS ccy,
|
||||||
|
COUNT(*) AS sells,
|
||||||
|
ROUND(SUM(pnl),2) AS pnl_sum
|
||||||
|
FROM labeled
|
||||||
|
WHERE prev_buy_rationale NOT LIKE '[startup-sync]%'
|
||||||
|
GROUP BY ccy
|
||||||
|
ORDER BY ccy;
|
||||||
|
```
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Q3) 수량 일치 체결만 포함(무결성 필터)
|
||||||
|
WITH base AS (
|
||||||
|
SELECT * FROM trades
|
||||||
|
WHERE mode='live' AND action='SELL'
|
||||||
|
AND timestamp >= '2026-02-25T00:00:00+00:00'
|
||||||
|
AND timestamp < '2026-02-28T00:00:00+00:00'
|
||||||
|
),
|
||||||
|
labeled AS (
|
||||||
|
SELECT s.*,
|
||||||
|
s.quantity AS sell_qty,
|
||||||
|
COALESCE((SELECT b.rationale FROM trades b
|
||||||
|
WHERE b.mode='live' AND b.action='BUY'
|
||||||
|
AND b.stock_code=s.stock_code AND b.market=s.market
|
||||||
|
AND b.timestamp < s.timestamp
|
||||||
|
ORDER BY b.timestamp DESC, b.id DESC LIMIT 1), '') AS prev_buy_rationale,
|
||||||
|
(SELECT b.quantity FROM trades b
|
||||||
|
WHERE b.mode='live' AND b.action='BUY'
|
||||||
|
AND b.stock_code=s.stock_code AND b.market=s.market
|
||||||
|
AND b.timestamp < s.timestamp
|
||||||
|
ORDER BY b.timestamp DESC, b.id DESC LIMIT 1) AS prev_buy_qty
|
||||||
|
FROM base s
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
CASE WHEN market='KR' THEN 'KRW' ELSE 'USD' END AS ccy,
|
||||||
|
COUNT(*) AS sells,
|
||||||
|
ROUND(SUM(pnl),2) AS pnl_sum
|
||||||
|
FROM labeled
|
||||||
|
WHERE prev_buy_qty = sell_qty
|
||||||
|
GROUP BY ccy
|
||||||
|
ORDER BY ccy;
|
||||||
|
```
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Q4) 이상치 목록 (수량 불일치)
|
||||||
|
WITH base AS (
|
||||||
|
SELECT * FROM trades
|
||||||
|
WHERE mode='live' AND action='SELL'
|
||||||
|
AND timestamp >= '2026-02-25T00:00:00+00:00'
|
||||||
|
AND timestamp < '2026-02-28T00:00:00+00:00'
|
||||||
|
),
|
||||||
|
labeled AS (
|
||||||
|
SELECT s.id, s.timestamp, s.stock_code, s.market, s.quantity AS sell_qty, s.pnl,
|
||||||
|
(SELECT b.quantity FROM trades b
|
||||||
|
WHERE b.mode='live' AND b.action='BUY'
|
||||||
|
AND b.stock_code=s.stock_code AND b.market=s.market
|
||||||
|
AND b.timestamp < s.timestamp
|
||||||
|
ORDER BY b.timestamp DESC, b.id DESC LIMIT 1) AS prev_buy_qty
|
||||||
|
FROM base s
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
id, timestamp, stock_code, market, sell_qty, prev_buy_qty, ROUND(pnl,2) AS pnl
|
||||||
|
FROM labeled
|
||||||
|
WHERE prev_buy_qty IS NOT NULL
|
||||||
|
AND prev_buy_qty != sell_qty
|
||||||
|
ORDER BY ABS(pnl) DESC;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 수익률 저조 근본 원인 분석
|
||||||
|
|
||||||
|
### ROOT-1: hard_stop_pct 기본값(-2%)이 KR 소형주 변동성 대비 과소
|
||||||
|
|
||||||
|
- **현재 설정**: `stop_loss_threshold = -2.0` (`src/main.py:511`), staged exit의 `hard_stop_pct`로 전달
|
||||||
|
- **v2 계획**: ATR 기반 동적 trailing stop (ExitPrice = PeakPrice - k × ATR)
|
||||||
|
- **실제 동작**: staged exit는 호출되나, `atr_value`/`pred_down_prob` 등 피처가 0.0으로 공급되어 hard_stop 편향 발동 (ROOT-5 참조)
|
||||||
|
- **증거**:
|
||||||
|
- 000370: 매수 8,040 → 24분 후 -2.74% 손절
|
||||||
|
- 033340: 매수 2,080 → 18분 후 -3.13% 손절
|
||||||
|
- 229000: -3.7%, -3.25%, -3.2% 반복 손절
|
||||||
|
|
||||||
|
### ROOT-2: 동일 종목 반복 매매 (재진입 쿨다운 미구현)
|
||||||
|
|
||||||
|
- **문제**: 손절 후 동일 종목 즉시 재매수 → 고가 재진입 → 재손절 반복
|
||||||
|
- **최악 사례**: 종목 229000
|
||||||
|
| 매수가 | 매도가 | 손익 | 보유 시간 |
|
||||||
|
|--------|--------|------|-----------|
|
||||||
|
| 5,670 | 5,460 | -24,780 | 0.5h |
|
||||||
|
| 5,540 | 5,360 | -21,780 | 0.7h |
|
||||||
|
| 5,310 | 5,580 | +34,020 (승) | 0.8h |
|
||||||
|
| 5,620 | 5,440 | -21,420 | 1.5h |
|
||||||
|
- **순손실**: 하루 한 종목에서 **-33,960 KRW**
|
||||||
|
|
||||||
|
### ROOT-3: 미국 페니스탁/마이크로캡 무분별 진입
|
||||||
|
|
||||||
|
- **문제**: $2 이하 종목에 confidence 85~90으로 진입, 오버나잇 대폭락
|
||||||
|
- **사례**:
|
||||||
|
| 종목 | 손실률 | 보유시간 |
|
||||||
|
|------|--------|----------|
|
||||||
|
| ALBT | -27.7% | ~23h |
|
||||||
|
| SMJF | -15.9% | ~23h |
|
||||||
|
| KAPA | -18.2% | ~23h |
|
||||||
|
| CURX | -10.6% | ~23h |
|
||||||
|
| CELT | -8.3% | ~23h |
|
||||||
|
|
||||||
|
### ROOT-4: 진화 전략 코드 생성기 문법 오류
|
||||||
|
|
||||||
|
- **위치**: `src/strategies/v20260227_*_evolved.py`
|
||||||
|
- **문제**: 중첩 `def evaluate` 정의 (들여쓰기 오류)
|
||||||
|
- **영향**: 런타임 실패 → 기본 전략으로 폴백 → 진화 시스템 사실상 무효
|
||||||
|
|
||||||
|
### ROOT-5: v2 청산 로직이 부분 통합되었으나 실효성 부족 (HIGH)
|
||||||
|
|
||||||
|
- **현재 상태**: `src/main.py:500-583`에서 `evaluate_exit()` 기반 staged exit override가 동작함
|
||||||
|
- 상태기계(HOLDING→BE_LOCK→ARMED→EXITED) 전이 구현
|
||||||
|
- 4중 청산(hard stop, BE lock threat, ATR trailing, model/liquidity exit) 평가
|
||||||
|
- **실효성 문제**:
|
||||||
|
- `hard_stop_pct`에 고정 `-2.0`이 기본값으로 들어가 v2 계획의 ATR 적응형 의도와 괴리
|
||||||
|
- `be_arm_pct`/`arm_pct`가 playbook의 `take_profit_pct`에서 기계적 파생(`* 0.4`)되어 v2 계획의 독립 파라미터 튜닝 불가
|
||||||
|
- `atr_value`, `pred_down_prob` 등 런타임 피처가 대부분 0.0으로 들어와 사실상 hard stop만 발동
|
||||||
|
- **결론**: 코드 통합은 되었으나, 피처 공급과 파라미터 설정이 미비하여 v2 설계 가치가 실현되지 않는 상태
|
||||||
|
|
||||||
|
### ROOT-6: SELL 손익 계산이 부분청산/수량 불일치에 취약 (CRITICAL)
|
||||||
|
|
||||||
|
- **위치**: `src/main.py:1658-1663`, `src/main.py:2755-2760`
|
||||||
|
- **문제**: PnL 계산이 실제 매도 수량(`sell_qty`)이 아닌 직전 BUY의 `buy_qty`를 사용
|
||||||
|
- `trade_pnl = (trade_price - buy_price) * buy_qty`
|
||||||
|
- **영향**: 부분청산, 역분할/액분할, startup-sync 후 수량 드리프트 시 손익 과대/과소 계상
|
||||||
|
- **실증**: CRCA 이상치(BUY 146주 → SELL 15주에서 PnL +4,612 USD) 가 이 버그와 정합
|
||||||
|
|
||||||
|
### ROOT-7: BUY 매칭 키에 exchange_code 미포함 — 잠재 오매칭 리스크 (HIGH)
|
||||||
|
|
||||||
|
- **위치**: `src/db.py:292-313`
|
||||||
|
- **문제**: `get_latest_buy_trade()`가 `(stock_code, market)`만으로 매칭, `exchange_code` 미사용
|
||||||
|
- **성격**: 현재 즉시 발생하는 확정 버그가 아닌, 동일 티커가 다중 거래소에 혼재 기록될 때 증폭되는 구조 리스크
|
||||||
|
- **영향**: 데이터 드리프트 조건(예: CCUP/CRCA 등 다중 exchange 기록)에서 오매칭 → 손익 왜곡 가능
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 수익률 개선 방안
|
||||||
|
|
||||||
|
### 5.1 즉시 적용 가능 (파라미터/로직 수정)
|
||||||
|
|
||||||
|
| 우선순위 | 방안 | 예상 효과 | 난이도 |
|
||||||
|
|----------|------|-----------|--------|
|
||||||
|
| P0 | KR 손절선 확대: -2% → -4~5% 또는 ATR 기반 | 노이즈 손절 대폭 감소 | 낮음 |
|
||||||
|
| P0 | 재진입 쿨다운: 손절 후 동일 종목 1~2시간 매수 차단 | churn & burn 패턴 제거 | 낮음 |
|
||||||
|
| P1 | US 최소 가격 필터: $5 이하 종목 진입 차단 | 페니스탁 대폭락 방지 | 낮음 |
|
||||||
|
| P1 | 진화 전략 코드 생성 시 syntax 검증 추가 | 진화 시스템 정상화 | 낮음 |
|
||||||
|
|
||||||
|
### 5.2 구조적 개선 (아키텍처 변경)
|
||||||
|
|
||||||
|
| 우선순위 | 방안 | 예상 효과 | 난이도 |
|
||||||
|
|----------|------|-----------|--------|
|
||||||
|
| **P0** | **SELL PnL 계산을 sell_qty 기준으로 수정 (ROOT-6)** | 손익 계상 정확도 확보, 이상치 제거 | 낮음 |
|
||||||
|
| **P0** | **v2 staged exit에 실제 피처 공급 (atr_value, pred_down_prob) + 독립 파라미터 설정 (ROOT-5)** | v2 설계 가치 실현, 수익 보호 | 중간 |
|
||||||
|
| P0 | BUY 매칭 키에 exchange_code 추가 (ROOT-7) | 오매칭 방지 | 낮음 |
|
||||||
|
| P0 | 블랙아웃 복구 주문에 `log_trade()` 추가 (GAP-4) | DB/성과 리포트 정합성 | 낮음 |
|
||||||
|
| P1 | 세션 전환 시 리스크 파라미터 동적 재로딩 (GAP-3 해소) | 세션별 최적 파라미터 적용 | 중간 |
|
||||||
|
| P1 | session_id를 거래 로그/의사결정 로그에 명시적 전달 (GAP-1,2 해소) | 세션별 성과 분석 가능 | 낮음 |
|
||||||
|
| P2 | 블랙아웃 복구 시 가격/세션 재검증 강화 (GAP-4 잔여) | 세션 변경 후 무효 주문 방지 | 중간 |
|
||||||
|
|
||||||
|
### 5.3 권장 실행 순서
|
||||||
|
|
||||||
|
```
|
||||||
|
Phase 1 (즉시): 파라미터 조정
|
||||||
|
→ KR 손절 확대 + 재진입 쿨다운 + US 가격 필터
|
||||||
|
→ 예상: 가장 큰 손실 패턴 2개(노이즈 손절, 반복 매매) 즉시 제거
|
||||||
|
|
||||||
|
Phase 2 (단기): 데이터 정합성 + v2 실효화
|
||||||
|
→ SELL PnL을 sell_qty 기준으로 수정
|
||||||
|
→ BUY 매칭 키에 exchange_code 추가
|
||||||
|
→ 블랙아웃 복구 주문 DB 기록 추가
|
||||||
|
→ v2 staged exit에 실제 피처(ATR, pred_down_prob) 공급 + 독립 파라미터 설정
|
||||||
|
→ session_id 명시적 전달
|
||||||
|
→ 예상: 손익 정확도 확보 + 수익 구간 보호 메커니즘 실효화
|
||||||
|
|
||||||
|
Phase 3 (중기): v3 세션 최적화
|
||||||
|
→ 세션 전환 훅 + 파라미터 재로딩
|
||||||
|
→ 블랙아웃 재검증
|
||||||
|
→ 운영 거버넌스 CI 자동화
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 테스트 커버리지 현황
|
||||||
|
|
||||||
|
### 테스트 존재 (통과)
|
||||||
|
|
||||||
|
- ✅ 상태기계 승격 (`test_strategy_state_machine.py`)
|
||||||
|
- ✅ 4중 청산 규칙 (`test_strategy_exit_rules.py`)
|
||||||
|
- ✅ Triple Barrier 라벨링 (`test_triple_barrier.py`)
|
||||||
|
- ✅ Walk-Forward + Purge/Embargo (`test_walk_forward_split.py`)
|
||||||
|
- ✅ 백테스트 비용 검증 (`test_backtest_cost_guard.py`)
|
||||||
|
- ✅ Kill Switch 순서 (`test_kill_switch.py`)
|
||||||
|
- ✅ 블랙아웃 관리 (`test_blackout_manager.py`)
|
||||||
|
- ✅ 주문 정책 저유동 거부 (`test_order_policy.py`)
|
||||||
|
- ✅ FX 손익 분리 (`test_db.py`)
|
||||||
|
|
||||||
|
### 테스트 미존재
|
||||||
|
|
||||||
|
- ❌ 세션 전환 훅 콜백
|
||||||
|
- ❌ 세션 경계 리스크 파라미터 재로딩
|
||||||
|
- ❌ DecisionLogger session_id 캡처
|
||||||
|
- ❌ 실거래 경로 ↔ v2 상태기계 통합 테스트 (피처 공급 포함)
|
||||||
|
- ❌ 블랙아웃 복구 주문의 DB 기록 검증
|
||||||
|
- ❌ SELL PnL 계산 시 수량 불일치 케이스
|
||||||
|
|
||||||
|
### 테스트 존재 (재점검으로 확인)
|
||||||
|
|
||||||
|
- ✅ 블랙아웃 복구 후 유효 intent 실행 (`tests/test_main.py:5811`)
|
||||||
|
- ✅ 블랙아웃 복구 후 정책 거부 intent 드롭 (`tests/test_main.py:5851`)
|
||||||
|
|
||||||
|
### 6.1 재점검 반영 이력 (2026-02-28)
|
||||||
|
|
||||||
|
아래 코멘트들은 코드 대조 검증 후 본문에 반영 완료됨:
|
||||||
|
|
||||||
|
1. ROOT-5: “완전 미통합” → “부분 통합 + 실효성 부족”으로 정정 (본문 반영)
|
||||||
|
2. GAP-4: “재검증 없음” → “부분 해소 + DB 기록 미구현”으로 정정 (본문 반영)
|
||||||
|
3. 블랙아웃 복구 DB 미기록: GAP-4에 통합 + 개선 방안 5.2에 P0 추가
|
||||||
|
4. SELL PnL buy_qty 버그: ROOT-6으로 신규 등재 (CRITICAL)
|
||||||
|
5. BUY 매칭 exchange_code 누락: ROOT-7로 신규 등재 (HIGH)
|
||||||
|
6. 경로 표기: `main.py` → `src/main.py`로 정규화 완료
|
||||||
|
7. 테스트 섹션: 블랙아웃 복구 테스트 존재 확인, “테스트 존재 (재점검)” 항목으로 이동
|
||||||
|
|
||||||
|
### 6.2 정밀 검토 반영 이력 (2026-02-28)
|
||||||
|
|
||||||
|
아래 코멘트들은 검증 후 본문에 반영 완료됨:
|
||||||
|
|
||||||
|
1. 기간 기준 통일: 3.1에 UTC 기준 명시 + SELL 45건(기간 외 1건 제외) 주석 추가
|
||||||
|
2. ROOT-1 ↔ ROOT-5 정합성: ROOT-1 문구를 “staged exit 호출되나 hard_stop 편향”으로 정정
|
||||||
|
3. REQ-V3-007 2단 표기: “⚠️ 코드 완료 / 운영 미반영”으로 상태 변경
|
||||||
|
4. ROOT-7 톤 조정: “잠재 오매칭 리스크”로 표현 변경, 확정 버그 → 구조 리스크로 재분류
|
||||||
|
5. 3.6 USD 손익 표에 환산 KRW(가정 환율 1,450) + KRW 합산 참고값 병기
|
||||||
|
6. 3.2 일별 표에 DB 실측치 불일치 주의 문구 추가
|
||||||
|
7. 3.3 KR 승률에 “0손익 제외” 기준 명시
|
||||||
|
8. 3.7 코멘트들을 세부 항목(3.7.1~3.7.5)으로 정리, 각 항목에 반영 상태 표기
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*끝.*
|
||||||
96
docs/ouroboros/82_doc_restructure_plan.md
Normal file
96
docs/ouroboros/82_doc_restructure_plan.md
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<!--
|
||||||
|
Doc-ID: DOC-PLAN-082
|
||||||
|
Version: 1.0.0
|
||||||
|
Status: draft
|
||||||
|
Owner: strategy
|
||||||
|
Updated: 2026-02-28
|
||||||
|
-->
|
||||||
|
|
||||||
|
# 문서 재구조화 계획: 감사 → 실행 파이프라인
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
80_implementation_audit.md는 v2/v3 구현 감사와 수익률 분석을 수행했으나, 여러 차례 리뷰를 거치면서 리뷰 이력/데이터 품질 논의/SQL 쿼리 등이 혼재되어 **실행 문서로 사용하기 어려운 상태**다.
|
||||||
|
|
||||||
|
목표: 이 감사 결과를 바탕으로 **티켓 생성 → 개발 설계 → 구현/리뷰 → 검증 → 실환경 테스트**까지 일관되게 진행할 수 있는 문서 체계를 만든다.
|
||||||
|
|
||||||
|
## 변경 사항
|
||||||
|
|
||||||
|
### 1. 80_implementation_audit.md 정리 (감사 기록 문서)
|
||||||
|
|
||||||
|
**역할**: 현재 상태의 팩트 기록. "무엇이 문제인가"에만 집중.
|
||||||
|
|
||||||
|
정리 내용:
|
||||||
|
- Section 3: P&L 분석을 핵심 수치만 남기고 간결화
|
||||||
|
- 3.1(종합), 3.3(시장별), 3.4(통화 분리), 3.5(전략 진입분 분리), 3.6(무결성 결론) 유지
|
||||||
|
- 3.2 일별 손익: 주의 문구 제거, 본문으로 통합
|
||||||
|
- 3.7 데이터 품질: 핵심 결론만 남기고 세부 항목 제거
|
||||||
|
- 3.8 SQL: 별도 파일(`scripts/audit_queries.sql`)로 분리, 본문에서 참조만
|
||||||
|
- Section 6.1, 6.2 리뷰 반영 이력: 전부 제거 (git history로 추적 가능)
|
||||||
|
- Section 6 테스트: "재점검으로 확인" 항목을 "테스트 존재" 항목에 통합
|
||||||
|
- 신규 Section 7: 후속 문서 링크 (85_ 참조)
|
||||||
|
|
||||||
|
### 2. 85_loss_recovery_action_plan.md 신규 작성 (실행 계획 문서)
|
||||||
|
|
||||||
|
**역할**: "어떻게 고칠 것인가". 티켓 생성부터 실환경 검증까지의 실행 청사진.
|
||||||
|
|
||||||
|
구조:
|
||||||
|
```
|
||||||
|
## 1. 요약
|
||||||
|
- 목표: 손실 구간 탈출을 위한 7개 ROOT/5개 GAP 해소
|
||||||
|
- 성공 기준 (정량)
|
||||||
|
|
||||||
|
## 2. Phase별 작업 분해
|
||||||
|
### Phase 1: 즉시 파라미터/로직 수정 (손실 출혈 차단)
|
||||||
|
각 항목마다:
|
||||||
|
- ROOT/GAP 참조
|
||||||
|
- Gitea 이슈 제목/설명 템플릿
|
||||||
|
- 변경 대상 파일 + 현재 동작 + 목표 동작
|
||||||
|
- 수용 기준 (acceptance criteria)
|
||||||
|
- 테스트 계획
|
||||||
|
- 의존성/차단 관계
|
||||||
|
|
||||||
|
### Phase 2: 데이터 정합성 + v2 실효화
|
||||||
|
(동일 형식)
|
||||||
|
|
||||||
|
### Phase 3: v3 세션 최적화
|
||||||
|
(동일 형식)
|
||||||
|
|
||||||
|
## 3. 검증 계획
|
||||||
|
- 단위 테스트 기준
|
||||||
|
- 통합 테스트 시나리오 (백테스트 파이프라인 활용)
|
||||||
|
- 실환경 검증: 소액 live 운용으로 직접 검증
|
||||||
|
(paper trading 제외 — 실환경과 괴리가 커 검증 신뢰도 부족)
|
||||||
|
- Phase별 실환경 투입 기준:
|
||||||
|
단위/통합 테스트 통과 → 소액 live → 모니터링 → 정상 확인 후 본운용
|
||||||
|
|
||||||
|
## 4. 의존성 그래프
|
||||||
|
- Phase 간 blocking 관계
|
||||||
|
- Phase 내 작업 순서
|
||||||
|
|
||||||
|
## 5. 롤백 계획
|
||||||
|
- 각 Phase 실패 시 롤백 절차
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. README.md 업데이트
|
||||||
|
|
||||||
|
- 85_ 문서 링크 추가
|
||||||
|
|
||||||
|
## 작업 순서
|
||||||
|
|
||||||
|
1. 80_ 정리 (노이즈 제거, SQL 분리, 리뷰 이력 삭제)
|
||||||
|
2. `scripts/audit_queries.sql` 작성 (80_에서 분리한 SQL)
|
||||||
|
3. 85_ 신규 작성 (실행 계획)
|
||||||
|
4. README.md 업데이트
|
||||||
|
|
||||||
|
## 작성하지 않는 것
|
||||||
|
|
||||||
|
- 30_code_level_work_orders.md, 40_acceptance_and_test_plan.md 업데이트: 85_를 기반으로 실제 구현 시점에 업데이트 (지금은 실행 계획 수립까지만)
|
||||||
|
- 01_requirements_registry.md: ROOT/GAP에서 파생되는 신규 REQ는 구현 착수 시 등록
|
||||||
|
- Gitea 이슈 생성: 85_ 문서 확정 후 별도 진행
|
||||||
|
|
||||||
|
## 검증
|
||||||
|
|
||||||
|
- 80_: 감사 팩트만 남았는지, 리뷰 이력이 제거되었는지 확인
|
||||||
|
- 85_: Phase별 작업이 Gitea 이슈로 바로 전환 가능한 수준인지 확인
|
||||||
|
- 85_ 각 항목에 수용 기준과 테스트 계획이 포함되었는지 확인
|
||||||
@@ -22,6 +22,7 @@ Updated: 2026-02-26
|
|||||||
8. TPM 제어 프로토콜/수용 매트릭스: [50_tpm_control_protocol.md](./50_tpm_control_protocol.md)
|
8. TPM 제어 프로토콜/수용 매트릭스: [50_tpm_control_protocol.md](./50_tpm_control_protocol.md)
|
||||||
9. 저장소 강제 설정 체크리스트: [60_repo_enforcement_checklist.md](./60_repo_enforcement_checklist.md)
|
9. 저장소 강제 설정 체크리스트: [60_repo_enforcement_checklist.md](./60_repo_enforcement_checklist.md)
|
||||||
10. 메인 에이전트 아이디에이션 백로그: [70_main_agent_ideation.md](./70_main_agent_ideation.md)
|
10. 메인 에이전트 아이디에이션 백로그: [70_main_agent_ideation.md](./70_main_agent_ideation.md)
|
||||||
|
11. v2/v3 구현 감사 및 수익률 분석: [80_implementation_audit.md](./80_implementation_audit.md)
|
||||||
|
|
||||||
## 운영 규칙
|
## 운영 규칙
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user