EXPANSION OF THINKING IN INVESTMENT

투자에 대한 생각의 확장

CODING/PYTHON

[Python] 3주차_DART 데이터 내 마음대로 활용하기(3편) (Feat. 스파르타코딩클럽)

메타닷 2022. 12. 8. 11:06
728x90
반응형

 

드디어, 3주차 마지막 3편이다!

 

6. 상장종목 분석하기

7. 비상장종목 분석하기

 

위 두 가지를 배우고 실습해봤는데,

상장종목에 비해 비상장종목은 종목수도 많고 데이터도 별로 없어서,

유의미한 데이터 분석 결과를 도출하기엔 조금 어려움이 있었다. 

심지어 종목수와 데이터 양이 너무 많아,

전체 데이터를 다 끌고오지 못하는 경우도 있다. (Dart API 콜 제한)

 

상장기업이든, 비상장 기업이든, 

어떤 데이터를 추출하고, 활용해야 좋을지

더 찾아보고 공부해봐야 할 듯 하다.

 

6. 상장 종목 분석하기 

1) 재미로 하는 시총 Top 50 社 - 연봉왕 뽑아보기

 * 한 종목에 대해 뽑아보기   
  - 기업 데이터를 끌어와, 표로 만들어본다. 

corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
data = dart_fss.api.info.indvdl_by_pay(corp_code,'2021'.'11011')

pd.DataFrame(data['list'])

[기업 데이터 표 만들기]


  - 아래와 같이 컬럼명을 바꿔서 뽑아볼 수 있다.

corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
data = dart_fss.api.info.indvdl_by_pay(corp_code, '2021', '11011')
    
df = pd.DataFrame(data['list'])
df = df[['corp_name','nm','ofcps','mendng_totamt']]
df.columns = ['기업명','이름','역할','보수']
df

[컬럼 명 바꾸기]

  - 보수 금액을 문자열에서 숫자형으로 바꾸기

[문자열에서 숫자형으로 바꾸기]

  - 보수 금액을 오름차순/내림차순으로 정렬해본다. 

[보수 금액 정렬하기]


  - 여러 기업에 적용시키기 위해, 함수로 만들어 본다.

def get_salary_top(name):
  corp_code = df_listed[df_listed['corp_name'] == name].iloc[0,0]
  data = dart_fss.api.info.indvdl_by_pay(corp_code, '2021', '11011')
      
  df = pd.DataFrame(data['list'])
  df = df_temp[['corp_name','nm','ofcps','mendng_totamt']]
  df.columns = ['기업명','이름','역할','보수']
  df['보수'] = pd.to_numeric(df['보수'].str.replace(',',''))
  df = df_temp.sort_values(by='보수',ascending=False)
      
  return df

get_salary('삼성전자')

[함수로 만들기]



 *여러개 종목에 대해 뽑아보기

  - 50여개 종목을 뽑아, 합쳐준다.

names = ['삼성전자','LG에너지솔루션','SK하이닉스','NAVER','삼성바이오로직스','삼성전자우','카카오','삼성SDI','현대차','LG화학','기아','POSCO홀딩스','KB금융','카카오뱅크','셀트리온','신한지주','삼성물산','현대모비스','SK이노베이션','LG전자','카카오페이','SK','한국전력','크래프톤','하나금융지주','LG생활건강','HMM','삼성생명','하이브','두산중공업','SK텔레콤','삼성전기','SK바이오사이언스','LG','S-Oil','고려아연','KT&G','우리금융지주','대한항공','삼성에스디에스','현대중공업','엔씨소프트','삼성화재','아모레퍼시픽','KT','포스코케미칼','넷마블','SK아이이테크놀로지','LG이노텍','기업은행']

dfs = []
for name in names:
  try:
     df = get_salary(name)
     dfs.append(df)
  except:
     print(f'error- {name}')
    
df_result = pd.concat(dfs)
df_result

[여러개 종목 데이터 뽑아보기]

 

  - 결과 값에서 '보수'의 내림차순으로 정렬해보고, 상위 30개만 뽑아본다. 

df_result.sort_values(by='보수',ascending=False).head(30)

[데이터 정렬하고 상위 30개 추출하기]


2) 최대 주주의 주식 변동 모아보기

 * 한 종목에 대해 해보기
  - 우선, 특정 기업의 주요 주주 지분율을 다시 본다.

corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
data = dart_fss.api.info.hyslr_sttus('00258801', '2021', '11011')

df = pd.DataFrame(data['list'])
df

