원-달러 환율과 KOSPI 지수 상관관계 분석
본문 바로가기
파이썬(Python)/파이썬으로 투자실험

원-달러 환율과 KOSPI 지수 상관관계 분석

by 만초손겸수익 2023. 2. 6.

 

원-달러 환율과 코스피 지수는 반대로 움직일 것 같다는 생각을 했습니다.

 

투자의 세계에서 항상 '감'으로 "~~이럴 것 같다." 라는 마음으로 투자하면 낭패를 보겠죠.

 

그래서 주말에 새벽부터 열심히 찾아보고, 데이터를 분석해 보았습니다.

 

KOSPI 지수(빨간색)와 원달러 환율(파란색)

 

위의 그래프는 코스피 지수와 원-달러 환율의 가격흐름을 나타내었습니다.

 

2003년부터 오늘(2023년 2월 3일 종가기준)까지의 데이터를 이용하였습니다.

 

코스피가 올라갈 때 환율은 떨어지고, 환율이 떨어지면 코스피가 올라가는 모습이 보이시나요? 마치 데칼코마니 처럼 움직입니다.

 

좀 더 정확한 상관관계를 알아보기 위해 산점도(Scatter Graph)로 나타내어서 회귀분석을 해 보도 하겠습니다.

 

코스피 지수와 원-달러 환율간 상관관계 분석

위의 그래프를 보면 R값이 0.16이 나옵니다.

 

두 데이터 간 상관관계를 나타내는 R 값은 0에 가까울 수록 서로 관련이 없고, 1에 가까울 수록 양의 상관관계 그리고 -1에 가까울 수록 음의 상관관계를 나타냅니다.

 

즉, 위의 회귀분석 결과로는 "원-달러 환율이 올라갈 수록 코스피도 같이 올라간다"라고 판단할 수 있습니다.

KOSPI 지수(빨간색)와 원달러 환율(파란색)

다시 첫 번째 그래프로 돌아와서 보겠습니다. 

 

제 눈이 잘못된 건가요? 분명히 완전 반대로 움직이지 않나요? 그런대 왜 같이 움직인다고 결과가 나올까요?

 

코스피 지수와 원-달러 환율간 상관관계 분석 결과의 이상치

상관관계 분석 결과를 다시 보겠습니다.

 

위의 그림의 빨간색 타원 부분과 같이 이상치가 발생한 것을 보입니다.

 

사람들은 물리학과 경제학을 많이 혼동 합니다.

 

물리학은 동전을 떨어뜨리면 항상 땅에 떨어지 듯이 때와 장소에 따라서 변하지 않는 진리입니다.

 

하지만, 경제학은 다르죠. "동전을 떨어뜨리면 대부분 땅에 떨어지지만, 항상 그렇지는 않다."라는 개념입니다.

 

물리학에서는 1+1=2가 절대 진리이지만, 경제학에서는 1+1은 대부분 2이지만, 가끔 3이 되거나 5가 될 수도 있습니다.

 

그래서 경제관련 데이터는 항상 이상치(Outlier)가 발생합니다. 이런 이상치로 인해서 결과값이 왜곡될 수도 있습니다.

 

위의 그래프 결과 또한 왜곡되었다고 생각합니다.

 

그래서 이상치를 삭제하고 다시 분석을 해 보았습니다.

 

코스피 지수와 원-달러 환율간 상관관계 분석(이상치 삭제)

이상치(Outlier)를 제거하니 그래프가 원하는 방향대로 나왔네요.

 

R값은 -0.34가 나와서 환율과 코스피가 반대로 움직일 수 있다는 것을 확인할 수 있습니다.

 

또한 1차함수 그래프(빨간색 선)가 자동으로 그려지며, 식 "코스피지수 = -1.09 X 환율 + 3182 "라는 식도 만들어져서 환율을 통해 코스피지수도 추정할 수 있게 되었습니다.

 

아쉽지만, 이 그래프도 틀렸어요.

 

임의로 제가 이상치를 지우는 바람에 제 입맛에 맞는 결과를 조작한 것 처럼 되어버렸습니다.

 


문제가 무엇일까 천천히 생각해 보았습니다.

 

KOSPI 지수(빨간색)와 원달러 환율(파란색)

