[통계 R 언어] 이동평균이 표시된 plotly 동적 주가 그래프 in R

plotly를 사용한 주가 이동평균 그래프 그리기

주가 그래프에서 주가의 전반적인 흐름을 살펴보기 위해 사용하는 것이 이동평균 선 그래프이다. 보통 이동평균은 5일 이동평균, 20일 이동 평균, 60일 이동 평균, 120일 이동 평균을 보지만 그 간격은 사용자의 관점에 따라 달라질 수 있다.

그렇다면 plotly의 캔들 스틱 트레이스로 만든 그래프에서 이동 평균을 표시하는 선 그래프를 추가하는 방법에 대해 알아본다.

add_trace()를 사용한 여러 그래프의 중첩

plotly를 사용할 때 가장 직관적으로 표현되는 것은 add_trace()의 함수 이름과 같이 이미 그려진 plotly 객체에 트레이스를 추가하는 것이다. 이는 ggplot2에서 +를 사용해서 geom_*()을 추가해주는 것과 유사한 개념이지만 ‘add’ 라는 단어에서 주는 어감으로 기존의 시각화 개체에 추가한다는 의미가 보다 직관적으로 다가온다.

주가로 표현된 캔들스틱 트레이스로 그려진 plotly 객체에 add_trace()를 사용하여 ‘type’ 속성이 ‘scatter’이고 ’mode’ 속성이 ’lines’인 트레이스를 추가해주면 이동 평균 선 그래프가 추가된다.

이를 위해서 먼저 이동 평균값을 산출해주어야 한다.

이동 평균을 좀 더 잘 살펴보기 위해 앞서 100일간의 삼성전자 주가대신 500일간 삼성전자 주가를 사용하도록 하겠다.

library(tqk)
library(lubridate)
code <- code_get()

## 삼성전자 코드값을 가져온다. 
sse_code <- code |> filter(name == '삼성전자') |>
  select(code) |> 
  pull()

samsung_500 <- tqk_get(sse_code, from=today() - 500, to=today())

이제 5일, 20일, 60일, 120일 이동 평균을 다음과 같이 구한다. 이동 평균을 구하기 위해 zoo 패키지의 rollmean()을 사용한다.

samsung_moving <- samsung_500 %>% 
  mutate(MA_5 = zoo::rollmean(x = close, # column to take
                            k = 5, # rolling time period
                            align = "right", #leave values above the top
                            fill = NA), 
         MA_20 = zoo::rollmean(x = close, 
                             k = 20, 
                             align = "right", 
                             fill = NA), 
         MA_60 = zoo::rollmean(x = close, 
                             k = 60, 
                             align = "right", 
                             fill = NA), 
         MA_120 = zoo::rollmean(x = close, 
                             k = 120, 
                             align = "right", 
                             fill = NA)
         )  # fill the missing with NA)) |>

이제 앞선 포스트에서 최종적으로 그렸던 주말, 공휴일이 제거되고 거래량이 표시된 최종 캔들스틱 차트를 그린다.

samsung_moving <- samsung_moving |> 
  mutate(direction = case_when(
    open > close ~ 'd', 
    open <= close ~ 'i'
  ))

fig1 <- samsung_moving |> plot_ly() |>
  add_trace(
    type="candlestick", x = ~date,
    open = ~open, close = ~close,
    high = ~high, low = ~low, 
    increasing = list(line = list(color = 'red')), 
    decreasing = list(line = list(color = 'blue')), 
    text = paste0(samsung$date,"<br>시가:",scales::comma(samsung$open), '원', 
                  "<br>고가:", scales::comma(samsung$high), '원', 
                  "<br>저가:",scales::comma(samsung$low), '원', 
                  "<br>종가:", scales::comma(samsung$close), '원'),
    hoverinfo='text', showlegend = FALSE
  ) |> 
  layout(title = "삼성전자 Candlestick Chart", 
         xaxis = list(rangeslider = list(visible = F), 
                      rangebreaks=list(
                        list(bounds=list("sat", "mon")), 
                        list(values = list("2022-09-09", "2022-09-12", "2022-10-03", "2022-10-10"))
                      )
         ),
         yaxis = list(title = '주가'),
         showlegend = FALSE)

fig2 <- samsung_moving %>% plot_ly() |>
  add_trace(type = 'bar', x=~date, y=~volume, type='bar',
            color = ~direction, colors = c('blue','red'), showlegend = FALSE, 
            text = paste0(samsung$date, '<br>거래량:', scales::comma(samsung$volume)), 
            hoverinfo = 'text') |>
  layout(xaxis = list(rangebreaks=list(
    list(bounds=list("sat", "mon")), 
    list(values = list("2022-09-09", "2022-09-12", "2022-10-03", "2022-10-10"))
  )
  ),
  yaxis = list(title = '거래량'))

