From aa5807690be358e0a767038404cc431f1055943c Mon Sep 17 00:00:00 2001 From: ayuriel Date: Fri, 31 Jan 2025 11:04:41 +0900 Subject: [PATCH] =?UTF-8?q?feat:=2010=EC=9E=A5=20=EA=B0=80=EC=B9=98?= =?UTF-8?q?=EC=A7=80=ED=91=9C=20=EA=B3=84=EC=82=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/10-calculate-stock-value.py | 96 +++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 example/10-calculate-stock-value.py diff --git a/example/10-calculate-stock-value.py b/example/10-calculate-stock-value.py new file mode 100644 index 0000000..0e94d1d --- /dev/null +++ b/example/10-calculate-stock-value.py @@ -0,0 +1,96 @@ +# 패키지 불러오기 +import os +from urllib.parse import quote_plus + +import pymysql +from sqlalchemy import create_engine +import pandas as pd +import numpy as np +from dotenv import load_dotenv + +load_dotenv() +user = os.getenv('DB_USER') +pw = os.getenv('DB_PW') +engine_for_pw = quote_plus(pw) +host = os.getenv('DB_HOST') +port = int(os.getenv('DB_PORT')) +db = os.getenv('DB_DB') + +# DB 연결 +engine = create_engine(f'mysql+pymysql://{user}:{engine_for_pw}@{host}:{port}/{db}') +con = pymysql.connect(user=user, + passwd=pw, + host=host, + port=port, + db=db, + charset='utf8') +mycursor = con.cursor() +# 가치 지표 계산 +# 분기 재무제표 불러오기 +kor_fs = pd.read_sql(""" +select * from kor_fs +where 공시구분 = 'q' +and 계정 in ('당기순이익', '자본', '영업활동으로인한현금흐름', '매출액'); +""", con=engine) + +# 티커 리스트 불러오기 +ticker_list = pd.read_sql(""" +select * from kor_ticker +where 기준일 = (select max(기준일) from kor_ticker) +and 종목구분 = '보통주'; +""", con=engine) + +engine.dispose() + +# TTM 구하기 +kor_fs = kor_fs.sort_values(['종목코드', '계정', '기준일']) +kor_fs['ttm'] = kor_fs.groupby(['종목코드', '계정'], as_index=False)['값'].rolling( + window=4, min_periods=4).sum()['값'] + +# 자본은 평균 구하기 +kor_fs['ttm'] = np.where(kor_fs['계정'] == '자본', kor_fs['ttm'] / 4, + kor_fs['ttm']) +kor_fs = kor_fs.groupby(['계정', '종목코드']).tail(1) + +kor_fs_merge = kor_fs[['계정', '종목코드', + 'ttm']].merge(ticker_list[['종목코드', '시가총액', '기준일']], + on='종목코드') +kor_fs_merge['시가총액'] = kor_fs_merge['시가총액'] / 100000000 + +kor_fs_merge['value'] = kor_fs_merge['시가총액'] / kor_fs_merge['ttm'] +kor_fs_merge['value'] = kor_fs_merge['value'].round(4) +kor_fs_merge['지표'] = np.where( + kor_fs_merge['계정'] == '매출액', 'PSR', + np.where( + kor_fs_merge['계정'] == '영업활동으로인한현금흐름', 'PCR', + np.where(kor_fs_merge['계정'] == '자본', 'PBR', + np.where(kor_fs_merge['계정'] == '당기순이익', 'PER', None)))) + +kor_fs_merge.rename(columns={'value': '값'}, inplace=True) +kor_fs_merge = kor_fs_merge[['종목코드', '기준일', '지표', '값']] +kor_fs_merge = kor_fs_merge.replace([np.inf, -np.inf, np.nan], None) + +query = """ + insert into kor_value (종목코드, 기준일, 지표, 값) + values (%s,%s,%s,%s) as new + on duplicate key update + 값=new.값 +""" + +args_fs = kor_fs_merge.values.tolist() +mycursor.executemany(query, args_fs) +con.commit() + +ticker_list['값'] = ticker_list['주당배당금'] / ticker_list['종가'] +ticker_list['값'] = ticker_list['값'].round(4) +ticker_list['지표'] = 'DY' +dy_list = ticker_list[['종목코드', '기준일', '지표', '값']] +dy_list = dy_list.replace([np.inf, -np.inf, np.nan], None) +dy_list = dy_list[dy_list['값'] != 0] + +args_dy = dy_list.values.tolist() +mycursor.executemany(query, args_dy) +con.commit() + +engine.dispose() +con.close() \ No newline at end of file