2015-01-20 5 views
2

저는 간단하고 긴 bollinger 전략을 quantstrat (아래 재현 가능한 예제)에서 구현했습니다. 코드는 제대로 실행되지만 이제는 sigThreshold 값 (예 : 0.3 및 0.7)을 최적화하려고합니다. apply.paramset 기능은 ... 내가 해석하는 방법을 모르는Quantstrat로 신호 매개 변수를 최적화하면 오류가 발생합니다. 하나 이상의 요소를 선택하려고합니다.

result.137, result.138): attempt to select less than one element> 

을 정의 된 매개 변수의 범위를 통해 실행 그러나 결국 오류

error calling combine function: 
<simpleError in fun(result.1, result.2, 

을 보여줍니다. 나는 어떤 조언도 기쁘게 생각합니다. 아래의 코드를 찾아주세요 : 이제

require(quantstrat) 
require(foreach) 
require(doParallel) 

startDate <- '2010-01-01' 
endDate <- '2015-01-01' 
symbols = c('XLF') 
Sys.setenv(TZ='UTC')  


getSymbols(symbols, 
      src='yahoo', 
      index.class=c('POSIXt','POSIXct'), 
      from=startDate, to=endDate, 
      adjust=TRUE) 


initDate <- startDate 
initEq <- 1000000 
currency('USD') 
stock(symbols, currency='USD',multiplier=1) 


rm.strat('bbands') 
initPortf(name='bbands', symbols, initDate=initDate) 
initAcct(name='bbands', portfolios='bbands', 
     initDate=initDate, initEq=initEq) 
initOrders(portfolio='bbands', initDate=initDate) 


strategy.st <- 'bbands' 
account.st <- 'my.account' 
portfolio.st <- 'bollinger' 
strategy(strategy.st, store=TRUE) 


# add indicators 
add.indicator(strategy.st, name = 'BBands', 
       arguments = list(HLC = quote(Cl(mktdata)), 
           maType='SMA', 
           n=40, 
           sd=2), 
       label='BBands') 


#add signals 
add.signal(strategy.st, name='sigThreshold', 
      arguments=list(column='pctB', 
          threshold = 1.0, 
          relationship='gt', 
          cross=TRUE), 
      label='Cl.gt.UpperBand') 

add.signal(strategy.st, name='sigThreshold', 
      arguments=list(column ='pctB', 
          threshold = 0, 
          relationship='lt', 
          cross=TRUE), 
      label='Cl.lt.LowerBand') 

add.signal(strategy.st, name='sigThreshold', 
      arguments=list(column ='pctB', 
          threshold = 0.7, 
          relationship='gte', 
          cross = TRUE), 
      label='Cl.gte.0.7') 

add.signal(strategy.st, name='sigThreshold', 
      arguments=list(column ='pctB', 
          threshold = 0.3, 
          relationship='lte', 
          cross = TRUE), 
      label='Cl.lt.0.3') 



#add rules 
add.rule(strategy.st, name='ruleSignal', 
     arguments=list(sigcol='Cl.gt.UpperBand', 
         TxnFees = -5, 
         sigval=TRUE, 
         orderqty= 'all', 
         ordertype='market', 
         orderside=NULL), 

     type='exit') 

add.rule(strategy.st, name='ruleSignal', 
     arguments=list(sigcol='Cl.lt.LowerBand', 
         TxnFees = -5, 
         sigval=TRUE, 
         orderqty= 500, 
         ordertype='market', 
         orderside=NULL, 
         osFUN=osMaxPos), 
     type='enter') 

add.rule(strategy.st, name='ruleSignal', 
     arguments=list(sigcol='Cl.gte.0.7', 
         TxnFees = -5, 
         sigval=TRUE, 
         orderqty= 500, 
         ordertype='market', 
         orderside=NULL, 
         osFUN=osMaxPos), 
     type='enter') 

add.rule(strategy.st, name='ruleSignal', 
     arguments=list(sigcol='Cl.lt.0.3', 
         TxnFees = -5, 
         sigval=TRUE, 
         orderqty='all', 
         ordertype='market', 
         orderside=NULL), 
     type='exit') 

# add positon limit 
addPosLimit('bbands', 'XLF', timestamp=initDate, maxpos=500, minpos=0) 


SD = 2 
N = 40 

out <- applyStrategy('bbands', 
    portfolios='bbands',parameters=list(sd=SD,n=N)) 


updatePortf('bbands') 
updateAcct('bbands') 
updateEndEq('bbands') 

을, 여기에 모든 질문은 당신이 apply.paramset를 호출하기 전에 포트폴리오에 포지션 한도를 추가 할 필요가에 대한

# start optimization here 
.upper.range.distribution = seq(0.4, 0.9, by = 0.05) 
.lower.range.distribution = seq(0, 0.7, by = 0.05) 

add.distribution(strategy.st, 
       paramset.label = 'sigThreshold', 
       component.type = 'signal', 
       component.label = 'Cl.lt.0.3', 
       variable = list(threshold = .lower.range.distribution), 
       label = 'LOWER' 
) 


add.distribution(strategy.st, 
       paramset.label = 'sigThreshold', 
       component.type = 'signal', 
       component.label = 'Cl.gte.0.7', 
       variable = list(threshold = .upper.range.distribution), 
       label = 'UPPER' 
) 


add.distribution.constraint(strategy.st, 
          paramset.label = 'sigThreshold', 
          distribution.label.1 = 'LOWER', 
          distribution.label.2 = 'UPPER', 
          operator = '<', 
          label = 'RANGE' 
) 


rm.strat(portfolio.st) 
rm.strat(account.st) 

initPortf(portfolio.st, symbols='XLF', initDate=initDate, currency='USD') 
initAcct(account.st, portfolios=portfolio.st, 
     initDate=initDate, currency='USD') 
initOrders(portfolio.st, initDate=initDate) 



apply.paramset(strategy.st, paramset.label='sigThreshold', 
       portfolio.st=portfolio.st, account.st=account.st, nsamples=0) 
+0

질문에'sessionInfo()'의 출력을 편집하십시오. –

답변

3

입니다 것입니다. 그리고 아마도 apply.paramset의 출력을 무언가에 할당하려고합니다. 이것은 blotter 및 quantstrat의 최신 개정판을 사용하여 저에게 효과적이었습니다.

addPosLimit(portfolio.st, 'XLF', timestamp=initDate, maxpos=500, minpos=0) 
ap <- apply.paramset(strategy.st, paramset.label='sigThreshold', 
    portfolio.st=portfolio.st, account.st=account.st, nsamples=0) 
+0

언제나 그렇듯이, 이것은 정확한 Joshua입니다. 감사! – Pat