data-updater

과학기술공제회 퇴직연금 CSV 파일을 읽어 Python 스크립트를 통해 펀드 데이터 JSON 파일을 자동 생성하는 스킬이다.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "data-updater" with this command: npx skills add orientpine/honeypot/orientpine-honeypot-data-updater

Fund Data Updater

Overview

과학기술공제회 퇴직연금 CSV 파일을 읽어 Python 스크립트를 통해 펀드 데이터 JSON 파일을 자동 생성하는 스킬이다.

핵심 기능:

  • CSV 파일 파싱 및 검증

  • fund_data.json 생성 (펀드 기본 정보 및 수익률)

  • fund_fees.json 생성 (펀드 수수료 정보)

  • fund_classification.json 자동 생성 (펀드 분류)

  • 투자 가능 펀드 필터링 (investable_codes.json 기반)

  • funds/all/ 폴더에 전체 펀드 데이터 저장 (2015개)

  • deposit_rates.json 업데이트 (예금금리 - 사용자 입력 필수)

  • 기존 파일 자동 백업 (archive/ 디렉토리)

⚠️ 중요: 예금금리 데이터는 웹 검색으로 얻을 수 없습니다. 과학기술인공제회 내부 금리이므로 반드시 사용자에게 직접 확인해야 합니다.

사용자 입력 스키마

필수 입력

항목 설명 예시

CSV 파일 경로 과학기술공제회 퇴직연금 CSV 파일 resource/26년01월_상품제안서_퇴직연금(DCIRP).csv

선택 입력

항목 설명 기본값

출력 디렉토리 JSON 파일 저장 위치 자동 감지 (investments/funds/)

dry-run 모드 미리보기 (파일 생성 없이 결과만 출력) false

Workflow

[Phase 0: 입력 검증] | +-- Step 0-1. CSV 파일 확인 | +-- 사용자 제공 경로 존재 여부 확인 | +-- 파일 확장자 (.csv) 확인 | +-- 인코딩 검증 (UTF-8 필수) | +-- Step 0-2. 출력 폴더 설정 | +-- funds/ 폴더 존재 확인 (없으면 생성) | +-- archive/ 폴더 존재 확인 (없으면 생성) | +-- 기존 JSON 파일 백업 준비 | +-- Step 0-3. Python 환경 확인 +-- Python 3.10+ 설치 여부 확인 +-- 필수 패키지: 표준 라이브러리만 (외부 패키지 불필요)

[Phase 1: Dry-run 실행 (권장)] | +-- Step 1-1. 미리보기 실행 | +-- --dry-run 옵션으로 스크립트 실행 | +-- CSV 메타데이터 확인 (사업자명, 기준일 등) | +-- 펀드 개수 확인 | +-- Step 1-2. 샘플 데이터 검토 +-- 처음 3개 펀드 데이터 미리보기 +-- 사용자에게 확인 요청 (진행 여부)

[Phase 2: 데이터 변환] | +-- Step 2-1. Python 스크립트 찾기 및 실행 | +-- 상대경로 참조: scripts/update_fund_data.py (스킬 루트 기준) | +-- 실패 시 Glob 폴백: **/investments-portfolio/skills/data-updater/scripts/update_fund_data.py | +-- Glob도 실패 시: Glob: **/update_fund_data.py | +-- 찾은 경로로 실행: python {경로} --file [csv_file_path] | +-- 스크립트를 찾지 못하면: 즉시 중단, 사용자에게 경로 확인 요청 | +-- 절대 금지: 스크립트를 못 찾았을 때 자체 Python 코드를 작성하여 대체하지 않음 | +-- Step 2-2. 자동 분류 실행 | +-- update_fund_data.py가 자동으로 classify_funds.py 호출 | +-- fund_classification.json 자동 생성 | +-- Step 2-3. 결과 확인 +-- 생성된 JSON 파일 목록 확인 +-- 펀드 개수 및 분류 통계 확인

[Phase 3: 검증] | +-- Step 3-1. 파일 검증 | +-- fund_data.json 존재 및 JSON 유효성 확인 | +-- fund_fees.json 존재 및 JSON 유효성 확인 | +-- fund_classification.json 존재 확인 | +-- Step 3-2. 메타데이터 검증 +-- _meta.version 확인 (CSV 기준일과 일치) +-- _meta.recordCount 확인 (펀드 개수) +-- _meta.updatedAt 확인 (현재 시간)

