[통계 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 86816
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 79108
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95866
46 [데이터분석 & 데이터 사이언스] 수많은 데이터 사이언티스트들이 직장을 떠나는 이유는 무엇인가? file 졸리운_곰 2025.03.09 907
45 [데이터분석][파이썬][python] 한글 글꼴 사용 (matplotlib) 졸리운_곰 2024.04.18 1361
44 [데이터분석 & 데이터 사이언스] 데이터에 관한 꼭 알아야 할 오해와 진실 12가지 졸리운_곰 2024.01.17 1317
43 [데이터분석][파이썬][python] Awesome Dash Awesome file 졸리운_곰 2021.07.10 2344
42 [데이터분석][파이썬][python] ???? Introducing Dash ???? file 졸리운_곰 2021.07.10 1609
41 [dataset] (한글) 욕설 감지 데이터셋 file 졸리운_곰 2021.05.12 1560
40 [데이터분석][python] Dash를 사용하는 초보자 및 기타 모든 사용자를위한 Python의 대시 보드 file 졸리운_곰 2021.04.14 1766
39 [데이터분석][python] Dash를 사용하는 초보자 및 기타 모든 사용자를위한 Python의 대시 보드 file 졸리운_곰 2021.04.14 1605
38 [데이터분석][데이터 사이언스][python][Dash] Python, Dash 및 Plotly를 사용하여 COVID-19 사례 데이터 시각화 file 졸리운_곰 2021.03.28 1503
37 [데이터분석][머신러닝] When not to use machine learning or AI Adventures in wishful thinking, nonstationarity, and pattern-finding / 기계 학습 또는 AI를 사용하지 않아야하는 경우 희망찬 사고, 비정상 성, 패턴 찾기의 모험 file 졸리운_곰 2021.03.28 21624
36 [MSA][머신러닝] 쿠버네티스 기반의 End2End 머신러닝 플랫폼 Kubeflow #1 - 소개 file 졸리운_곰 2021.03.21 1139
35 [데이터사이언스] 데이터 과학자를위한 3 가지 훌륭한 디자인 패턴, 3 Great Design Patterns for Data Scientists file 졸리운_곰 2021.03.04 783
34 [데이터분석] 시계열 데이터에 AI를 사용하는 이유는 무엇입니까? file 졸리운_곰 2021.02.28 1194
33 [데이터분석] AI 예측 및 이상 탐지를위한 시계열 데이터 전처리 file 졸리운_곰 2021.02.28 1035
32 [데이터분석] bitcoin analysis 비트 코인 시계열 데이터에 대한 AI 이상 탐지 file 졸리운_곰 2021.02.27 1600
31 [데이터분석 & 데이터 사이언스] How To Create a Data Science Portfolio Website file 졸리운_곰 2021.02.14 1831
30 [데이터수집4] 오픈 API 데이터 수집 (소셜미디어 데이터 수집) file 졸리운_곰 2020.06.12 1954
29 [데이터수집3] 관계형 데이터베이스 데이터 수집 file 졸리운_곰 2020.06.12 1321
28 [데이터수집2] 분산시스템 로그 수집 (빅데이터 수집) file 졸리운_곰 2020.06.12 1496
27 [데이터수집1] 웹 크롤링, 웹 스크래핑 file 졸리운_곰 2020.06.12 1806
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED