2016-09-15 13 views
0

我一直负责采用股票预测模型并将其放入Shiny中。我在R方面的成功一直在上下混合。代码有点混乱,但希望能够通过这一点,并尝试清理它以达到更好的代码。错误:在Shiny应用程序中找不到股票预测模型的功能

我收到错误

Error: could not find function "myATR" 

这似乎在那里我建立一个公式字符串给予specifyModel从该行的到来。

这是该行

formula <- as.formula(paste0("Next(Cl(",symbol(),"),",i,") ~ Delt(Cl(",symbol(),"),k=1)+myATR(",symbol(),")+myADX(",symbol(),")+myEMV(",symbol(),")+myVolat(",symbol(),")+myMACD(",symbol(),")+mySAR(",symbol(),")+runMean(Cl(",symbol(),"))")) 

公式myATV在代码中定义为

我很为难,不知道如何向别人问这个。我在下面列出了我的ui.R和server.R。

ui.R 
    # Stock Symbols 
    # ##### 
    # AAPL - Apple Inc. 
    # GOOGL - Alphabet Inc. 
    # ORCL - Oracle Corporation 
    # FB - Facebook, Inc. 
    # TWTR - Twitter Inc 

    shinyUI(fluidPage(
     titlePanel("Stock Tickers and Prediction Models, Predicting Future Close Prices"), 
      sidebarLayout(
       sidebarPanel(
        selectInput("symbolID", label= "Select ticker", 
         choices = list("XXII" = 1, "GOOGL" = 2, "ORCL" = 3, "MSFT" = 4, "AIG" = 5)), 
        selectInput("modelID", label= "Select ticker", 
         choices = list("svm" = 1, "random forest" = 2, "neural network" = 3)) 
     ), 

     mainPanel(
      plotOutput("Graph"), 
      tableOutput("getsymbols"), 
      tableOutput("Predictions") 
     ) 
    ) 
    )) 

server.R 

    library(shiny) 
    library(quantmod) 
    library(e1071) 
    library(nlme) 
    library(earth) 
    library(xts) 

    # for stock symbols 
    symbols = {} 

    # for model symbols 
    models = {} 

    # end date and start dates based on system time 
    endDate = as.Date(Sys.Date() - 1, format = "%Y-%M-%D") 
    startDate = as.Date(endDate - 1000, format = "%Y-%M-%D") 

    myATR <- function(x) ATR(HLC(x))[,'atr'] 
    myADX <- function(x) ADX(HLC(x))[,'ADX'] 
    myEMV <- function(x) EMV(cbind(Hi(x),Lo(x)),Vo(x))[,2] 
    myMACD <- function(x) MACD(Cl(x))[,2] 
    mySAR <- function(x) SAR(cbind(Hi(x),Cl(x))) [,1] 
    myVolat <- function(x) volatility(OHLC(x),calc="garman")[,1] 

    shinyServer(function(input, output){ 
     inputSymbols <- reactive({ 
      if (input$symbolID == 1) { 
       symbols = 'XXII' 
      } else if (input$symbolID == 2) { 
       symbols = 'GOOGL' 
      } else if (input$symbolID == 3) { 
       symbols = 'ORCL' 
      } else if (input$symbolID == 4) { 
       symbols = 'MSFT' 
      } else if (input$symbolID == 5) { 
       symbols = 'AIG' 
      } 

      getSymbols(symbols, src = "yahoo", from = startDate, to = endDate, auto.assign = FALSE) 
     }) 

     symbol <- reactive({ 
      if (input$symbolID == 1) { 
       symbols = 'XXII' 
      } else if (input$symbolID == 2) { 
       symbols = 'GOOGL' 
      } else if (input$symbolID == 3) { 
       symbols = 'ORCL' 
      } else if (input$symbolID == 4) { 
       symbols = 'MSFT' 
      } else if (input$symbolID == 5) { 
       symbols = 'AIG' 
      } 

      symbols 
     }) 

     model <- reactive({ 
      if (input$modelID == 1) { 
       models = 1 
      } else if (input$modelID == 2) { 
       models = 2 
      } else if (input$modelID == 3) { 
       models = 3 
      } 

      models 
     }) 
     #model <- reactive([email protected]) 


     # graph output 
     output$Graph <- renderPlot({ 
      chartSeries(inputSymbols(), subset = paste(endDate - 30, endDate, sep = "/"), type = 'line', theme = 'white') 
     }) 

     #output$getsymbols = renderPrint({symbol()}) 

     output$Predictions <- renderTable({ 
      getSymbols(symbol()) 

      #Obtain prediction model for a given iteration 
      GetPredModel <- function(i){ 
       formula <- as.formula(paste0("Next(Cl(",symbol(),"),",i,") ~ Delt(Cl(",symbol(),"),k=1)+myATR(",symbol(),")+myADX(",symbol(),")+myEMV(",symbol(),")+myVolat(",symbol(),")+myMACD(",symbol(),")+mySAR(",symbol(),")+runMean(Cl(",symbol(),"))")) 
       #formula <- as.formula(paste0("Next(Cl(",symbol(),")",",",i,") ~ Delt(Cl(",symbol(),"),k=1)+myATR(",symbol(),")+myADX(",symbol(),")+myEMV(",symbol(),")+myVolat(",symbol(),")+myMACD(",symbol(),")+mySAR(",symbol(),")+runMean(Cl(",symbol(),"))")) 
       m <- specifyModel(formula) 
       data <- as.data.frame(modelData(m)) 
       return(data) 
      } 

      #Derive max data available 
      maxdate<-max(index(get(symbol()))) 

      #Define prediction as xts object 
      prediction<-xts() 
      n=1 
      while(n<=5){ 

       data<-GetPredModel(n) 
       formula <- as.formula(paste0("Next.Cl.",symbol(),".",n," ~ .")) 
       set.seed(1234) 

       # pick model 
       if (model() == 1) { 
        res <- svm(formula,data,cost=10,gamma=0.01) 
       } else if (model() == 2) { 
        res<- randomForest(formula,data,na.action = na.omit, ntree=200) 
       } else if (model() == 3) { 
        res<-nnet(formula,data, size=10, decay=0.01, maxit=1000, linout=T, trace=F) 
       } 

       pred_date<-as.Date(maxdate) + n 
       p <- predict(res,data[as.character(maxdate),]) 
       #print(pred_date) 
       names(p)<-c(as.character(pred_date)) 
       prediction<-rbind(as.xts(cbind(p)),prediction) 

       n = n + 1 
      } 
     }) 
    }) 