[Phase 4: 완료 보고] | +-- Step 4-1. 실행 보고서 생성 | +-- 포함 내용: | - 입력 CSV 파일명 및 기준일 | - 생성된 JSON 파일 목록 | - 펀드 개수 및 분류 통계 | - 아카이브된 파일 목록 | +-- Step 4-2. 사용자 안내 +-- 생성 완료 알림 +-- funds/ 폴더 위치 안내 +-- 다음 단계 안내 (포트폴리오 분석 등)

[Phase 5: 예금금리 업데이트 (선택)] | +-- Step 5-0. 예금금리 업데이트 필요 여부 확인 | +-- deposit_rates.json 존재 확인 | +-- _meta.version 기준 경과일 계산 | +-- 30일 이상 경과 시 업데이트 권장 | +-- Step 5-1. 사용자에게 예금금리 확인 요청 (mcp_question 사용) | +-- ⚠️ 웹 검색 불가 - 사용자 직접 입력 필수 | +-- 질문: "과학기술인공제회 퇴직연금 예금금리를 입력해주세요" | +-- 필수 입력 항목: | - 과학기술인공제회 1년 정기예금 금리 (%) | - 우리은행 1년 정기예금 금리 (%) - 선택 | +-- Step 5-2. deposit_rates.json 업데이트 | +-- _meta.version: 현재 날짜 (YYYY-MM-DD) | +-- _meta.updatedAt: 현재 ISO 8601 타임스탬프 | +-- rates 배열 업데이트 | +-- Step 5-3. 업데이트 완료 확인 +-- JSON 유효성 검사 +-- 업데이트 내역 보고

스크립트 실행 방식

스크립트 참조 및 실행 (CRITICAL)

스크립트는 이 스킬의 상대경로에 위치합니다:

scripts/update_fund_data.py scripts/classify_funds.py

실행 순서:

Step 1. 상대경로로 실행 (최우선)

python scripts/update_fund_data.py --file [csv_file_path] python scripts/classify_funds.py --fund-data "funds/fund_data.json"

Step 2. 상대경로 실패 시 Glob 폴백

Glob: **/investments-portfolio/skills/data-updater/scripts/update_fund_data.py Glob: **/investments-portfolio/skills/data-updater/scripts/classify_funds.py

Step 3. Glob도 실패 시 확장 탐색

Glob: **/update_fund_data.py Glob: **/classify_funds.py

절대 금지: 스크립트를 찾지 못했을 때 자체적으로 Python 코드를 작성하지 마세요. 반드시 에러를 보고하고 사용자에게 경로 확인을 요청하세요.

실행 명령어

Dry-run (미리보기) - 권장

python scripts/update_fund_data.py
--file [csv_file_path]
--dry-run

실제 실행 (자동 경로 감지)

python scripts/update_fund_data.py
--file [csv_file_path]

실제 실행 (출력 경로 지정)

python scripts/update_fund_data.py
--file [csv_file_path]
--output-dir [output_directory]

분류만 재실행 (선택)

python scripts/classify_funds.py
--fund-data "funds/fund_data.json"

스크립트 옵션

스크립트 옵션 필수 설명

update_fund_data.py --file

O CSV 파일 경로

update_fund_data.py --output-dir

X 출력 디렉토리 (기본: 자동 감지)

update_fund_data.py --dry-run

X 미리보기 모드

classify_funds.py --fund-data

O fund_data.json 파일 경로

classify_funds.py --output

X 출력 파일 경로

의존성

  • Python 3.10+

  • 표준 라이브러리만 사용 (외부 패키지 불필요)

Output Structure

출력 디렉토리 구조

funds/ ├── fund_data.json # 필터링된 펀드 (206개) ├── fund_fees.json # 필터링된 수수료 정보 ├── fund_classification.json # 필터링된 펀드 분류 ├── investable_codes.json # 투자 가능 펀드 코드 목록 ├── deposit_rates.json # 예금금리 정보 ├── all/ # 전체 펀드 데이터 │ ├── all_fund_data.json # 전체 펀드 (2015개) │ ├── all_fund_fees.json # 전체 수수료 정보 │ └── all_fund_classification.json # 전체 펀드 분류 └── archive/ # 이전 버전 백업 ├── fund_data_2026-01-01.json └── fund_fees_2026-01-01.json

