채팅으로 주식 공부 GPT 3 (재무 정보 얻기) (tistory.com)
채팅 GPT 3를 통한 주식 연구(재무 정보 얻기)
둘째, 주가 정보를 얻은 후에는 금융 정보를 얻어서 MySQL에 저장하는 방법을 알아보자. 오픈다트 API
akirasujin.tistory.com
지난 회에는 금융 정보까지 받았는데, 이번에는 서로 다른 API를 통해 받은 정보를 이용해 해당 주가를 계산해 보도록 하겠습니다.
이번에는 다양한 정보(포괄손익계산서/대차대조표/현금흐름표 등)를 바탕으로 공정가치를 산정하는데 수고가 많았습니다.
삽질에는 여러 가지 이유가 있었지만 가장 일반적인 이유는 다음과 같습니다.
1. GPT에서 요구하는 공정 가치 계산이 너무 어렵고 직관적이지 않습니다.
2. OpenDART API를 통해 금융 정보를 검색하는 것은 나에게 너무 많은 일입니다.
– 모든 회사의 연간 회계 형식은 동일하지 않습니다.
– 사업마다 2022년 총계좌가 있는 곳과 없는 곳이 있습니다.
3. 주가정보는 기업의 적정가치 산정에 그다지 도움이 되지 않는다.
그래서 많은 삽질 끝에 정신을 차리고 생각을 정리했고, 관련 데이터 시트를 시트별로 따로 정보를 모아서 MySQL에 저장할 필요 없이 바로 엑셀에 저장하는 것도 나쁘지 않을 것 같았습니다.
Excel로 저장하고 Excel에서 계산하는 것으로 시작했습니다.
금융정보 사이트를 찾아보니 http://comp.fnguide.com/ 사이트에서 정보를 긁어내기도 쉽고 여러모로 잘 정리되어 있는 것 같아서 여기에서 모든 데이터를 가져와서 시작하기로 했습니다.
먼저 필요한 모듈을 설치하고 로드합니다.
import pandas as pd
import requests
from bs4 import BeautifulSoup
import pymysql
from datetime import datetime, timedelta
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
from pykrx import stock
웹사이트에서 회사명을 검색하여 재무 정보를 얻으려면 회사의 주식 코드를 알아야 합니다.
모든 상장 기업의 주식 코드는 MySQL 데이터베이스에 저장됩니다.
그리고 회사명을 입력하면 주식코드를 받아 변수에 저장하고 그 코드를 URL에 넣으면 크롤링된다.
회사명으로 검색하시면 금융정보를 불러올 수 있도록 링크가 변경됩니다.
먼저 다음과 같이 SQL 연결을 설정합니다.
# MySQL 연결 설정
conn = pymysql.connect(
host="localhost",
user="본인꺼",
password = '본인꺼',
database="본인꺼"
)
회사 이름과 날짜를 변수로 지정하고,
# 회사 이름 입력 받기
company_name="삼성전자"
today = datetime.now().strftime("%Y%m%d")
rawtoday = datetime.now()
rawyearbefore = rawtoday - timedelta(days=365)
yearbefore = rawyearbefore.strftime("%Y%m%d")
Python을 실행 중인 경우 스톡 코드를 가져올 수 있습니다.
# 주식 코드가져오기
with conn.cursor() as cursor:
sql = "SELECT CODE FROM company_code WHERE company = %s"
cursor.execute(sql, company_name)
result = cursor.fetchone()
if result:
stock_code = result(0)
else:
print("검색된 회사가 없다")
conn.close()
exit()
위에서 언급했듯이 링크 URL에는 stock_code라는 변수가 포함되어 웹 사이트에서 금융 정보를 검색할 수 있습니다.
원하는 기업의 재무정보가 공개된 뒤 홈페이지의 재무정보표를 긁었다.
여기서 주의할 점은 사이트에 들어가면 재무정보가 연도별과 분기별로 구분되어 있다는 점이다.
분기별 재무제표를 만들고 싶었고, (1)(3)(5)가 DataFrame의 각 분기별 재무제표이기 때문에 이렇게 했습니다.
Finance = f'http://comp.fnguide.com/SVO2/ASP/SVD_Finance.asp?pGB=2&gicode=A{stock_code}&cID=&MenuYn=Y&ReportGB=&NewMenuID=103&stkGb=701'
Finance_res = requests.get(Finance)
Finance_soup = BeautifulSoup(Finance_res.content, 'lxml')
Finance_table = Finance_soup.find_all('table')
Finance_df = pd.read_html(str(Finance_table))
포괄손익계산서 = Finance_df(1)
재무상태표 = Finance_df(3)
현금흐름표 = Finance_df(5)
이후 각 스크랩한 재무 정보를 다른 시트의 엑셀 파일로 저장하는 코드를 삽입하고 결국 데이터베이스를 닫았다.
wb = Workbook()
ws1 = wb.active
ws1.title="포괄손익계산서"
ws1.append(('포괄손익계산서'))
for r in dataframe_to_rows(포괄손익계산서, index=False, header=True):
ws1.append(r)
ws2 = wb.create_sheet('재무상태표')
ws2.title="재무상태표"
ws2.append(('재무상태표'))
for r in dataframe_to_rows(재무상태표, index=False, header=True):
ws2.append(r)
ws3 = wb.create_sheet('현금흐름표')
ws3.title="현금흐름표"
ws3.append(('현금흐름표'))
for r in dataframe_to_rows(현금흐름표, index=False, header=True):
ws3.append(r)
wb.save(f'{company_name}_{today}.xlsx')
conn.close()
그 후 파이썬 파일을 실행하고 요약 시트를 붙여넣고 인터넷을 검색한 후 (사경인 회계사)가 만든 적정주식 계산식을 적용하여 테크윙이라는 회사의 적정주가를 계산하고, 다음과 같이 생성되었습니다.
회계사의 공정 가치를 계산하는 공식은 다음과 같습니다.
공정가치 = 기업가치 / 발행주식수
기업가치 = 자기자본 + (초과수익 / 할인율)
초과소득 = 자기자본 x (ROE – 할인율)
할인율 = 한국신용평가(kisrating.com)BBB 채권의 5년 수익률을 참조하십시오.
ROE = P/B/PERPBR = 주가 / BPSPER = 주가 / EPSBPS = 순자산 / 주식수EPS = 순이익 / 주식 수
크롤링된 금융정보에 모든 정보가 들어있어 쉽게 계산할 수 있었습니다.
위의 계산식을 이용해서 여러 기업에 적용해보면 잘 나가는 종목도 있지만 큰 폭의 기업도 많습니다.
공정가치 계산에 익숙한 분들이 이 글을 읽으시면 도와주세요.