thistleknot
thistleknot

Reputation: 1158

Quantstrat applystrategy incorrect dimensions trying to work with manual mktdata OHCLV data vs getSymbols

I apologize for not having a working example atm

All I really need is a sample format for how to load multiple symbols from a csv

The function call says

https://www.rdocumentation.org/packages/quantstrat/versions/0.16.7/topics/applyStrategy

mktdata "an xts object containing market data. depending on indicators, may need to be in OHLCV or BBO formats, default NULL"

The reason I don't wish to use getSymbols is because I do some preprocessing and load the data from csv's because my internet is shoddy. I do download data, but about once a week. My preprocess produces different symbols from a subset of 400 symbols based on the time periods I scan. I'm trying to frontload all my download processing, and no matter what I try, I can't get it to load from either a dataframe or an xts object. Right now I'm converting from csv to dataframe to xts and attempting to load.

I have noticed my xts objects differ from the getSymbols (error about incorrect dimensions). Specifically if I call colnames. Mine will say none, where as getSymbols subelements list 6 columns.

Anyways. What I would like to do, is see a minimal example of loading custom OHCLV data from a csv into an xts that can be supplied as an object to mktdata = in the applyStrategy call. That way I can format my code to match

I have the code to load and create the xts object from a dataframe.

#loads from a dataframe which includes Symbol, Date, Open, High, Low, Close, Volume, Adjusted

tempData <- symbol_data_set[symbol_data_set$Symbol %in% symbolstring & symbol_data_set$Date >= startDate & symbol_data_set$Date<=endDate,]

#creates a list of xts    
vectorXTS <- mclapply(symbolstring,function(x)
{
  df <- symbol_data_set[symbol_data_set$Symbol==x & symbol_data_set$Date >= startDate & symbol_data_set$Date<=endDate,]
  #temp <- as.xts(
    temp <- cbind(as.data.frame(df[,2]),as.data.frame(df[,-1:-2]))
    rownames(df) <- df$Date
    #,order.by=as.POSIXct(df$Date),)
  z <- read.zoo(temp, index = 1, col.names=TRUE, header = TRUE)

  #sets names to Symbol.Open ...
  colnames(z) <- c(paste0(symbolstring[x],".Open"),paste0(symbolstring[x],".High"),paste0(symbolstring[x],".Low"),paste0(symbolstring[x],".Close"),paste0(symbolstring[x],".Volume"),paste0(symbolstring[x],".Adjusted"))

  return(as.xts(z, match.to=AAPL))
  #colnames(as.xts(z))
})

names(symbolstring) <- symbolstring
names(vectorXTS) <- symbolstring

for(i in symbolstring) assign(symbolstring[i],vectorXTS[i])

colnames(tempData) <- c(paste0(x,".Symbol"),paste0(x,".Date"),paste0(x,".Open"),paste0(x,".High"),paste0(x,".Low"),paste0(x,".Close"),paste0(x,".Volume"),paste0(x,".Adjusted"))
head(tempData)

rownames(tempData) <- tempData$Date

#attempts to use this xts object I created

results <- applyStrategy(strategy= strategyName, portfolios = portfolioName,symbols=symbolstring,mktdata)

error

Error in mktdata[, keep] : incorrect number of dimensions

Upvotes: 1

Views: 72

Answers (1)

thistleknot
thistleknot

Reputation: 1158

This is how you store an xts getSymbols object in a file and reload it for use for quantStrat's applyStrategy (two methods shown, the read.xts method is the ideal as you can see how the csv's are stored)

getSymbols("AAPL",from=startDate,to=endDate,adjust=TRUE,src='yahoo',auto.assign = TRUE)
saveRDS(AAPL, file= 'stuff.Rdata')
AAPL <- readRDS(file= 'stuff.Rdata')
 write.zoo(AAPL,file="zoo.csv", index.name = "Date", row.names=FALSE)
rm(AAPL)
AAPL <- as.xts(read.zoo(file="zoo.csv",header = TRUE))

If you want to work with multiple symbols, I had this work.

Note initially I had a reference to the 1st element, i.e. vectorXTS[[1]], and it worked

Note: at least setting it up like this got it to run...

vectorXTS <- mclapply(symbolstring,function(x)
{
  df <- symbol_data_set[symbol_data_set$Symbol==x & symbol_data_set$Date >= startDate & symbol_data_set$Date<=endDate,]
    temp <- cbind(as.data.frame(df[,2]),as.data.frame(df[,-1:-2]))
    rownames(df) <- df$Date
  z <- read.zoo(temp, index = 1, col.names=TRUE, header = TRUE)
  colnames(z) <- c(paste0(x,".Open"),paste0(x,".High"),paste0(x,".Low"),paste0(x,".Close"),paste0(x,".Volume"),paste0(x,".Adjusted"))
  write.zoo(z,file=paste0(x,"zoo.csv"), index.name = "Date", row.names=FALSE)
  return(as.xts(read.zoo(file=paste0(x,"zoo.csv"),header = TRUE)))
})

names(vectorXTS) <- symbolstring

#this will assign to memory vs vectorXTS if one wishes to avoid using mktdata = vectorXTS[[]]
for(i in symbolstring) assign(i,vectorXTS[[i]])

results <- applyStrategy(strategy= strategyName, portfolios = portfolioName,symbols=symbolstring, mktdata = vectorXTS[[]])

#alternatively
#results <- applyStrategy(strategy= strategyName, portfolios = portfolioName,symbols=symbolstring)

Upvotes: 0

Related Questions