기초지식/ISL with R(통계학)

[3장]ISL with R : 다중선형회귀 실습 in R(주가예측 심화)

문송한투자자 2022. 10. 25. 07:56
반응형

환율과 원유 선물을 통한 주가 예측

[3장]ISL with R : 단순선형회귀 실습 in R(환율을 통한 주가예측) 에서 환율을 통한 주가예측 모델을 만들어 봤다. 단순선형회귀에서 조금 더 다양한 factor를 반영한다면(다중선형회귀) 예측의 정확도가 올라갈지 한 번 실습해보자. [3장]ISL with R : 단순선형회귀 실습 in R(환율을 통한 주가예측) 에서와 마찬가지로 yahoo finance 에서 수집한 코스피 종가, 환율 종가, 원유선물 종가 데이터 샘플에서 시작해보자. 
단순선형회귀에서와 마찬가지로 각 데이터들의 단위가 다르기 때문에 코스피, 환율, 원유선물 종가의 일일 수익률을 이용해서 선형회귀 분석을 진행해보자.

데이터 만들기

엑셀 읽어오기

[3장]ISL with R : 단순선형회귀 실습 in R(환율을 통한 주가예측) 에서와 마찬가지로 R의 "readxl"이라는 라이브러리를 이용해서 read_excel 함수를 아래와 같이 쓰면 위의 코스피, 환율, 원유 선물 데이터를 불러와서 fxdata, oildata, kospi라는 변수에 저장할 수 있다. 

library(readxl)

fxdata = read_excel("파일경로")
oildata = read_excel("파일경로")
kospi = read_excel("파일경로")

통합 데이터 만들기

분석을 편하게 하기 위해서 위 fxdata, kospi, oildata 데이터를 하나의 DataFrame으로 묶어 보자. 아래 그림 1에서 확인할 수 있듯이 fxdata, oildata, kospi는 'Date'라는 컬럼을 공유한다. 

그림1: 데이터 구조 확인

R에서 'Date'를 기준으로 두 데이터를 묶는 방법은 merge 함수를 쓰는 것이다. 그런데 merge 함수는 데이터를 두 개씩 밖에 묶지 못한다. 그래서 아래 그림 2와 같이 kospi와 fxdata를 먼저 묶고 그 결과를 다시 oildata와 묶어서 최종 데이터를 만들 것이다.

그림2: merge를 통한 데이터 합치기

마지막으로 subset 함수의 select 기능을 이용해서 특정 컬럼만 선택하여 데이터를 정리하면, 다중회귀에 필요한 독립변수와 종속변수를 모두 갖고 있는 fin2 data라는 데이터가 나온다.

library(readxl)

fxdata = read_excel("파일경로")
oildata = read_excel("파일경로")
kospi = read_excel("파일경로")

merge1 = merge(kospi, fxdata, by='Date')
merge2 = merge(merge1, oildata, by='Date')
fin2data = subset(merge2, select=c('Date','kospi_roc','fx_roc','oilfut_roc'))

선형 회귀 분석

회귀 계수 도출

[3장]ISL with R : 선형 회귀계수 계산 에서 알아본 다중 선형 회귀 기본 식은 아래와 같다. 

식1: 다중선형회귀 기본식

다중 선형 회귀 계수를 구할 때도 단순 선형 회귀 분석과 마찬가지로 R에서 제공하는 lm 함수를 쓰면 된다. lm.fit = lm(y값~x1값 + x2값+x3값 ... , data=R에서 설정한 데이터 명)과 같이 " + "를 통해서 독립 변수만 추가하면 여러 독립 변수의 회귀계수를 구할 수 있다.  

lm.fit2=lm(kospi_roc~fx_roc+oilfut_roc, data=fin2data)
result2 = lm.fit2

선형 회귀분석을 통한 예측

summary 함수를 통해서 result2에 저장한 선형 회귀 결과를 아래와 같이 확인할 수 있다.

그림3: 선형회귀 분석 결과

그림 3에서 회귀계수(regression coefficient)는 절편(intercept)은 -0.0011418, fx 변화율에 대한 계수는(fx_roc) -0.3416087 이 나오고 원유 선물의 수익률에 대한 계수는(oilfut) 0.0379169 가 나온다. 아래 식과 같이 intercept_2라는 변수에는 첫 번째( [1] ) 회귀계수(regression coefficient), beta2_1이라는 변수에는 두 번째(회귀계수(regression coefficient), beta2_2라는 변수에는 세 번째(회귀계수(regression coefficient)를 넣으면 아래와 같은 선형 회귀 식을 완성할 수 있다.

library(readxl)

fxdata = read_excel("파일경로")
oildata = read_excel("파일경로")
kospi = read_excel("파일경로")

merge1 = merge(kospi, fxdata, by='Date')
merge2 = merge(merge1, oildata, by='Date')

fin2data = subset(merge2, select=c('Date','kospi_roc','fx_roc','oilfut_roc'))
lm.fit2=lm(kospi_roc~fx_roc+oilfut_roc, data=fin2data)
result2 = lm.fit2
intercept_2 = result2$coefficients[1]
beta1_2 = result2$coefficients[2]
beta2_2 = result2$coefficients[3]

x1 = 관측된 환율의 일일 변화율
x2 = 관측된 원유 선물의 일일 수익률

kospi_ex2 = intercept_2 + beta1_2*x1 + beta2_2*x2
kospi_ex2

x1, x2에 특정 값을 넣어주면 kospi_ex2에서 회귀분석에 따른 예측 값을 산출해 낸다.

 

결론: R 스퀘어 여전히 낮네...

반응형