분명 환율과 코스피는 반대로 움직이는게 확실하다고 생각합니다.

 

그런데 왜 상관관계에서는 엉뚱한 값이 나올까요?

 

한참을 고민해보니 이유를 알게 되었습니다.

 

코스피 지수와 원-달러 환율간 상관관계 분석

이렇게 산점도는 시간을 고려하지 않습니다.

 

코스피지수와 환율은 반대로 움직이지만 시간에 따라 그 값은 달라집니다. 

 

예를들어 2008년 즈음에는 환율이 폭락할 때는 1,000원 밑으로 내려갔지만, 2020년 이후에는 폭락을 해도 1,100원 밑으로 살짝 내려갈 뿐 1,000원대까지 떨어지진 않았습니다.

 

또한, 코스피 지수도 2008년에는 1,000까지 폭락했지만, 2020년 폭락장에는 1,500까지만 내려갔습니다.

 

시간에 따라서 정도가 다른데, 상관관계 분석 데이터에는 이것이 고려되지 않아서 결과값이 이상하게 나온 것입니다.

 


그럼 어떻게 나타내야지 이 두 데이터가 반대로 움직인다는 것을 증명할 수 있을까요?

 

다시 처음의 데이터를 보겠습니다.

 

KOSPI 지수(빨간색)와 원달러 환율(파란색)

 

잘 보면 환율과 코스피는 값이 반대라기 보다는 방향이 반대로 움직이는 것을 알 수 있습니다.

 

즉, 코스피지수가 올라가면 환율은 감소하고 반대로 환율이 올라가면 코스피지수는 떨어지는 것입니다.

 

그러면 그래프의 증감율에 대한 상관관계를 분석하면 정말 이 두 데이터가 반대로 움직이는지 확인해 볼 수 있을겁니다.

 

환율 코스피 증감률 상관관계(30일 기준)

이렇게 그래프를 그려보면 확실히 반대로 움직이는 것을 확인 할 수 있습니다.

 

환율과 코스피지수 한달 동안의 증감을 계산해서 그래프로 표현해 보았습니다. 

 

R 값은 -0.53으로 서로 반대로 움직이는 것이 강하다는 것을 알 수 있습니다.

 

환율 코스피 증감률 상관관계(60일 기준)

증감률을 60일로 해 보니 환율과 코스피의 반대로 움직이는 성향이 더 강해 졌습니다.

환율 코스피 증감률 상관관계(60일 기준)

90일로 하면 R값이 더욱 떨어져서 -0.63이 되었습니다.

 

환율 코스피 증감률 상관관계(300일 기준)

300일 기준으로 하니 R값이 -0.7까지 떨어졌습니다.

 

이정도면 완전 반대로 움직인다고 해도 무방할 것 같습니다.

 

그리고 기간이 길어 질 수록 R값의 음의 값이 증가하는 것을 확인 할 수 있었습니다.

 

이것은 코스피든 환율이든 방향이 바뀌면 오랜동안 그 방향으로 간다는 것을 의미합니다.

 

즉, 환율과 주식을 분배해서 포트폴리오를 만들면 너무 잦은 매매 보다는 어느정도 일정 기간 이후에 매매를 해야 자산분배의 효과가 있다는 것을 의미합니다.

 

 

코스피지수와 환율증감률(300일 기준)

코스피지수와 환율증감률을 보더라도 반대로 움직이는 것을 알 수 있습니다.

 

상관관계가 -0.109 정도로 비교적 약합니다. 즉, 특정값을 기준으로 매매를 한다는 것은 위험할 수 도 있다는 생각이 듭니다.

 

코스피 증감률(빨간색)과 원달러 환율 증감률(파란색) / 300일 기준

코스피증감률과 환율 증감률을 살펴보겠습니다.

 

300일을 기준으로 했을때 상관계수(R)는 -0.69이고, 위의 그래프와 같이 완전히 반대로 움직이는 것을 알 수 있습니다.

 

저 그래프를 잘 활용하면 투자에 많은 도움이 될 것 같습니다.

 

특히나 최근 지점을 보면 지금은 주식을 매수할 때라는 것을 생각할 수 있습니다.

 

 


원달러 환율과 코스피주가지수는 서로 반대로 움직이는 것을 확인할 수 있었습니다.

 

