Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- 리눅스
- 유니티
- 다이어트
- 라즈베리파이
- pandas
- Linux
- swift
- PER
- ASP
- PyQt
- urllib
- 날짜
- node.js
- ubuntu
- Excel
- flutter
- MS-SQL
- python
- port
- MySQL
- tensorflow
- sqlite
- 맛집
- 함수
- GIT
- IOS
- mssql
- javascript
- PyQt5
- Unity
Archives
아미(아름다운미소)
재무제표 분석 본문
import pandas as pd
import requests
def get_financial_statement(ticker):
"""
네이버 금융에서 손익계산서 데이터를 가져오는 함수
"""
url = f'https://finance.naver.com/item/main.naver?code={ticker}'
try:
tables = pd.read_html(url, encoding='euc-kr')
except:
return None
for table in tables:
if table.shape[1] >= 3 and '매출액' in table.iloc[:, 0].values:
return table
return None
def clean_financial_df(df):
"""
데이터프레임 전처리: 인덱싱, 숫자 변환, 결측치 처리 등
"""
df.set_index(df.columns[0], inplace=True)
df = df.replace('-', '0') # 결측치는 0으로
df = df.applymap(lambda x: int(str(x).replace(',', '')) if isinstance(x, str) else x)
return df
def analyze_financials(df):
"""
주요 지표 분석 및 해석 제공
"""
analysis = {}
try:
df_cleaned = clean_financial_df(df)
# 컬럼(연도 또는 분기) 자동 탐지
latest = df_cleaned.columns[-1]
prev = df_cleaned.columns[-2]
# 유연한 행 이름 처리 (예: '영업이익(손실)', '당기순이익(손실)')
def get_row_name(df, candidates):
for candidate in candidates:
if candidate in df.index:
return candidate
raise ValueError(f"다음 항목을 찾을 수 없습니다: {candidates}")
row_매출 = get_row_name(df_cleaned, ['매출액'])
row_영업이익 = get_row_name(df_cleaned, ['영업이익', '영업이익(손실)'])
row_순이익 = get_row_name(df_cleaned, ['당기순이익', '당기순이익(손실)'])
# 주요 지표 추출
revenue_now = df_cleaned.loc[row_매출, latest]
revenue_prev = df_cleaned.loc[row_매출, prev]
op_now = df_cleaned.loc[row_영업이익, latest]
op_prev = df_cleaned.loc[row_영업이익, prev]
net_now = df_cleaned.loc[row_순이익, latest]
net_prev = df_cleaned.loc[row_순이익, prev]
# 증가 여부 판단
analysis['매출액 증가 여부'] = '📈 증가' if revenue_now > revenue_prev else '📉 감소'
analysis['영업이익 증가 여부'] = '📈 증가' if op_now > op_prev else '📉 감소'
analysis['당기순이익 증가 여부'] = '📈 증가' if net_now > net_prev else '📉 감소'
# 증가율(%) 계산
def calc_rate(now, prev):
try:
if prev == 0:
return "N/A"
return f"{((now - prev) / abs(prev)) * 100:.2f}%"
except:
return "N/A"
analysis['매출액 증가율'] = calc_rate(revenue_now, revenue_prev)
analysis['영업이익 증가율'] = calc_rate(op_now, op_prev)
analysis['당기순이익 증가율'] = calc_rate(net_now, net_prev)
# 영업이익률
if revenue_now != 0:
op_margin = op_now / revenue_now * 100
analysis['영업이익률'] = f"{op_margin:.2f}%"
if op_margin >= 10:
analysis['영업이익률 평가'] = '✅ 우수'
elif op_margin >= 5:
analysis['영업이익률 평가'] = '⚠️ 보통'
else:
analysis['영업이익률 평가'] = '❌ 낮음'
else:
analysis['영업이익률'] = "N/A"
# 연간/분기 추정 힌트
if any("년" in str(col) for col in df.columns):
analysis['데이터 유형'] = '📅 연간 실적'
else:
analysis['데이터 유형'] = '📆 분기 실적 (추정)'
except Exception as e:
analysis['에러'] = f"⚠️ 분석 실패: {str(e)}"
return analysis
def print_analysis(ticker):
print(f"[{ticker}] 재무 분석 요약")
df = get_financial_statement(ticker)
if df is None:
print("❌ 재무제표 데이터 로딩 실패 또는 해당 종목 없음")
return
result = analyze_financials(df)
for k, v in result.items():
print(f"{k}: {v}")
# 예시 실행: 삼성전자(005930)
if __name__ == "__main__":
print_analysis("005930") # 원하는 종목 코드 입력
'랭귀지 > python' 카테고리의 다른 글
재무재표심화 (1) | 2025.08.06 |
---|---|
재무재표개선 (0) | 2025.08.06 |
안전하게 삭제하는 코드 예시 (0) | 2025.06.26 |
git merge (0) | 2025.06.26 |
파일에 최대 5줄까지만 유지하면서 새로운 내용을 추가 (0) | 2025.02.19 |
Comments