如何从 SQL 服务器导入数据到 quantmod?

How to import data from SQL Server into quantmod?

我正在寻找一些指导,希望我在这里张贴的是正确的。我正在寻找使用来自 SQL 服务器的 GetSymbols 将数据输入到 Quantmod。我是 R 的新手,但有使用 SQL 服务器的背景,不是专业人士,但找到了自己的方式。 我已将所有数据导入 SQL 服务器中名为 Quotes 的一个 table 中,其中包含以下列;

 - Ticker Varchar(10)
 - Name varchar(50)
 - [Date] datetime
 - [Open] Decimal(19,9)
 - High Decimal(19,9)
 - Low Decimal(19,9)
 - [Close] Decimal(19,9)
 - Volume Decimal(19,9)
 - Signal Decimal(19,9)

我可以使用 RODBC 包连接到数据库:

 - (cn <- odbcDriverConnect(connection="Driver={SQL Server Native Client 11.0};server=localhost;database=DB;trusted_connection=yes;")) 

并在 R 中制作各种 select 语句,但我迷失了将数据导入 Quantmod 而无需执行其他解决方法,例如从 SQL 导出到 csv。从 Yahoo 导入数据是个问题,因为我找不到完整的 Yahoo-tickerlist。

有没有办法将数据从 SQL 服务器直接导入 R 和 quantmod

像这样应该可以解决问题。

getPrices.DB <- function(Symbol, from=NA) {
    cn <- "add your connection info here"
    qry <- sprintf("select [Date], [Open],[High],[Low],[Close],[Volume],[Signal] from MarketPrice where Ticker = '%s'", Symbol)
    if (!is.na(from)) { qry <- paste(qry, sprintf(" and [Date]>= '%s'", from)) }
    DB <- odbcDriverConnect(cn)
    r <- sqlQuery(DB, qry, stringsAsFactors = FALSE)
    odbcClose(DB)
    if (!is.null(r) && NROW(r) >= 1) {
        x <- xts(r[, 2:7], order.by = as.POSIXct(r[, 1], tz = "UTC"))#can eliminate tz if you want in local timezone
        indexFormat(x) <- "%Y-%b-%d %H:%M:%OS3  %z" #option. I find useful for debuggging
        colnames(x) <- paste(Symbol, c("Open", "High","Low", "Close", "Volume", "Signal"), sep = ".")
        return(x)
    } else {
        return(NULL)
    }
}

现在连接到 quantmod 基础设施:

getSymbols.DB <- function(Symbols, env, ...) {
    importDefaults("getSymbols.DB")
    this.env <- environment()
    for (var in names(list(...))) {assign(var, list(...)[[var]], this.env)}
    if (!hasArg(from)) from <- NA
    if (!hasArg(verbose)) verbose <- FALSE
    if (!hasArg(auto.assign)) auto.assign <- FALSE
    for (i in 1:length(Symbols)) {
        if (verbose) cat(paste("Loading ", Symbols[[i]], paste(rep(".", 10 - nchar(Symbols[[i]])), collapse = ""), sep = ""))
        x <- getPrices.DB(Symbols[[i]], from = from)
        if (auto.assign) assign(Symbols[[i]], x, env)
        if (verbose) cat("done\n")
    }
    if (auto.assign)
        return(Symbols)
    else
        return(x)
}

用法示例:

APPL <- getSymbols("AAPL", src="DB", auto.assign=F)