과학기술인공제회(SEMA) DC형 퇴직연금을 위한 AI 멀티에이전트 포트폴리오 가이드입니다. 거시경제 분석부터 펀드 선별, 규제 검증, 환각(hallucination) 방지 검증까지 하나의 명령으로 수행하고, 그 결과를 실제 SEMA 시스템에 입력하는 단계까지 함께 도와주는 것을 목표로 합니다.
이 프로젝트가 도와주는 일
- 나에게 맞는 DC형 퇴직연금 포트폴리오를 분석·추천받기
- DC형 규제(위험자산 70% 한도 등) 준수 여부를 자동 검증
- 완성된 포트폴리오를 과학기술인공제회 포털에 직접 입력할 때 옆에서 도와주기
🔓 공개 저장소입니다. 개인정보(투자자 프로필·잔고·실제 분석 산출물)는 저장소에 포함되지 않으며, 로컬의
confidentialData/디렉토리(gitignore 대상)에만 보관됩니다.
이 프로젝트의 메인 기능은 SEMA DC형 퇴직연금 포트폴리오 생성입니다. 주식·ETF 상담과 개별 기업 리서치는 같은 환각 방지 설계를 공유하는 추가(보조) 기능입니다.
| 하고 싶은 일 | 사용하는 명령 / 에이전트 | 결과물 |
|---|---|---|
| 내 퇴직연금 포트폴리오 구성 | /investments-portfolio:portfolio-analyze |
5단계 분석 보고서(거시경제 → 펀드 → 규제 → 검증 → 요약) |
| 하고 싶은 일 | 사용하는 명령 / 에이전트 | 결과물 |
|---|---|---|
| 주식·ETF 투자 상담 | /stock-consultation:stock-consult |
스크리닝·밸류에이션·반론·검증 상담 보고서 |
| 개별 기업 리서치 | @equity-research 에이전트 (티커와 함께 호출) |
기관급 리서치 리포트 |
| 퇴직연금 세금 상담 | /pension-tax-advisor:tax-consult |
납입→운용→수령 절세 상담, 3중 검증, 보류 안전 |
⚙️ 공용 엔진 —
macro-analysis(지수·금리·섹터·리스크·리더십)는 위 기능들이 내부에서 호출하는 공용 거시경제 분석 엔진으로, 사용자가 직접 실행하는 기능이 아닙니다.
핵심 설계 원칙은 환각 방지입니다. 모든 수치는 출처를 명시하고, 3개 출처 교차검증·출력 검증 에이전트를 거칩니다.
- Claude Code (플러그인/마켓플레이스 지원 버전)
- Python 3 (펀드 데이터 업데이트 시) — 대부분 표준 라이브러리만 사용
- openpyxl (xlsx → CSV 변환 시에만 필요):
pip install openpyxl
이 저장소는 Claude Code 마켓플레이스 + 5개 플러그인을 .claude/plugins/에 내장(vendoring)하고 있습니다.
.claude/settings.json에 마켓플레이스(extraKnownMarketplaces)와 활성 플러그인(enabledPlugins, 5개 모두 true)이 등록되어 있어,
프로젝트를 열고 폴더를 신뢰(trust)하면 Claude Code가 자동으로 설치를 안내합니다.
수동으로 등록하려면:
/plugin marketplace add ./.claude/plugins
이후 pension-sema-guide 마켓플레이스의 5개 플러그인(investments-portfolio, macro-analysis, stock-consultation, equity-research, pension-tax-advisor)이 활성화됩니다.
portfolio-analyze 명령에 투자자 프로필을 함께 입력하여 실행합니다.
명령은 입력한 프롬프트에서 생년·투자 성향 등 투자자 정보를 직접 파싱합니다(별도 파일을 읽지 않습니다).
/investments-portfolio:portfolio-analyze 나를 위한 새로운 포트폴리오를 구성해줘.
| 항목 | 내용 |
|------|------|
| **생년** | (예: 1985년) |
| **은퇴 예정** | 65세 |
| **투자 성향** | 공격형 (장기투자) |
| **위험 수용도** | 높음 (단기 손실 감내 가능) |
💡 프로필을 매번 입력하기 번거롭다면
confidentialData/investor-profile.md(gitignore 대상)에 저장해 두고 복사해 붙여넣으세요. 단, 명령이 이 파일을 자동으로 읽지는 않으므로 실행할 때 반드시 프롬프트에 프로필을 포함해야 합니다.
명령을 실행하면 아래 5단계 멀티에이전트 워크플로우가 순차 실행되어, 추천 펀드 목록·비중·규제 준수 여부·신뢰도 점수가 담긴
최종 보고서가 생성됩니다. 산출물은 개인정보를 포함하므로 confidentialData/에 저장됩니다.
공개 예시는 portfolios/samples/sample-aggressive/에서 익명화된 형태로 확인할 수 있습니다:
portfolios/samples/sample-aggressive/
├── 00-macro-outlook.md # 거시경제 전망 + 자산배분 권고
├── 01-fund-analysis.md # 펀드 선별 및 비중 배분
├── 02-compliance-report.md # DC형 규제 준수 검증
├── 03-output-verification.md # 환각 방지·출처 검증, 신뢰도 점수
├── 04-portfolio-summary.md # 최종 통합 보고서 (추천 펀드 표 + 실행 체크리스트)
├── index-data.json # 시장 지수 스냅샷 (근거 데이터)
├── rate-analysis.json # 금리/환율 분석 근거
├── risk-analysis.json # 리스크/시나리오 분석 근거
└── sector-analysis.json # 섹터 전망 분석 근거
최종 보고서(04-portfolio-summary.md)에는 추천 펀드명 + 비중 표와 실행 체크리스트가 들어 있어,
이 표를 그대로 들고 SEMA 포털에 입력하면 됩니다.
분석으로 끝이 아닙니다. 이 프로젝트의 최종 목적은 추천 포트폴리오를 실제 과학기술인공제회 DC형 퇴직연금 포털에 정확히 입력하는 것입니다. 그런데 보고서는 목표 비중(%)·금액으로 적혀 있는 반면, 포털 입력 화면은 비율(%)·좌수 단위로 동작하고 정수만 허용되거나, 매수비율 합이 정확히 100%가 되어야 하는 등 현장에서 숫자를 다시 환산·계산해야 하는 순간이 많습니다. 이때 포털 화면을 그대로 복사해 붙여넣고 에이전트와 함께 계산·검산하며 입력하세요. 에이전트는 보고서의 목표 비중을 포털 입력 단위(비율·좌수·정수 %)로 옮기는 환산 작업을 도와줄 것입니다.
포털 화면(매도/매수, 부담금 설정)을 그대로 복사해 붙여넣고, 아래 같은 계산을 요청하세요.
| 입력 중 상황 | 에이전트에게 이렇게 요청 |
|---|---|
| 포털이금액이 아니라 비율(%)로만 매도/매수됨 | "이 펀드를 목표 비중만 남기고 팔 거야. 매도 비율 몇 %로 입력해야 해?" → (매도금액 ÷ 평가금액) 환산 |
| 포털이정수 %만 입력 가능 | "환산하니 26.6%인데 정수만 돼. 26%와 27% 중 목표 금액에 더 가까운 건?" |
| **매수비율 합이 정확히 100%**여야 함 | "매도 재원을 이 펀드들에 목표 비중대로 나눌 건데, 정수 %로 합이 딱 100% 되게 배분해줘." |
| 입력값이 맞는지검산 | "방금 매도 화면에 입력한 값이야(표 붙여넣기). 매도예상금액이 내 목표랑 맞는지 검산해줘." |
| 빠진 펀드·현금 드래그 점검 | "매수 목록에 이거 넣었는데, 합이 100% 안 되거나 빠진 펀드 있어? 안 사고 남는 예수금 생겨?" |
| 부담금(향후 납입금) 투자비율 설정 | "'부담금 투자비율 설정' 화면이야. 기본·일시전환·경영성과 3칸을 목표 비중에 맞게 채워줘. 합 100%·위험자산 70% 이하로." |
| 위험자산 70% 게이트에 막힘 | "위험자산이 정확히 70%라 포털이 한도 초과로 막아. 어느 펀드를 1%만 줄이면 통과돼?" |
- "이 펀드 평가금액이 ○○원이고 목표는 10%만 남기는 거야. 포털은 비율 매도니까 몇 %로 팔아야 해?"
- "매수 재원을 이 7개 펀드에 목표 비중대로 나눌 건데, 정수 %로 합계 100% 맞춰서 표로 줘."
- "방금 입력한 매도 화면이야(붙여넣기). 매도예상금액이랑 비중 합이 내 계획이랑 맞는지 검산해줘."
- "'부담금 투자비율' 화면이야. 목표 포트폴리오대로 기본·일시전환·경영성과 비율을 채워줘."
- "위험자산이 딱 70%라 입력이 막혀. 어느 펀드를 1%만 줄이면 통과되는지 알려줘."
왜 대화형으로 하나요? 포털은 보고서와 입력 단위가 다릅니다. 매수·매도가 금액이 아니라 비율(%)·좌수로 처리되고, 정수만 허용되며, 매수비율 합 100%·위험자산 70% 한도를 그 자리에서 맞춰야 합니다. 보고서의 목표 비중을 화면 단위로 환산·검산하는 계산이 매번 필요하므로, 화면을 붙여넣고 계산하고 → 입력하고 → 검산하기를 반복하는 게 가장 정확하고 안전합니다.
- (보유분) 매도·매수 비율을 입력했고, 매도예상금액이 내 목표와 일치하는가
- (향후 납입금) 부담금 투자비율(기본·일시전환·경영성과)을 설정했는가
- 매수비율 합계 = 100% 인가 (정수 % 반올림 후에도)
- 위험자산 비중 ≤ 70% 인가 (적격 TDF는 한도 면제)
- 단일 펀드 비중 ≤ 40% 인가
/investments-portfolio:portfolio-analyze는 아래 단계를 오케스트레이션합니다. 거시경제 단계는 macro-analysis 플러그인의
공용 에이전트들이 수행하고, 이후 펀드 선별·규제 검증·출력 검증을 거쳐 최종 보고서로 통합됩니다.
[사용자 요청 + 투자자 프로필(명령 프롬프트에 인라인 입력)]
│
▼
[거시경제 분석] macro-analysis 에이전트(지수·금리·섹터·리스크·리더십) → 종합/검증
│ └─► 00-macro-outlook.md
▼
[fund-portfolio] 펀드 데이터 기반 포트폴리오 구성 (Bogle 원칙·저비용·인덱스 우선)
│ └─► 01-fund-analysis.md
▼
[compliance-checker] DC형 위험자산 70% 한도, 단일펀드 40% 한도, 비중 합계 100% 검증
│ └─► 02-compliance-report.md
▼
[output-critic] 출처 검증, 환각 탐지, 과신 표현 제어, 신뢰도 점수 산출
│ └─► 03-output-verification.md
▼
[최종 통합] 추천 펀드 표 + 핵심 지표 + 실행 체크리스트
└─► 04-portfolio-summary.md
| 단계 | 담당 | 출력 | 역할 |
|---|---|---|---|
| 1 | macro-analysis 에이전트 |
00-macro-outlook.md |
거시경제·시장 전망, 자산배분 권고 |
| 2 | fund-portfolio |
01-fund-analysis.md |
펀드 선별·비중 배분 |
| 3 | compliance-checker |
02-compliance-report.md |
DC형 규제 준수 검증 |
| 4 | output-critic |
03-output-verification.md |
환각 방지·출처 검증·신뢰도 점수 |
| 5 | portfolio-analyze(조율) |
04-portfolio-summary.md |
최종 통합 보고서 |
추가 기능인 tax-consult는 납입 → 운용 → 수령 3단계의 연금·퇴직연금 절세를 상담하는 오케스트레이터입니다.
portfolio-analyze와 마찬가지로 투자자 프로필을 프롬프트에 인라인으로 입력하면(개인정보 파일을 자동으로 읽지 않습니다),
교육 → 전략 → 3중 검증 → 최종 요약 파이프라인이 순차 실행됩니다. 모든 세제 수치는 funds/pension_tax_params.json(현행 조문 앵커)에서
parameter_id로 로드해 python3로 독립 재계산하고, 검증을 통과하지 못한 항목은 숫자를 만들어내지 않고 **"보류"**로 표시합니다.
/pension-tax-advisor:tax-consult 내 연금계좌 절세 상담을 해줘.
| 항목 | 내용 |
|------|------|
| **총급여** | 6,000만원 (고소득) |
| **나이 / 수령 개시** | 45세 / 65세 (20년 후) |
| **계좌 구성** | IRP + 연금저축 (DC는 직장에서 별도 운용) |
| **연간 납입** | IRP 600만원 + 연금저축 300만원 |
💡 프로필에는 개인정보가 포함되므로 실행 결과는 모두
confidentialData/tax/(gitignore 대상) 하위에만 저장됩니다.
[프로필 인라인 입력]
│
▼
[0. 신선도 체크] funds/pension_tax_params.json 90일 초과 시 → tax-law-updater (BLOCKING)
│
▼
[tax-knowledge-educator] 납입·운용·수령 3단계 세제 교육 (개인 맞춤 아님)
│ └─► 00-educator.md
▼
[tax-strategy-planner] 개인 맞춤 절세 전략 초안 (미검증 파라미터는 보류)
│ └─► 01-strategy.md
▼
[C4 3중 검증] calc-verifier(python3 재계산) → critic(A~F 채점) → devil-advocate(반론)
│ └─► 02-calc-verify.json/.md · 03-critic.json/.md
│ ✗ C/D/E/F·중대 반론 → planner 재시도(최대 3회) → 초과 시 "제공 보류"
▼
[04-summary 재검증] 검증 통과(A/B) 금액만 인용 + parameter_id 1:1 매핑 → 재검증 후 확정
└─► 04-summary.md
| 단계 | 담당 에이전트 | 산출물 | 게이트 |
|---|---|---|---|
| 0 | tax-law-updater |
(파라미터 갱신) | 90일 초과 시에만 · BLOCKING |
| 1 | tax-knowledge-educator |
00-educator.md |
BLOCKING |
| 2 | tax-strategy-planner |
01-strategy.md |
BLOCKING |
| 3 | tax-calc-verifier → tax-critic → devil-advocate¹ |
02-calc-verify.* · 03-critic.* |
A/B 통과 · 미통과 3회 시 보류 |
| 4 | tax-consult(조율) |
04-summary.md |
재검증(calc→critic) 후 확정 |
¹ devil-advocate는 별도 에이전트가 아니라
tax-critic이 보유한 반론 스킬입니다(에이전트는 5개).
개인정보 보호를 위해 모든 파일은 confidentialData/tax/{YYYY-MM-DD}-{slug}-{6자리}/ 하위에만 JSON+MD로 저장됩니다(공개 저장소에 커밋되지 않습니다).
confidentialData/tax/{YYYY-MM-DD}-{slug}-{6자리}/
├── 00-educator.md # 납입·운용·수령 3단계 세제 교육
├── 01-strategy.md # 개인 맞춤 절세 전략 초안
├── 02-calc-verify.json/.md # python3 독립 재계산 검증
├── 03-critic.json/.md # A~F 신뢰도 채점 + 반론(devil-advocate)
└── 04-summary.md # 최종 요약 (검증 통과 금액만 + 검증 부록)
위 익명 프로필에 대한 최종 요약의 일부입니다.
tax-criticA등급 PASS를 받은,parameter_id로 재계산된 금액만 포함됩니다.
| 항목 | 금액 | parameter_id | 조문 | 등급 |
|---|---|---|---|---|
| 연간 세액공제 | 1,080,000원 | [id:연금계좌_세액공제한도] × [id:공제율_국세기준_고소득] |
소득세법 §59의3 제1항 | ✅ A |
| 분리과세 경계 | 15,000,000원 | [id:사적연금_분리과세_경계] |
소득세법 §14 제3항 및 §20의3 | ✅ A |
보류(미검증) 항목 — 숫자를 생성하지 않고 세무사 확인을 권고합니다.
| parameter_id | 조문 | 상태 |
|---|---|---|
연금소득세율_70세미만 |
소득세법 §20의3 | 보류(미검증) |
퇴직소득세_감면율_11년_20년 |
소득세법 §22 제3항 | 보류(미검증) |
⚠️ 면책: 본 상담은 정보 제공 목적이며 공인 세무사의 자문을 대체하지 않습니다. 세법·파라미터는 변경될 수 있으므로 실행 전 최신 조문(law.go.kr)을 재확인하세요.
익명화된 전체 예시는 portfolios/samples/sample-tax-consult/에서 5단계 산출물(00-educator → 01-strategy → 02-calc-verify → 03-critic → 04-summary)로 확인할 수 있습니다. 실명·생년·소속·계좌 등 개인정보는 포함되어 있지 않습니다.
마켓플레이스 pension-sema-guide에 5개 플러그인이 vendoring되어 있습니다. (서브모듈이 아닌 내장 디렉토리)
역할 위계는 다음과 같습니다.
| 구분 | 플러그인 | 위치 |
|---|---|---|
| 🎯 메인 기능 | investments-portfolio |
SEMA 퇴직연금 포트폴리오 생성 (이 프로젝트의 핵심) |
| ⚙️ 공용 엔진 | macro-analysis |
메인·추가 기능이 내부 호출하는 거시경제 분석 엔진 |
| ➕ 추가 기능 | stock-consultation |
주식/ETF 투자 상담 |
| ➕ 추가 기능 | equity-research |
개별 기업 리서치 |
| ➕ 추가 기능 | pension-tax-advisor |
퇴직연금·연금계좌 세금 상담 |
3 에이전트 · 1 명령 · 11 스킬
| 종류 | 이름 | 역할 |
|---|---|---|
| 명령 | portfolio-analyze |
포트폴리오 분석 오케스트레이터 |
| 에이전트 | fund-portfolio |
퇴직연금 펀드 포트폴리오 추천 |
| 에이전트 | compliance-checker |
DC형 규제 준수 검증 |
| 에이전트 | output-critic |
출력 검증·환각 탐지 |
| 스킬 | web-search-verifier |
3개 출처 교차검증 웹검색 프로토콜 |
| 스킬 | analyst-common |
분석 에이전트 공통 규칙 |
| 스킬 | bogle-principles |
John Bogle / Vanguard 투자 철학 |
| 스킬 | dc-pension-rules |
DC형 퇴직연금 규제 준수 규칙 |
| 스킬 | fund-selection-criteria |
펀드 선택 기준·점수 체계 |
| 스킬 | fund-output-template |
펀드 포트폴리오 보고서 출력 템플릿 |
| 스킬 | macro-output-template |
거시경제 보고서 출력 템플릿 |
| 스킬 | perspective-balance |
Bull/Bear 균형 분석 |
| 스킬 | devil-advocate |
반론·리스크 발굴 |
| 스킬 | file-save-protocol |
분석 결과 파일 저장 프로토콜 |
| 스킬 | data-updater |
CSV→JSON 펀드 데이터 업데이트 |
7 에이전트 (명령·스킬 없음). 메인·추가 기능 플러그인이 내부에서 재사용하며, 사용자가 직접 실행하는 기능은 아닙니다.
| 에이전트 | 역할 |
|---|---|
index-fetcher |
지수·환율 데이터 수집 |
rate-analyst |
Fed/BOK 금리 + USD/KRW 전망 |
sector-analyst |
5개 핵심 섹터 전망 |
risk-analyst |
지정학·경제·시장 리스크 + Bull/Base/Bear 시나리오 |
leadership-analyst |
주요 7개국 정치·중앙은행 동향 |
macro-synthesizer |
하위 분석 결과 종합 보고서 작성 |
macro-critic |
종합 결과 검증 |
5 에이전트 · 1 명령 · 3 스킬. Bogle/Vanguard 철학 기반.
| 종류 | 이름 | 역할 |
|---|---|---|
| 명령 | stock-consult |
주식/ETF 상담 오케스트레이터 |
| 에이전트 | materials-organizer |
사용자 제공 자료 정리·요약 |
| 에이전트 | stock-screener |
주식/ETF 후보 스크리닝 |
| 에이전트 | stock-valuation |
개별 종목 심층 밸류에이션 |
| 에이전트 | bear-case-critic |
반대 논거·리스크 분석 |
| 에이전트 | stock-critic |
최종 검증 |
| 스킬 | stock-data-verifier |
주식/ETF 데이터 교차검증 |
| 스킬 | analyst-common-stock |
주식/ETF 분석 공통 규칙 |
| 스킬 | file-save-protocol-stock |
결과 파일 저장 프로토콜 |
1 에이전트 (명령·스킬 없음).
| 에이전트 | 역할 |
|---|---|
equity-research-analyst |
기관급 주식 리서치 분석 (티커와 함께 호출) |
5 에이전트 · 1 명령 · 3 스킬. law.go.kr 출처 등급제 + 3중 검증(재계산→비판→반론) 기반 환각 방지.
| 종류 | 이름 | 역할 |
|---|---|---|
| 명령 | tax-consult |
절세 상담 오케스트레이터 (read-time 신선도·C4 3중 검증) |
| 에이전트 | tax-knowledge-educator |
납입·운용·수령 3단계 세제 기초 교육 |
| 에이전트 | tax-strategy-planner |
개인 맞춤 절세 전략 (미검증 시 보류·강한 면책) |
| 에이전트 | tax-calc-verifier |
python3 독립 재계산 검증 (LLM 암산 금지) |
| 에이전트 | tax-critic |
조문·basis·미검증·미래시행 탐지, A~F 채점 |
| 에이전트 | tax-law-updater |
90일 법령 자동 재확인 (law.go.kr 현행 앵커) |
| 스킬 | pension-tax-rules |
납입/운용/수령 규칙 + 계산식 스펙 (parameter_id 참조) |
| 스킬 | tax-law-verifier |
출처 등급제·EXACT 법령 검증 |
| 스킬 | file-save-protocol-tax |
세금 상담 결과 저장 프로토콜 |
데이터는 과학기술인공제회 상품제안서(제로인 평가 데이터) 기반이며, JSON으로 저장됩니다.
각 파일의 정확한 기준일·레코드 수는 항상 파일 안의 _meta 블록을 신뢰하세요.
| 파일 | 내용 | 레코드 수 | 기준일(_meta.version) |
조인 키 |
|---|---|---|---|---|
funds/fund_data.json |
투자가능 펀드 기본정보·수익률 | 205 | 2026-06-01 | fundCode(요율) / name(분류) |
funds/fund_fees.json |
펀드 총보수·연간비용 | 205 | 2026-06-01 | fundCode |
funds/fund_classification.json |
카테고리·위험자산 분류 (9개 유형) | 205 | (생성 시각 기준) | 펀드명 |
funds/tdf_data.json |
TDF 마스터 (결정적 enrichment) | 75 | 2026-06-04 | fundCode |
funds/tdf_fees.json |
TDF 수수료/요율 | 75 | 2026-06-07 | fundCode |
funds/deposit_rates.json |
원리금보장형 예금 금리 (수동 업데이트) | 4 | 2026-02-28 | (단독 조회) |
funds/investable_codes.json |
투자가능 펀드 코드 허용목록 | 207 | — | (필터용) |
funds/all/all_fund_data.json |
전체 펀드 마스터 (투자불가 포함) | 2104 | 2026-06-01 | fundCode |
funds/all/all_fund_fees.json |
전체 펀드 수수료 | 2104 | 2026-06-01 | fundCode |
funds/all/all_fund_classification.json |
전체 펀드 분류 | 2104 | (생성 시각 기준) | 펀드명 |
⚠️ TDF는 별도 기준일(tdf_data.json2026-06-04, 75개)을 사용하므로fund_data.json(205개)과 직접 교차비교하지 마세요.tdf_data.json의baseDateNote에도 명시되어 있습니다.
⚠️ funds/README.md는 구버전(STALE) 문서입니다. 펀드 수·분류 기준은 항상 각 JSON의_meta를 따르세요. 데이터 스키마·조인 키 상세는funds/AGENTS.md를 참고하세요.
스크립트는 data-updater 스킬 디렉토리에 있습니다. update_fund_data.py·classify_funds.py·update_tdf_data.py는
표준 라이브러리만 사용하고, xlsx_to_csv.py만 openpyxl이 필요합니다 (fetch_latest_proposal.py는 --convert 시에만 간접 필요).
SCRIPTS=".claude/plugins/investments-portfolio/skills/data-updater/scripts"
# 1) 미래에셋 게시판에서 최신 xlsx 자동 다운로드 + CSV 변환 (openpyxl 필요)
python $SCRIPTS/fetch_latest_proposal.py --out-dir resource --convert
# 2) CSV → JSON 변환 (fund_data / fund_fees / fund_classification 자동 재생성)
python $SCRIPTS/update_fund_data.py \
--file "resource/26년06월_상품제안서_퇴직연금(DCIRP).csv" \
--output-dir "funds"선택 검증·재생성:
# 변경 사항만 미리보기
python $SCRIPTS/update_fund_data.py --file "resource/...csv" --output-dir funds --dry-run
# 분류만 재생성
python $SCRIPTS/classify_funds.py \
--fund-data "funds/fund_data.json" --output "funds/fund_classification.json"TDF 업데이트 (별도 흐름):
# 1) TDF 표를 resource/tdf-raw.md 에 붙여넣기
# 2) 파싱 → tdf_data.json 생성 (요율 enrichment는 --fees)
python $SCRIPTS/update_tdf_data.py --input resource/tdf-raw.md --fees
⚠️ 유지보수 주의 (게시판/양식 변경 시)
- 미래에셋 게시판 구조가 바뀌면
fetch_latest_proposal.py의 첨부 파싱 정규식(attachmentId·(DCIRP).xlsx)을 점검하세요.- 상품제안서 xlsx 양식이 바뀌면
xlsx_to_csv.py의 시트명(실적배당형(펀드, ETF))·컬럼 수(25)를 점검하세요.- 회귀 검증: 과거 월 xlsx를 변환해 커밋된
resource/*.csv와 byte 단위 일치하는지 확인하세요.
이 프로젝트는 데이터의 결정성과 일관성을 보장하기 위해 두 단계의 검증 체계를 갖추고 있습니다.
tests/는 TDF enrichment 파이프라인(update_tdf_data.py)의 결정성을 검증합니다.
이름 정규화·펀드코드 해석·수수료 매칭·수익률 드리프트 경고·전체 enrichment·CLI·통합 테스트로 구성됩니다.
python3 -m pytest # 98 passed (GREEN)데이터 업데이트나 프롬프트 수정 후, 전체 시스템의 정합성을 검증하는 게이트를 실행합니다.
python3 scripts/verify_consistency.py- 검증 항목: dangling references, 날짜 동기화, 데이터 신선도, 중복 테스트, 플러그인 매니페스트 정합성 등 5개 항목
- 결과: Exit 0 (정상), Exit 1 (불일치 감지), Exit 2 (내부 에러)
pension_sema_guide/
├── .claude/ # 🔌 Claude Code 설정 + 내장 마켓플레이스/플러그인
│ ├── settings.json # enabledPlugins(5개) + extraKnownMarketplaces
│ └── plugins/ # vendored 마켓플레이스 + 5개 플러그인
│ ├── .claude-plugin/
│ │ └── marketplace.json # 마켓플레이스 매니페스트 (pension-sema-guide)
│ ├── investments-portfolio/ # 3 에이전트 + portfolio-analyze + 11 스킬
│ ├── macro-analysis/ # 7 공용 거시경제 에이전트
│ ├── stock-consultation/ # 5 에이전트 + stock-consult + 3 스킬
│ ├── equity-research/ # 1 에이전트 (기업 리서치)
│ └── pension-tax-advisor/ # 5 에이전트 + tax-consult + 3 스킬
├── funds/ # 펀드 데이터 (제로인 기반) — funds/AGENTS.md 참고
│ ├── fund_data.json # 투자가능 펀드 (205)
│ ├── fund_fees.json # 수수료 정보 (205)
│ ├── fund_classification.json # 자산 분류 (205, 9개 유형)
│ ├── tdf_data.json # TDF 마스터 (75, 별도 기준일)
│ ├── tdf_fees.json # TDF 수수료 (75)
│ ├── deposit_rates.json # 예금 금리 (수동 업데이트)
│ ├── investable_codes.json # 투자가능 코드 허용목록 (207)
│ └── all/ # 전체 펀드 (2104, *_all_*)
├── tests/ # TDF enrichment pytest 스위트
├── portfolios/samples/ # 익명화된 공개 예시 (sample-aggressive)
├── consultations/ # 주식/ETF 상담 보고서 (비개인)
├── resource/ # SEMA 상품제안서 CSV/XLSX (원본)
├── docs/ # 기술 문서
├── scripts/ # verify_no_pii.sh, verify_plugin.sh
├── index-data.json # 시장 지수 데이터 스냅샷
├── pytest.ini # testpaths=tests
├── confidentialData/ # 🔒 개인정보 (gitignore — 저장소 미포함)
└── AGENTS.md # 프로젝트 지식베이스
이 저장소는 공개(Public) 저장소입니다. 개인정보는 절대 커밋하지 않습니다.
- 개인별 데이터(투자자 프로필
investor-profile.md, 개인 투자계획·잔고, 실제 분석 산출물)는 반드시confidentialData/에만 저장합니다. confidentialData/는.gitignore에 등록되어 저장소에 포함되지 않습니다.- 공개 가능한 예시는 익명화하여
portfolios/samples/에 둡니다 (실명·생년·소속·계좌 금지). - 커밋 전 PII 누출 여부를 검증하세요:
scripts/verify_no_pii.sh # 히스토리 전수 PII 스캔
scripts/verify_plugin.sh # 플러그인 매니페스트 검증- 과거 수익률은 미래 수익률을 보장하지 않습니다.
- 본 가이드는 정보 제공 목적이며, 투자 권유가 아닙니다. 투자 결정은 본인의 판단과 책임 하에 이루어져야 합니다.
- DC형 퇴직연금 규제는 변경될 수 있으니 입력 전 최신 규정과 포털 안내를 확인하세요.
- 데이터 기준일이 지난 경우 펀드 라인업·수익률이 실제 포털과 다를 수 있습니다.
- 데이터 출처: 과학기술인공제회 퇴직연금 상품제안서 + 펀드평가사 제로인(Zeroin)
- 마켓플레이스:
pension-sema-guide
Multi-Agent Portfolio System for SEMA DC Pension