R без транзакций / позиций на графике - PullRequest
0 голосов
/ 26 июня 2018

Я работаю над блоттером и квантратом.Мне интересно, почему есть информация об ошибке, которая постоянно показывает отсутствие транзакций / позиций на графике.Не могли бы вы предложить мне помощь?

#### Set up packages we need to use below   ##########
library(blotter)
library(FinancialInstrument)
library(quantstrat)
p = 0

## This is your universe of investable assets    #####
## To remove an asset from the list, just delete #####
symbols <- c( "UGAZ", "EWQ", "EWH",
               "VIXM", "SPY", "QQQ",
               "EWG", "INDA", "MCHI"  )

plot(VIXM$Adjusted)
##### ignore code until you see "Pay Attention" ########################
currency('USD')
stock(symbols, 
      currency = "USD", 
      multiplier = 1)

## Set up investment strategy params
init_date <- "2015-12-31"
start_date <- "2016-01-01"
end_date <- "2018-06-01"
init_equity <- 10000000 # $10,000,000
adjustment <- TRUE

getSymbols(Symbols = symbols, 
           src = "yahoo", 
           index.class = "POSIXct",
           from = start_date, 
           to = end_date, 
           adjust = adjustment)

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

portfolio.st <- "Port.Luxor"
account.st <- "Acct.Luxor"
strategy.st <- "Strat.Luxor"
#########^^^^^^^^Ignore ^^^^^^^^^########################
#########################################################



############################################################
### Once you run above, to rerun after makning changes   ###
### to your strategy below, just run from here to end    ###

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

initPortf(name = portfolio.st,
          symbols = symbols,
          initDate = init_date)


initAcct(name = account.st,
         portfolios = portfolio.st,
         initDate = init_date,
         initEq = init_equity)


initOrders(portfolio = portfolio.st,
           symbols = symbols,
           initDate = init_date)

strategy(strategy.st, store = TRUE)





#######################################################
#### Pay attention! Change indicators here  ###########

# SMA speed can be modified here
fastSMA=20
slowSMA=60

add.indicator(strategy = strategy.st,
              name = "SMA",
              arguments = list(x = quote(Cl(mktdata)), 
                               n = fastSMA),
              label = "nFast")

add.indicator(strategy = strategy.st, 
              name = "SMA", 
              arguments = list(x = quote(Cl(mktdata)), 
                               n = slowSMA), 
              label = "nSlow")



#### Pay attention! Change signals here  ##########
add.signal(strategy = strategy.st,
           name="sigCrossover",
           arguments = list(columns = c("nFast", "nSlow"),
                            relationship = "gte"),
           label = "long")

add.signal(strategy = strategy.st,
           name="sigCrossover",
           arguments = list(columns = c("nFast", "nSlow"),
                            relationship = "lt"),
           label = "short")



#### Pay attention! Change trade rules here  ###########

