한국, 미국 ETF 자산 간 상관 관계 구하기 (우상향하는 반대되는 자산)
본문 바로가기
파이썬(Python)/파이썬으로 투자실험

한국, 미국 ETF 자산 간 상관 관계 구하기 (우상향하는 반대되는 자산)

by Squat Lee 2024. 3. 27.

한국과 미국의 환율은 서로 반대로 움직입니다.

 

미국 또는 세계의 경제위기가 오면 환율이 올라가죠.

 

KOSPI와 환율그래프를 보면 서로 반대로 움직임을 알 수 있습니다.

 

환율 VS KOSPI

 

그래서 미국ETF와 한국ETF를 자산분배하여 투자하면 어떻게 될지 궁금해졌습니다.

 

우선 미국 S&P500 지수를 추종하는 SPY와 KOSPI 200을 추종하는 TIGER200의 상관관계를 분석하겠습니다.

 

서로 우상향하는 자산이라 그런지 R값이 0.75가 나왔네요. 환율이 반영된 값인데도 수치가 높네요.

 

그럼 우리가 흔히 얘기하는 주식:채권의 대표ETF SPY와 TLT의 상관관계를 보겠습니다.

 

SPY와 TLT도 상관관계가 높네요. 제가 계산을 잘못 한것인지 사람들이 얘기하는 이론이 틀린건지 모르겠네요.

 

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

 

사실 똑같은 계산 방법으로 코스피지수와 원-달러 환율관 상관관계를 분석하면 0.83이 나와서 상관관계가 상당히 높은 것으로 보입니다.

 

위의 그래프들은 단순히 수치만 보고 상관관계를 나타내는 그래프라서 오차가 있는 것 같습니다.

 

우리는 주가의 방향을 봐야하기 때문에 장기적으로 우상향이라도 단기적으로 방향이 반대로 움직이는지 확인해 볼 필요가 있습니다.

 

다시 SPY와 TLT를 증감률을 반영해서 상관관계를 보도록 하겠습니다.

 

 

이번에는 QQQ와 GLD의 상관관계를 보겠습니다.

 

서로 방향이 반대는 아니지만 QQQ와 현금을 투자하는 것처럼 상관성이 상당히 떨어지는 것을 확인할 수 있습니다.(현금은 상관성이 0에 수렴합니다.)

 

그럼 이제는 미국ETF와 한국ETF의 상관관계를 보겠습니다.

 

우선 SPY와 TIGER KOSPI 200을 보겠습니다.

 

환율을 반영했는데도 상관성이 상당히 높은것으로 나옵니다.

 

이번엔 QQQ와 TIGER KOSPI 200을 보겠습니다.

역시나 상관성이 높게 나오네요. 아마도 우리나라 주식은 미국시장에 영향을 많이 받는다는 말이 사실인 것 같습니다.

 

그럼 이제 마지막으로 SPY와 QQQ의 상관관계를 보도록 하겠습니다.

 

 

예상했던대로 SPY와 QQQ는 거의 동일한 방향으로 움직입니다.

 

전체 코드는 아래와 같습니다.

 

우선 증감율이 반영되지 않은 코드입니다.

 

import pandas as pd
from pandas_datareader import data as pdr
import yfinance as yf
yf.pdr_override()
from scipy import stats
import matplotlib.pylab as plt
from datetime import datetime

port1 = 'SPY'
port2 = 'TLT'

start = datetime(2000, 1, 1)
end = datetime(2024, 2, 29)

def get_etf_data(start, end, p):
    if p[-2:] == 'KS': #한국ETF는 환율반영
        df_ex = pdr.get_data_yahoo('USDKRW=X', start, end) #환율데이터 가져오기
        df_ko = pdr.get_data_yahoo(p, start, end)
        df = pd.merge(df_ko['Adj Close'], df_ex['Adj Close'], left_index=True, right_index=True)
        df.columns = ['국내ETF', '환율']
        df['Adj Close'] = df['국내ETF'] / df['환율']
    else:
        df = pdr.get_data_yahoo(p, start, end)
    return df

df1 = get_etf_data(start, end, port1)
print(df1)
df2 = get_etf_data(start, end, port2)
print(df2)
df_o = pd.merge(df1['Adj Close'], df2['Adj Close'], left_index=True, right_index=True)
df_o.columns = ['p1', 'p2']
df_o.dropna(inplace=True)

df = pd.merge(df_o['p1'], df_o['p2'], left_index=True, right_index=True)
df.columns = ['X', 'Y']

df = df.fillna(method='bfill')
df = df.fillna(method='ffill')

regr = stats.linregress(df.X, df.Y)
regr_line = f'Y={regr.slope:.2f} * X + {regr.intercept:.2f}'

plt.figure(figsize=(16, 9))
plt.plot(df.X, df.Y, '.')
plt.plot(df.X, regr.slope * df.X + regr.intercept,'r')
plt.legend([port1 + ' X ' + port2, regr_line])
plt.title(f'{port1} X {port2} (R = {regr.rvalue:.2f})')
plt.xlabel(port1)
plt.ylabel(port2)
plt.show()

 

 

이번에는 주가의 증감율이 반영된 코드입니다.

import pandas as pd
from pandas_datareader import data as pdr
import yfinance as yf
yf.pdr_override()
from scipy import stats
import matplotlib.pylab as plt
from datetime import datetime

port1 = 'QQQ'
port2 = 'SPY'

start = datetime(2000, 1, 1)
end = datetime(2024, 2, 29)

def get_etf_data(start, end, p):
    if p[-2:] == 'KS': #한국ETF는 환율반영
        df_ex = pdr.get_data_yahoo('USDKRW=X', start, end) #환율데이터 가져오기
        df_ko = pdr.get_data_yahoo(p, start, end)
        df = pd.merge(df_ko['Adj Close'], df_ex['Adj Close'], left_index=True, right_index=True)
        df.columns = ['국내ETF', '환율']
        df['Adj Close'] = df['국내ETF'] / df['환율']
    else:
        df = pdr.get_data_yahoo(p, start, end)
    return df

df1 = get_etf_data(start, end, port1)
print(df1)
df2 = get_etf_data(start, end, port2)
print(df2)
df_o = pd.merge(df1['Adj Close'], df2['Adj Close'], left_index=True, right_index=True)
df_o.columns = ['p1', 'p2']
df_o.dropna(inplace=True)

df = pd.merge(df_o['p1'], df_o['p2'], left_index=True, right_index=True)

#증감율 반영
df['X'] = df['p1'].pct_change(periods=300)
df['Y'] = df['p2'].pct_change(periods=300)

df = df.fillna(method='bfill')
df = df.fillna(method='ffill')

regr = stats.linregress(df.X, df.Y)
regr_line = f'Y={regr.slope:.2f} * X + {regr.intercept:.2f}'

plt.figure(figsize=(16, 9))
plt.plot(df.X, df.Y, '.')
plt.plot(df.X, regr.slope * df.X + regr.intercept,'r')
plt.legend([port1 + ' X ' + port2, regr_line])
plt.title(f'{port1} X {port2} (R = {regr.rvalue:.2f})')
plt.xlabel(port1)
plt.ylabel(port2)
plt.show()
728x90
반응형

댓글