드디어, 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)
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)
- 여러 기업을 적용시키기 위해, 함수로 만들어본다.
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개 종목의 코드를 출력해본다.
corp_codes = list(df_listed.sample(10)['corp_code'])
for corp_code in corp_codes:
print(corp_code)
- 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
* 조건을 추가하기
- 증감이 큰 순서대로 정렬하기 (여기서 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
- 마찬가지로, 함수로 만들어 본다.
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
- 약간의 작업을 거쳐서 이익잉여금의 변화를 우선 표기해준다.
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)
* 남녀 평균 급여 차이가 가장 안나는 회사 찾아보기
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) 여러 종목 해보기
- 할 수는 있지만, 비상장종목은 특히 정보가 없는 경우가 많다.
'CODING > PYTHON' 카테고리의 다른 글
[Python] 4주차_백테스팅 기초(1) : 골든/데드크로스 전략 구현 (2편) (Feat. 스파르타코딩클럽) (0) | 2022.12.13 |
---|---|
[Python] 4주차_백테스팅 기초(1) : 골든/데드크로스 전략 구현 (1편) (Feat. 스파르타코딩클럽) (0) | 2022.12.13 |
[Python] 3주차_DART 데이터 내 마음대로 활용하기(2편) (Feat. 스파르타코딩클럽) (0) | 2022.12.08 |
[Python] 3주차_DART 데이터 내 마음대로 활용하기(1편) (Feat. 스파르타코딩클럽) (1) | 2022.12.08 |
[Python] 2주차_손쉽게 다루는 해외주식(2편) (Feat. 스파르타코딩클럽) (0) | 2022.12.04 |