반응형
문제
국내 주요 지수인 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
반응형
'R' 카테고리의 다른 글
[R + Python 연습] 증권사 Open API를 이용하여 종목의 일일 시세를 다운로드하라. (1) | 2023.12.05 |
---|---|
[R 연습] 증권사에서 다운받은 일일주가 데이터를 구글 시트에 올려 공유하고, 이를 가져오는 코드를 작성하라. (0) | 2023.12.04 |
[R 연습] KOPSI 200을 추종하는 KODEX 200 ETF를 매매하는 전략을 선형 회귀 분석으로 도출하라. (0) | 2023.11.30 |
[R 연습] 기대 수익률이 더 높지만 기대 변동성도 더 높은 투자 상품은 장기적으로 얼마나 더 유리한가? (0) | 2023.11.29 |
[R 연습] 한국과 미국의 주요 주가지수를 추종하는 ETF들의 누적 수익률 그래프 그리기 (0) | 2023.11.28 |