fund_data.json 구조

{ "_meta": { "version": "2026-01-01", "sourceFile": "26년01월_상품제안서_퇴직연금(DCIRP).csv", "updatedAt": "2026-01-21T21:00:00+09:00", "recordCount": 206, "missing": [] }, "funds": [ { "fundCode": "K55105EC1749", "name": "펀드명", "company": "운용사명", "riskLevel": 2, "riskName": "높은위험", "return10y": "", "return7y": "", "return5y": "", "return3y": "70.34", "return1y": "178.03", "return6m": "30.03", "netAssets": "50840000", "inceptionDate": "20220627", "isAffiliate": false, "fundType": "ETF" } ] }

fund_classification.json 구조

{ "펀드명": { "category": "해외주식형", "riskAsset": true, "assetClass": "equity", "region": "global", "themes": ["semiconductor", "ai"], "hedged": false, "riskLevel": 2, "source": "fund_data.json + keyword classification", "generatedAt": "2026-01-21" } }

deposit_rates.json 구조

{ "_meta": { "version": "2026-01-31", "source": "과학기술인공제회 퇴직연금 원리금보장형 운용방법 안내", "updatedAt": "2026-01-31T12:00:00+09:00", "recordCount": 4, "freshnessThresholdDays": 30, "note": "30일 경과 시 데이터 업데이트 필요" }, "rates": [ { "id": "sema-1y", "institution": "과학기술인공제회", "productName": "과학기술인공제회 퇴직연금 운용방법 (1년)", "type": "원리금보장형운용방법", "term": "1년", "termMonths": 12, "rate": 4.9, "unit": "%" }, { "id": "woori-1y", "institution": "우리은행", "productName": "우리은행 정기예금 1년", "type": "원리금보장형운용방법", "term": "1년", "termMonths": 12, "rate": 2.75, "unit": "%" } ], "summary": { "highestRate": { "institution": "과학기술인공제회", "rate": 4.9, "term": "1년" }, "institutions": ["과학기술인공제회", "우리은행"] } }

예금금리 업데이트 (Phase 5)

⚠️ 중요: 웹 검색 불가

예금금리 데이터는 웹 검색으로 얻을 수 없습니다.

  • 과학기술인공제회 내부 금리는 공개 웹에 게시되지 않음

  • 회원 전용 포털 또는 고객센터에서만 확인 가능

  • 따라서 사용자에게 직접 확인 요청이 필수

사용자 질문 예시 (mcp_question 사용)

{ "questions": [ { "header": "예금금리 업데이트", "question": "과학기술인공제회 퇴직연금 1년 정기예금 금리(%)를 입력해주세요. (예: 4.9)", "options": [ {"label": "4.9%", "description": "현재 저장된 금리"}, {"label": "5.0%", "description": ""}, {"label": "4.8%", "description": ""}, {"label": "4.7%", "description": ""} ] } ] }

또는 직접 입력을 받는 경우:

사용자에게 예금금리 확인을 요청합니다.

과학기술인공제회 퇴직연금 포털에서 현재 예금금리를 확인해주세요:

  • 과학기술인공제회 1년 정기예금 금리: _____ %
  • (선택) 우리은행 1년 정기예금 금리: _____ %

확인 방법:

  1. 과학기술인공제회 퇴직연금 포털 로그인
  2. 원리금보장형 운용방법 안내 페이지 확인
  3. 현재 금리 입력

업데이트 수행 방법

사용자로부터 금리 정보를 받은 후:

deposit_rates.json 업데이트

import json from datetime import datetime

현재 파일 읽기

with open('funds/deposit_rates.json', 'r', encoding='utf-8') as f: data = json.load(f)

메타데이터 업데이트

data['_meta']['version'] = datetime.now().strftime('%Y-%m-%d') data['_meta']['updatedAt'] = datetime.now().isoformat()

금리 업데이트 (사용자 입력값 사용)

for rate in data['rates']: if rate['id'] == 'sema-1y': rate['rate'] = 4.9 # 사용자 입력값 elif rate['id'] == 'woori-1y': rate['rate'] = 2.75 # 사용자 입력값

요약 업데이트

