엑셀_파이썬_기타 코딩

파이썬 Lagged variable Linear Regression

2023. 6. 17. 12:21

관련 글 : 그랜져 인과검정

(*이하 글은 필자가 나름의 탐구를 진행한 바를 서술하고 있지만 개념적으로 오류가 있을 수 있으며 다소의 자의적인 해석이 포함되어 있습니다.)

경제 사이클이나 경제지표를 분석하는 관점에서 가장 궁금한 것 중 하나는 어느 지표나 변수가 다른 지표에 얼마나 선행하는지이다.  "ISM PMI가 주식 어닝에 얼마나 선행할까?" 이런 질문들에 대한 나름의 답을 정리하는 작업이 필요하다.

보편적으로는 그랜져 인과검정을 쓰는 것으로 보이지만, 어느 통계모형을 사용한 분석이든 시차를 넣어 선행/후행 관계를 분석하는 것도 가능하다. 

두 변수의 분포를 피팅하는 가장 기본적인 방법은 선형회귀이다. 선형회귀 분석에서도 독립변수에 시차를 넣어 선행/후행 관계를 분석하는 것이 가능하다. 다만 이 경우에는 데이터의 시계열 속성을 버리게 되는 것이 한계점이다. 즉 두 변수 X, Y를 분석할 때, 각 변수의 시간 데이터는 버리고 두 변수로 형성되는 분포만을 분석하게 되는 것이다. 


파이썬에서 statsmodel 라이브러리를 사용하여 시차 변수를 사용한 회귀분석을 진행해보자. 기본적인 회귀분석과 크게 다른 것은 없다. 그저 변수에 시차만 집어넣는 과정이 추가될 뿐이다. 

이 글에서는 ISM 신규주문(New order), S&P500 NTM 어닝- 미국채 10년 금리 간의 관계를 살펴보려 한다.

참고: S&P500 NTM 어닝에서 10년금리를 감산

더보기

S&P500 NTM 어닝에서 10년금리를 감산하는 것은 주식 밸류에이션에 대한 프록시를 만드는 것인데, 그다지 일반적인 프록시는 아니고 개념적으로도 불완전하다. 좀 더 엄밀한 밸류에이션을 원한다면 S&P500 배당수익률과 금리를 비교해야하고, 비교 대상도 시장 금리인 10년 금리보다는 FFR을 쓰는게 맞을 수도 있다. 하지만 일반적으로 배당수익률을 밸류에이션의 지표로 잘 쓰지는 않고, FFR은 시장 금리라고 하기 어려운 부분이 있어 마켓을 대변할 수 있느냐는 또 다른 문제가 있다. 

1.데이터 구글드라이브에 올리고 코랩 파일로 읽기

더보기
from google.colab import drive
drive.mount('/content/drive')

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
import os
warnings.filterwarnings('ignore')
%matplotlib inline

excel_direc1 = str('/content/drive/MyDrive/Colab Notebooks/')
excel_direc2= str('neworder_eps_grang_1.xlsx')
excel_direc = os.path.join(excel_direc1, excel_direc2)
print(excel_direc)
print(os.path.exists(excel_direc))

2.데이터 정리

df = pd.read_excel(excel_direc, header =0, engine= 'openpyxl')
display(df)

df=df.dropna()
df.set_index('Date', drop= True, inplace =True )
df.sort_index(ascending = False, inplace= True )

display(df)

3. 독립 변수에 시차 넣기

-shift로  열을 이동시켜준다. 

#Add lag
df.iloc[:, 1]= df.iloc[:, 1].shift(periods=-2)
df=df.dropna()

4.회귀분석 진행

#회귀분석
import statsmodels.api as sm

x = df.iloc[:, 0].values
y = df.iloc[:, 1].values
sm.add_constant(x)
model = sm.OLS(y, x)

result = model.fit()
p = model.fit().params

print(result.summary())

5.그래프화

-seaborn 패키지는 회귀분석 관련하여 깔끔한 시각화 기능을 제공한다. regplot에서 자체적으로 회귀분석을 시행한다.  

import seaborn

seaborn.regplot(x='ISM New order (no na())', y='S&P500 Forward NTM EPS YoY-UST 10Y Yield', data=df)

 


위에는 나와있지 않지만, y변수(S&P500 NTM 어닝- 미국채 10년 금리)를 1~2개월 후행시킬 때 (shift 할 때 periods =-1, -2) 베타값이 조금 더 높다. 

x변수(ISM New order)에 로그 값을 취해서 skew를 줄일 수도 있다. 결과는 크게 다르지 않다.

시차 변수를 넣는 것과 관련하여 통계 모델의 유의성이 어떻게 달라지에 관한 복잡한 논의가 있다. 그러나 당장은 더 파고들지 않으려 한다.