한국은행 API를 이용해서 우리나라 국채와 회사채 데이터를 수집해서 그래프로 확인하고,
신용스프레드(회사채-국채)와 코스피 주가를 비교해 보겠습니다.
확인을 위해서는 한국은행 API에 가입이 되어 있어야 합니다.
1. 한국은행 API 가입
2. 국채 3년 및 회사채 3년 데이터 수집
3. 신용스프레드와 코스피
1. 한국은행 API 가입
2. 국채 3년 및 회사채 3년 데이터 수집
한국은행 API의 통계조회 조건 설정의 서비스에서 통계항목코드 1을 '817Y002'로
지정하면 금리에 대한 정보를 불러올 수 있습니다.
아래는 금리에 대한 정보(817Y002)를 20230106~20230206 기간에서 일별로 조회한 코드입니다.
import requests
url = 'https://ecos.bok.or.kr/api/StatisticSearch/' + apikey \
+ '/json/kr/1/100/817Y002/D/20230106/20230206'
response = requests.get(url)
result = response.json()
list_total_count=(int)(result['StatisticSearch']['list_total_count'])
list_count=(int)(list_total_count/100) + 1
rows=[]
for i in range(0,list_count):
start = str(i * 100 + 1)
end = str((i + 1) * 100)
url = 'https://ecos.bok.or.kr/api/StatisticSearch/' + apikey + '/json/kr/' \
+ start + '/' + end + '/817Y002/D/20230106/20230206'
response = requests.get(url)
result = response.json()
rows = rows + result['StatisticSearch']['row']
df=pd.DataFrame(rows)
df
호출 URL이고 한 번에 최대 100개까지의 데이터만 불러올 수 있습니다.
100개가 넘을 경우에는 100개씩 나누어서 데이터를 수집해야 되는데,
총데이터의 수는 result['StatisticSearch']['list_total_count'] 에서 확인이 가능합니다.
100개씩 몇 번의 for loop를 돌아야 하는지는 list_count에 저장했습니다.
list_total_count=(int)(result['StatisticSearch']['list_total_count'])
list_count=(int)(list_total_count/100) + 1
for문마다 불러온 결과를 rows라는 list에 저장하고 마지막에 dataframe으로 변환했습니다.
rows=[]
for i in range(0,list_count):
start = str(i * 100 + 1)
end = str((i + 1) * 100)
url = 'https://ecos.bok.or.kr/api/StatisticSearch/' + apikey + '/json/kr/' \
+ start + '/' + end + '/817Y002/D/20230106/20230206'
response = requests.get(url)
result = response.json()
rows = rows + result['StatisticSearch']['row']
df=pd.DataFrame(rows)
어떤 데이터들을 제공하는지 확인하겠습니다.
dataframe의 ITEM_CODE1에서 확인이 가능합니다.
df.groupby('ITEM_CODE1')[['ITEM_CODE1','ITEM_NAME1']].first()
이 중에서 국고채(3년), 회사채(3년, AA-), 회사채(3년, BBB-)를 불러오겠습니다.
2006년 2월 1일 ~ 2023년 2월 6일까지의 데이터를 불러올 수 있는 함수를 작성하겠습니다.
위에서 확인한 코드를 조금 변형했습니다.
import requests
def getdata(ITEM_CODE1):
url = 'https://ecos.bok.or.kr/api/StatisticSearch/' + apikey \
+ '/json/kr/1/100/817Y002/D/20060201/20230206/' + ITEM_CODE1
response = requests.get(url)
result = response.json()
list_total_count=(int)(result['StatisticSearch']['list_total_count'])
list_count=(int)(list_total_count/100) + 1
rows=[]
for i in range(0,list_count):
start = str(i * 100 + 1)
end = str((i + 1) * 100)
url = 'https://ecos.bok.or.kr/api/StatisticSearch/' + apikey + '/json/kr/' \
+ start + '/' + end + '/817Y002/D/20060201/20230206/' + ITEM_CODE1
response = requests.get(url)
result = response.json()
rows = rows + result['StatisticSearch']['row']
df=pd.DataFrame(rows)
df['date']=pd.to_datetime(df['TIME'].str[:4] + '-' + \
df['TIME'].str[4:6] + '-' + df['TIME'].str[6:8] )
df = df[['date','DATA_VALUE']].set_index('date')
df=df.astype('float')
return df
결과 중 TIME column이 날짜 데이터인데 YYYYMMDD의 형식으로 제공됩니다.
이것을 datetime형태로 만든 후 date column에 저장했습니다.
그리고 DATA_VALUE가 금리 데이터인데 float 형태로 변경했습니다.
df=pd.DataFrame(rows)
df['date']=pd.to_datetime(df['TIME'].str[:4] + '-' + \
df['TIME'].str[4:6] + '-' + df['TIME'].str[6:8] )
df = df[['date','DATA_VALUE']].set_index('date')
df=df.astype('float')
데이터 수집을 하겠습니다.
df3Y = getdata('010200000')
dfaa = getdata('010310000')
dfbb = getdata('010320000')
그래프로 확인해 볼까요.
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.graph_objects as go
fig=go.Figure()
fig.add_trace(
go.Scatter(x=df3Y.index, y=df3Y['DATA_VALUE'], name="국채 3년"),
)
fig.add_trace(
go.Scatter(x=dfaa.index, y=dfaa['DATA_VALUE'], name="회사채 3년(AA-)"),
)
fig.add_trace(
go.Scatter(x=dfbb.index, y=dfbb['DATA_VALUE'], name="회사채 3년(BBB-)"),
)
fig.update_layout(title_text='국채 3년과 회사채 3년(AA-, BBB-)', title_x=0.5)
fig.show()
3. 신용스프레드와 코스피
신용스프레드 (회사채 - 국채)를 구하고 코스피와 비교해 보겠습니다.
우선 코스피 데이터를 수집하겠습니다.
yfinance를 이용해서 yahoo finance에서 데이터를 가져왔습니다.
import yfinance as yf
from datetime import datetime
enddate=datetime.now().strftime('%Y-%m-%d')
kospi=yf.download('^KS11', '2006-02-01', enddate, auto_adjust=True)
kospi
다음으로는 회사채 3년(AA-)과 국채 3년의 스프레드 데이터와
회사채 3년(BBB-)과 국채 3년의 스프레드 데이터를 구하겠습니다.
우선 회사채 3년(AA-)과 국채 3년 데이터를 병합하고, column명을 지정해 줬습니다.
그리고 스프레드 데이터를 계산했습니다.
dfaadiff=pd.concat([df3Y,dfaa],axis=1)
dfaadiff.columns=['국채3년','회사채3년AA-']
dfaadiff['회사채AA스프레드']=dfaadiff['회사채3년AA-']-dfaadiff['국채3년']
dfaadiff
회사채 3년(BBB-)과 국채 3년의 스프레드도 동일하게 구합니다.
dfbbdiff=pd.concat([df3Y,dfbb],axis=1)
dfbbdiff.columns=['국채3년','회사채3년BBB-']
dfbbdiff['회사채BBB스프레드']=dfbbdiff['회사채3년BBB-']-dfbbdiff['국채3년']
dfbbdiff
그럼 코스피와 비교해 보겠습니다.
fig = make_subplots(specs=[[{"secondary_y":True}]])
fig.add_trace(
go.Scatter(x=dfaadiff.index, y=dfaadiff['회사채AA스프레드'], name="회사채AA스프레드"),
secondary_y=False,
)
fig.add_trace(
go.Scatter(x=kospi.index, y=kospi['Close'], name="KOSPI"),
secondary_y=True,
)
fig.update_layout(
title_text='회사채AA-와 국채3년 스프레드와 코스피',
title={'x':0.5, 'y':0.9}
)
fig.show()
fig = make_subplots(specs=[[{"secondary_y":True}]])
fig.add_trace(
go.Scatter(x=dfbbdiff.index, y=dfbbdiff['회사채BBB스프레드'], name="회사채BBB스프레드"),
secondary_y=False,
)
fig.add_trace(
go.Scatter(x=kospi.index, y=kospi['Close'], name="KOSPI"),
secondary_y=True,
)
fig.update_layout(
title_text='회사채BBB- 국채3년 스프레드와 코스피',
title={'x':0.5, 'y':0.9}
)
fig.show()
이상으로 우리나라 국채와 회사채 데이터를 수집해서 그래프로 확인하고,
신용스프레드(회사채-국채)와 코스피 주가를 비교해 봤습니다.
'API' 카테고리의 다른 글
[공공데이터포털 API] SRT 운행월별 정차역별 승하차인원 (8) | 2023.02.13 |
---|---|
[Fred API] 실업률과 비농업고용 및 기준금리 비교 (4) | 2023.02.09 |
[농림축산식품 API] 농수축산물 물가조사가격 수집 및 가격비교 (4) | 2023.02.02 |
[Fred API] 물가연동채권(TIPS)과 기준금리 및 소비자물가지수(CPI) (15) | 2023.01.31 |
[한국은행API] 경기 선행지수 및 동행지수 순환변동치와 주가 (4) | 2023.01.29 |