각종 경제 지표는 서로 간에 밀접한 관계를 갖고 있다.
미국, 유럽, 일본 시장이 어떻게 움직이는 지에 따라 한국 시장도 같이 움직이고,
금, 은, 유가, 채권, 환율 등 여러가지 요소에 영향을 받아 가격이 결정된다.
이러한 경제 지표 간에 서로 얼마나 밀접한 관계를 갖고 있는지 파악할 수 있다면 경제를 이해하는 데 좀 더 도움이 될 것 같다.
각 지표들 간의 관계는 피어슨 상관계수
를 활용해 보려고 한다.
피어슨 상관 계수(Pearson correlation coefficient 또는 Pearson’s r)는 두 변수간의 관련성을 구하기 위해 보편적으로 이용된다.
$r = {\frac{X와 Y가 함께 변하는 정도}{X와 Y가 각각 변하는 정도}}$
r 값은 X 와 Y 가 완전히 동일하면 +1, 전혀 다르면 0, 반대방향으로 완전히 동일 하면 –1 을 가진다.
결정계수(coefficient of determination)는 $r^2$으로 계산하며 이것은 X 로부터 Y 를 예측할 수 있는 정도를 의미한다.
일반적으로 다음과 같이 해석한다.
참고 : 피어슨 상관계수
우선, 필요한 라이브러리들을 선언한다.
>>> import yfinance as yf
>>> import pandas as pd
>>> import matplotlib.pyplot as plt
>>> import seaborn as sns
Yahoo Finance 에서 다음과 같이 코드를 정의하고 있다.
금, 은, 크루드 오일, 미국 10년 만기 채권, S&P 500, 다우 존스, 나스닥, 닛케이, 달러, 유로, 파운드, 엔화, 코스피 등을 비교 지표로 뽑았다.
>>> codes = {'Gold': 'GC=F',
... 'Silver': 'SI=F',
... 'Crude Oil': 'CL=F',
... '10-Yr Bond': '^TNX',
... 'S&P 500': '^GSPC',
... 'Dow Jones': '^DJI',
... 'Nasdaq': '^DJI',
... 'Nikkei 225': '^N225',
... 'USD/KRW': 'KRW=X',
... 'EUR/KRW': 'EURKRW=X',
... 'GBP/KRW': 'GBPKRW=X',
... 'JPY/KRW': 'JPYKRW=X',
... 'KOSPI': '^KS11'}
최근 5년 동안의 각 경제 지표를 구하고, 데이터 프레임 한 곳에 저장한다.
일부 누락된 정보는 제거한다.
>>> df = pd.DataFrame()
>>>
>>> for stock_type in codes:
... code = codes[stock_type]
...
... ticker = yf.Ticker(code)
... ticker = ticker.history(period='5y')
... ticker = ticker[['Close']]
...
... df[stock_type] = ticker.Close
...
>>> df.dropna(inplace=True)
>>> print(df)
Gold Silver Crude Oil ... GBP/KRW JPY/KRW KOSPI
Date ...
2019-04-08 1297.1 15.173 64.40 ... 1481.9000 10.1750 2210.60
2019-04-09 1303.5 15.168 63.98 ... 1490.5000 10.2380 2213.56
2019-04-10 1309.1 15.201 64.61 ... 1488.6000 10.2610 2224.39
2019-04-11 1288.6 14.824 63.58 ... 1489.1000 10.2430 2224.44
2019-04-12 1290.6 14.920 63.89 ... 1489.6000 10.2210 2233.45
... ... ... ... ... ... ... ...
2020-03-30 1637.2 14.155 20.48 ... 1508.5601 11.2811 1717.12
2020-03-31 1592.4 14.135 20.28 ... 1512.6100 11.3219 1754.64
2020-04-01 1605.2 14.085 21.19 ... 1509.5500 11.3168 1685.46
2020-04-02 1637.7 14.625 24.77 ... 1528.9000 11.5126 1724.86
2020-04-03 1648.8 14.525 29.00 ... 1518.9399 11.3480 1725.44
[203 rows x 13 columns]
각 지표의 값은 서로 다른 단위를 사용하여 표시하므로, 지표 간의 비교를 위해 동일한 단위로 맞출 필요가 있다.
특정 날짜를 기준으로 하여 기준 날짜의 값을 100으로 보고, 상대적인 값을 구하면 모두 동일한 단위로 스케일링을 할 수 있다.
우선은 수집한 기간의 3분의 2 시점(2019년 12월 13일)을 기준으로 하였다.
>>> base_value = df.iloc[int(-len(df.index) / 3)]
>>> print(base_value)
Gold 1475.6000
Silver 16.9100
Crude Oil 60.0700
10-Yr Bond 1.8190
S&P 500 3168.8000
Dow Jones 28135.3800
Nasdaq 28135.3800
Nikkei 225 24023.1000
USD/KRW 1169.5900
EUR/KRW 1307.9800
GBP/KRW 1576.0300
JPY/KRW 10.6902
KOSPI 2170.2500
Name: 2019-12-13 00:00:00, dtype: float64
다음과 같이 기준 날짜의 값으로 스케일링 후 대부분의 값이 100 이라는 값 내외로 변경된 것을 확인할 수 있다.
>>> for stock_type in codes:
... df[stock_type] = df[stock_type] / base_value[stock_type] * 100
...
>>> print(df)
Gold Silver ... JPY/KRW KOSPI
Date ...
2019-04-08 87.903226 89.717360 ... 95.180633 101.859233
2019-04-09 88.336948 89.687796 ... 95.769958 101.995623
2019-04-10 88.716454 89.882923 ... 95.985108 102.494643
2019-04-11 87.327189 87.653737 ... 95.816729 102.496947
2019-04-12 87.462727 88.221381 ... 95.610933 102.912107
... ... ... ... ... ...
2020-03-30 110.951477 83.697966 ... 105.527492 79.120839
2020-03-31 107.915424 83.579707 ... 105.909150 80.849672
2020-04-01 108.782868 83.313623 ... 105.861443 77.662021
2020-04-02 110.985362 86.417928 ... 107.693027 79.477480
2020-04-03 111.737598 85.885762 ... 106.153299 79.504205
[203 rows x 13 columns]
Process finished with exit code 0
위 데이터 프레임을 그래프로 표시하면 다음과 같다.
너무 많은 feature 를 넣어 그래프가 복잡하게 표시되고 있지만 그래프는 단순히 확인하는 용도일 뿐,
나중에 상관관계를 다양하게 도출하기 위해 많은 수의 feature 를 유지하고자 한다.
>>> df.plot()
>>> plt.grid()
>>> plt.show()
위에서 설명한 상관계수
는 pandas 데이터 프레임의 corr()
이라는 함수를 이용하여 출력할 수 있다.
>>> print(df.corr())
Gold Silver Crude Oil ... GBP/KRW JPY/KRW KOSPI
Gold 1.000000 0.578434 -0.588975 ... 0.290338 0.502117 -0.327670
Silver 0.578434 1.000000 0.245663 ... 0.259771 0.050130 0.362752
Crude Oil -0.588975 0.245663 1.000000 ... -0.027969 -0.627055 0.808066
10-Yr Bond -0.885136 -0.229970 0.840196 ... -0.180331 -0.703376 0.652542
S&P 500 0.172943 0.701609 0.562134 ... 0.405106 -0.451195 0.800775
Dow Jones -0.027390 0.644563 0.723518 ... 0.267907 -0.520197 0.871725
Nasdaq -0.027390 0.644563 0.723518 ... 0.267907 -0.520197 0.871725
Nikkei 225 -0.035360 0.590545 0.675302 ... 0.386376 -0.658605 0.872334
USD/KRW 0.486054 -0.070670 -0.711727 ... -0.004479 0.885940 -0.840846
EUR/KRW 0.167778 -0.340608 -0.577914 ... -0.147190 0.857446 -0.806888
GBP/KRW 0.290338 0.259771 -0.027969 ... 1.000000 -0.093344 0.268144
JPY/KRW 0.502117 0.050130 -0.627055 ... -0.093344 1.000000 -0.796779
KOSPI -0.327670 0.362752 0.808066 ... 0.268144 -0.796779 1.000000
[13 rows x 13 columns]
이 상관계수는 seaborn
의 heatmap
을 이용하면 시각적 효과가 좋다.
>>> sns.heatmap(df.corr(), square=True, annot=True, cmap=plt.cm.viridis, linewidths=0.01, linecolor='white')
>>> plt.show()
금값은 S&P 500, 다우 존스, 나스닥 등 미국의 경제 지표와 유사하게 움직이고 있다.
일본의 닛케이 지수도 0.8 이상의 수치로 미국의 경제 지표를 따르고 있다.
코스피 지수는 -0.72의 수치로 원달러 환율과 음의 관계로 강한 관계를 갖고 있다.
즉, 원달러 환율이 올라가면 코스피는 낮아지고 환율이 낮아지면 코스피는 높아지는 경향을 확인할 수 있다.
또한 코스피 지수는 크루드 오일, 미국 10년 만기 채권, 닛케이 지수와도 어느정도의 연관성이 있다.
최근 3년 간의 경제지표와 상관계수를 살펴보면 다음과 같다.
코스피 지수가 5년 간의 상관 관계에 있어서는 원달러 환율과 깊은 연관이 있었지만, 원달러 환율 뿐 아니라 엔화와도 관련이 깊어졌다.
금값과는 음의 관계로 연관성이 깊어진 반면, 미국의 경제 지표와는 연관성이 다소 떨어졌다.
최근 1년 간의 경제지표와 상관계수를 살펴보면 다음과 같다.
최근 1년 간의 코스피 지수는 금, 은, 파운드 환율을 제외한 대부분의 지수와 밀접한 관계를 가지며 움직이는 것을 확인할 수 있다.
그리고 모든 지표 중, 금, 은 값의 상승률이 가장 높은 것으로 보아 화폐 가치의 하락으로 인해 실물 자산을 선호하는 경향이 뚜렷해지는 것으로 보인다.
Written on April 7th, 2020 by Jonghyun Ho