subplot(fig1, fig2, heights = c(0.7,0.2), nrows=2,
        shareX = TRUE) |>
  layout(margin = margins)

1newplot.png

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

이제 완성된 fig에 이동 평균 선 그래프 3개를 추가해준다. 그런데 전체 그래프를 subplot()으로 구성된 두 개의 그래프(fig1, fig2)이기 떄문에 두 개의 그래프 중 어떤 그래프에 add_trace()할지를 결정하고 해당 그래프에 add_trace()로 추가해야한다.

fig1 <- fig1 |> add_trace(type = 'scatter', mode = 'lines', 
                          x = ~date, y = ~MA_5, name = '5일 이동평균')

fig1 <- fig1 |> add_trace(type = 'scatter', mode = 'lines', 
                          x = ~date, y = ~MA_20, name = '20일 이동평균')

fig1 <- fig1 |> add_trace(type = 'scatter', mode = 'lines', 
                          x = ~date, y = ~MA_60, name = '60일 이동평균')

fig1 <- fig1 |> add_trace(type = 'scatter', mode = 'lines', 
                          x = ~date, y = ~MA_120, name = '120일 이동평균')

subplot(fig1, fig2, heights = c(0.7,0.2), nrows=2,
        shareX = TRUE) |>
  layout(margin = margins)

2newplot.png

 

[출처] https://2stndard.tistory.com/153?category=935215

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 오라클 기본 샘플 데이터베이스 졸리운_곰 2014.01.02 86192
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 78670
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95410
92 [통계 R 언어] R에서 DB 사용(Sqlite) file 졸리운_곰 2024.06.25 1489
91 [통계 R 언어] R 언어에서 Python 코드 호출 : Calling Python from R 졸리운_곰 2024.01.28 1747
90 [R lang 크롤링] 비트코인(암호화폐) 가격 불러오기 in R 졸리운_곰 2023.12.11 1245
» [통계 R 언어] 이동평균이 표시된 plotly 동적 주가 그래프 in R file 졸리운_곰 2023.12.11 1094
88 [R lang 크롤링] 금융 데이터 분석 주가 데이터 가져오기 in R 졸리운_곰 2023.12.11 1286
87 [R lang 크롤링] (R) [전략적가치투자] - 증액 투자법 file 졸리운_곰 2023.12.10 1103
86 [R lang 크롤링] (R) [전략적가치투자] - 정액 투자법 file 졸리운_곰 2023.12.10 1636
85 [R lang 크롤링] (R) [전략적가치투자] - 매입 보유법, 정률 투자법, 변율 투자법 file 졸리운_곰 2023.12.10 910
84 [R lang 크롤링] (R) wordcloud2로 더 예쁘게 시각화하기 file 졸리운_곰 2023.12.10 1580
83 [R lang 크롤링] (R) 나만의 주식차트만들기 / quantmod 패키지(2) file 졸리운_곰 2023.12.10 859
82 [R lang 크롤링] (R) R에서 주가정보 가져오기 / quantmod 패키지(1) file 졸리운_곰 2023.12.10 1175
81 [R lang 크롤링] (R) 정규식에서 사용되는 주요 기호들과 의미 file 졸리운_곰 2023.12.10 1522
80 [R lang 크롤링] (R) 종목토론실 텍스트마이닝하여 시각화하기 file 졸리운_곰 2023.12.10 2324
79 [R lang 크롤링] (R) 네이버금융에서 종목토론방 크롤링 file 졸리운_곰 2023.12.10 1281
78 [통계 R 언어] [ R ] pipe operator %>% 의 의미 - magrittr 패키지 졸리운_곰 2023.12.10 1186
77 [R lang 크롤링] [R 코드] 웹사이트 크롤링 졸리운_곰 2023.12.10 1314
76 [R lang 크롤링] R - 크롤링 file 졸리운_곰 2023.12.10 1743
75 [통계 R 언어] [Rtips] 불리는 패키지가 없습니다 해결 방법 file 졸리운_곰 2023.12.10 1380
74 [통계 R 언어] 패키지 설치 에러시 ERROR configuration failed for package RCurl during installation of DESeq file 졸리운_곰 2023.12.10 1205
73 [R lang 크롤링] 최대한 친절하게 쓴 R 크롤러 만들기 file 졸리운_곰 2023.12.10 1496
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED