본문 바로가기

파이썬으로 퀀트 프로그램 만들기 project

(Python)국내 주식 가치 지표 계산하기_2

728x90

전 종목에 해당하는 가치지표를 계산해보겠습니다.

먼저 mysql에서 가치지표 데이터를 담을 테이블을 만들겠습니다.

use stock_db;

create table kor_value
(
종목코드 varchar(6),
기준일 date,
지표 varchar(3),
값 double,
primary key(종목코드, 기준일, 지표)
);

 

이제 전 종목 가치지표를 계산후 sql에 저장해보겠습니다.

#패키지 불러오기
import pymysql
from sqlalchemy import create_engine
import pandas as pd
import numpy as np

# DB 연결
engine = create_engine('mysql+pymysql://root:1234@127.0.0.1:3306/stock_db')
con = pymysql.connect(user='root',
                       passwd = '1234',
                       host = '127.0.0.1',
                       db = 'stock_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(['종목코드', '계정', '기준일'])

#ttm 계산하기
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))))

 

마지막으로 'value' 열의 이름을 '값'으로 바꿔줍니다.

그리고 ttm이 0일 때 값들에 nan혹은 inf가 생깁니다.

sql은 그러한 값은 저장 못하므로 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)

 

이제 sql에 저장해줍니다.

#sql에 저장
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()

 

sql로 돌아가서 확인해 보시면 데이터가 저장되어 있을 것입니다.