하지만, 정확하게 어떤 값에서 매매를 해야 하는지는 그래프로 판단하기가 어렵습니다.

 

백테스트라는 것이 그런것 같습니다. 마치 백밀러를 보고 운전을 하는 것처럼 과거만 바라보며 미래를 예측한다는 것은 위험할 수도 있습니다.

 

다만, 인간의 심리는 단기간에 변화하지 않습니다. 7만년 전의 인간과 지금의 인간이 심리적인 부분에서는 동일합니다.

 

역사는 반복되기에 과거의 결과를 바탕으로 미래를 대비하는 것은 충분히 가능할 것 같습니다.

 

비가올때 우산을 팔고, 날씨가 좋을때는 소금을 파는 마음으로 적절히 대응하는 자세가 중요할 것 같습니다.

 

※ 프로그램을 독학으로 배우고, 통계를 배운적이 없어서 틀린 부분이 있을 수 있습니다. 알려주시면 감사드리겠습니다.


아래는 위 데이터를 분석한 도구입니다.

 

원달러 환율과 KOSPI 회귀분석(Scatter Graph)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import pandas as pd
import matplotlib.pyplot as plt
import FinanceDataReader as fdr
from datetime import datetime
from scipy import stats
 
today = datetime.today()
today = datetime.strftime(today, '%Y%m%d')
 
us_kw = fdr.DataReader('USD/KRW''2000')   # 원달러 환율
kospi = fdr.DataReader('KS11''2000')
 
 
df = pd.DataFrame({'X': us_kw['Close'], 'Y': kospi['Close']})
 