回答

0

当我尝试应用功能nnetrandomForest无法找到。你错过了这2个包吗?

+0

这是一个明显的错误,我忽略了! 我正在处理原始预测文件,然后用Shiny插入,看起来像我没有转移到所有的库。会试试看。 –

+0

看着原来的预测文件,添加以下库: 库(T系列) 库(NNET) 库(quantmod) 库(DMwR) 库(随机森林) 库(TTR) –

+0

加载缺少的库变我与myATR有同样的错误。 –

0

以下是按工作顺序提交的内容。根据mRcSchwering,范围问题是一个很大的问题。希望这有助于某人。

library(shiny) 
library(quantmod) 
library(e1071) 
library(nlme) 
library(xts) 
library(DMwR) 
library(TTR) 
library(nnet) 
library(randomForest) 
library(gridExtra) 

myATR <- function(x) ATR(HLC(x))[,'atr'] 
myADX <- function(x) ADX(HLC(x))[,'ADX'] 
myEMV <- function(x) EMV(cbind(Hi(x),Lo(x)),Vo(x))[,2] 
myMACD <- function(x) MACD(Cl(x))[,2] 
mySAR <- function(x) SAR(cbind(Hi(x),Cl(x))) [,1] 
myVolat <- function(x) volatility(OHLC(x),calc="garman")[,1] 

assign("myATR", myATR, envir = .GlobalEnv) 
assign("myADX", myADX, envir = .GlobalEnv) 
assign("myEMV", myEMV, envir = .GlobalEnv) 
assign("myMACD", myMACD, envir = .GlobalEnv) 
assign("mySAR", mySAR, envir = .GlobalEnv) 
assign("myVolat", myVolat, envir = .GlobalEnv) 

#Obtain prediction model for a given iteration 
GetPredModel <- function(i, stockName){ 
    formula <- as.formula(paste0("Next(Cl(",stockName,")",",",i,") ~ Delt(Cl(",stockName,"),k=1)+myATR(",stockName,")+myADX(",stockName,")+myEMV(",stockName,")+myVolat(",stockName,")+myMACD(",stockName,")+mySAR(",stockName,")+runMean(Cl(",stockName,"))")) 
    m <- specifyModel(formula) 
    data <- as.data.frame(modelData(m)) 
    return(data) 
} 

shinyServer(function(input, output){ 

    # graph output 
    output$Graph <- renderPlot({ 

     stockName = input$symbolID 
     modelID = input$modelID 

     # end date and start dates based on system time 
     endDate = as.Date(Sys.Date() - 1, format = "%Y-%M-%D") 
     startDate = as.Date(endDate - 180, format = "%Y-%M-%D") 

     # Plot the actual stock price 
     chartData <- getSymbols(stockName, src = "yahoo", from = startDate, to = endDate, auto.assign = FALSE) 
     chartSeries(chartData, subset = paste(endDate - 30, endDate, sep = "/"), type = 'line', theme = 'white') 

    }) 


    # Calculate forecast and plot forecast 
    output$Predictions <- renderPlot({ 

     stockName = input$symbolID 
     modelID = input$modelID 

     # end date and start dates based on system time 
     endDate = as.Date(Sys.Date() - 1, format = "%Y-%M-%D") 
     startDate = as.Date(endDate - 180, format = "%Y-%M-%D") 

     #Derive max data available 
     maxdate<-max(index(getSymbols(stockName, auto.assign = FALSE))) 

     #Define prediction as xts object 
     prediction<-xts() 
     n=1 
     while(n<=5){ 

     data<-GetPredModel(n, stockName) 
     formula <- as.formula(paste0("Next.Cl.",stockName,".",n," ~ .")) 
     set.seed(1234) 

     # pick model 
     if (modelID == 1) { 
      res <- svm(formula,data,cost=10,gamma=0.01) 
     } else if (modelID == 2) { 
      res<- randomForest(formula,data,na.action = na.omit, ntree=200) 
     } else if (modelID == 3) { 
      res<-nnet(formula,data, size=10, decay=0.01, maxit=1000, linout=T, trace=F) 
     } 

     pred_date<-as.Date(maxdate) + n 
     p <- predict(res,data[as.character(maxdate),]) 
     if (modelID == 3){ 
      p <- p[,1] 
     } 
     #print(pred_date) 
     names(p)<-c(as.character(pred_date)) 
     prediction<-rbind(as.xts(cbind(p)),prediction) 

     n = n + 1 
     } 

     plot(prediction) 

     #grid.arrange(pActual, pPredict, ncol= 1) 

    }) 
})