1. 程式人生 > 其它 >獲取股票資訊的簡單shiny介面

獲取股票資訊的簡單shiny介面

原文: http://supstat.com.cn/blog/2014/12/03/a-simple-shiny-interface-to-retrieve-stock-information/

本文的作者是某國際知名製藥公司在華研究中心的工程師,今年8月他們部門接受了我們的R語言培訓,這篇文章就是培訓後他做的presentation.

目標:通過資料的股票程式碼獲取中國股票資訊

這個專案以利用shiny獲取和展示股票資訊為目標。

資料準備

新浪是獲取中國股票資訊源資料的理想場所,我們可以利用下面的程式碼來得到資料,然而,sina.com還能夠提供準確到分鐘的精確資訊。

library(RCurl)

2 library(XML)

3 library(plyr)

4 raw <- getURL("http://biz.finance.sina.com.cn/stock/flash_hq/kline_data.php?symbol=sh600000&end_date=20121231&begin_date=20111231")

5 raw

6 do.call(rbind, xmlToList(raw))

但是來自新浪的資料格式並不規範,我們需要花大量的時間去清洗和整理。我的主要目標是利用shiny來展示股市資料,因此我使用雅虎為資料來源然後直接使用quantmod程式包來提取資料。

Server.R

下面服務終端程式碼。程式碼非常簡單。讓人吃驚的是R居然能如此完美的處理這一大堆股票資料。

1 if (!require(quantmod)) { 
2   stop("This app requires the quantmod package. To install it, run 'install.packages("quantmod")'.n") 
3 }

1 # Download data for a stock if needed, and return the data

2 require_symbol <- function(symbol, envir = parent.frame()) {

3 if (is.null(envir[[symbol]])) {

4 envir[[symbol]] <- getSymbols(symbol, auto.assign = FALSE)

5 }

6

7 envir[[symbol]]

8 }

9

10

11 shinyServer(function(input, output) {

12 # Create an environment for storing data

13 symbol_env <- new.env()

14

15 # Make a chart for a symbol, with the settings from the inputs

16 make_chart <- function(symbol) {

17 symbol_data <- require_symbol(symbol, symbol_env)

18 #TA_STR <- paste0()

19 chartSeries(symbol_data,

20 name = symbol,

21 type = input$chart_type,

22 subset = paste("last", input$time_num, input$time_unit),

23 #log.scale = input$log_y,

24 theme = "white")

25 }

26

27 output$plot_1 <- renderPlot({ make_chart(input$stock1) })

28 output$plot_2 <- renderPlot({ make_chart(input$stock2) })

29 output$plot_3 <- renderPlot({ make_chart(input$stock3) })

30 output$plot_4 <- renderPlot({ make_chart(input$stock4) })

31 output$plot_5 <- renderPlot({ make_chart(input$stock5) })

32 })

ui.R

接著是前端程式碼,它主要包括前端元件的構建。

1 shinyUI(pageWithSidebar(

2 headerPanel("炒股神器 發財大計"),

3 sidebarPanel(

4 wellPanel(

5 p(strong("股票")),

6 textInput(inputId = "stock1", label = "股票1"),

7 textInput(inputId = "stock2", label = "股票2"),

8 textInput(inputId = "stock3", label = "股票3"),

9 textInput(inputId = "stock4", label = "股票4"),

10 textInput(inputId = "stock5", label = "股票5")),

11 selectInput(inputId = "chart_type",

12 label = "圖形",

13 choices = c("蠟燭圖" = "candlesticks",

14 "火柴圖" = "matchsticks",

15 "柱形圖" = "bars",

16 "線型圖" = "line")),

17 wellPanel(

18 p(strong("日期範圍 (從現在起倒推)")),

19 sliderInput(inputId = "time_num",

20 label = "時間個數",

21 min = 1, max = 24, step = 1, value = 6),

22

23 selectInput(inputId = "time_unit",

24 label = "時間單位",

25 choices = c("日" = "days",

26 "周" = "weeks",

27 "月" = "months",

28 "年" = "years"),

29 selected = "Months"))

30 #checkboxInput(inputId = "log_y", label = "log y axis", value = FALSE)

31 ),

32 mainPanel(

33 conditionalPanel(condition = "input.stock1",

34 br(),

35 div(plotOutput(outputId = "plot_1"))),

36 conditionalPanel(condition = "input.stock2",

37 br(),

38 div(plotOutput(outputId = "plot_2"))),

39 conditionalPanel(condition = "input.stock3",

40 br(),

41 div(plotOutput(outputId = "plot_3"))),

42 conditionalPanel(condition = "input.stock4",

43 br(),

44 div(plotOutput(outputId = "plot_4"))),

45 conditionalPanel(condition = "input.stock5",

46 br(),

47 plotOutput(outputId = "plot_5"))

48 )

49 )

50 )

最終生成的shiny app的效果是這樣的:

結論

Shiny十分強大,它就像是我資訊部的同事一樣能應用各種各樣的工具來處理資料,然後展現給科學家們檢視。以前我常常提出這樣的問題,怎麼樣才能為我整理好的資料建立一個規範的埠,然後讓使用者在各個方向上靈活地分析。Shiny和R恰好是一個好的解決方法,但是我依然需要找到一個將shiny應用於使用者的便捷方法。