수업 과제

Author

홍길동 (2025012345)

Published

March 27, 2026

  1. 코스피200 및 S&P500 일별 종가 데이터를 불러와 날짜를 기준으로 두 지수를 병합한 뒤, merged_px 객체를 생성하시오. 그리고 일별 수익률 변수(ret_sp500, ret_kospi200, ret_kospi200_lead)를 생성하시오. (inner_join)
library(dplyr)
library(tidyverse)

sp500_px <- read_csv("https://raw.githubusercontent.com/chung-jiwoong/FMB819/refs/heads/main/chapter_slr/data/%5Espx_d.csv") |>
  transmute(date = as.Date(Date), sp500_close = as.numeric(Close)) |> 
  arrange(date)

ks200_px <- read_csv("https://raw.githubusercontent.com/chung-jiwoong/FMB819/refs/heads/main/chapter_slr/data/%5Ekospi_d.csv") |>
  transmute(date = as.Date(Date), kospi200_close = as.numeric(Close)) |> 
  arrange(date)

merged_px <- inner_join(sp500_px, ks200_px, by = "date") |> 
  mutate(
    ret_sp500 =  10000 * (log(sp500_close) - log(lag(sp500_close))),
    ret_kospi200 =  10000 * (log(kospi200_close) - log(lag(kospi200_close)))
  ) |> 
  mutate(ret_kospi200_lead = lead(ret_kospi200)) |> 
  drop_na()
  1. 데이터셋 설명:

    • 총 몇 개의 관측치가 있는가?

    • 데이터셋을 확인하고 어떤 변수가 있는지 확인하시오.

    • skimr 패키지의 skim 함수 사용해서 생성한 수익률 변수에 대한 기본적인 요약 통계 확인.

      힌트: dplyrselect 사용해서 변수 선택한 후 %>%skim() 적용하면 됨.

if (!requireNamespace("skimr")) {install.packages("skimr")}
library(skimr)
returns_raw <- merged_px %>% select(date, ret_sp500, ret_kospi200, ret_kospi200_lead)
skim(returns_raw)
Data summary
Name returns_raw
Number of rows 11002
Number of columns 4
_______________________
Column type frequency:
Date 1
numeric 3
________________________
Group variables None

Variable type: Date

skim_variable n_missing complete_rate min max median n_unique
date 0 1 1980-01-07 2026-02-19 2003-02-16 11002

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
ret_sp500 0 1 3.79 115.86 -2289.97 -45.92 6.33 57.93 1095.72 ▁▁▁▇▁
ret_kospi200 0 1 3.67 154.55 -1611.54 -65.10 4.17 75.56 1128.44 ▁▁▇▅▁
ret_kospi200_lead 0 1 3.67 154.54 -1611.54 -65.10 4.17 75.56 1128.44 ▁▁▇▅▁
  1. S&P500 수익률(ret_sp500)과 코스피200 수익률(ret_kospi200, ret_kospi200_lead)의 상관관계는?
cor(returns_raw$ret_sp500, returns_raw$ret_kospi200)
[1] 0.1322428
cor(returns_raw$ret_sp500, returns_raw$ret_kospi200_lead)
[1] 0.2437567

Task 2

  1. 익일 코스피200 평균 수익률(ret_kospi200_lead)을 S&P500 수익률에 대해 회귀분석 수행. 회귀 계수(coefficients)를 해석하시오.
kospi_reg <- lm(ret_kospi200_lead ~ ret_sp500, data = merged_px)
summary(kospi_reg)

Call:
lm(formula = ret_kospi200_lead ~ ret_sp500, data = merged_px)

Residuals:
     Min       1Q   Median       3Q      Max 
-1634.16   -68.30     0.06    69.11  1162.22 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  2.43827    1.42975   1.705   0.0882 .  
ret_sp500    0.32514    0.01233  26.361   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 149.9 on 11000 degrees of freedom
Multiple R-squared:  0.05942,   Adjusted R-squared:  0.05933 
F-statistic: 694.9 on 1 and 11000 DF,  p-value: < 2.2e-16
  1. 이 회귀분석에서 OLS 계수 \(b_0\)\(b_1\)을 직접 계산 (공식 이용).
    힌트: cov, var, mean 함수 사용.
