#!/usr/bin/env python # coding: utf-8 # **[mark down math functions](https://twinstarinfo.blogspot.com/2019/11/bloggerblogspot-markdown-mathjax.html)** \\ **[Finance-data](https://github.com/FinanceData/FinanceDataReader)** # # - ! pip install finance-datareader # - ! pip install beautifulsoup4 # # In[1]: get_ipython().run_line_magic('matplotlib', 'inline') get_ipython().run_line_magic('config', "InlineBackend.figure_format = 'retina'") # Loading ... Visualization Modules import matplotlib.pyplot as plt import warnings plt.style.use('seaborn') warnings.simplefilter(action='ignore', category=FutureWarning) from matplotlib.font_manager import fontManager as fm # 한글폰트 확인 및 추가 font_list_check = ['D2Coding', 'NanumGothicCoding', 'NanumGothic'] for _ in font_list_check: font_counts = [f for f in font_list_check if _ in [_.name for _ in fm.ttflist]] if len(font_counts) > 1: print(f"found : {_}"); plt.rc('font', family=_); break # In[2]: # S&P 500 지수와 VIX 지수를 다운로드 합니다 import yfinance as yf df = yf.download(['^GSPC', '^VIX'], start='1999-01-01', end='2022-12-31', progress=False) df = df[['Adj Close']].copy() df.columns = df.columns.droplevel(0) df = df.rename(columns={'^GSPC': 'sp500', '^VIX': 'vix'}) # In[3]: # yahoo finance 를 활용한 주가수집 # loading ... the Financial DataSet import os import pandas as pd def fd_csv(file_name, code='', date_start='', date_end=''): if os.path.isfile(file_name): # Checking the File exist data = pd.read_csv(file_name) data['Date'] = pd.to_datetime(data['Date']) # datetime 포맷 data = data.set_index('Date') # 변경된 컬럼을 Index 로 설정 else: # if not, download the data from FinanceDataReader import DataReader as fdr data = fdr(code, date_start, date_end).reset_index() data.to_csv(file_name, index=None) data = data.set_index('Date') return data # Finance DataSet 생성하기 file_name = './data/stock-msft.csv' data_csv = fd_csv(file_name, 'MSFT', date_start='2020-1-1', date_end='2021-3-31') data_csv.tail(3) # In[4]: # yahoo finance 를 활용한 주가수집 # loading ... the Financial DataSet import os import pandas as pd def yf_csv(file_name, code='', date_start='', date_end=''): if os.path.isfile(file_name): # Checking the File exist data = pd.read_csv(file_name) data['Date'] = pd.to_datetime(data['Date']) # datetime 포맷 변경 data = data.set_index('Date') # 변경된 컬럼을 Index 로 설정 else: # if not, download the data import yfinance as yf data = yf.download(code, start=date_start, end=date_end, progress=False, auto_adjust=True).reset_index() data.to_csv(file_name, index=None) data = data.set_index('Date') return data # Finance DataSet 생성하기 file_name = './data/stock-samsung.csv' data_csv = yf_csv(file_name, '005930', date_start='2020-1-1', date_end='2021-3-31') data_csv.tail(3) # In[12]: data_csv['2021-MAR-1':'2021-MAY-1'].tail() # In[ ]: data_csv # In[6]: import os import pandas as pd class StockCSV: #def __init__(self): # self.code = '005930' def finance(self, code='', date_start='', date_end='', file_name=None): r'''Finance Data Reacer : CSV file save & loader https://github.com/FinanceData/FinanceDataReader/blob/master/README.md''' # case 1 : 파일을 지정한 경우 if file_name: ## 01 Loading from CSV if os.path.isfile(file_name): # Checking the File exist data = pd.read_csv(file_name) data['Date'] = pd.to_datetime(data['Date']) # datetime 포맷 data = data.set_index('Date') # 변경된 컬럼을 Index 로 설정 ## 02 Loading from Py Module API else: # if not, download the data from FinanceDataReader import DataReader as fdr data = fdr(code, date_start, date_end).reset_index() data.to_csv(file_name, index=None) data = data.set_index('Date') # case 2 : 파일을 지정하지 않은경우 else: from FinanceDataReader import DataReader as fdr data = fdr(code, date_start, date_end) return data def yahoo(self, code='', date_start='', date_end='', file_name=None): r'''Yahoo Finance : CSV file save & loader''' # case 1 : 파일을 지정한 경우 if file_name: ## 01 Loading from CSV if os.path.isfile(file_name): # Checking the File exist data = pd.read_csv(file_name) data['Date'] = pd.to_datetime(data['Date']) # datetime 포맷 변경 data = data.set_index('Date') # 변경된 컬럼을 Index 로 설정 ## 02 Loading from Py Module API else: # if not, download the data import yfinance as yf data = yf.download(code, start=date_start, end=date_end, progress=False, auto_adjust=True).reset_index() data.to_csv(file_name, index=None) data = data.set_index('Date') # case 2 : 파일을 지정하지 않은경우 else: import yfinance as yf data = yf.download(code, start=date_start, end=date_end, progress=False, auto_adjust=True) #.reset_index() return data # In[7]: reader = StockCSV() # reader.finance('005930', '2020-01-01','2021-01-01', './data/test.csv') reader.finance('005930', '2020-01-01','2021-01-01').tail() # ### **2) BOK EOS 한국은행 통계정보 API** # - **[한국은행 API Key 확인하기](https://ecos.bok.or.kr/jsp/openapi/OpenApiController.jsp?t=myAuthKey#)** # - **[한국은행 통계코드 검색](https://ecos.bok.or.kr/jsp/openapi/OpenApiController.jsp?t=guideStatCd&menuGroup=MENU000004&menuCode=MENU000024)** # - **[Python Tutorial](https://ecos.bok.or.kr/jsp/openapi/OpenApiController.jsp?t=guideDevGuide&menuGroup=MENU000004&menuCode=MENU000017)** # - **[Python Example](https://hayjo.tistory.com/57)** // **[파이썬 자료수집 예시](https://bjecondata.blogspot.com/2019/08/open-api-ecos-ii.html)** # In[8]: # https://bjecondata.blogspot.com/2019/08/open-api-ecos-ii.html import pandas as pd code_table = pd.read_csv('./data/BOK_ECOS_EXAMPLE.csv') code_table.head(3) # In[9]: # 필요한 자료코드 추출하기 search_text = '인플레' code_index = [no for no, _ in enumerate(code_table['통계명'].to_list()) if _.find(search_text) != -1] code_example = code_table.iloc[code_index, :].reset_index(drop=True) code_example.head(3) # code_example['URL'][:3].to_list() # In[10]: from data.finance import bok_eos_api eos_table = bok_eos_api('040Y003', date_end='20210101', code2='FMB') # 7년 단위로만 추출가능 eos_table['DATA_VALUE'] = list(map(lambda x : float(x), eos_table['DATA_VALUE'])) eos_table = eos_table.rename(columns={'DATA_VALUE':'cpi', 'TIME':'Date'}) eos_table['Date'] = pd.to_datetime(eos_table['Date'], format='%Y%m') eos_table = eos_table.set_index('Date') # eos_table.head(3) eos_table = eos_table[['cpi']] # ploting the DataSet eos_table.head(3)