Блоттер R: ошибка в get (Symbol, pos = env): объект не найден

Хорошо, я прочитал документацию, обновленные слайды Гая Йоллина и все мои предыдущие сообщения, но я не могу найти ответа на эту проблему. После цикла for я все еще получаю сообщение об ошибке, что объект «USDCHF» не может быть найден.

Вот мой код:

################
# HOUSEKEEPING #
################
setwd("O:/R/R Programs/")
rm(list=ls(all=TRUE))
library(blotter)
.blotter <- new.env()
.instrument <- new.env()


Sys.setenv(TZ="UTC")

source("VariableAndDataFunctions.R")


############
# SETTINGS #
############
StrategyName<-"Test"
CurrencyPair<-"USD_CHF"
RiskIndex<-"RiskIndex"

MAPeriod <- 10
ParamUp <- 0.96
ParamDown <- 0.95
InitialInvestment <- 10000

Lag=1 #default 1, in order not to peek into the future

CrossCurrency <- paste(substrLeft(CurrencyPair, 3), substrRight(CurrencyPair,3),sep="")

#############
# DATASETUP #
#############
#Import datasets, both as XTS
RiskIndicator<-readVariableAsXTS(RiskIndex)
FXCrossTable<-read.table(paste("O:/Data/",CurrencyPair, ".asc", sep=""),sep=",",skip=1,header=FALSE)
FXCrossTable[,4]<-as.Date(as.character(FXCrossTable[,4]), format="%Y%m%d")
colnames(FXCrossTable)<-c("V1","V2","V3", "Date","Close")
FXCrossXTS<-xts(FXCrossTable[,5], order.by=FXCrossTable[,4])
MergedXTS<-merge.xts(FXCrossXTS,RiskIndicator,join='inner')
MergedXTS[,'RiskIndicator']<-SMA(MergedXTS[,'RiskIndicator'],MAPeriod)
colnames(MergedXTS)<-c("Close", "RiskIndicatorMA")


currency("USD")
currency("CHF")
exchange_rate(CrossCurrency)

####################################
# Initialize portfolio and account #
####################################
#Initialize portfolio and account
Risk.Strategy <- StrategyName  #Is only the name for the portfolio strategy
initPortf(Risk.Strategy,CrossCurrency, initDate='1970-12-31')
initAcct(Risk.Strategy,portfolios=Risk.Strategy, initDate='1970-12-31', initEq=1e6)

#######################
# Formating the chart #
#######################
theme<-chart_theme()
theme$col$up.col<-'lightgreen'
theme$col$up.border<-'lightgreen'
theme$col$dn.col<-'pink'
theme$col$dn.border<-'pink'
chart_Series(MergedXTS,theme=theme,name=CrossCurrency)
plot(add_SMA(n=10,col=4,lwd=2))

#################
# Trading logic # (buy when monthly price > 10-month SMA, sell when monthly price < 10-month SMA)
#################
for(i in (MAPeriod+1):nrow(MergedXTS) ) {
  CurrentDate <- time(MergedXTS)[i]
  ClosePrice <- as.numeric(MergedXTS[i,'Close'])
  if(!(is.na(as.numeric(MergedXTS[i,'Close']))) && !(is.na(as.numeric(MergedXTS[i-1,'Close'])))){

    RiskClose <- as.numeric(MergedXTS[i,'RiskIndicatorMA'])
    RiskClose.PreviousDay <- as.numeric(MergedXTS[i-1,'RiskIndicatorMA'])
    Posn <- getPosQty(Risk.Strategy, Symbol=CrossCurrency, Date=CurrentDate)


    if(Posn != 0){
      if(Posn>0){
        #Long active, sell long
        if(RiskClose <= ParamUp && RiskClose.PreviousDay > ParamUp){
          addTxn(Risk.Strategy, Symbol=CrossCurrency, TxnDate=CurrentDate, 
                 TxnPrice=ClosePrice, TxnQty = -1000 , TxnFees=0)
        }
      } else {
        #Short active sell short
        if(RiskClose >= ParamDown && RiskClose.PreviousDay < ParamDown){
          addTxn(Risk.Strategy, Symbol=CrossCurrency, TxnDate=CurrentDate, 
                 TxnPrice=ClosePrice, TxnQty = 1000 , TxnFees=0)
        }
      }
    } else {
      if(RiskClose >= ParamUp && RiskClose.PreviousDay < ParamUp){
        #Buy
        addTxn(Risk.Strategy, Symbol=CrossCurrency, TxnDate=CurrentDate, 
               TxnPrice=ClosePrice, TxnQty = 1000 , TxnFees=0)
      }
      if(RiskClose <= ParamDown && RiskClose.PreviousDay > ParamDown){
        #Short
        addTxn(Risk.Strategy, Symbol=CrossCurrency, TxnDate=CurrentDate, 
               TxnPrice=ClosePrice, TxnQty = -1000 , TxnFees=0)
      }
    }

    # Calculate P&L and resulting equity with blotter
    updatePortf(Risk.Strategy)
    updateAcct(Risk.Strategy)
    updateEndEq(Risk.Strategy)
  }
}

И вот ошибка:

Error in get(Symbol, pos = env) : object 'USDCHF' not found

Однако эта строка кода дает следующий результат:

> ls(envir=FinancialInstrument:::.instrument)
[1] "CHF"    "SPY"    "USD"    "USDCHF"

Итак, объект есть, но его нельзя найти ... почему? Если я выполню образец кода с веб-сайта GuyYollins Quantstrat-I.R, он будет работать совершенно нормально ...


person MichiZH    schedule 19.08.2013    source источник
comment
можете ли вы сократить свой код до того, что действительно актуально, то есть предоставить небольшой воспроизводимый пример?   -  person flodel    schedule 19.08.2013
comment
Я не могу точно сказать, в чем ошибка, поэтому скопировал все. Ошибка возникает после цикла for, поэтому я предполагаю, что ошибка должна быть в объявлении обменного курса, который будет в разделе Datasetup.   -  person MichiZH    schedule 19.08.2013


Ответы (1)


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

Вот строки кода, которые ее решили:

CurrencyPair<-"USD_CHF"
CrossCurrency <- paste(substrLeft(CurrencyPair, 3), substrRight(CurrencyPair,3), sep="")
assign(CrossCurrency,MergedXTS)

Теперь у меня есть другая проблема ... но для этого я открою новую тему.

person MichiZH    schedule 19.08.2013
comment
Сделаем это за 2 дня :-) - person MichiZH; 19.08.2013