b_1 <- cov(merged_px$ret_sp500, merged_px$ret_kospi200_lead) / var(merged_px$ret_sp500)
b_0 <- mean(merged_px$ret_kospi200_lead) - b_1 * mean(merged_px$ret_sp500)
b_0
[1] 2.438274
b_1
[1] 0.3251395
  1. S&P500 수익률이 0bp일 때, 예측된 익일 코스피200 수익률은 얼마인가?
b_0 + b_1 * 0
[1] 2.438274
  1. S&P500 수익률이 30bp일 때, 예측된 익일 코스피200 수익률은 얼마인가?
b_0 + b_1 * 30
[1] 12.19246

Task 3

  1. 코스피200 수익률을 S&P500 수익률에 대해 회귀(regress)하고 결과를 kospi_reg 객체에 저장.
kospi_reg <- lm(ret_kospi200 ~ ret_sp500, data = merged_px)
summary(kospi_reg)

Call:
lm(formula = ret_kospi200 ~ ret_sp500, data = merged_px)

Residuals:
     Min       1Q   Median       3Q      Max 
-1525.52   -68.51     0.69    70.81  1080.49 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3.00335    1.46130   2.055   0.0399 *  
ret_sp500    0.17640    0.01261  13.993   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 153.2 on 11000 degrees of freedom
Multiple R-squared:  0.01749,   Adjusted R-squared:  0.0174 
F-statistic: 195.8 on 1 and 11000 DF,  p-value: < 2.2e-16
  1. summary(kospi_reg)를 실행하여 (다중) \(R^2\) 값을 확인함. 이 값의 의미를 해석할 것.

  2. 코스피200 수익률을 S&P500 수익률 간 상관계수(correlation)를 제곱하여 계산. 참고: 이 값은 단일 설명변수를 가진 회귀에서 \(R^2\)와 상관계수 간의 관계를 보여줌.

cor(merged_px$ret_sp500, merged_px$ret_kospi200)^2
[1] 0.01748815
  1. 1번과 2번을 익일 코스피200 수익률에 대해 반복.
    당일 코스피200 수익률과 익일 코스피200 수익률 중 어떤 결과가 S&P500 수익률 변화로 더 많이 설명되는지 비교하시오.
kospi_reg <- lm(ret_kospi200_lead ~ ret_sp500, data = merged_px)
summary(kospi_reg)

Call:
lm(formula = ret_kospi200_lead ~ ret_sp500, data = merged_px)

Residuals:
     Min       1Q   Median       3Q      Max 
-1634.16   -68.30     0.06    69.11  1162.22 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  2.43827    1.42975   1.705   0.0882 .  
ret_sp500    0.32514    0.01233  26.361   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 149.9 on 11000 degrees of freedom
Multiple R-squared:  0.05942,   Adjusted R-squared:  0.05933 
F-statistic: 694.9 on 1 and 11000 DF,  p-value: < 2.2e-16
  1. (Optional) broom 패키지를 설치 및 로드한 후, augment(kospi_reg)를 새로운 객체에 저장.
    ret_kospi200_lead의 분산(SST)과 예측값의 분산(SSE)을 사용하여 \(R^2\) 값을 직접 계산하시오. (이전 슬라이드의 공식을 참고할 것.)

    • broom 패키지의 augment() 함수는 회귀 결과에 예측값과 잔차를 추가하는 데 사용됨.
    if (!requireNamespace("broom")) {install.packages("broom")}
    library(broom)
    kospi_reg_aug <- augment(kospi_reg) # 회귀 결과에 예측값과 잔차 추가
    SST <- var(merged_px$ret_kospi200_lead) * (nrow(merged_px) - 1)
    SSE <- var(kospi_reg_aug$.fitted) * (nrow(kospi_reg_aug) - 1)
    R_squared <- SSE / SST
    R_squared
    [1] 0.05941731