R

[R 연습] 국내 주요 지수를 추종하는 ETF의 요일별 밤낮 평균 수익률은?

오렌지사과키위 2023. 11. 29. 15:33

문제

국내 주요 지수인 KOSPI 200과 KOSDAQ 150을 추종하는 ETF로 KODEX 200과 KODEX 코스닥 150이 있다. 이 두 ETF에 대해 시가에 매수해서 종가에 매도하는 전략을 (이하 주간 매매 전략) 사용하면 수익을 얻을 수 있는가? 반대로 종가에 매수해서 다음날 시가에 매도하는 전략은 (이하 야간 매매 전략) 어떠한가? 요일별로 특이점이 있는가?

 

주의

Yahoo Finance 또는 Google Finance의 (Google Sheet에서 불러온 경우도 포함) 국내 시세 데이터는 완벽하지 않습니다. 결측값이 있거나 잘못된 값이 있는 경우가 꽤 있습니다. 실사용 목적으로는 보다 완전한 데이터를 이용하는 것이 바람직합니다.
여기에서 제시하는 결과는 통계적 유의성을 전혀 고려하지 않았습니다. 또한 데이터 적용 기간에 따라 결과에 상당한 차이가 있을 수 있습니다.

 

코드

library(dplyr)  ## for summarize()
library(ggplot2)  ## got ggplot()
library(lubridate)  ## for wday()
library(quantmod)  ## for getSymbols()
library(tidyr) ## for tribble()

# Map Yahoo Finance ticker names and legends.
ticker_map <- tribble(
  ~ticker, ~name,
  "069500.KS", "Kodex.Kospi200",
  "229200.KS", "Kodex.Kosdaq150",
)

# Get daily stock prices from Yahoo Finance.
getSymbols(ticker_map$ticker, src = "yahoo")

# Calculate day gains.
gains_day <- do.call(
  cbind,
  lapply(ticker_map$ticker,
         function(x) (Cl(get(x)) / Op(get(x))) - 1)) %>%
  setNames(paste(ticker_map$name, "Day", sep = "."))

# Calculate night gains.
gains_night <- do.call(
  cbind,
  lapply(ticker_map$ticker,
         function(x) (
           timeSeries::lag(Op(get(x)), k = -1) / Cl(get(x))) - 1)) %>%
  setNames(paste(ticker_map$name, "Night", sep = "."))

# Merge them and convert to dataframe.
gains <- cbind(gains_day, gains_night) %>%
  na.omit() %>%
  fortify.zoo()

# Calculate means.
gain_means <- summarize(gains, across(everything(), mean)) %>%
  subset(select = -c(Index))

# Transpose and convert to dataframe.
gain_means.df <- pivot_longer(gain_means, c(everything()),
                              names_to = "type", values_to = "mean_gain")

# Draw a bar chart.
ggplot(data = gain_means.df) +
  geom_bar(mapping = aes(x = type, y = mean_gain * 100.0, fill = type),
           stat = "identity") +
  geom_hline(yintercept = 0, color = "red") +
  xlab(NULL) +
  theme(legend.position = "top")

# Calculate means by wday.
gain_wday_means <- mutate(gains, wday = wday(Index, label = TRUE)) %>%
  group_by(wday) %>%
  summarize(across(everything(), mean)) %>%
  subset(select = -c(Index))

# Transpose and convert to dataframe.
gain_wday_means.df <- pivot_longer(gain_wday_means, -c(wday),
                              names_to = "type", values_to = "mean_gain")

# Draw a bar chart.
ggplot(data = gain_wday_means.df) +
  geom_bar(mapping = aes(x = wday, y = mean_gain * 100.0, fill = type),
           stat = "identity", position = "dodge") +
  xlab(NULL) +
  theme(legend.position = "top")

 

결과 및 해석

아래 표와 그래프는 KODEX 코스닥 150과 KODEX 200 ETF의 주간 또는 야간 매매 전략의 평균 수익률입니다. 주간 매매 전략은 평균적으로 손실이 발생합니다. 야간 매매 전략은 평균적으로 대략 0.055% 가량 (두 ETF를 반반씩 매매했을 때) 수익이 납니다. 이는 수수료를 고려하지 않은 것입니다. 매수 매도 합산 수수료를 0.01%로 가정하면 기대 수익은 일 0.045% 정도가 됩니다. 1년 거래일이 250일이라면 산술평균으로 11.25% 정도가 됩니다.

 

gain_means.df %>%
  mutate(gain_means.df, mean_gain = mean_gain * 100) %>%
  arrange(type)
  
----------
# A tibble: 4 × 2
  type                  mean_gain
  <chr>                     <dbl>
1 Kodex.Kosdaq150.Day     -0.0454
2 Kodex.Kosdaq150.Night    0.0673
3 Kodex.Kospi200.Day      -0.0174
4 Kodex.Kospi200.Night     0.0421

 

 

아래 표와 그래프는 요일별로 본 평균 수익률입니다. 월요일, 화요일, 그리고 수요일에 야간 매매 전략의 평균 수익률이 상대적으로 높음을 알 수 있습니다.

 

gain_wday_means[, c(1, order(colnames(gain_means)) + 1)] %>%
  mutate(across(!wday) * 100)

----------
# A tibble: 5 × 5
  wday  Kodex.Kosdaq150.Day Kodex.Kosdaq150.Night Kodex.Kospi200.Day Kodex.Kospi200.Night
  <ord>               <dbl>                 <dbl>              <dbl>                <dbl>
1 Mon             -0.0643                  0.0915            -0.0262             0.103   
2 Tue              0.0525                  0.100              0.0600             0.0363  
3 Wed             -0.112                   0.114             -0.0588             0.0505  
4 Thu             -0.102                   0.0104            -0.0858             0.000497
5 Fri             -0.000944                0.0220             0.0248             0.0239

 

도움이 되었다면, 이 글을 친구와 공유하는 건 어떻까요?

facebook twitter kakaoTalk naver band