본문 바로가기

코딩

제일제당, 존버가 답이었을까? - 5편

저번 글에 이어서, 매매를 진행해보았는데

 

library(readr)
library(tidyverse)
library(lubridate)
library(tsibble)
library(tidyquant)
library(TTR)
library(ggpubr)

codeData<-read_csv("codeData.txt") # 다운로드한 종목번호 데이터

stockdata<- tq_get(paste0(
  codeData %>% 
    filter(종목명=="CJ제일제당") %>% 
    select(종목번호),".KS"))

df_trade<- stockdata %>% 
  na.omit() %>% 
  mutate(ma5=SMA(close,5),
         ma20=SMA(close,20),
         ma120=SMA(close,120),
         macd=MACD(close,12,26,9,"EMA")[,1],
         signal=MACD(close,12,26,9,"EMA")[,2],
         roc=ROC(close,14),
         rsi=RSI(close,14),
         fastk=stoch(cbind(high,low,close),nFastK = 10, nFastD = 6, nSlowD = 6)[,1],
         slowk=stoch(cbind(high,low,close),nFastK = 10, nFastD = 6, nSlowD = 6)[,2],
         slowd=stoch(cbind(high,low,close),nFastK = 10, nFastD = 6, nSlowD = 6)[,3],
         obv=OBV(close,volume)
  )

 

전처리는 전처럼 진행해주었다.

test01 <- df_trade %>% 
  mutate(type_signal=ifelse((rsi<45) & (roc>0) & (macd>signal) & (slowk>slowd),"buy",
                          ifelse((rsi>55) & (roc<0) & (macd<signal) & (slowk<slowd),"sell",NA))) %>% 
  na.omit() %>% 
  mutate(trade = ifelse(is.na(lag(type_signal))==TRUE,type_signal,
                    ifelse(lag(type_signal)==type_signal,NA,type_signal))) %>% 
  na.omit() %>% 
  mutate(rate_return=ifelse((trade=="sell") & (lag(trade)=="buy"),(close/lag(close)-1)*100,NA))

 

ROC 조건을 넣고, RSI를 35 미만, 65 초과로 범위를 지정했더니 거래가 이뤄지지 않아서 우선 RSI를 조금 더 넓게 지정해주었다.

 

> print(paste0("총 수익률 ",round((prod(test01 %>% select(rate_return) %>% na.omit() %>%  unlist()/100+1)-1)*100,2),"%, 연 평균 수익률 ",round((prod(test01 %>% select(rate_return) %>% na.omit() %>%  unlist()/100+1)^(1/10)-1)*100,2),"%"))
[1] "총 수익률 58.54%, 연 평균 수익률 4.72%"

 

다음과 같은 결과가 나타났다. 빨간 점선에서 매수, 파란 점선에서 매도했다.

그래도 손해는 안봤네. 11년 데이터부터 있어서 기간은 10년으로 계산했다.

 

한편, 위에서 ROC와 RSI의 범위 문제로 조건을 수정했던 터라, 다른 조건으로 ROC를 아예 빼버렸다.

 

test02 <- df_trade %>% 
  mutate(type_signal=ifelse((rsi<35) & (macd>signal) & (slowk>slowd),"buy",
                            ifelse((rsi>65) & (macd<signal) & (slowk<slowd),"sell",NA))) %>% 
  na.omit() %>% 
  mutate(trade = ifelse(is.na(lag(type_signal))==TRUE,type_signal,
                        ifelse(lag(type_signal)==type_signal,NA,type_signal))) %>% 
  na.omit() %>% 
  mutate(rate_return=ifelse((trade=="sell") & (lag(trade)=="buy"),(close/lag(close)-1)*100,NA))

 

> print(paste0("총 수익률 ",round((prod(test02 %>% select(rate_return) %>% na.omit() %>%  unlist()/100+1)-1)*100,2),"%, 연 평균 수익률 ",round((prod(test02 %>% select(rate_return) %>% na.omit() %>%  unlist()/100+1)^(1/10)-1)*100,2),"%"))
[1] "총 수익률 79.52%, 연 평균 수익률 6.03%"

다음과 같은 결과가 나타났다. RSI가 더 강력한 조건이 되는 것일까? 하는 생각이 든다.

더 적게 거래하고 더 수익이 높으니 수수료 이득~

 

다음에는 코드를 함수로 정리해서 다른 주식들에 넣어보아야겠다.

반응형