출력 요구사항
모든 Excel 파일
수식 오류 없음
- 모든 Excel 모델은 #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", "2,024" 아님)
- 통화:
$#,##0서식 사용; 헤더에 항상 단위 명시 ("수익 ($mm)") - 0: 모든 0을 "-"로 표시하도록 숫자 서식 지정 (백분율 포함) (예:
$#,##0;($#,##0);-) - 백분율: 기본값 0.0% 서식 (소수점 한 자리)
- 배수: EV/EBITDA, P/E 등 가치 평가 배수는 0.0x 서식
- 음수: 괄호 사용 (123), 마이너스 기호 -123 사용하지 않음
수식 작성 규칙
가정 입력 위치
- 모든 가정 (성장률, 마진, 배수 등)은 별도의 가정 셀에 배치
- 수식에서 하드코딩된 값 대신 셀 참조 사용
- 예:
=B5*1.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 터미널, 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에서 계산하고 결과를 하드코딩
total = df['Sales'].sum()
sheet['B10'] = total # 5000을 하드코딩
# 나쁨: Python에서 성장률 계산
growth = (df.iloc[-1]['Revenue'] - df.iloc[0]['Revenue']) / df.iloc[0]['Revenue']
sheet['C5'] = growth # 0.15를 하드코딩
# 나쁨: Python에서 평균 계산
avg = sum(values) / len(values)
sheet['D20'] = avg # 42.5를 하드코딩
✅ 올바른 방법 - Excel 수식 사용
# 좋음: Excel이 합계를 계산하도록 함
sheet['B10'] = '=SUM(B2:B9)'
# 좋음: Excel 수식으로 성장률
sheet['C5'] = '=(C4-C2)/C2'
# 좋음: Excel 함수를 사용한 평균
sheet['D20'] = '=AVERAGE(D2:D19)'
이것은 합계, 백분율, 비율, 차이 등 모든 계산에 적용됩니다. 스프레드시트는 원본 데이터가 변경될 때 다시 계산할 수 있어야 합니다.
일반 워크플로우
- 도구 선택: 데이터는 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! 등)에 대해 모든 셀을 검사합니다.
- 상세한 오류 위치와 개수가 포함된 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 파일 자체의 경우:
- 복잡한 수식이나 중요한 가정이 있는 셀에 주석 추가
- 하드코딩된 값의 데이터 출처 문서화
- 주요 계산 및 모델 섹션에 대한 메모 포함