한국 주식 가격, 미국주식 가격, 지수, 환율, 암호화폐 가격, 종목 리스팅 등 금융 데이터 수집 라이브러리
(https://github.com/financedata-org/FinanceDataReader)
(https://financedata.github.io/posts/finance-data-reader-users-guide.html)
(https://pandas-datareader.readthedocs.io/en/latest/readers/index.html)
!pip install -U finance-datareader
import pandas as pd
import numpy as np
import FinanceDataReader as fdr
fdr.__version__
# KRX : KRX 종목 전체
# 한국거래소 상장종목 전체 가져오기
df = fdr.StockListing("KRX")
# 행과 열의 크기
df.shape
# 앞에서부터 데이터 추출
df.head()
# 뒤에서부터 데이터 추출
df.tail()
# 기술 통계값 구하기
df.describe()
# 날짜 순으로 데이터 내림차순 정렬
df.sort_values(by="ListingDate", ascending=False).head()
Symbol Market Name Sector Industry ListingDate SettleMonth Representative HomePage Region
5831 413300 KONEX 티엘엔지니어링 건축기술, 엔지니어링 및 관련 기술 서비스업 클린룸 설계 및 시공 2022-09-27 12월 서충옥 http://tleng.kr 경기도
5167 394280 KOSDAQ 오픈엣지테크놀로지 소프트웨어 개발 및 공급업 시스템 반도체 IP 2022-09-26 12월 이성현 http://www.openedges.com 서울특별시
5626 436530 KOSDAQ 케이비제22호스팩 금융 지원 서비스업 기업인수목적 2022-09-22 12월 오동출 NaN 서울특별시
5981 427950 KOSDAQ 하나금융23호스팩 금융 지원 서비스업 기업인수합병 2022-09-15 12월 박기일 NaN 서울특별시
5758 433530 KOSDAQ 키움제7호스팩 금융 지원 서비스업 기업 인수합병 2022-09-07 12월 박정근 NaN 서울특별시
df.to_csv("krx.csv", index=False)
pd.read_csv("krx.csv")
import pandas as pd
import numpy as np
item_code = "051910'
item_name = "LG화학"
page_no = 4
url = f"https://finance.naver.com/item/news_news.nhn?code={item_code}&page={page_no}&sm=title_entity_id.basic&clusterId="
print(url)
네이버 금융주가 기사를 read_html 수집하여서 table 변수에 할당
table = pd.read_html(url)
len(table)
df = table[0]
cols = df.columns
cols
=> Index(['제목', '정보제공', '날짜'], dtype='object')
temp_list = []
for news in table[:-1]:
news.columns = cols
temp_list.append(news)
display(news)
df_news = pd.concat(temp_list)
df_news = df_news.dropna()
# 인덱스 번호 순서대로 설정
df_news = df.news_reset_index(drop=True)
# 기사에서 "연관기사" 포함된 데이터 제거 (~ : 반대를 의미)
df_news = df.news[~df_news["정보제공"].str.contains("연관기사")].copy()
df_news.drop_duplicates()
# url return 함수
def get_url(item_code, page_no):
url = f"https://finance.naver.com/item/news_news.nhn?code={item_code}&page={page_no}&sm=title_entity_id.basic&clusterId="
return url
# 뉴스의 한 페이지 수집 함수
def get_one_page_news(item_code, page_no):
url = get_url(item_code, page_no)
table = pd.read_html(url)
temp_list = []
df = table[0].columns
for news in table[:-1]:
news.columns = df
temp_list.append(news)
df_news = pd.concat(temp_list)
df_news = df_news.dropna()
df_news = df_news.reset_index(drop=True)
df_news = df_news[~df_news["정보제공"].str.contains("연관기사")].copy()
df_news = df_news.drop_duplicates()
return df_news
!pip install -U finance-datareader
import FinanceDataReader as fdr
df_krx = fdr.StockListing("KRX")
df_krx.shape
item_code = df_krx.loc[df_krx["Name"]=="기아", "Symbol"].values[0]
page_no = 10
temp = get_one_page_news(item_code, page_no)
temp.head(2)
제목 정보제공 날짜
0 기아 노사,2년 연속 무분규 임금협상 잠정합의 헤럴드경제 2022.08.31 07:20
1 기아,2년 연속 무분규 임협 잠정합의 매일경제 2022.08.30 20:58
import time
from tqdm import trange
item_name = "기아"
item_code = df.krx.loc[df_krx["Name"] == "기아", "Symbol".values[0]
news_list = []
for page_no in trange(1, 11):
temp = get_one_page_news(item_code, page_no)
news_list.append(temp)
time.sleep(0.01)
df_news = pd.concat(news_list)
file_name = f"news_{item_code}_{item_name}.csv"
df_news.to_csv(file_name, index=False)
pd.read_csv(file_name)
https://finance.naver.com/sise/
import pandas as pd
import numpy as np
import requests
item_code = "005930"
item_name = "삼성전자"
page_no = 1
url = f"https://finance.naver.com/item/sise_day.naver?code={item_code}&page={page_no}"
https://requests.readthedocs.io/en/latest/
https://requests.readthedocs.io/en/latest/user/quickstart/#custom-headers
response = requests.get(url, headers = {"user-agent" : "Mozilla/5.0"}
response
=> <Response [200]>
response.text
from bs4 import BeautifulSoup as bs
html = bs(response.text)
html.title
=> <title>네이버 금융</title>
# a-> link 의미
html.a
html.find_all("a")[:3]
=> [<a href="/item/sise_day.naver?code=005930&page=1">1</a>,
<a href="/item/sise_day.naver?code=005930&page=2">2</a>,
<a href="/item/sise_day.naver?code=005930&page=3">3</a>]
html.select("table > tr > td")
html.select("body > table.type2")
table = pd.read_html(response.text)
temp = table[0]
# row 결측치 제거
temp.dropna()
def get_one_day_list(item_code, page_no):
url = f"https://finance.naver.com/item/sise_day.naver?code={item_code}&page={page_no}"
response = requests.get(url, header = {"user-agent": "Mozilla/5.0"})
response.text
table = pd.read_html(response.text)
site = table[0].dropna()
return site
df_item = get_day_list(item_code, page_no)
last_day = df_item.iloc[-1]["날짜"]
import time
item_code = "373220"
item_name = "LG에너지솔루션"
page_no = 1
item_list = []
previous_day = None
while True:
df_item = get_day_list(item_code, page_no) # 한 페이지의 일별시세 수집
last_day = df_item.iloc[-1]["날짜"] # 해당 데이터의 마지막 날짜 가져옴
print(page_no, previous_day, last_day)
if last_day == previous_day:
break
previous_day = last_day
item_list.append(df_item) # 수집한 일별 시세를 리스트에 추가
page_no += 1
df_day = pd.concat(item_list)
df_day[3]
=> 날짜 종가 전일비 시가 고가 저가 거래량
1 2022.09.28 436000.0 8000.0 444000.0 451500.0 427000.0 403887.0
2 2022.09.27 444000.0 2500.0 447500.0 451000.0 435000.0 365111.0
3 2022.09.26 446500.0 14000.0 453000.0 458000.0 440000.0 446277.0
date = df_day.iloc[0]["날짜"]
file_name = f"{item_name}_{item_code}_{date}.csv"
# index=False : 기본 index 저장 X
df_day.to_csv("file_name", index=False)
pd.read_csv("file_name")
def get_item_list(item_code, item_name):
# """
# 일별 시세를 수집하는 함수
# """
page_no = 1
# 데이터를 저장할 빈 변수 선언
item_list = []
pre_day = None
while True:
df_item = get_day_list(item_code, page_no)
# 해당 데이터의 마지막 날짜를 가져옴
last_day = df_item.iloc[-1]["날짜"]
if last_day == pre_day:
break
pre_day = last_day
item_list.append(df_item)
page_no = page_no + 1
time.sleep(0.01)
df_day = pd.concat(item_list)
# 종목코드, 종목명 추가
df_day["종목코드"] = item_code
df_day["종목명"] = item_name
cols = ['종목코드', '종목명', '날짜', '종가', '전일비', '시가', '고가', '저가', '거래량']
df_day = df_day[cols]
df_day = df_day.drop_duplicates()
date = df_day.iloc[0]["날짜"]
file_name = f"{item_name}_{item_code}_{date}.csv"
# 파일로 저장
df_day.to_csv("file_name", index=False)
file_name = pd.read_csv('file_name')
return file_name
상장지수펀드는 기초지수의 성과를 추적하는 것이다.
거래소에 상장되어 있어서 개별주식과 마찬가지로 기존의 주식계좌를 통해 거래가 가능하다.
https://finance.naver.com/sise/etf.nhn
import pandas as pd
import numpy as np
import requests
url = "https://finance.naver.com/sise/etf.nhn"
pd.read_html(url)
url = "https://finance.naver.com/api/sise/etfItemList.nhn?etfType=0&targetColumn=market_sum&sortOrder=desc"
response = requests.get(url)
etf_json = response.json()
etfItemList = etf_json["result"]["etfItemList"]
print(len(etfItemList))
etfItemList[-1]
=> 622
{'itemcode': '287310',
'etfTabCode': 2,
'itemname': 'KBSTAR 200경기소비재',
'nowVal': 9040,
'risefall': '5',
'changeVal': -235,
'changeRate': -2.53,
'nav': 9041.0,
'threeMonthEarnRate': -2.2656,
'quant': 9,
'amonut': 0,
'marketSum': 7}
df = pd.DateFrame(etfItemList)
df.head(1)
=> itemcode etfTabCode itemname nowVal risefall changeVal changeRate nav threeMonthEarnRate quant amonut marketSum
0 069500 1 KODEX 200 28390 5 -715 -2.46 28412.0 -7.9422 11126915 316767 47383
# 파생 변수 생성
df["브랜드"] = df["itemname"].str.split(expand=True)[0]
df["브랜드"].head(2)
=> 0 KODEX
1 TIGER
Name: 브랜드, dtype: object
from datetime import datetime
today = datetime.today().strftime("%y-%m-%d")
file_name = f"etf-{today}_raw.csv"
file_name
=> 'etf-22-09-28_raw.csv'
df.to_csv(file_name, index=False)
file_name = pd.read_csv(file_name, dtype={'itemcode' : 'object'})