2016-12-12 4 views
3

quantstrat에서 EMA50 교차 전략을 수행 중이므로 잘 작동하지만 매일부터 매주로 시간대를 변경하려고했습니다. 나는 stock()이라는 함수를 to.weekly(SPY)으로 저장하려고했으나 그렇게하지 못하게했다. 나중에 여러 주식에 대해이 방법을 사용하려고하므로 포트폴리오 내에서 적용해야합니다.quantstrat의 시간 프레임을 매일에서 주간으로 변경

library(quantstrat) 
rm(list=ls(.blotter), envir=.blotter) 

strategy.st<-"firststrat" 
portfolio.st<-"firststrat" 
account.st<-"firststrat" 
rm.strat(strategy.st) 


#assignsymbol 
getSymbols("SPY",auto.assign=TRUE,adjust=TRUE) 

initdate<-"2009-01-01" 
from<-"2010-01-01" 
to<-"2016-11-01" 
Sys.setenv(TZ="UTC") 
currency("USD") 
stock("SPY",currency="USD",multiplier=1) 
tradesize<-10000 
inieq<-100000 

rm.strat(portfolio.st) 
initPortf(portfolio.st,symbols="SPY",initDate=initdate,currency='USD') 
initAcct(account.st,portfolios = portfolio.st,initDate = initdate,initEq = inieq,currency="USD") 
initOrders(portfolio = portfolio.st,initDate = initdate) 
strategy(strategy.st,store=TRUE) 



add.indicator(strategy = strategy.st,name="EMA",arguments=list(x=quote(Cl(mktdata)),n=50),label="EMA50") 
#if closing price goes over moving average 50 and TSi fference is less then 0.15, then long 
#short when closing price touches below original closing price by x(depends on atr? previous lows?) 


add.signal(strategy.st,name="sigCrossover", 
      arguments = list(columns=c("Close","EMA50"), 
          relationship="gt"), 
      label="crossentry"  
) 
add.signal(strategy.st,name="sigCrossover", 
      arguments = list(columns=c("Close","EMA50"), 
          relationship="lt"), 
      label="crossexit"  
) 


add.rule(strategy.st,name="ruleSignal", 
     arguments=list(sigcol = "crossentry", 
         sigval=TRUE, 
         orderqty=100, 
         ordertype="market", 
         orderside="long", 
         replace=FALSE, 
         prefer="Open", 
         path.dep=TRUE 
     ), 
     type="enter" 
)   

add.rule(strategy.st,name="ruleSignal", 
     arguments=list(sigcol = "crossexit", 
         sigval=TRUE, 
         orderqty="all", 
         ordertype="market", 
         orderside="long", 
         replace=FALSE, 
         prefer="Open", 
         path.dep=TRUE 
     ), 
     type="exit" 
)   


out <- applyStrategy(strategy = strategy.st, portfolios = portfolio.st) 

....

[1] "2016-01-04 00:00:00 SPY -100 @ 197.432029165538" 
[1] "2016-02-23 00:00:00 SPY 100 @ 191.041013032617" 
[1] "2016-02-24 00:00:00 SPY -100 @ 187.72241891553" 
[1] "2016-02-26 00:00:00 SPY 100 @ 193.571820974787" 
[1] "2016-03-01 00:00:00 SPY -100 @ 192.035603073637" 

.... 나는 매주으로 변경할 수있는 방법?

답변

5

당신은 올바른 길을 가고 있습니다. applyStrategy을 실행하기 전에 SPY <- to.weekly(SPY)을 수행하면 매주 막대에 전략이 실행됩니다. quantstrat는 기본 데이터가 저장되는 빈도 (사용자의 경우 SPY 오브젝트에 매일 또는 매주 여부와 관계 없음)에 관계없이 기호 이름을 사용하여 데이터를 찾습니다.

다음은 유가 증권 포트폴리오에 대해 이렇게하기 때문에보다 일반적인 자동화 된 접근 방식입니다. 가독성을 개선하기 위해, 난 그냥 당신이> = 2 증권으로 실행하기 위해 수정할 필요가 귀하의 질문에 코드의 섹션을 보여주는 해요 : 당신이 mktdata을 확인할 수

symbols <- c("SPY", "XLE") 

getSymbols(symbols,auto.assign=TRUE,adjust=TRUE) 
# Change to weekly frequency, using the same names for the symbols in the global environment (which is where you have assigned them in your getSymbols call) 
lapply(symbols, function(x) assign(x = x, value = to.weekly(get(x, envir = globalenv()), name = x), envir = globalenv())) 

initdate<-"2009-01-01" 
from<-"2010-01-01" 
to<-"2016-11-01" 
Sys.setenv(TZ="UTC") 
currency("USD") 


# Use your symbols to construct the correct instrument types for your strategy. You are running on stocks only, so simply pass in the vector named `symbols` to stock: 
stock(symbols,currency="USD",multiplier=1) 
tradesize<-10000 
inieq<-100000 

rm.strat(portfolio.st) 
# When initializing your portfolios, pass in the symbols you want the strategy to run on (the vector named `symbols` here): 
initPortf(portfolio.st,symbols=symbols,initDate=initdate,currency='USD') 

# ... run the rest of your original code 

applyStrategy 후이 성공적으로 실행하면입니다 가장 최근의 기호 실행 (이 예에서는 기호 벡터의 XLE ETF)에 대해 (매주) 원하는 형식을 선택하십시오. 다음과 같이 표시됩니다.

mktdata["2016-04/2016-05"] 
# XLE.Open XLE.High XLE.Low XLE.Close XLE.Volume XLE.Adjusted EMA.EMA50 crossentry crossexit 
# 2016-04-01 61.08612 61.83661 59.70363 60.29613 70527800  60.29613 64.16397   NA  NA 
# 2016-04-08 60.18750 61.92548 59.19014 61.58974 81670700  61.58973 64.06302   NA  NA 
# 2016-04-15 62.08348 63.73259 61.33299 62.74510 94225700  62.74510 64.01134   NA  NA 
# 2016-04-22 61.45149 66.44819 61.30337 66.20132 94215100  66.20131 64.09722   1  NA 
# 2016-04-29 65.97419 67.95905 64.96695 66.65556 92445000  66.65556 64.19754   NA  NA 
# 2016-05-06 66.53706 66.81356 63.69309 64.45345 76727000  64.45345 64.20758   NA  NA 
# 2016-05-13 64.08809 65.90507 62.70560 64.17696 65436100  64.17696 64.20638   NA   1 
# 2016-05-20 65.01632 66.07294 63.68321 65.33233 79205200  65.33233 64.25053   1  NA 
# 2016-05-27 64.94720 67.07030 64.72008 66.29019 55806400  66.29018 64.33052   NA  NA