일봉(고가/저가/시가/종가/거래량) 데이터
!pip instasll finance-datareader==0.9.1
import FinanceDataReader as fdr
samsung_df = fdr.DataReader('005390', '2017-01-01', '2017-12-31')
print(samsung_df)
Open High Low Close Volume Change
Date
2017-01-02 1260 1300 1255 1295 1232965 0.040161
2017-01-03 1305 1315 1280 1310 886559 0.011583
2017-01-04 1305 1310 1280 1305 446070 -0.003817
2017-01-05 1305 1330 1300 1320 721691 0.011494
2017-01-06 1320 1345 1305 1325 645608 0.003788
... ... ... ... ... ... ...
2017-12-21 1080 1095 1050 1050 526785 -0.032258
2017-12-22 1050 1065 1040 1050 575426 0.000000
2017-12-26 1050 1070 1045 1060 441204 0.009524
2017-12-27 1080 1095 1060 1095 428161 0.033019
2017-12-28 1095 1095 1050 1065 559604 -0.027397
[243 rows x 6 columns]
재무 데이터 받기 - new : lib사용
!pip install pykrx
from pykrx import stock
# ticker 받기
tickers = stock.get_market_ticker_list("20190225")
# 20190225에 상장된 티커 모두 출력
tickers = stock.get_market_ticker_list()
# 최근 영업일 기준 티커 출력
tickers = stock.get_market_ticker_list("20190225", market="KOSDAQ")
# KOSDAQ에만 있는 티커, KOSPI, KOSDAQ, KONEX, ALL (디폴트는 KOSPI)
# 티커로 종목명 조회
for ticker in stock.get_market_ticker_list():
종목 = stock.get_market_ticker_name(ticker)
print(종목)
# 일봉데이터
df = stock.get_market_ohlcv("20150720", "20150810", "005930")
"""
시가 고가 저가 종가 거래량
날짜
2015-07-20 25820 26080 25460 25500 128928
2015-07-21 25500 25540 24940 25260 194055
2015-07-22 24880 25200 24700 25060 268323
"""
# 상폐종목 확인
df = stock.get_market_ohlcv("20150720", "20150810", "005930")
if df.empty :
print("error") # 상폐
else:
print(df)
# 상폐종목의 주가조회
# adjusted=False로 둬야한다(수정종가가 아님)
df = stock.get_market_ohlcv("20150720", "20150810", "005930", adjusted=False)
# 특정일 코스피 전체 종목 조회
df = stock.stock.get_market_ohlcv("20210122")
재무 데이터 분석 - old : opendart에서 파싱해서 구하기
API 발급
-
링크 -> 인증키 신청/관리
-
필요한 재무 데이터?
- PER = (주가)/(EPS) = (주가)/[(순이익)/(총발행주식수)] = [(주가)*(총발행주식수)]/(순이익) = (시가총액)/(순이익)
- 시가총액, 순이익 필요
- PBR = (주가)/[(순자산)/(총발행주식수)] = [(주가)*(총발행주식수)]/(순자산) = (시가총액)/(순자산)
- 시가총액, 순자산 필요
- ROE = (당기순이익)/(순자산) = (PBR)/(PER)
- PER, PBR 필요
- ROA = (당기순이익)/(자산총액)
- 당기순이익, 자산총액 필요
- PER = (주가)/(EPS) = (주가)/[(순이익)/(총발행주식수)] = [(주가)*(총발행주식수)]/(순이익) = (시가총액)/(순이익)
필요한 데이터를 구해보자.
!pip install opendartreader
import OpenDartReader
api_key = '{api key}'
dart = OpenDartReader(api_key)
자산, 당기순이익 구하기
"""
corp='종목코드'
bsns_year='사업연도'
reprt_code='1분기보고서-11013 / 반기보고서-11012 / 3분기보고서-11014 / 사업보고서-11011'
"""
# 2019년 사업보고서
fs_2019 = dart.finstate_all(corp='005930', bsns_year='2019', fs_div='CFS', reprt_code=11011)
# 2020년 3분기 보고서
fs_2020_3Q = dart.finstate_all(corp='005930', bsns_year='2020', fs_div='CFS', reprt_code=11014)
"""
sj_div=BIS # BIS 재무상태표
sj_div=CIS # CIS 포괄손익계산서
"""
# 자본 받기
# fs_2020_3Q.loc[fs_2020_3Q['sj_div'].isin(['BS']) & fs_2020_3Q['account_id'].isin(['ifrs-full_Equity']), ]
"""
rcept_no | reprt_code | bsns_year | corp_code | sj_div | sj_nm | account_id | account_nm | account_detail | thstrm_nm ...
52 20201116001248 | 11014 | 2020 | 00126380 | BS | 재무상태표 | ifrs-full_Equity | 자본총계 | - | 제 52 기 3분기말 ...
thstrm_amount | frmtrm_nm | frmtrm_amount | ord | thstrm_add_amount | frmtrm_q_nm | frmtrm_q_amount | frmtrm_add_amount
276136188000000 | 제 51 기말 | 262880421000000 | 55 | NaN | NaN | NaN | NaN
"""
# 부채 받기
# fs_2020_3Q.loc[fs_2020_3Q['sj_div'].isin(['BS']) & fs_2020_3Q['account_id'].isin(['ifrs-full_Liabilities']), ]
"""
rcept_no | reprt_code | bsns_year | corp_code | sj_div | sj_nm | account_id | account_nm | account_detail | thstrm_nm | frmtrm_add_amount
42 20201116001248 | 11014 | 2020 | 00126380 | BS | 재무상태표 | ifrs-full_Liabilities | 부채총계 | - | 제 52 기 3분기말 | 99652554000000
thstrm_amount | frmtrm_nm | frmtrm_amount | ord | thstrm_add_amount | frmtrm_q_nm | frmtrm_q_amount
제 51 기말 | 89684076000000 | 44 | NaN | NaN | NaN | NaN
"""
# 자본과 부채는 재무상태표에서 당기금액('thstrm_amount') 값을 가져오면 됨
# 당기자본(자본총계)
equity = int(fs_2020_3Q.loc[fs_2020_3Q['sj_div'].isin(['BS']) & fs_2020_3Q['account_id'].isin(['ifrs-full_Equity']), 'thstrm_amount'].replace(",", ""))
# 당기부채(부채총계)
liability = int(fs_2020_3Q.loc[fs_2020_3Q['sj_div'].isin(['BS']) & fs_2020_3Q['account_id'].isin(['ifrs-full_Liabilities']), 'thstrm_amount'].replace(",", ""))
# 자본 + 부채 = 자산총계
assets = equity + liability
# 당기순이익 받기
# fs_2020_3Q.loc[fs_2020_3Q['sj_div'].isin(['IS']) & fs_2020_3Q['account_id'].isin(['ifrs-full_ProfitLossAttributableToOwnersOfParent']), ]
"""
rcept_no | reprt_code | bsns_year | corp_code | sj_div | sj_nm | account_id | account_nm ...
68 20201116001248 | 11014 | 2020 | 00126380 | IS | 손익계산서 | ifrs-full_ProfitLossAttributableToOwnersOfParent | 지배기업의 소유주에게 귀속되는 당기순이익(손실) ...
account_detail | thstrm_nm | thstrm_amount | frmtrm_nm | frmtrm_amount | ord | thstrm_add_amount | frmtrm_q_nm | frmtrm_q_amount | frmtrm_add_amount
- | 제 52 기 3분기 | 9266814000000 | NaN | NaN | 15 | 19645377000000 | 제 51 기 3분기 | 6105039000000 | 16277059000000
"""
# 2019 4분기 ~ 2020 3분기까지의 당기순이익의 합을 구하려면 2019년 4분기 당기순이익과 2020년 1분기 ~ 3분기 당기순이익의 합을 알아여함
# 2020년 1분기 ~ 3분기 당기순이익의 합은 2020년 3분기 손익계산서에서 'thstrm_add_amount' 값을 가져오면 되고
# 2019년 4분기 당기순이익은 2019년 전체 당기순이익에서 2019년 1분기 ~ 3분기 당기순이익의 합을 빼서 구할 수 있음
# 2019 년 1~3분기 당기순이익
profit_2019_3Q = int(fs_2020_3Q.loc[fs_2020_3Q['sj_div'].isin(['IS']) & fs_2020_3Q['account_id'].isin(['ifrs-full_ProfitLossAttributableToOwnersOfParent']), 'frmtrm_add_amount'].replace(",", ""))
# 2019 전체 당기순이익
profit_2019 = int(fs_2019.loc[fs_2019['sj_div'].isin(['IS']) & fs_2019['account_id'].isin(['ifrs-full_ProfitLossAttributableToOwnersOfParent']), 'thstrm_amount'].replace(",", ""))
# 2020년 1~3분기 당기순이익
profit_2020_3Q = int(fs_2020_3Q.loc[fs_2020_3Q['sj_div'].isin(['IS']) & fs_2020_3Q['account_id'].isin(['ifrs-full_ProfitLossAttributableToOwnersOfParent']), 'thstrm_add_amount'].replace(",", ""))
profit = (profit_2019-profit_2019_3Q) + profit_2020_3Q
profit
발행주식수, 시가총액 구하기
- 문제점: EPS는 보통주와 우선주의 합인 수정평균발행주식수를 이용하여 계산하는데 Open dart API를 통해서는 우선주의 총발행 주식수를 정확하게 확인할 수 있는 방법이 없음
- marcap에서 상장기업의 데이터셋을 받을 수 있음.
# 삼성전자
df_005930 = marcap_data('2021-01-21', code='005930')
df_005930 = df_005930.assign(Amount=df_005930['Amount'].astype('int64'),
Marcap=df_005930['Marcap'].astype('int64'))
df_005930
"""
| Code | Name | Market | Dept | Close | ChangeCode | Changes | ChagesRatio | Open | High | Low | Volume | Amount | Marcap | Stocks | MarketId | Rank
Date
2021-01-21 | 005930 | 삼성전자 | KOSPI | NaN | 88100 | 1 | 900 | 1.03 | 87500 | 88600 | 86500 | 25318011 | 2211209788500 | 525937842655000 | 1674815254 | STK | 1
"""
# 이걸로 오해할 수 있는데 데이터가 잘못됨
df_005930['Stocks'].iat[0] # 1674815254
# 시가총액/종가 로 계산하면 맞게 나옴
stocks_005930 = int(df_005930['Marcap']/df_005930['Close'])
stocks_005930 # 5969782550
# 삼성전자우
df_005935 = marcap_data('2021-01-21', code='005935')
df_005935 = df_005935.assign(Amount=df_005935['Amount'].astype('int64'),
Marcap=df_005935['Marcap'].astype('int64'))
df_005935
# 물론 맞는경우도 있음
df_005935['Stocks'].iat[0] # 822886700
# 그래도 이게 확실
stocks_005935 = int(df_005935['Marcap']/df_005935['Close'])
stocks_005935 # 822886700
# 총 발행주식수 계산
total_stocks = stocks_005930 + stocks_005935
total_stocks
지표를 구해보자
다시 정리하자면 …
- EPS = (순이익)/(총발행주식수)
-
PER = (주가)/(EPS)
- BPS = (순자산)/(총발행주식수)
-
PBR = (주가)/(BPS)
- ROE = (당기순이익)/(순자산) = (PBR)/(PER)
- ROA = (당기순이익)/(자산총액)
# EPS = (순이익)/(총발행주식수)
# PER = (주가)/(EPS)
EPS = profit/total_stocks
PER = df_005930['Close'].iat[0]/EPS
# BPS = (순자산)/(총발행주식수)
# PBR = (주가)/(BPS)
BPS = eqauity/total_stocks
PBR = df_005930['Close'].iat[0]/BPS
# ROE = (당기순이익)/(순자산) = (PBR)/(PER)
# ROA = (당기순이익)/(자산총액)
ROE = PBR/PER
ROA = profit/assets