ランダムの森

20代エンジニアです。プログラミングについて主に書いてます。

Rのshinyライブラリを使って株価をグラフで見える化する方法

Rのライブラリーの一つ、練習がてらshinyを使って株価即見画面を作って見たのでコードを残しておきます。

機能は「見たい株価の銘柄を選択できる」、「見たい株価の期間を選択できる」です。また、グラフ上にカーソルを乗せるとカーソルがさしている時期の株価が右上に表示されます。グラフの下のバーを引っ張ると、表示期間を調整できたりします。
f:id:doreikaiho:20190201212210p:plain


機能としてはかなり単純ですが、意外と手が込んでるように見えますね。しかし、ここまで作るのに30分もかかりません。これがshinyというライブラリーのすごいところ。
shinyを使うとRのコードだけで画面を作れたり、画面でボタンとかいじるとReactiveに画面に表示させたりすることができる優れたwebフレームワークです。
Rでデータ分析などをした結果を画面でパッと確認したり、簡単なwebアプリケーションとして公開することができます。

shinyの書き方はこちらのリンクからチュートリアルを追えば基本的なことは分かると思うんですが、いかんせん英語しかないんですよね。というか、Rの情報って日本語少ないんですよねー。

ということで、今回作った株価即見画面のコードを残しておこうと思いました。
誰かのお役に立てればと思います。

shinyの基本形は以下のような感じでuiとserverに分けてコード書いて、最後にshinyApp(ui, server)でshinyアプリケーションとして繋げます。
uiの中にはsidebarLayout()が入っていますがこれは、サイドバーとメインパネルに分かれた画面のフレームワークとして読み込ませています。
その内部にある、sidebarPanel()とmainPanel()でそれぞれの枠の中に何を入れるか記述することになります。

ui <- (fluidPage(
  titlePanel(),
  sidebarLayout(
    sidebarPanel(
      )
    ),

    mainPanel(
    )
)

server <- (function(input, output) {
  })

shinyApp(ui, server)


ということでuiの中に、サイドバー(銘柄と株期間を選ぶinput画面)、メインパネル(株のグラフ)といった具合でコードを書きます。インプットとして選ばせる銘柄はコードの中で適当に選定しています。これでフロント側は完了です。

library(shiny)
library(xts)
library(zoo)
library(dygraphs)
library(datasets)
library(quantmod)

ui <- (fluidPage(
  titlePanel("Stock price fast view"),
  sidebarLayout(
    sidebarPanel(
      selectInput("stock", label = "Slect stock",
                  choices = c("AMZN", "AAPL", "GOOG","MO","WIX"),
                  selected = "AMZN"),
      dateRangeInput('dateRange',
                     label = 'Date range input: yyyy-mm-dd',
                     start = Sys.Date() - 2, end = Sys.Date() + 2
      )
    ),
    mainPanel(
      dygraphOutput("dygraph")
    )
  )
))

server <- (function(input, output) {
  })

shinyApp(ui, server)


サーバー側ではデータの取得やデータ処理やらを行いuiに値を投げ返します。
また、shinyではクライアント側で何か操作されると、更新されたinput値を含む関数が走ることになり、uiにアウトプット値も更新されます。こらがshinyがReactiveと言われる所以です。
一番下が完成形のコードです。

このoutput$dygraphがReactive関数と呼ばれるものです。この中で行われた処理がuiのdygraphOutput("dygraph")に飛んでいき、画面に表示させることになります。

output$dygraph <- renderDygraph({
    dygraph
  })

今回書いたコードの中にはinput$ホゲ(hogeは変数の名前)という変数がいくつか書いてあります。これはuiで操作(クリックとか)され更新た値が飛んできます。基本的にReactive関数の中にあるinput変数が一つでも更新されると関数全体が走ることになります。

例えば、画面で株銘柄を変更したとすると以下のような計算が走ります。
uiの"stock"が更新される
→serverのinput$stockを含んだoutput$dygraph関数全体が計算される
→output$dygraphのreturn値dygraphがuiに投げられる
→uiのdygraphOutput("dygraph")で選ばれた銘柄のグラフ表示

ちなみに今回使っているdygraphというオープンソースは、かっこいいグラフを一瞬で描いてくれる優れものです。データをRのxtsの形でインプットしてやればおけです。
株価の取得にはRのライブラリーであるquantmodでgetSymbols関数により取得しています。
以下、完成系コードです。

library(shiny)
library(xts)
library(zoo)
library(dygraphs)
library(quantmod)

ui <- (fluidPage(
  titlePanel("Stock price fast view"),
  sidebarLayout(
    sidebarPanel(
      selectInput("stock", label = "Slect stock",
                  choices = c("AMZN", "AAPL", "GOOG","MO","WIX"),
                  selected = "AMZN"),
      dateRangeInput('dateRange',
                     label = 'Date range input: yyyy-mm-dd',
                     start = Sys.Date() - 2, end = Sys.Date() + 2
      )
    ),
    mainPanel(
      dygraphOutput("dygraph")
    )
  )
))

server <- (function(input, output) {
  output$dygraph <- renderDygraph({
    start <- as.Date(input$dateRange[1])
    end <- as.Date(input$dateRange[2])
    stock_data <- getSymbols(input$stock, src = "yahoo", from = start, to = end,,auto.assign=FALSE)
    dygraph(stock_data[,1], main = as.character(input$stock)) %>% 
      dyRangeSelector() %>% 
      dyUnzoom() 
  })
})

shinyApp(ui, server)

以上です。