| 
									
										
										
										
											2025-01-31 11:04:41 +09:00
										 |  |  | # 패키지 불러오기 | 
					
						
							|  |  |  | import numpy as np | 
					
						
							| 
									
										
										
										
											2025-01-31 16:22:23 +09:00
										 |  |  | import pandas as pd | 
					
						
							| 
									
										
										
										
											2025-01-31 11:04:41 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-31 16:22:23 +09:00
										 |  |  | import quantcommon | 
					
						
							| 
									
										
										
										
											2025-01-31 11:04:41 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | # DB 연결 | 
					
						
							| 
									
										
										
										
											2025-01-31 16:22:23 +09:00
										 |  |  | common = quantcommon.QuantCommon() | 
					
						
							|  |  |  | engine = common.create_engine() | 
					
						
							|  |  |  | con = common.connect() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-31 11:04:41 +09:00
										 |  |  | 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() |