[목차]
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)