我想并行化Quantstrat。我的代码并不完全像这样,但这可以说明问题。我相信的问题是.blotter env初始化为指针内存地址,而我无法初始化new.env()的数组/矩阵。
我想做的是用mclapply替换for循环,这样我可以运行具有不同日期/符号的多个applyStrategies(此处仅显示不同的符号)。我的最终目标是一个beowulf群集(makecluster),并计划在最多252个交易日(滚动窗口)中并行运行它们,并且每次迭代使用不同的符号(但我并不需要所有这些。我只是问是否有一个可以使用mclapply的方式来分配投资组合和随后的.blotter内存对象的方法
#Load quantstrat in your R environment.
rm(list = ls())
local()
library(quantstrat)
library(parallel)
# The search command lists all attached packages.
search()
symbolstring1 <- c('qqQ','GOOG')
#symbolstring <- c('qqQ','GOOG')
#for(i in 1:length(symbolstring1))
mlapply(symbolstring1,function(symbolstring)
{
#local()
#i=2
#symbolstring=as.character(symbolstring1[i])
.blotter <- new.env()
.strategy <- new.env()
try(rm.strat(strategyName),silent=TRUE)
try(rm(envir=FinancialInstrument:::.instrument),silent=TRUE)
for (name in ls(FinancialInstrument:::.instrument)){rm_instruments(name,keep.currencies = FALSE)}
print(symbolstring)
currency('USD')
stock(symbolstring,currency='USD',multiplier=1)
# Currency and trading instrument objects stored in the
# .instrument environment
print("FI")
ls(envir=FinancialInstrument:::.instrument)
# blotter functions used for instrument initialization
# quantstrat creates a private storage area called .strategy
ls(all=T)
# The initDate should be lower than the startDate. The initDate will be used later while initializing the strategy.
initDate <- '2010-01-01'
startDate <- '2011-01-01'
endDate <- '2019-08-10'
init_equity <- 50000
# Set UTC TIME
Sys.setenv(TZ="UTC")
getSymbols(symbolstring,from=startDate,to=endDate,adjust=TRUE,src='yahoo')
# Define names for portfolio,account and strategy.
#portfolioName <- accountName <- strategyName <- "FirstPortfolio"
portfolioName <- accountName <- strategyName <- paste0("FirstPortfolio",symbolstring)
print(portfolioName)
# The function rm.strat removes any strategy,portfolio,account,or order book object with the given name. This is important
#rm.strat(strategyName)
print("port")
initPortf(name = portfolioName,symbols = symbolstring,initDate = initDate)
initacct(name = accountName,portfolios = portfolioName,initDate = initDate,initEq = init_equity)
initOrders(portfolio = portfolioName,initDate = initDate)
# name: the string name of the strategy
# assets: optional list of assets to apply the strategy to.
# Normally these are defined in the portfolio object
# contstrains: optional portfolio constraints
# store: can be True or False. If True store the strategy in the environment. Default is False
print("strat")
strategy(strategyName,store = TRUE)
ls(all=T)
# .blotter holds the portfolio and account object
ls(.blotter)
# .strategy holds the orderbook and strategy object
print(ls(.strategy))
print("ind")
add.indicator(strategy = strategyName,name = "EMA",arguments = list(x = quote(Cl(mktdata)),n = 10),label = "nFast")
add.indicator(strategy = strategyName,n = 30),label = "nSlow")
# Add long signal when the fast EMA crosses over slow EMA.
print("sig")
add.signal(strategy = strategyName,name="sigCrossover",arguments = list(columns = c("nFast","nSlow"),relationship = "gte"),label = "longSignal")
# Add short signal when the fast EMA goes below slow EMA.
add.signal(strategy = strategyName,name = "sigCrossover",relationship = "lt"),label = "shortSignal")
# go long when 10-period EMA (nFast) >= 30-period EMA (nSlow)
print("rul")
add.rule(strategyName,name= "ruleSignal",arguments=list(sigcol="longSignal",sigval=TRUE,orderqty=100,ordertype="market",orderside="long",replace = TRUE,TxnFees = -10),type="enter",label="EnterLong")
# go short when 10-period EMA (nFast) < 30-period EMA (nSlow)
add.rule(strategyName,name = "ruleSignal",arguments = list(sigcol = "shortSignal",sigval = TRUE,orderside = "short",ordertype = "market",orderqty = -100,TxnFees = -10,replace = TRUE),type = "enter",label = "EnterShort")
# Close long positions when the shortSignal column is True
add.rule(strategyName,orderside = "long",orderqty = "all",type = "exit",label = "ExitLong")
# Close Short positions when the longSignal column is True
add.rule(strategyName,arguments = list(sigcol = "longSignal",label = "ExitShort")
print("summary")
summary(getStrategy(strategyName))
# Summary results are produced below
print("results")
results <- applyStrategy(strategy= strategyName,symbols=symbolstring)
# The applyStrategy() outputs all transactions(from the oldest to recent transactions)that the strategy sends. The first few rows of the applyStrategy() output are shown below
getTxns(Portfolio=portfolioName,Symbol=symbolstring)
mktdata
updatePortf(portfolioName)
dateRange <- time(getPortfolio(portfolioName)$summary)[-1]
updateacct(portfolioName,dateRange)
updateEndEq(accountName)
print(plot(tail(getaccount(portfolioName)$summary$End.Eq,-1),main = "Portfolio Equity"))
#cleanup
for (name in symbolstring) rm(list = name)
#rm(.blotter)
rm(.stoploss)
rm(.txnfees)
#rm(.strategy)
rm(symbols)
}
)
但是抛出一个错误 get(symbol,envir = envir)中的错误:找不到对象'qqQ'
具体来说,问题是FinancialInstrument :::。instrument指向的内存地址未使用我的封装变量调用(符号字符串)更新