import yfinance as yf
import pandas as pd
# 엑셀 파일 경로
file_path = r"C:\Users\PC\Desktop\python work space\US_stock_data.xlsx"
# 기업 리스트 (알파벳순으로 정렬)
tickers = sorted(["NVDA", "AVGO", "MSFT", "V", "META",
"AAPL", "BRK.B", "PLTR", "AMZN", "GOOGL",
"TSLA", "NFLX", "TSM", "ASML", "AMD",
"INTC", "QCOM", "TXN", "AMAT", "LRCX"])
# 데이터를 저장할 리스트
stock_data = []
# 시가총액을 숫자로 변환하는 함수
def parse_market_cap(market_cap):
# 시가총액 문자열이 'B', 'M', 'K' 등의 단위를 포함한 경우 이를 변환
if isinstance(market_cap, str):
market_cap = market_cap.upper()
if 'B' in market_cap: # Billion
return float(market_cap.replace('B', '').strip()) * 1e9
elif 'M' in market_cap: # Million
return float(market_cap.replace('M', '').strip()) * 1e6
elif 'K' in market_cap: # Thousand
return float(market_cap.replace('K', '').strip()) * 1e3
return market_cap
# 각 기업의 데이터 수집
for ticker in tickers:
stock = yf.Ticker(ticker)
info = stock.info
# 시가총액이 없으면 건너뛰기
market_cap = info.get("marketCap", None)
if market_cap is None:
continue # 시가총액이 없는 기업은 건너뜁니다.
# 시가총액을 숫자로 변환
market_cap = parse_market_cap(market_cap)
stock_data.append([
ticker,
info.get("longName", "N/A"), # 회사명
market_cap, # 시가총액
info.get("trailingPE", "N/A"), # PER
info.get("forwardPE", "N/A"), # Forward PER
info.get("priceToBook", "N/A"), # PBR
info.get("returnOnEquity", "N/A"), # ROE
info.get("operatingMargins", "N/A"), # 영업이익률
info.get("debtToEquity", "N/A") # 부채비율
])
# 데이터프레임 생성
df = pd.DataFrame(stock_data, columns=["티커", "회사명", "시가총액", "PER", "Forward PER", "PBR", "ROE", "영업이익률", "부채비율"])
# 시가총액을 숫자로 변환 (혹시 누락된 시가총액 값이 있다면 처리)
df["시가총액"] = pd.to_numeric(df["시가총액"], errors="coerce")
# 시가총액 기준으로 내림차순 정렬
df = df.sort_values(by="시가총액", ascending=False)
# 숫자들을 소수점 둘째자리까지 표현
columns_to_round = ["PER", "Forward PER", "PBR"]
for col in columns_to_round:
df[col] = pd.to_numeric(df[col], errors="coerce").round(2) # 각 숫자 열을 소수점 둘째 자리까지 반올림
# 영업이익률과 ROE를 % 형식으로 변환하고 소수점 첫째자리까지 표시
df["영업이익률"] = pd.to_numeric(df["영업이익률"], errors="coerce").apply(lambda x: round(x * 100, 1) if pd.notnull(x) else "N/A")
df["ROE"] = pd.to_numeric(df["ROE"], errors="coerce").apply(lambda x: round(x * 100, 1) if pd.notnull(x) else "N/A")
# 부채비율을 소수점 둘째자리까지 반올림
df["부채비율"] = pd.to_numeric(df["부채비율"], errors="coerce").round(2)
# 엑셀 파일로 저장
df.to_excel(file_path, index=False)
print("엑셀 파일 저장 완료: US_stock_valuation.xlsx")