Ошибка в mktdata[, keep]: неправильное количество размеров из-за того, что запас T относится к ИСТИННОМУ?

У меня возникла проблема при попытке запустить пример quantstrat на акции AT&T, на которую ссылается символ "T". Я полагаю, это потому, что R где-то думает, что это T относится к ИСТИННОМУ. Вот мой код:

library(quantstrat)
ticker="T"
total_hist.start = as.Date("2006-06-22")
total_hist.end   = as.Date("2008-06-20")
total_hist = total_hist.end - total_hist.start

currency("USD")
stock(ticker,currency="USD",multiplier=1)

getSymbols(ticker,from=total_hist.start,to=total_hist.end,to.assign=TRUE)
init.date = initDate=total_hist.start-1
strat.name<- "MyStrat"
port.name <- "MyPort"
acct.name <- "MyAcct"

TradeSize = 1000
initEq=as.numeric( TradeSize*max(Ad(get(ticker)) ) )

port <- initPortf(port.name,ticker,initDate=init.date)
acct <- initAcct(acct.name,portfolios=port.name, initDate=init.date, initEq=initEq)
ords <- initOrders(portfolio=port.name,initDate=init.date)
strat<- strategy(strat.name)

strat<- add.indicator(strategy = strat, name = "SMA", arguments = list(x=quote(Ad(mktdata)), n=20),label= "ma20" )

strat<- add.indicator(strategy = strat, name = "SMA", arguments = list(x=quote(Ad(mktdata)), n=50),label= "ma50")
strat<- add.signal(strat,name="sigCrossover",arguments = 
list(columns=c("ma20","ma50"),relationship="gte"),label="ma20.gt.ma50")

strat<- add.signal(strat,name="sigCrossover",arguments =   
list(column=c("ma20","ma50"),relationship="lt"),label="ma20.lt.ma50")
strat<- add.rule(strategy = strat,name='ruleSignal', arguments = list(sigcol="ma20.gt.ma50",sigval=TRUE,  
orderqty=TradeSize, ordertype='market', orderside='long', pricemethod='market'),type='enter', path.dep=TRUE)

strat<- add.rule(strategy = strat,name='ruleSignal', arguments = list(sigcol="ma20.lt.ma50",sigval=TRUE, orderqty='all', 
ordertype='market', orderside='long', pricemethod='market'),type='exit', path.dep=TRUE)

out<-try(applyStrategy(strategy=strat, portfolios=port.name))

Теперь я получаю это сообщение об ошибке:

Error in mktdata[, keep] : nombre de dimensions incorrect

Я пробовал с другой акцией, такой как Agilent Technologies, у которой символ «A», и я не получаю этой ошибки, поэтому я почти уверен, что проблема связана с тем фактом, что T похож на TRUE. Спасибо за помощь!


person jeremy.staub    schedule 29.06.2012    source источник
comment
Какой пакет вы используете, чтобы дать вам функции currency, stock и т. д.? Или при вызове какой функции вы получаете сообщение об ошибке? Я предполагаю, что ваш вызов get(ticker) в initEq=as.numeric(...) говорит мне о значении переменной T, равной true. Но без подробностей трудно поставить диагноз.   -  person mathematical.coffee    schedule 29.06.2012
comment
Чтобы добавить к комментарию @mathematical.coffee: что такое mktdata? Это не определено в коде, который вы показываете. Ответ может быть таким же простым, как ticker<-as.character(ticker)   -  person Carl Witthoft    schedule 29.06.2012
comment
Вы получите ту же проблему, когда передадите «F» (Ford) в переменную тикера.   -  person Milktrader    schedule 29.06.2012
comment
@Carl-whitthoft: как описано в документации, «mktdata» — это внутренний объект, созданный внутри кода выполнения стратегии.   -  person Brian G. Peterson    schedule 29.06.2012


Ответы (1)


Ваша проблема не в quantstrat, а в getSymbols

> head(T)
[1] TRUE
> get('T')
[1] TRUE
> getSymbols(T,from=total_hist.start,to=total_hist.end,to.assign=TRUE)
Error in do.call(paste("getSymbols.", symbol.source, sep = ""), 
list(Symbols = current.symbols, : could not find function "getSymbols.TRUE"
> getSymbols('T',from=total_hist.start,to=total_hist.end,to.assign=TRUE)
[1] "T"
> head(T)
           T.Open T.High T.Low T.Close T.Volume T.Adjusted
2006-06-22  27.34  27.44 27.13   27.29 14123800      19.85
2006-06-23  27.15  27.61 27.05   27.37 10474500      19.91
2006-06-26  27.32  27.53 27.19   27.33 11311200      19.88
2006-06-27  27.38  27.49 27.29   27.35  9869100      19.89
2006-06-28  27.27  27.44 27.24   27.41 14853300      19.94
2006-06-29  27.42  27.79 27.42   27.70 17314300      20.15

одним из обходных путей было бы сделать что-то вроде этого:

stock('ATT',currency='USD')
ticker<-'ATT'
ATT<-getSymbols('T',from=total_hist.start,to=total_hist.end,auto.assign=FALSE)

это позволит избежать путаницы T/F в R с TRUE/FALSE (что всегда было ужасной идеей, imo).

С уважением,

  • Брайан
person Brian G. Peterson    schedule 29.06.2012
comment
Просто интересно, решит ли getSymbols(as.character(ticker),...) проблему? - person Carl Witthoft; 29.06.2012
comment
Большое спасибо за обходной путь, очень ценю это! - person jeremy.staub; 29.06.2012
comment
FWIW, я не испытываю этого. Причина, по которой Брайан сначала получил ошибку, заключается в том, что вокруг T нет кавычек. Это работает для меня: ticker <- "T"; getSymbols(ticker, src='yahoo'); get(ticker) - person GSee; 29.06.2012
comment
То есть это не проблема квантмода. - person GSee; 29.06.2012