본문 바로가기

API

[한국은행 API] 소비자동향조사 CSI(금리수준, 현재경기판단)와 코스피, 국채10년

반응형

한국은행 API를 이용해서 소비자동향조사의 금리 수준전망 CSI와 현재경기판단 CSI를 불러오고 각각 코스피와 국채 10년 데이터와 비교해 보도록 하겠습니다.
확인을 위해서는 한국은행 API에 가입이 되어 있어야 합니다.

1. 한국은행 API 가입
2. 금리수준전망 CSI와 현재경기판단 CSI

3. 금리수준전망 CSI와 국채 10년
4. 현재경기판단 CSI와 코스피

 

 

1. 한국은행 API 가입

https://yenpa.tistory.com/80

 

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

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

yenpa.tistory.com

 

 

2. 금리수준전망 CSI와 현재경기판단 CSI

한국은행 API의 통계조회 조건 설정의 서비스에서 통계항목코드 1을 '511Y002'로
지정하면 6.2. 소비자동향조사 데이터를 불러올 수 있습니다.

ITEM_CODE1을 FMBG로 지정하면 금리 수준전망 CSI를 불러오고

FMAB로 지정하면 현재경기판단 CSI를 불러올 수 있습니다.
아래는 200809~202303 기간에서 월별로 금리 수준전망 CSI를 조회한 코드입니다.

import requests

url = 'https://ecos.bok.or.kr/api/StatisticSearch/' + apikey \
        + '/json/kr/1/100/511Y002/M/200809/202303/FMBG'
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 + '/511Y002/M/200809/202303/FMBG'
    response = requests.get(url)
    result = response.json()
    rows = rows + result['StatisticSearch']['row']
    
df=pd.DataFrame(rows)
df

 

TIME Column이 YYYYMM의 object형식인데 Datetime Column으로 만들고,

Data_value는 float으로 변경 후 필요한 Column만 따로 저장했습니다.

그리고 데이터는 ITEM_NAME2에 전체와 각 지역별 데이터가 각각 존재합니다.

그중에서 전체 데이터만 따로 불러왔습니다.

df=df.loc[df['ITEM_NAME2']=='전체']
df=df.astype({'DATA_VALUE':'float'})
df['datetime']=pd.to_datetime(df['TIME'].str[:4] + '-' + df['TIME'].str[4:6] + '-01')
df=df[['datetime','ITEM_NAME1','DATA_VALUE']]
df

 

다음으로는 현재경기판단 CSI를 불러오겠습니다.

url = 'https://ecos.bok.or.kr/api/StatisticSearch/' + apikey \
        + '/json/kr/1/100/511Y002/M/200809/202303/FMAB'
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 + '/511Y002/M/200809/202303/FMAB'
    response = requests.get(url)
    result = response.json()
    rows = rows + result['StatisticSearch']['row']
    
df1=pd.DataFrame(rows)
df1

금리수준전망 CSI와 마찬가지로 아래와 같이 처리했습니다.

df1=df1.loc[df1['ITEM_NAME2']=='전체']
df1=df1.astype({'DATA_VALUE':'float'})
df1['datetime']=pd.to_datetime(df1['TIME'].str[:4] + '-' + df1['TIME'].str[4:6] + '-01')
df1=df1[['datetime','ITEM_NAME1','DATA_VALUE']]
df1

 

반응형

 

 

그래프로 확인해 볼까요. plotly를 이용했습니다.

import plotly.graph_objects as go
from plotly.subplots import make_subplots
import plotly.express as px

fig = make_subplots(specs=[[{'secondary_y':True}]])


fig.add_trace(
    go.Scatter(x=df['datetime'], y=df['DATA_VALUE'], name='금리수준전망CSI'),
    secondary_y=False
)

fig.add_trace(
    go.Scatter(x=df1['datetime'], y=df1['DATA_VALUE'], name='현재경기판단CSI'),
    secondary_y=False
)


fig.update_layout(
    title_text = '금리수준전망CSI와 현재경기판단CSI',
    title = {'x':0.5, 'y':0.9}
)

fig.show()

 

 

3. 금리수준전망 CSI와 국채 10년

금리 수준전망 CSI와 국채 10년 데이터를 비교해 보겠습니다.

우선 국채 10년 데이터를 불러오겠습니다.

기간을 2008년 9월 1일부터 지정했고 통계항목코드는 817Y002와

ITEM_CODE1을 010210000으로 지정해서 불러올 수 있습니다.

url = 'https://ecos.bok.or.kr/api/StatisticSearch/' + apikey \
        + '/json/kr/1/100/817Y002/D/20080901/20230315/010210000'
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/20080901/20230315/010210000'
    response = requests.get(url)
    result = response.json()
    rows = rows + result['StatisticSearch']['row']
    
df10y=pd.DataFrame(rows)
df10y

df10y=df10y.astype({'DATA_VALUE':'float'})
df10y['datetime']=pd.to_datetime(df10y['TIME'].str[:4] + '-' + df10y['TIME'].str[4:6] + '-' + df10y['TIME'].str[6:8])
df10y=df10y[['datetime','ITEM_NAME1','DATA_VALUE']]
df10y

 

 

그래프로 비교해 보겠습니다.

fig = make_subplots(specs=[[{'secondary_y':True}]])


fig.add_trace(
    go.Scatter(x=df2['datetime'], y=df2['금리수준전망CSI'], name='금리수준전망CSI'),
    secondary_y=False
)


fig.add_trace(
    go.Scatter(x=df10y['datetime'], y=df10y['DATA_VALUE'], name='국채 10년'),
    secondary_y=True
)

fig.update_layout(
    title_text = '금리수준전망CSI와 국채 10년',
    title = {'x':0.5, 'y':0.9}
)

fig.show()

 

 

반응형

 

4. 현재경기판단 CSI와 코스피

마지막으로 현재경기판단 CSI와 코스피 데이터를 비교해 보겠습니다.

코스피 데이터는 Yahoo Finance API를 이용했습니다.

import yfinance as yf
from datetime import datetime

enddate=datetime.now().strftime('%Y-%m-%d')
kospi=yf.download('^KS11', '2008-09-01', enddate, auto_adjust=True)
kospi

 

그래프로 보겠습니다.

fig = make_subplots(specs=[[{'secondary_y':True}]])


fig.add_trace(
    go.Scatter(x=df2['datetime'], y=df2['현재경기판단CSI'], name='현재경기판단CSI'),
    secondary_y=False
)


fig.add_trace(
    go.Scatter(x=kospi.index, y=kospi['Close'], name='코스피지수'),
    secondary_y=True
)

fig.update_layout(
    title_text = '현재경기판단CSI와 코스피',
    title = {'x':0.5, 'y':0.9}
)

fig.show()

이상으로 소비자동향조사의 금리 수준전망 CSI와 현재경기판단 CSI를 불러오고 각각 코스피와 국채 10년 데이터와 비교해 봤습니다.

반응형