Rのshinyライブラリを使って株価をグラフで見える化する方法
Rのライブラリーの一つ、練習がてらshinyを使って株価即見画面を作って見たのでコードを残しておきます。
Rで株価見える化画面。
— かず (@randomlyforest) January 27, 2019
株の銘柄と時期を選択すると、株情報をネットから取得して表示。
shiny libraryでここまで作るのに30分。
Rだけで書けるので、言語の勉強にはならないが、有用性で言えば最強libraryなのでオススメ。
そのうちブログにコード載せとこ。#駆け出しエンジニアと繋がりたい pic.twitter.com/kUdpTjsFIA
機能は「見たい株価の銘柄を選択できる」、「見たい株価の期間を選択できる」です。また、グラフ上にカーソルを乗せるとカーソルがさしている時期の株価が右上に表示されます。グラフの下のバーを引っ張ると、表示期間を調整できたりします。
機能としてはかなり単純ですが、意外と手が込んでるように見えますね。しかし、ここまで作るのに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)
以上です。