본문 바로가기

카테고리 없음

개발일지 3주차(2) - Dart 상장 종목 분석

[목차]

1. 상장 종목 분석하기

2. 비상장 종목 분성하기

3. 숙제

 

1. 상장 종목 분석하기

1) 시총 Top 연봉왕 뽑아보기

 - 한 종목에 대해 뽑아보기

corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
print(corp_code) #여기까지는 내가 원하는 회사의 코드를 가져와서 저장

data = dart_fss.api.info.indvdl_by_pay(corp_code, '2021', '11011')

df_temp = pd.DataFrame(data['list'])
df_temp = df_temp[['corp_name','nm','ofcps','mendng_totamt']]
df_temp.columns = ['기업명','이름','역할','보수']

df_temp
#추가로 함수로 만들고 싶을 때

df_temp['보수'] = pd.to_numeric(df_temp['보수'].str.replace(',',''))
df_temp = df_temp.sort_value(by='보수', ascending =False)

return df_temp

get_salary_top('삼성전자')
get_salary_top('카카오')

 - 여러 종목에 대해 뽑아보기

names = ['회','사','명'] #여러 회사 

dfs = [] # 리스트를 만들어

for name in names: # 반복문을 사용
  try:
    df = get_salary_top(name) #이름을 넣고
    dfs.append(df) 리스트에 df을 추가해라
  except: # 에러가 날 경우..//연봉 5억이상 5명이 없을 수도 있다.
    print(f'없음 - {name}') #계속해라

df_result = pd.concat(dfs) #위에것을 합쳐 준다.

df_result

# 새로운 코드를 만들고
df_result.sort_values(by='보수',ascending=False) #연봉 오름차순
df_result.sort_values(by='보수',ascending=False).head(30) #탑 30명을 보고 싶을때

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

- 한 종목에 대해 해보기

** 초보는 정리가 중요

1. (정기보고서)최대 주주 현황을 볼수 있는 코드를 찾고 복붙

2. 결과 확인 하면 보기가 쉽지 않음 (정리)

 - df를 가져와 뽑고 싶은 것 찾기

 - colums를 통해 알아보기 쉽게 정리 ( 회사명, 이름, 관계, 기초지분, 기말지분, rm )

3. 지분율에 숫자가 문자열이여서 정수로 변경 후 정렬

 - df['지분율'] = pd.to_numeric(df['지분'])

4. 관계가 None이 아닌 것은 뽑는다.

 - df = df[df['관계'].notnull()]

5. sort_value(by = '지분율' , ascending = false).head(3)내림차순으로 뽑는다.

 

정리 : 최대 주주 현황을 가져와 내가 원하는 정보를 보기 쉽게 변경

+ 필요없는 정보는 제거, 원하는 정보값 정렬을 위해 문자열 + 숫자로 변경 

 

corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
corp_code


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 = df[df['관계'].notnull()]

df['기초지분율'] = pd.to_numeric(df['기초지분율'])
df['기말지분율'] = pd.to_numeric(df['기말지분율'])

# 함수로 만든다면..
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개 만 추려내기

df_listed.sample(10) # 정보를 가져올 수 있는 제한이 있기에 샘플로 10개만 가져옴

corp_codes = list(df_listed.sample(10)['corp_code']) # 샘플의 corp_code를 리스트화

dfs = [] # 빈리스트를 생성

for corp_code in corp_codes:# 반복문으로 실행
  try:
    df = get_shareholders(corp_code) #샘플코드를 하나식
    dfs.append(df)#dfs 에 넣어준다
  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) 돈 많이 번 회사 찾기

 - 한 종목에 대해 뽑기

def get_profit(corp_name):
  corp_code = df_listed[df_listed['corp_name'] == 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'] #CFS인것만 가져온다.

  df['name'] = corp_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['전기']) //abs는 절대값이기에 무조건 + 만 나옴

  return df

 - 여러 종목에 대해 뽑기

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)

# 이는 최대 주주의 주식 변동 10개 추려보는 것과 비슷한 방법이라 생략하겠다.

 

2. 비상장 종목 분성하기

비상장 종목은 '사업보고서 주요정보'만 분석 가능

'배당' 항목을 통해 당기순이익 확인 법

 

 - 한 종목에 대해 알아보기

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'] == '(연결)당기순이익(백만원)']
  #df = df[['corp_name','thstrm','frmtrm','lwfr']]
  # -> 밑의 방식으로 쉽게 변경
  df = df[df['se'] == '(연결)당기순이익(백만원)'][['corp_name','thstrm','frmtrm','lwfr']]
  df.columns = ['기업명','2021','2020','2019']
  
  return df

 - 여러 종목 해보기

잘 안나온다..

df_non_listed.sample(10)['corp_name']
dfs = []

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

3. 숙제

# Nomal code 
!pip install dart-fss 
# Add code
import dart_fss as dart_fss
import pandas as pd

api_key = 'my api code'
dart_fss.set_api_key(api_key=api_key)
# Add code
all = dart_fss.api.filings.get_corp_code()
# Add code
df = pd.DataFrame(all)

df_listed = df[df['stock_code'].notnull()]
df_non_listed = df[df['stock_code'].isnull()]
# Add code
corp_codes = list(df_listed.sample(10)['corp_code'])

dfs = []
for corp_code in corp_codes:
  try:
    df = get_salary(corp_code)
    dfs.append(df)
  except:
    print(f'error - {corp_code}')

df_result = pd.concat(dfs)

df_result['차이(남-여)'] = df_result['연봉(남)'] - df_result['연봉(여)']
df_result['평균'] = (df_result['연봉(남)']+df_result['연봉(여)'])/2

df_result.sort_values(by="차이(남-여)",ascending=True)