(Python : Basic) 데이터 분석 라이브러리 사용하기

Posted by : at

Category : Python


일봉(고가/저가/시가/종가/거래량) 데이터

!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 = (당기순이익)/(자산총액)
      • 당기순이익, 자산총액 필요

필요한 데이터를 구해보자.

!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

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links