import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
etf_names = []
# Yahoo Finance ETF 페이지 URL
for page in range(0,120):
url = f'<https://finance.yahoo.com/markets/etfs/most-active/?start={page*25}&count=25>'
# 요청 보내기
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
# BeautifulSoup 객체 생성
html = bs(response.text, 'html.parser')
# span 태그에서 class가 'name yf-1jpysdn'인 부분을 모두 선택
tags = html.select('span.symbol.yf-1jpysdn')
# 선택한 태그 출력
for tag in tags:
etf_names.append(tag)
print(tag.text)
# DataFrame으로 변환
etf_df = pd.DataFrame(etf_names, columns=['ETF Name'])
# CSV로 저장
etf_df.to_csv('yahoo_etf_names.csv', index=False)
print("ETF 이름 리스트 저장 완료!")
# ETF의 운용사를 찾는 함수
def get_etf_info(ticker):
try:
etf = yf.Ticker(ticker)
info = etf.info
if 'fundFamily' in info:
print(f"{ticker}의 운용사: {info['fundFamily']}")
return info['fundFamily']
else:
print(f"{ticker}의 운용사 정보를 찾을 수 없습니다.")
return "NONE"
except Exception as e:
print(f"오류 발생: {e}")
# 각 ETF의 운용사를 추가하여 새로운 CSV로 저장
import pandas as pd
import yfinance as yf
etf_data = pd.read_csv('yahoo_etf_names.csv')
fund_families = []
for i in range(len(etf_data)):
ticker = etf_data.iloc[i, 0]
fund_families.append(get_etf_info(ticker))
etf_data['운용사'] = fund_families
etf_data.to_csv('etf_ff.csv', index=False)
print("생성 완료")
# ETF 이름을 list로 불러오고, 잘 불러와졌나 개수 확인 + 중복 확인
import pandas as pd
etf_ff = pd.read_csv("C:\\\\Users\\\\wnstj\\\\OneDrive\\\\바탕 화면\\\\데이터분석캡스톤디자인\\\\etf_fundfm.csv", encoding='cp949')
print(etf_ff['ETF Name'])
etf_name = list(etf_ff['ETF Name'])
print(len(etf_name))
print(len(set(etf_name)))
duplicates = etf_ff['ETF Name'][etf_ff['ETF Name'].duplicated()]
print(duplicates)
# yfinace library를 사용하여 각 ETF의 2009.01.01 ~ 2024.09.29 가격 데이터 수
import yfinance as yf
for i in etf_name:
try:
data = yf.download(i, start="2009-01-01", end="2024-09-29")
data.to_csv(f"C:\\\\Users\\\\wnstj\\\\OneDrive\\\\바탕 화면\\\\데이터분석캡스톤디자인\\\\ETF_US\\\\{i}.csv")
print(f"{i} 생성 완료")
except:
print(f"{i} 생성 실패")
print("모든 ETF 종가 데이터 생성 완료")
# csv 파일을 생성하면서 빠진 것(생성에 실패한 것)이 없나 확인하는 코드
import os
etf_failed = []
etf_success = []
for i in etf_name:
try:
file_path = f"C:\\\\Users\\\\wnstj\\\\OneDrive\\\\바탕 화면\\\\데이터분석캡스톤디자인\\\\ETF_US\\\\{i}.csv"
# 파일이 제대로 생성되었는지 확인
if os.path.exists(file_path):
print(f"{i} 생성 완료")
etf_success.append(i)
else:
print(f"{i} 생성 실패")
etf_failed.append(i)
except:
print(f"{i} 생성 실패")
etf_failed.append(i)
print("모든 ETF 종가 데이터 생성 완료")
print(f"성공적으로 생성된 ETF 수: {len(etf_success)}")
print(f"생성 실패한 ETF 수: {len(etf_failed)}")
print(f"생성 실패한 ETF 목록: {etf_failed}")