96 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | # 패키지 불러오기 | ||
|  | 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() |