[특정 기업 주주지분 데이터 뽑기]

 
  - 보고 싶은 컬럼을 뽑고, 컬럼명을 바꿔준다

data = dart_fss.api.info.hyslr_sttus('00258801', '2021', '11011')
df = pd.DataFrame(data['list'])
    
df = df[['corp_name','nm','relate','bsis_posesn_stock_qota_rt','trmend_posesn_stock_qota_rt','rm']]
df.columns = ['회사명','이름','관계','기초지분율','기말지분율','비고']

df

[컬럼 선택 및 컬럼명 바꾸기]

 

  - 컬럼명 '관계'에서 NaN값을 없애주고, 기초지분율와 기말지분율을 숫자형으로 바꾸어 준다.

  - 그리고, 기초지분율을 내림차순으로 정렬하고, 5개만 뽑아본다. 

df = df[df['관계'].notnull()]
    
df['기초지분율'] = pd.to_numeric(df['기초지분율'])
df['기말지분율'] = pd.to_numeric(df['기말지분율'])
    
df.sort_values(by='기초지분율',ascending=False).head(5)

[NaN값 없애고, 숫자형 변환후 정렬하기]


  - 여러 기업을 적용시키기 위해, 함수로 만들어본다.

def get_shareholders(corp_code):
data = dart_fss.api.info.hyslr_sttus(corp_code, '2021', '11011')
df = pd.DataFrame(data['list'])
    
df = df[['corp_name','nm','relate','bsis_posesn_stock_qota_rt','trmend_posesn_stock_qota_rt','rm']]
df.columns = ['회사명','이름','관계','기초지분율','기말지분율','비고']
    
df = df[df['관계'].notnull()]
    
df['기초지분율'] = pd.to_numeric(df['기초지분율'])
df['기말지분율'] = pd.to_numeric(df['기말지분율'])
    
return df.sort_values(by='기초지분율',ascending=False).head(3)

get_shareholders('00258801')

[함수로 만들기]

   
 * 상장 종목 중 10개만 추려내기
  - 전체 종목을 다 하면 매우 좋겠지만, 하루에 쓸 수 있는 Quata(한도)가 정해져 있기 때문에, 샘플 10개만 뽑아본다. 
  - df_listed만 실행하면 전체 종목이 나오게 된다.

  - df_listed.sample(10) 는 실행할 때 마다 다르게 나온다.

df_listed.sample(10)

[상장종목 10개 추리기]

   
 * 10개 종목에 대해 해보기
  - 우선, 10개 종목의 코드를 출력해본다.

corp_codes = list(df_listed.sample(10)['corp_code'])

for corp_code in corp_codes:
print(corp_code)

[10개 종목코드 추출하기]


  - 10개 기업을 붙여서 보기

corp_codes = list(df_listed.sample(10)['corp_code'])
    
dfs = []
for corp_code in corp_codes:
  try:
    df = get_shareholders(corp_code)
    dfs.append(df)
 except:
    print(f'error - {corp_code}')
    
df_result = pd.concat(dfs)
df_result

[10개 기업의 데이터 합치기]


 * 조건을 추가하기
  - 증감이 큰 순서대로 정렬하기 (여기서 sample(10)을 지우면, 전체 데이터 정렬을 볼 수 있는 것이다.)

corp_codes = list(df_listed.sample(10)['corp_code'])
    
dfs = []
for corp_code in corp_codes:
  try:
    df = get_shareholders(corp_code)
    dfs.append(df)
 except:
    print(f'error - {corp_code}')
    
df_result = pd.concat(dfs)
    
df_result['증감'] = df_result['기말지분율'] - df_result['기초지분율']
    
 df_result.sort_values(by='증감',ascending=False)

[조건에 맞는 컬럼 추가하고 정렬하기]



3) ‘돈 많이 번 회사’를 찾기

 * 한 종목에 대해 해보기
  - 기업의 재무정보 가져오기

corp_code = df_listed[df_listed['corp_name'] == '삼성전자'].iloc[0,0]
data = dart_fss.api.finance.fnltt_singl_acnt(corp_code, '2021', '11011')

df = pd.DataFrame(data['list'])
df

[기업 재무 정보 가져오기]

 

 * 한 종목에 대해 표 그리기

  - 조건을 충족하는 데이터프레임 만들기

[조건을 충족하는 표 만들기]

  - 기본 정보만 가지고 df 만들기

corp_code = df_listed[df_listed['corp_name'] == '삼성전자'].iloc[0,0]
data = dart_fss.api.finance.fnltt_singl_acnt(corp_code, '2021', '11011')
df = pd.DataFrame(data['list'])
    