# Trade sizes for long/short
longSize=100
shortSize=10000
fast=slow=sr1=sr2=sr3=sr4 =sr5=sr6=longs=shorts=c()
z = seq(10, 1000, by = 100)
for (i in z) {
  longSize=i
  j = seq(10,100,by = 10)
   for(n in z){
     shortSize = n

     add.signal(strategy = strategy.st,
                name="sigCrossover",
                arguments = list(columns = c("nFast", "nSlow"),
                                 relationship = "gte"),
                label = "long")

     add.signal(strategy = strategy.st,
                name="sigCrossover",
                arguments = list(columns = c("nFast", "nSlow"),
                                 relationship = "lt"),
                label = "short")
### LONG Rules
# Enter Long
add.rule(strategy = strategy.st,
         name = "ruleSignal",
         arguments = list(sigcol = "long",
                          sigval = TRUE,
                          orderqty = longSize,
                          ordertype = "market",
                          orderside = "long", 
                          prefer = "High", 
                          TxnFees = 0, 
                          replace = FALSE),
         type = "enter",
         label = "EnterLONG")
# Exit Long
add.rule(strategy.st, 
         name = "ruleSignal", 
         arguments = list(sigcol = "long", 
                          sigval = TRUE, 
                          orderside = "short", 
                          ordertype = "market", 
                          orderqty = "all", 
                          TxnFees = 0, 
                          replace = TRUE), 
         type = "exit", 
         label = "Exit2LONG")

#### SHORT rules
# Enter Short
add.rule(strategy.st,
         name = "ruleSignal",
         arguments = list(sigcol = "short",
                          sigval = TRUE,
                          orderqty = -shortSize,
                          ordertype = "market",
                          orderside = "short", 
                          replace = FALSE, 
                          TxnFees = 0, 
                          prefer = "Low"),
         type = "enter",
         label = "EnterSHORT")

# Exit Short
add.rule(strategy.st, 
         name = "ruleSignal", 
         arguments = list(sigcol = "short", 
                          sigval = TRUE, 
                          orderside = "long", 
                          ordertype = "market", 
                          orderqty = "all", 
                          TxnFees = 0, 
                          replace = TRUE), 
         type = "exit", 
         label = "Exit2SHORT")

### Add stop loss rule  #####
.stoploss <- .04 # <<<< Modify stop loss as % of entry price here


## Stop loss long
add.rule(strategy.st, 
         name = "ruleSignal",
         arguments = list(sigcol = "long" , 
                          sigval = TRUE,
                          replace = FALSE,
                          orderside = "long",
                          ordertype = "stoplimit",
                          tmult = TRUE,
                          threshold = quote(.stoploss),
                          TxnFees = 0,
                          orderqty = "all",
                          orderset = "ocolong"),
         type = "chain", 
         parent = "EnterLONG",
         label = "StopLossLONG",
         enabled = T)


## Stop loss short
add.rule(strategy.st, 
         name = "ruleSignal",
         arguments = list(sigcol = "short", 
                          sigval = TRUE,
                          replace = FALSE,
                          orderside = "short",
                          ordertype = "stoplimit",
                          tmult = TRUE,
                          threshold = quote(.stoploss),
                          TxnFees = 0,
                          orderqty = "all",
                          orderset = "ocoshort"),
         type = "chain", 
         parent = "EnterSHORT",
         label = "StopLossSHORT",
         enabled =T)

#### End of Stop Loss code  ################

## Now get results for signal/rules/strategies
results_file <- paste("results", strategy.st, "RData", sep = ".")
if( file.exists(results_file) ) {
  file.remove(results_file)}

  results <- applyStrategy(strategy.st, portfolios = portfolio.st)
  updatePortf(portfolio.st)
  updateAcct(account.st)
  updateEndEq(account.st)

for(symbol in symbols) {
  print(symbol)
  chart.Posn(portfolio.st, Symbol = symbol, 
             TA = "add_SMA(n = fastSMA, col = 4); add_SMA(n = slowSMA, col = 2)")
}

### Tabulate Result Stats by Individual Asset
tstats <- tradeStats(portfolio.st)
knitr::kable(t(tstats))

### Now get Total Portfolio Results   ####
final_acct <- getAccount(account.st)
end_eq <- final_acct$summary$End.Eq
returns <- Return.calculate(end_eq, method="log")
charts.PerformanceSummary(returns, colorset = bluefocus, main = "Strategy Performance")


########### Our sharpe ratio and return #########
sr1 = c(SharpeRatio.annualized(returns),sr1)
sr2 = c(table.AnnualizedReturns(returns),sr2)
sr3 = SharpeRatio(returns,add.sharpe = "SPY$Adjusted")
longs=c(longSize,longs)
shorts=c(shortSize,shorts)
p = p+1

print(sr3[3])
sr4[p] = sr3[3]
sr5[p] = SharpeRatio.annualized(returns)
sr6[p] = returns
rm.strat(portfolio.st)
rm.strat(account.st)
rm.strat(strategy.st)

initPortf(name = portfolio.st,
          symbols = symbols,
          initDate = init_date)


initAcct(name = account.st,
         portfolios = portfolio.st,
         initDate = init_date,
         initEq = init_equity)


initOrders(portfolio = portfolio.st,
           symbols = symbols,
           initDate = init_date)

strategy(strategy.st, store = TRUE)
print(sr4)
print(sr5)
print(sr6)
  }
}

Я хочу использовать цикл, чтобы попробовать как можно больше комбинаций между длинной и короткой.Поэтому я добавляю это для функции.Однако, когда я тестирую по одному, это работает хорошо.когда я переключаюсь на цикл, он показывает эту ошибку.

1 Ответ

0 голосов
/ 18 июля 2018

Иногда ошибки в Quantstrat даются из-за неправильной спецификации имен столбцов.Попробуйте это:

add.signal(strategy = strategy.st,
                name="X1.sigCrossover",
                arguments = list(columns = c("nFast", "nSlow"),
                                 relationship = "gte"),
                label = "long")

     add.signal(strategy = strategy.st,
                name="X1.sigCrossover",
                arguments = list(columns = c("nFast", "nSlow"),
                                 relationship = "lt"),
                label = "short")
...