data['summary']['highestRate']['rate'] = max(r['rate'] for r in data['rates'])

저장

with open('funds/deposit_rates.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=2)

Usage Example

입력 예시 1: 펀드 데이터 업데이트

data-updater 스킬을 사용해서 펀드 데이터를 업데이트해줘. CSV 파일: resource/26년01월_상품제안서_퇴직연금(DCIRP).csv

또는 간단히:

펀드 데이터 업데이트해줘

입력 예시 2: 예금금리 업데이트

예금금리 데이터도 업데이트해줘

또는:

data-updater 스킬로 예금금리 업데이트 해줘. 과학기술인공제회 1년: 4.9% 우리은행 1년: 2.75%

수행 절차

펀드 데이터 업데이트 (Phase 0-4):

  • Phase 0: CSV 파일 확인, UTF-8 인코딩 검증

  • Phase 1: Dry-run으로 미리보기, 2015개 펀드 발견

  • Phase 2: Python 스크립트 실행, JSON 파일 생성

  • Phase 3: 생성된 파일 검증

  • Phase 4: 완료 보고서 생성

예금금리 업데이트 (Phase 5, 선택): 6. Phase 5: 사용자에게 예금금리 확인 요청 → deposit_rates.json 업데이트

출력 파일

  • funds/fund_data.json : 펀드 마스터 데이터 (2015개)

  • funds/fund_fees.json : 펀드 수수료 정보

  • funds/fund_classification.json : 펀드 분류 정보

  • funds/deposit_rates.json : 예금금리 정보 (Phase 5 실행 시)

에러 처리

에러 원인 해결

File not found

CSV 파일 경로 오류 경로 확인, 절대 경로 사용

UnicodeDecodeError

인코딩 오류 CSV 파일을 UTF-8로 재저장

Header not found

CSV 형식 오류 "펀드코드" 포함 헤더 확인

Output directory not found

경로 감지 실패 --output-dir 옵션 사용

상세한 에러 처리 및 디버깅 방법은 ./scripts/README.md 참조.

CSV 파일 형식

예상 구조

Row 1: 사업자명 | 미래에셋증권 Row 2: 제도유형 | DC/IRP Row 3: 상품유형 | 실적배당형 상품(펀드/ETF) Row 4: 기준일 | 2026-01-01, 제로인 Row 5-7: (빈 행 또는 기타) Row 8: 헤더 | 펀드코드 | 펀드명 | 운용회사명 | 위험등급 | ... Row 9+: 데이터 | K55105EC1749 | 펀드명 | 운용사 | 2등급(높은위험) | ...

필수 컬럼

컬럼명 용도

펀드코드 고유 식별자

펀드명 펀드 이름

운용회사명 운용사

위험등급 "N등급(위험명)" 형식

순자산총액(억원) 순자산 (억원 단위)

수익률(6M), (1Y), (3Y), (5Y), (7Y), (10Y) 기간별 수익률

설정일 펀드 설정일

비율(%) 총보수

1년투자비용(원) 연간 비용

관련 플러그인

플러그인/에이전트 역할 연계

portfolio-orchestrator 포트폴리오 분석 오케스트레이션 스킬 fund_data.json, deposit_rates.json 신선도 검사

fund-portfolio 펀드 추천 fund_data.json, fund_classification.json, deposit_rates.json 사용

compliance-checker DC 규제 검증 fund_classification.json, deposit_rates.json 사용

fund-selection-criteria 펀드 선택 기준 deposit_rates.json으로 예금 vs 채권 비교

data-updater 데이터 변환 현재 스킬

Resources

스크립트 위치

  • 메인 스크립트: scripts/update_fund_data.py (Glob으로 절대경로 확보 후 실행)

  • 분류 스크립트: scripts/classify_funds.py (Glob으로 절대경로 확보 후 실행)

  • 상세 문서: scripts/README.md

성능

  • 2,015개 펀드 처리 시간: 약 1-2초

  • 메모리 사용량: 약 50MB

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

devil-advocate

No summary provided by upstream source.

Repository SourceNeeds Review
General

stock-data-verifier

No summary provided by upstream source.

Repository SourceNeeds Review
General

chapter3-guide

No summary provided by upstream source.

Repository SourceNeeds Review
General

chapter2-guide

No summary provided by upstream source.

Repository SourceNeeds Review