df = df[df['fs_div'] == 'CFS']
    
df['name'] = '삼성전자'
cond = df['account_nm'] == '이익잉여금'
df = df[cond]
    
df = df[['name','thstrm_amount','frmtrm_amount']]
df.columns = ['이름','당기','전기']
    
df['당기'] = pd.to_numeric(df['당기'].str.replace(',',''))
df['전기'] = pd.to_numeric(df['전기'].str.replace(',',''))
    
df['증감'] = df['당기'] - df['전기']
df['증감율'] = abs(df['증감'])/abs(df['전기'])
    
df

[기본 정보로 새로운 df 만들기]
[증감과 증감율 추가하기]


  - 마찬가지로, 함수로 만들어 본다.

def get_profit(name):
corp_code = df_listed[df_listed['corp_name'] == name].iloc[0,0]
data = dart_fss.api.finance.fnltt_singl_acnt(corp_code, '2021', '11011')
df = pd.DataFrame(data['list'])
    
df = df[df['fs_div'] == 'CFS']
    
df['name'] = name
cond = df['account_nm'] == '이익잉여금'
df = df[cond]
    
df = df[['name','thstrm_amount','frmtrm_amount']]
df.columns = ['이름','당기','전기']
    
df['당기'] = pd.to_numeric(df['당기'].str.replace(',',''))
df['전기'] = pd.to_numeric(df['전기'].str.replace(',',''))
    
df['증감'] = df['당기'] - df['전기']
df['증감율'] = abs(df['증감'])/abs(df['전기'])
    
return df

[여러 기업에 적용하기 위해 함수 만들기]

 

 * 여러 기업에 대해 해보기
  - 마찬가지로 상장사 중 10개를 뽑아서 진행한다.

names = list(df_listed.sample(10)['corp_name'])
    
dfs = []
for name in names:
  try:
    df = get_profit(name)
    dfs.append(df)
 except:
    print(f'error - {name}')
    
df_result = pd.concat(dfs)
df_result

[상장기업 샘플 10개만 뽑아 표로 만들기]


  - 약간의 작업을 거쳐서 이익잉여금의 변화를 우선 표기해준다. 

names = list(df_listed.sample(10)['corp_name'])
    
dfs = []
for name in names:
  try:
    df = get_profit(name)
    dfs.append(df)
  except:
    print(f'error - {name}')
    
df_result = pd.concat(dfs)
df_result.sort_values(by='증감율',ascending=False)

[증감율을 기준으로 정렬하기]

 

 * 남녀 평균 급여 차이가 가장 안나는 회사 찾아보기

[남녀 평균 급여를 뽑아 데이터 변경하고, 함수 만들기]
[새로운 df에 컬럼을 추가하여, 연봉 차이 기준으로 정렬하기]

 


7. 비상장 종목 분석하기 

1) 한 종목에 대해 해보기

  - 배당 정보 가져오기

corp_code = df_non_listed[df_non_listed['corp_name'] == '야놀자'].iloc[0,0]
data = dart_fss.api.info.alot_matter(corp_code, '2021', '11011')
df = pd.DataFrame(data['list'])

df

[비상장주식 배당정보 가져오기]

  - 배당 정보 다듬기

corp_code = df_non_listed[df_non_listed['corp_name'] == '야놀자'].iloc[0,0]
data = dart_fss.api.info.alot_matter(corp_code, '2021', '11011')
df = pd.DataFrame(data['list'])

df = df[df['se'] == '(연결)당기순이익(백만원)'][['corp_name','thstrm','frmtrm','lwfr']]
df.columns = ['기업명','2021','2020','2019']
df

[데이터 표로 만들기]

 

[숫자형으로 변환하기]

 

 

  - 함수로 만들기

def get_earning(name):
  corp_code = df_non_listed[df_non_listed['corp_name'] == '야놀자'].iloc[0,0]
  data = dart_fss.api.info.alot_matter(corp_code, '2021', '11011')
  df = pd.DataFrame(data['list'])

  df = df[df['se'] == '(연결)당기순이익(백만원)'][['corp_name','thstrm','frmtrm','lwfr']]
  df.columns = ['기업명','2021','2020','2019']
  return df

[함수로 만든 후 다른 기업에 적용해보기]

 

 

2) 여러 종목 해보기

  - 할 수는 있지만, 비상장종목은 특히 정보가 없는 경우가 많다.

[여러 종목에 적용하기]

 

 

 

728x90
반응형