[파이썬] yfinance을 이용한 해외 주식 정보 분석

2022. 12. 24. 16:23자격증(다다익선)/파이썬

728x90

https://chanytv.tistory.com/137

 

[파이썬] 변수&기본연산 / 리스트,딕셔너리 / 함수 / 조건문 / 반복문

[파이썬] 변수&기본연산 / 리스트,딕셔너리 / 함수 / 조건문 / 반복문 파이썬 기초를 시작하면서.... 크롤링 한 번 해보자고 시작한 파이썬 공부다. 모든 공부는 기초가 중요한 법!! 이 번 공부로 파

chanytv.tistory.com

https://chanytv.tistory.com/138

 

[파이썬] 스크래핑(크롤링)

https://chanytv.tistory.com/137 [파이썬] 변수&기본연산 / 리스트,딕셔너리 / 함수 / 조건문 / 반복문 [파이썬] 변수&기본연산 / 리스트,딕셔너리 / 함수 / 조건문 / 반복문 파이썬 기초를 시작하면서.... 크

chanytv.tistory.com

https://chanytv.tistory.com/139

 

[파이썬] openpyxl / 파일 업로드, 다운로드

https://chanytv.tistory.com/137 [파이썬] 변수&기본연산 / 리스트,딕셔너리 / 함수 / 조건문 / 반복문 [파이썬] 변수&기본연산 / 리스트,딕셔너리 / 함수 / 조건문 / 반복문 파이썬 기초를 시작하면서.... 크

chanytv.tistory.com

https://chanytv.tistory.com/142

 

[파이썬] Pandas와 DataFrame

https://chanytv.tistory.com/137 [파이썬] 변수&기본연산 / 리스트,딕셔너리 / 함수 / 조건문 / 반복문 [파이썬] 변수&기본연산 / 리스트,딕셔너리 / 함수 / 조건문 / 반복문 파이썬 기초를 시작하면서.... 크

chanytv.tistory.com

 

[파이썬] yfinance을 이용한 해외 주식 정보 분석


pandas의 기초를 어느 정도 공부 했으니 이제 실전이다. yfinance를 이용해서 실제 주식 정보 분석해보는 거다.

역시나 시작 전 환경부터 구성해야 한다.

!pip install yfinance

'yfinance'는 'Yahoo finance'의 줄임말이다. 설치 시 'pip'앞에 '!'를 붙여줘야 하는데 이유는 문법이 아닌 설치 명령어라서 그런다고 한다. 야후 주식 사이트 주소는 아래와 같다. https://pypi.org/project/yfinance/

 

yfinance

Download market data from Yahoo! Finance API

pypi.org

설치가 끝났다면 테스트로 '테슬라'를 조회 해보자.

라이브러리 설정 후 아래와 같이 하면 yfinance에서 제공하는 테슬라 회사의 정보를 볼 수 있다.

import yfinance as yf

company = yf.Ticker('TSLA')

company.info

엄청 많은 내용을 불러오기 때문에 필요한 정보만 추려줄 필요가 있다.

# 회사명, 산업, 시가총액, 매출

name = company.info['shortName']
industry = company.info['industry']
marketcap = company.info['marketCap']
revenue = company.info['totalRevenue']

print(name,industry,marketcap,revenue)

# 대차대조표, 현금흐름표, 기업 실적

company.balance_sheet

company.cashflow

company.earnings

# 주주정보, 애널리스트 추천 등

company.institutional_holders

company.recommendations

company.calendar

news = company.news

for n in news:
  print(n['title'])

정보란건 가공이 들어가야지만 진정으로 의미가 있는 법이다. 값을 불러오는 방법을 알았다면 이를 어떤 식으로 보여줄지 전략을 세우는 게 중요하다. 일단 주식에 대해 전혀 모르는 나는 강의해서 하라는 대로 전략을 세웠다. 나중에 관심이 생기면 내 입맛에 맞는 전략을 세워볼까 한다.

company = yf.Ticker('TSLA')

code = 'TSLA' # 종목코드 
name = company.info['shortName'] # 회사명 
industry = company.info['industry'] # 산업 
marketcap = company.info['marketCap'] # 설명 
summary = company.info['longBusinessSummary'] # 시가총액 
currentprice = company.info['currentPrice'] # 현재 주가
targetprice = company.info['targetMeanPrice'] # 1년 후 예상 주가

per = company.info['trailingPE'] # PER 
eps = company.info['trailingEps'] # EPS 
pbr = company.info['priceToBook'] # PBR 

rev2021 = company.earnings.iloc[-1,0] # 매출 3년 치 가져오기
rev2020 = company.earnings.iloc[-2,0]
rev2019 = company.earnings.iloc[-3,0]

ear2021 = company.earnings.iloc[-1,1] # 순이익 3년 치 가져오기
ear2020 = company.earnings.iloc[-2,1]
ear2019 = company.earnings.iloc[-3,1]

  doc = {
    'code':code,
    'name':name,
    'industry':industry,
    'bussiness':bussiness,
    'marketCap':marketCap/1000,
    'currentPrice':currentPrice,
    'targetPrice':targetPrice,
    'per':per,
    'eps':eps,
    'pbr':pbr,
    'rev2021':rev2021/1000,
    'rev2020':rev2020/1000,
    'rev2019':rev2019/1000,
    'ear2021':ear2021/1000,
    'ear2020':ear2020/1000,
    'ear2019':ear2019/1000,
  }
  return doc

DataFrame형식으로 만들기 위해서는 값을 변환해야 한다. 이는 'doc'를 이용해 변경하면 된다.

여기서 여러 회사를 불러오고 싶다면 반복문(for)을 이용하면 된다.

df = pd.DataFrame()

codes = ['AAPL','ABNB','BIDU','FB','GOOG','MSFT','TSLA','PYPL','NFLX','NVDA']

for code in codes:
  print(code)
  try:
    row = add_company(code)
    df = df.append(row, ignore_index = True)
  except:
    print(f'error - {code}')

df

데이터를 불러왔다면 특정조건으로 정렬을 하거나 분류를 해보자.

# eps 순서대로 정렬해보기

df.sort_values(by='eps',ascending=False)

# 특정 per 이하만 보기

df[df['per'] < 30].sort_values(by='per',ascending=False)

# 현재가격 - 1년 후 가격의 비율 차이가 큰 종목들을 추려내기

df[['code','name','currentPrice','targetPrice']]

new_df = df[['code','name','currentPrice','targetPrice']].copy()
new_df['gap'] = new_df['targetPrice'] / new_df['currentPrice'] -1
new_df.sort_values(by='gap',ascending=False)

# 3년 연속 순수익이 오른 기업을 표기하기

import numpy as np
new_df2 = df[['code','name','ear2021','ear2020','ear2019']].copy()

cond = (new_df2['ear2021'] > new_df2['ear2020']) & (new_df2['ear2020'] > new_df2['ear2019'])

new_df2['is_target'] = np.where(cond,'O','X')

new_df2[new_df2['is_target'] == 'O']

역시 조건이 많아지면 많아질수록 코드 짜기가 여간 어려운 게 아닌 거 같다.

상당히 많이 반복적인 연습을 해야지만 제대로 사용할 수 있을 듯하다.ㅠㅠ

728x90