df = df[(df['Y'< 2800)]
 
df1 = df[(df['X'> 1260& (df['X'< 2240& (df['Y'> 2140)]
df.drop(df1.index, axis=0, inplace=True)
 
df2 = df[(df['Y'< 1000& (df['X'> 990& (df['X'< 1210)]
df.drop(df2.index, axis=0, inplace=True)
 
df3 = df[(df['Y'< 1500& (df['X'> 880& (df['X'< 1064)]
df.drop(df3.index, axis=0, inplace=True)
 
df4 = df[(df['X'> 1163& (df['X'< 1260& (df['Y'> 2589)]
df.drop(df4.index, axis=0, inplace=True)
 
df = df[(df['Y'> 1000)]
 
df.dropna(inplace=True)
 
regr = stats.linregress(df.X, df.Y)
regr_line = f'Y = {regr.slope:.2f} * X + {regr.intercept:.2f}'
 
plt.figure(figsize=(169))
plt.plot(df.X, df.Y, '.')
plt.plot(df.X, regr.slope * df.X + regr.intercept, 'r')
plt.legend(['KOSPI x USD/KRW', regr_line])
plt.title(f'KOSPI X USD/KRW (R={regr.rvalue:.2f})')
plt.xlabel('USD/KRW')
plt.ylabel('KOSPI INDEX')
plt.show()
cs

 

 

원달러환율과 KOSPI 회귀분석(증감률 이용)(Scatter Graph)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import pandas as pd
import matplotlib.pyplot as plt
import FinanceDataReader as fdr
from pykrx import stock
from datetime import datetime
from scipy import stats
 
today = datetime.today()
today = datetime.strftime(today, '%Y%m%d')
 
us_kw = fdr.DataReader('USD/KRW''2000')   # 원달러 환율
kospi = fdr.DataReader('KS11''2000')
 
 
df = pd.DataFrame({'USD-KW': us_kw['Close'], 'KOSPI': kospi['Close']})
 
df['X'= df['USD-KW'].pct_change(periods=300)
df['Y'= df['KOSPI'].pct_change(periods=300)
 
df.dropna(inplace=True)
 
print(df)
regr = stats.linregress(df.X, df.Y)
regr_line = f'Y = {regr.slope:.2f} * X + {regr.intercept:.2f}'
 
plt.figure(figsize=(169))
plt.plot(df.X, df.Y, '.')
plt.plot(df.X, regr.slope * df.X + regr.intercept, 'r')
plt.legend(['KOSPI x USD/KRW', regr_line])
plt.title(f'KOSPI X USD/KRW (R={regr.rvalue:.2f})')
plt.xlabel('USD/KRW')
plt.ylabel('KOSPI INDEX')
plt.show()
cs

 

 

 

KOSPI지수 와 원달러 증감률 회귀분석(선형그래프)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import pandas as pd
import matplotlib.pyplot as plt
import FinanceDataReader as fdr
from pykrx import stock
from datetime import datetime
 
today = datetime.today()
today = datetime.strftime(today, '%Y%m%d')
 
us_kw = fdr.DataReader('USD/KRW''2000')   # 원달러 환율
per = stock.get_index_fundamental('20040104', today, '1001')   # per
kospi = fdr.DataReader('KS11''2000')
us_kw['uskw_change_rate'= us_kw['Close'].pct_change(periods=300)
 
df = pd.DataFrame({'US-KW': us_kw['Close'], 'KOSPI': kospi['Close'], 'US-KW CH RATE': us_kw['uskw_change_rate']})
df.dropna(inplace=True)
 
plt.rcParams['figure.figsize'= (169)
 
fig, ax1 = plt.subplots()
ax1.set_xlabel('DATE')
ax1.set_ylabel('KOSPI')
ax1.plot(df.index, df['KOSPI'], color='red', label='KOSPI')
ax1.legend(loc='upper left')
 
# ax2 = ax1.twinx()
# ax2.set_ylabel('US-KW')
# ax2.plot(df.index, df['US-KW'], color='black', label='US-KW')
# ax2.legend(loc='lower right')
 
ax3 = ax1.twinx()
ax3.set_ylabel('US-KW CH RATE')
ax3.plot(df.index, df['US-KW CH RATE'], color='blue', label='US-KW CH RATE')
ax3.legend(loc='upper right')
 
plt.title('KOSPI VS US-KW CH RATE')
plt.grid(True)
 
 
print(df['US-KW'].describe(percentiles=[.10, .20, .25, .35, .85, .95]))
print(df['US-KW CH RATE'].describe(percentiles=[.10, .20, .25, .35, .85, .95]))
print(df['KOSPI'].corr(df['US-KW CH RATE']))
 
plt.show()
cs

 

 

KOSPI지수 증감률과 원달러 증감률 회귀분석(선형그래프)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import pandas as pd
import matplotlib.pyplot as plt
import FinanceDataReader as fdr
from pykrx import stock
from datetime import datetime
 
today = datetime.today()
today = datetime.strftime(today, '%Y%m%d')
 
us_kw = fdr.DataReader('USD/KRW''2000')   # 원달러 환율
per = stock.get_index_fundamental('20040104', today, '1001')   # per
kospi = fdr.DataReader('KS11''2000')
us_kw['uskw_change_rate'= us_kw['Close'].pct_change(periods=300)
kospi['kospi_change_rate'= kospi['Close'].pct_change(periods=300)
 
df = pd.DataFrame({'US-KW': us_kw['Close'], 'KOSPI CH RATE': kospi['kospi_change_rate'], 'US-KW CH RATE': us_kw['uskw_change_rate']})
df.dropna(inplace=True)
 
plt.rcParams['figure.figsize'= (169)
 
fig, ax1 = plt.subplots()
ax1.set_xlabel('DATE')
ax1.set_ylabel('KOSPI CH RATE')
ax1.plot(df.index, df['KOSPI CH RATE'], color='red', label='KOSPI CH RATE')
ax1.legend(loc='upper left')
 
# ax2 = ax1.twinx()
# ax2.set_ylabel('US-KW')
# ax2.plot(df.index, df['US-KW'], color='black', label='US-KW')
# ax2.legend(loc='lower right')
 
ax3 = ax1.twinx()
ax3.set_ylabel('US-KW CH RATE')
ax3.plot(df.index, df['US-KW CH RATE'], color='blue', label='US-KW CH RATE')
ax3.legend(loc='upper right')
 
plt.title('KOSPI CH RATE VS US-KW CH RATE')
plt.grid(True)
 
 
print(df['KOSPI CH RATE'].describe(percentiles=[.10, .20, .25, .35, .85, .95]))
print(df['US-KW CH RATE'].describe(percentiles=[.10, .20, .25, .35, .85, .95]))
print(df['KOSPI CH RATE'].corr(df['US-KW CH RATE']))
 
plt.show()
cs
728x90

댓글