출력 요구사항
모든 Excel 파일
수식 오류 제로
- 모든 Excel 모델은 ZERO 수식 오류(#REF!, #DIV/0!, #VALUE!, #N/A, #NAME?)로 전달되어야 합니다.
기존 템플릿 유지 (템플릿 업데이트 시)
- 파일을 수정할 때 기존 형식, 스타일 및 규칙을 연구하고 정확히 일치시켜야 합니다.
- 이미 정립된 패턴이 있는 파일에 표준화된 서식을 강제로 적용하지 마십시오.
- 기존 템플릿 규칙이 항상 이 지침보다 우선합니다.
재무 모델
색상 코딩 표준
사용자 또는 기존 템플릿에 별도로 명시되지 않은 경우
업계 표준 색상 규칙
- 파란색 텍스트 (RGB: 0,0,255): 하드코딩된 입력값 및 사용자가 시나리오에 따라 변경할 숫자
- 검은색 텍스트 (RGB: 0,0,0): 모든 수식 및 계산
- 녹색 텍스트 (RGB: 0,128,0): 동일 워크북 내 다른 워크시트에서 가져온 링크
- 빨간색 텍스트 (RGB: 255,0,0): 다른 파일에 대한 외부 링크
- 노란색 배경 (RGB: 255,255,0): 주의가 필요한 주요 가정 또는 업데이트해야 할 셀
숫자 서식 표준
필수 서식 규칙
- 년도: 텍스트 문자열로 서식 지정 (예: "2024"가 아닌 "2024")
- 통화: $#,##0 형식 사용; 헤더에 항상 단위 명시 ("매출 ($mm)")
- 0: 모든 0을 "-"로 표시하는 숫자 서식 사용 (예: "$#,##0;($#,##0);-")
- 백분율: 기본적으로 0.0% 형식 (소수점 한 자리)
- 배수: 밸류에이션 배수(EV/EBITDA, P/E)는 0.0x 형식으로 표시
- 음수: 괄호 사용 (123) 이며 마이너스 -123 사용 금지
수식 구성 규칙
가정 배치
- 모든 가정(성장률, 마진, 배수 등)은 별도의 가정 셀에 배치
- 수식에 하드코딩된 값 대신 셀 참조 사용
- 예시: =B51.05 대신 =B5(1+$B$6) 사용
수식 오류 방지
- 모든 셀 참조가 올바른지 확인
- 범위의 Off-by-one 오류 확인
- 모든 예측 기간에 걸쳐 일관된 수식 사용
- 경계값(0 값, 음수 값)으로 테스트
- 의도하지 않은 순환 참조가 없는지 확인
하드코드 문서화 요구사항
- 셀에 주석 또는 (표의 끝인 경우) 옆에 설명 추가. 형식: "출처: [시스템/문서], [날짜], [특정 참조], [해당 URL]
- 예시:
- "출처: 회사 10-K, FY2024, 45페이지, 수익 참고, [SEC EDGAR URL]"
- "출처: 회사 10-Q, 2025년 2분기, 첨부 99.1, [SEC EDGAR URL]"
- "출처: Bloomberg Terminal, 2025/8/15, AAPL US Equity"
- "출처: FactSet, 2025/8/20, 컨센서스 추정 화면"
XLSX 생성, 편집 및 분석
개요
사용자가 .xlsx 파일의 내용을 생성, 편집 또는 분석하도록 요청할 수 있습니다. 다양한 작업에 대해 서로 다른 도구와 워크플로우를 사용할 수 있습니다.
중요 요구사항
수식 재계산을 위한 LibreOffice 필요: 수식 값을 재계산하기 위해 recalc.py 스크립트를 사용하여 LibreOffice가 설치되어 있다고 가정할 수 있습니다. 이 스크립트는 첫 실행 시 LibreOffice를 자동으로 구성합니다.
데이터 읽기 및 분석
pandas를 사용한 데이터 분석
데이터 분석, 시각화 및 기본 작업의 경우 강력한 데이터 조작 기능을 제공하는 pandas를 사용하세요:
import pandas as pd
# Excel 읽기
df = pd.read_excel('file.xlsx') # 기본값: 첫 번째 시트
all_sheets = pd.read_excel('file.xlsx', sheet_name=None) # 모든 시트를 딕셔너리로
# 분석
df.head() # 데이터 미리보기
df.info() # 열 정보
df.describe() # 통계
# Excel 쓰기
df.to_excel('output.xlsx', index=False)
Excel 파일 워크플로우
중요: 수식 사용, 하드코딩된 값 사용 금지
Python에서 값을 계산하고 하드코딩하는 대신 항상 Excel 수식을 사용하세요. 이렇게 하면 스프레드시트가 동적이고 업데이트 가능한 상태로 유지됩니다.
❌ 잘못된 방법 - 계산된 값 하드코딩
# 나쁨: Python에서 계산하고 결과를 하드코딩
✅ 올바른 방법 - Excel 수식 사용
# 좋음: Excel이 합계를 계산하도록 함
이것은 모든 계산(합계, 백분율, 비율, 차이 등)에 적용됩니다. 스프레드시트는 원본 데이터가 변경될 때 다시 계산할 수 있어야 합니다.
일반 워크플로우
- 도구 선택: pandas (데이터), openpyxl (수식/서식)
- 생성/로드: 새 워크북 생성 또는 기존 파일 로드
- 수정: 데이터, 수식 및 서식 추가/편집
- 저장: 파일에 쓰기
- 수식 재계산 (수식 사용 시 필수): recalc.py 스크립트 사용
python recalc.py output.xlsx - 오류 확인 및 수정:
- 스크립트는 오류 세부 정보가 포함된 JSON을 반환합니다.
status가errors_found인 경우error_summary에서 특정 오류 유형 및 위치를 확인합니다.- 식별된 오류를 수정하고 다시 계산합니다.
- 수정해야 할 일반적인 오류:
#REF!: 잘못된 셀 참조#DIV/0!: 0으로 나누기#VALUE!: 수식에 잘못된 데이터 유형#NAME?: 인식할 수 없는 수식 이름
새 Excel 파일 생성
# openpyxl을 사용한 수식 및 서식
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
wb = Workbook()
sheet = wb.active
# 데이터 추가
sheet['A1'] = 'Hello'
sheet['B1'] = 'World'
sheet.append(['Row', 'of', 'data'])
# 수식 추가
sheet['B2'] = '=SUM(A1:A10)'
# 서식 지정
sheet['A1'].font = Font(bold=True, color='FF0000')
sheet['A1'].fill = PatternFill('solid', start_color='FFFF00')
sheet['A1'].alignment = Alignment(horizontal='center')
# 열 너비
sheet.column_dimensions['A'].width = 20
wb.save('output.xlsx')
기존 Excel 파일 편집
# openpyxl을 사용한 수식 및 서식 유지
from openpyxl import load_workbook
# 기존 파일 로드
wb = load_workbook('existing.xlsx')
sheet = wb.active # 또는 특정 시트의 경우 wb['SheetName']
# 여러 시트 작업
for sheet_name in wb.sheetnames:
sheet = wb[sheet_name]
print(f"시트: {sheet_name}")
# 셀 수정
sheet['A1'] = 'New Value'
sheet.insert_rows(2) # 2번 위치에 행 삽입
sheet.delete_cols(3) # 3번 열 삭제
# 새 시트 추가
new_sheet = wb.create_sheet('NewSheet')
new_sheet['A1'] = 'Data'
wb.save('modified.xlsx')
수식 재계산
openpyxl로 생성 또는 수정된 Excel 파일에는 수식이 문자열로 포함되어 있지만 계산된 값은 포함되어 있지 않습니다. 제공된 recalc.py 스크립트를 사용하여 수식을 재계산하세요:
python recalc.py <excel_file> [timeout_seconds]
예시:
python recalc.py output.xlsx 30
스크립트의 기능:
- 첫 실행 시 LibreOffice 매크로를 자동으로 설정
- 모든 시트의 모든 수식 재계산
- Excel 오류(#REF!, #DIV/0! 등)에 대해 ALL 셀 스캔
- 자세한 오류 위치 및 개수가 포함된 JSON 반환
- Linux 및 macOS 모두에서 작동
수식 확인 체크리스트
수식이 올바르게 작동하는지 확인하기 위한 빠른 점검:
필수 확인 사항
- 샘플 참조 2~3개 테스트: 전체 모델을 구축하기 전에 올바른 값을 가져오는지 확인
- 열 매핑: Excel 열이 일치하는지 확인 (예: 64열 = BL, BK 아님)
- 행 오프셋: Excel 행은 1부터 시작함을 기억 (DataFrame 행 5 = Excel 행 6)
일반적인 함정
- NaN 처리:
pd.notna()로 null 값 확인 - 오른쪽 끝 열: FY 데이터는 종종 50열 이후에 있음
- 여러 일치: 첫 번째 항목뿐만 아니라 모든 항목 검색
- 0으로 나누기: 수식에서
/를 사용하기 전에 분모 확인 (#DIV/0!) - 잘못된 참조: 모든 셀 참조가 의도한 셀을 가리키는지 확인 (#REF!)
- 시트 간 참조: 시트 연결을 위해 올바른 형식(Sheet1!A1) 사용
수식 테스트 전략
- 작게 시작: 광범위하게 적용하기 전에 2~3개 셀에서 수식 테스트
- 종속성 확인: 수식에서 참조하는 모든 셀이 존재하는지 확인
- 경계값 테스트: 0, 음수 및 매우 큰 값 포함
recalc.py 출력 해석
스크립트는 오류 세부 정보가 포함된 JSON을 반환합니다:
{
"status": "success", // 또는 "errors_found"
"total_errors": 0, // 총 오류 수
"total_formulas": 42, // 파일 내 수식 수
"error_summary": { // 오류가 있는 경우에만 표시
"#REF!": {
"count": 2,
"locations": ["Sheet1!B5", "Sheet1!C10"]
}
}
}
모범 사례
라이브러리 선택
- pandas: 데이터 분석, 대량 작업 및 간단한 데이터 내보내기에 가장 적합
- openpyxl: 복잡한 서식, 수식 및 Excel 특화 기능에 가장 적합
openpyxl 작업 시
- 셀 인덱스는 1부터 시작 (row=1, column=1은 셀 A1을 의미)
data_only=True를 사용하여 계산된 값 읽기:load_workbook('file.xlsx', data_only=True)- 경고:
data_only=True로 열고 저장하면 수식이 값으로 대체되어 영구적으로 손실됩니다. - 대용량 파일의 경우: 읽기에는
read_only=True, 쓰기에는write_only=True사용 - 수식은 유지되지만 평가되지는 않음 - 값을 업데이트하려면 recalc.py를 사용하세요.
pandas 작업 시
- 추론 문제를 피하기 위해 데이터 유형 지정:
pd.read_excel('file.xlsx', dtype={'id': str}) - 대용량 파일의 경우 특정 열만 읽기:
pd.read_excel('file.xlsx', usecols=['A', 'C', 'E']) - 날짜를 적절히 처리:
pd.read_excel('file.xlsx', parse_dates=['date_column'])
코드 스타일 지침
중요: Excel 작업을 위한 Python 코드를 생성할 때:
- 불필요한 주석 없이 간결한 Python 코드 작성
- 장황한 변수 이름 및 중복 작업 피하기
- 불필요한 print 문 피하기
Excel 파일 자체의 경우:
- 복잡한 수식이나 중요한 가정이 있는 셀에 주석 추가
- 하드코딩된 값의 데이터 소스 문서화
- 주요 계산 및 모델 섹션에 대한 노트 포함