Работа с примером Quantstat приводит к ошибке - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь проработать пример (https://statsmaths.github.io/stat395-f17/assets/final_project/amarnani.html) квантстрата: краткое введение в количественную торговлю и библиотеку Quanstrat [sic] Дираджа Амарнани 29 ноября 2017, но получаю ошибку.

Я пытался найти неопределенные переменные; например, «стратегия» определена, а «портфель» - нет. Я не достаточно опытен, чтобы устранять неисправности дальше. Я опубликовал вопрос на Github. Я также работаю над курсом по Quantstrat на DataCamp, но не смог выяснить проблему. Наконец, я искал переполнение стека; Существуют и другие примеры Quantstrat, но этот (хотя на него часто ссылаются в противном случае) здесь не приводится.

library(devtools)
library(quantmod)
library(quantstrat)
library(TTR)
library(png)
library(IKTrading)

_________ НАСТРОЙКА ___________

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

initdate <- "2010-01-01"
from <- "2011-01-01" #start of backtest
to <- "2017-01-01" #end of backtest
Sys.setenv(TZ= "EST") #Set up environment for timestamps

currency("USD") #Set up environment for currency to be used

symbols <- c("AAPL", "MSFT", "GOOG", "FB", "TWTR", "AMZN", "IBM") #symbols used in our backtest
getSymbols(Symbols = symbols, src = "google", from=from, to=to, adjust = TRUE) #receive data from google finance,  adjusted for splits/dividends

stock(symbols, currency = "USD", multiplier = 1) #tells quanstrat [sic] what instruments present and what currency to use

tradesize <-10000 #default trade size
initeq <- 100000 #default initial equity in our portfolio

strategy.st <- portfolio.st <- account.st <- "firststrat" #naming strategy, portfolio and account

# removes old portfolio and strategy from environment
rm.strat(portfolio.st)
rm.strat(strategy.st) 

# initialize portfolio, account, orders and strategy objects
initPortf(portfolio.st, symbols = symbols, initDate = initdate, currency = "USD")
initAcct(account.st, portfolios = portfolio.st, initDate = initdate, 
currency = "USD", initEq = initeq)
initOrders(portfolio.st, initDate = initdate)
strategy(strategy.st, store=TRUE)

_________ Показатели ___________

# graphs creation code excluded here

add.indicator(strategy = strategy.st,
          name = 'SMA',
          arguments = list(x = quote(Cl(mktdata)), n=200),
          label = 'SMA200')
add.indicator(strategy = strategy.st,
          name = 'SMA',
          arguments = list(x = quote(Cl(mktdata)), n=50),
          label = 'SMA50')
add.indicator(strategy = strategy.st,
          name = 'RSI',
          arguments = list(price = quote(Cl(mktdata)), n=3),
          label = 'RSI_3')

____________ Сигналы ___________

# graphs creation code excluded here

#First Signal: sigComparison specifying when 50-day SMA above 200-day SMA
add.signal(strategy.st, name = 'sigComparison',
      arguments = list(columns=c("SMA50", "SMA200")),
      relationship = "gt",
      label = "longfilter")

#Second Signal: sigCrossover specifying the first instance when 50-day SMA
# below 200-day SMA 
add.signal(strategy.st, name = "sigCrossover",
       arguments = list(columns=c("SMA50", "SMA200")),
       relationship = "lt",
       lablel = "sigCrossover.sig")

#Third Signal: sigThreshold which specifies all instance when RSI is below 20 (indication of asset being oversold)
add.signal(strategy.st, name = "sigThreshold",
       arguments = list(column = "RSI_3", threshold = 20,
                        relationship = "lt", cross = FALSE),
       label = "longthreshold")

#Fourth Signal: sigThreshold which specifies the first instance when rsi is above 80 (indication of asset being overbought)
add.signal(strategy.st, name = "sigThreshold",
       arguments = list(column = "RSI_3", threshold = 80,
                        relationship = "gt", cross = TRUE),
       label = "thresholdexit")

#Fifth Signal: sigFormula which indicates that both longfilter and longthreshold must be true.
add.signal(strategy.st, name = "sigFormula",
       arguments = list(formula = "longfilter & longthreshold",
                        cross = TRUE),
      label = "longentry")

________________ Правила ________________

#The first rule will be an exit rule. This exit rule will execute when the market environment is no longer conducive to a trade (i.e. when the SMA-50 falls below SMA-200)
add.rule(strategy.st, name = "ruleSignal",
     arguments = list(sigcol = "sigCrossover.sig", sigval = TRUE,
                      orderqty = "all", ordertype = "market",
                      orderside = "long", replace = FALSE,
                      prefer = "Open"),
     type = "exit")

#The second rule, similar to the first, executes when the RSI has crossed above 80. 
add.rule(strategy.st, name = "ruleSignal",
     arguments = list(sigcol = "thresholdexit", sigval = TRUE,
                      orderqty = "all", ordertype = "market",
                      orderside = "long", replace = FALSE,
                      prefer = "Open"),
     type = "exit")

#Additionally, we also need an entry rule. This rule executes when 
# longentry is true (or when long filter and longthreshold are true). 
# That is when SMA-50 is above SMA-200 and the RSI is below 20.
add.rule(strategy.st, name = "ruleSignal",
     arguments = list(sigcol = "longentry", sigval = TRUE,
                      orderqty = 1, ordertype = "market",
                      orderside = "long", replace = FALSE,
                      prefer = "Open", osFUN = IKTrading::osMaxDollar,
                      tradeSize = tradesize, maxSize = tradesize),
     type = "enter")

______________ Performance Analsis _________________

# Here is the code that didn't work (first line): 

out <- applyStrategy(strategy = strategy.st, portfolios = portfolio.st)
updatePortf(portfolio.st)
daterange <- time(getPortfolio(portfolio.st)$summary)[-1]

updateAcct(account.st, daterange)
updateEndEq(account.st)



# Error in `dimnames<-.xts`(`*tmp*`, value = dn) : length of 'dimnames' [2] not equal to array extent
# In addition: Warning messages:
# 1: In match.names(columns, colnames(data)) :
# all columns not located in SMA50 SMA200 for AAPL.Open AAPL.High AAPL.Low 
# AAPL.Close AAPL.Volume AAPL.Adjusted
# 2: In min(j, na.rm = TRUE) :
# no non-missing arguments to min; returning Inf
# 3: In max(j, na.rm = TRUE) :
# no non-missing arguments to max; returning -Inf
# 4: In min(j, na.rm = TRUE) :
# no non-missing arguments to min; returning Inf
# 5: In max(j, na.rm = TRUE) :
# no non-missing arguments to max; returning -Inf
# 6: In match.names(column, colnames(data)) :
# all columns not located in RSI_3 for AAPL.Open AAPL.High AAPL.Low 
# AAPL.Close AAPL.Volume AAPL.Adjusted longfilter sigCrossover.sig
# 7: In min(j, na.rm = TRUE) :  no non-missing arguments to min; returning Inf
# 8: In max(j, na.rm = TRUE) :  no non-missing arguments to max; returning -Inf

1 Ответ

0 голосов
/ 26 июня 2019

Отвечая на мой собственный вопрос; Исходя из моей цели, которая состояла в том, чтобы получить пример работы Quantstrat, чтобы я мог постепенно вносить изменения в соответствии с торговой стратегией нашей команды. Разочарованный тем, что я не смог сделать приведенный выше пример работоспособным (а также тем, что я не получил укусов по переполнению стека), я, наконец, нашел курс по DataCamp под названием «Финансовая торговля в R», который объясняет пакет quantstrat очень простыми укусами. Мне кажется очевидным, что приведенный здесь пример, похоже, взят из этого курса. Я безуспешно пытался запустить quantstrat со слайдов DataCamp, но смог заставить работать quantstrat, используя примеры из курса. Настоятельно рекомендуется. Рад передать код R, если кому-то интересно.

...