본문 바로가기

API

[한국은행 API] 국채와 회사채 수집 및 신용스프레드와 주가

반응형

한국은행 API를 이용해서 우리나라 국채와 회사채 데이터를 수집해서 그래프로 확인하고,
신용스프레드(회사채-국채)와 코스피 주가를 비교해 보겠습니다.
확인을 위해서는 한국은행 API에 가입이 되어 있어야 합니다.

1. 한국은행 API 가입
2. 국채 3년 및 회사채 3년 데이터 수집
3. 신용스프레드와 코스피

 

 

1. 한국은행 API 가입

https://yenpa.tistory.com/80

 

[한국은행 API] 인증키 신청 및 100대 통계 지표 수집

한국은행 API에 가입하고 서비스 항목 중 100대 통계지표에 대해 데이터 수집하고 그래프로 확인해보겠습니다. 1. 인증키 신청 2. 인증키 확인 3. 100대 통계 지표 수집 1. 인증키 신청 사이트 접속

yenpa.tistory.com

 

 

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()

 

이상으로 우리나라 국채와 회사채 데이터를 수집해서 그래프로 확인하고,
신용스프레드(회사채-국채)와 코스피 주가를 비교해 봤습니다.

반응형