10년 재무제표, FCF 확인하기(Feat.마이스노우볼) - 파이썬 코드 활용

상장 기업 10년 FCF를 쉽게 볼 수 있는 방법을 찾다가 결국 파이썬 코드를 이용하기로 했다. DART API를 통해 재무제표 추출하는 과정은 시간도 너무 오래 걸리고 ChatGPT와 Grok 형들이 감당을 하지 못해서 그냥 마이스노우볼 사이트를 활용하기로 했다. 아, 참고로 DART API가 10년 이상 데이터는 가져오지 못하는 듯했다.

마이스노우볼 사이트가 제공하는 재무제표

기업 리스트를 보여주는 화면으로, 각 행은 개별 기업을 나타내며 오른쪽 아이콘 중 돋보기 모양은 해당 기업의 상세 정보를 조회할 수 있는 버튼입니다.

마이스노우볼 사이트에서 각 종목 옆의 눈이 그려진 돋보기 모양 아이콘을 클릭하면 해당 종목의 10년치 재무제표가 나타난다. 현금흐름표의 영업 FCF와 CAPEX도 나타나서 FCF도 구할 수 있다. 페이지 최상단에는 시가총액도 나타나 있어서, 현재 시가총액이 FCF의 몇 배인지도 파악할 수 있다.

삼성전자의 연간 재무제표를 보여주는 화면으로, 매출액, 영업이익, 당기순이익 등 주요 재무 지표가 연도별로 나열되어 있고, 상단에는 시가총액, PER, PBR, 배당률 등의 지표도 포함되어 있습니다.

이때 이 페이지의 웹사이트 주소를 보면 다음과 같다. https://www.mysnowball.co.kr/intro/tool/view_analysis001/?target_code=005930&target_name=삼성전자

“target_code=005930”의 종목코드에 따라서 해당 종목의 재무제표가 나타난다. 뒤에 “target_name=삼성전자”의 “삼성전자”는 무엇이 와도 상관없다. 입력된 종목 코드에 해당되는 정보만 웹사이트가 불러온다. 그러니까 이 부분은 공란이어도 된다.

종목명으로 재무정보 확인하는 웹페이지 이동(파이썬 코드)

나는 종목명을 입력하면 해당 종목의 10년 재무정보를 보여주는 웹페이지로 이동하고 싶었다. 이를 구현하기 위해 ChatGPTGrok을 활용하여 구글 코랩에서 작동하는 파이썬 코드를 작성하였다.(구글 코랩 사용법을 모르겠다면 그냥 구글에 검색해보면 된다. 사용법도 간단하고 매우 친절하게 설명해준 글들이 많다.)

코드는 다음과 같다.

import pandas as pd
import requests
from IPython.display import display, HTML

# KRX에서 상장 기업 데이터 가져오기
def get_krx_data():
    url = "http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13"
    response = requests.get(url)
    df = pd.read_html(response.content, header=0)[0]
    df['종목코드'] = df['종목코드'].apply(lambda x: f"{x:06d}")
    return df

# 기업 이름으로 주식 코드 찾기
def find_stock_code(company_name, df):
    # 1. 정확한 이름 매칭 시도
    exact_match = df[df['회사명'] == company_name]
    if not exact_match.empty:
        stock_code = exact_match.iloc[0]['종목코드']
        matched_name = exact_match.iloc[0]['회사명']
        return [(stock_code, matched_name)]
    
    # 2. 부분 매칭 시도
    result = df[df['회사명'].str.contains(company_name, case=False, na=False)]
    if not result.empty:
        return [(row['종목코드'], row['회사명']) for _, row in result.iterrows()]
    
    # 3. 매칭 결과 없음
    return []

# mysnowball URL 생성 및 링크 표시
def open_mysnowball_url(company_name, df):
    matches = find_stock_code(company_name, df)
    
    if not matches:
        print(f"'{company_name}'에 해당하는 상장 기업을 찾을 수 없습니다. 정확한 회사명을 입력해 주세요.")
        return
    
    if len(matches) == 1:
        stock_code, matched_name = matches[0]
        url = f"https://www.mysnowball.co.kr/intro/tool/view_analysis001/?target_code={stock_code}&target_name={matched_name}"
        link_html = f'접속 중: {url}'
        display(HTML(link_html))
    else:
        print(f"'{company_name}'에 대한 검색 결과 ({len(matches)}개):")
        for i, (stock_code, matched_name) in enumerate(matches, 1):
            print(f"{i}. {matched_name} (종목코드: {stock_code})")
        try:
            choice = int(input("원하는 회사의 번호를 선택하세요 (1~{}): ".format(len(matches))))
            if 1 <= choice <= len(matches):
                stock_code, matched_name = matches[choice - 1]
                url = f"https://www.mysnowball.co.kr/intro/tool/view_analysis001/?target_code={stock_code}&target_name={matched_name}"
                link_html = f'접속 중: {url}'
                display(HTML(link_html))
            else:
                print("잘못된 번호입니다. 다시 시도하세요.")
        except ValueError:
            print("숫자를 입력해 주세요.")

# 메인 루프
def main():
    df = get_krx_data()  # 데이터를 한 번만 가져오도록 최적화
    print("상장 기업 이름을 입력하세요 (예: 삼성전자). 종료하려면 'quit' 입력:")

    while True:
        company_name = input("> ")
        if company_name.lower() == 'quit':
            print("프로그램을 종료합니다.")
            break
        open_mysnowball_url(company_name, df)

# 프로그램 시작
main()

주식 종목명과 일치하는 종목코드를 찾아서 이를 토대로 웹사이트 주소를 만들어주는 코드이다. 이 코드를 실행(shift+enter)하고 나타나는 빈칸에 원하는 종목명을 입력하고 엔터를 누르면 해당 종목의 재무제표 웹사이트 주소가 나타난다. 이를 클릭하면 된다. 다른 종목도 확인해보고 싶으면 빈칸에 또 새로운 종목이름을 입력하고 엔터를 누르면 된다.

이미지는 주식 종목 분석 도구의 실행 예시로, ①에서는 사용자가 기업 이름을 입력하기 전 상태이고, ②에서는 '삼성전자'를 입력해 관련 분석 페이지(https://www.mysnowball.co.kr/...)에 접속된 상태를 보여줍니다.

기업명 검색후 다른 기업을 검색하고 싶다면 또 다시 입력하고 엔터를 누르면 된다. 코드를 재실행 할 필요 없다.

코드를 종료하고 싶다면 네모 박스에 "quit"을 입력하고 엔터를 누르거나, 코드 자체를 정지시키는 "정지"버튼을 누르면 된다.

마무리

마이스노우볼에서 종목명 입력하는 기능이 추가된다면 이 글은 의미가 없어진다. 나중에 추가됐으면 좋겠다.

이 글의 목차
    면책: 이 글은 개인적 의견을 담은 정보 제공용 기록이며 투자 조언 또는 투자 권유가 아닙니다.
    링크가 복사되었습니다.