0

我正在研究用于 quanstrat 吸墨纸等的 Guy Yollin 幻灯片。这是我要执行的代码:

#According to quantstrat lectures 1-3 von Guy Yollin

library(blotter)
library(FinancialInstrument)
source("chart_Posn.R")

currency("USD")
stock("SPY",currency="USD",multiplier=1)
getSymbols('SPY', from='1998-01-01', to='2011-07-31', adjust=T)
SPY=to.monthly(SPY, indexAt='endof')
SPY$SMA10m <- SMA(Cl(SPY), 10)

####################################
# Initialize portfolio and account #
####################################
#Initialize portfolio and account
b.strategy <- "bFaber" #Is only the name for the portfolio strategy
initPortf(b.strategy,'SPY', initDate='1997-12-31')
initAcct(b.strategy,portfolios=b.strategy, initDate='1997-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(SPY,theme=theme,name="SPY")
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 1:nrow(SPY) ) {
  CurrentDate <- time(SPY)[i]
  ClosePrice <- as.numeric(Cl(SPY[i,]))
  Posn <- getPosQty(b.strategy, Symbol='SPY', Date=CurrentDate)
  if( !is.na(as.numeric(SPY[i,'SMA10m'])) ) {
    if( Posn == 0 ) { # No position, test to go Long
      if( ClosePrice > as.numeric(SPY[i,'SMA10m']) ) {
        # enter long position
        addTxn(b.strategy, Symbol='SPY', TxnDate=CurrentDate,
               TxnPrice=ClosePrice, TxnQty = 1000 , TxnFees=0) }
    } else { # Have a position, so check exit
      if( ClosePrice < as.numeric(SPY[i,'SMA10m']) ) {
        # exit position
        addTxn(b.strategy, Symbol='SPY', TxnDate=CurrentDate,
               TxnPrice=ClosePrice, TxnQty = -Posn , TxnFees=0) }
    }
  }
  # Calculate P&L and resulting equity with blotter
  updatePortf(b.strategy, Dates = CurrentDate)
  updateAcct(b.strategy, Dates = CurrentDate)
  updateEndEq(b.strategy, Dates = CurrentDate)
} # End dates loop

chart.Posn(b.strategy, Symbol='SPY', Dates='1998::')
plot(add_SMA(n=10,col=4,on=1,lwd=2))

但是我无法让它工作..for循环之后总是出现这个错误:

Error in periodicity(table) : 
  can not calculate periodicity of 1 Observation

这两行会产生以下错误:

chart.Posn(b.strategy, Symbol='SPY', Dates='1998::')
plot(add_SMA(n=10,col=4,on=1,lwd=2)
> chart.Posn(b.strategy, Symbol='SPY', Dates='1998::')
Error in as.POSIXct.numeric(first(index(Position))) : 
  'origin' must be supplied
> plot(add_SMA(n=10,col=4,on=1,lwd=2))
Warning message:
In mapply(function(name, value) { :
  longer argument not a multiple of length of shorter

我在看什么?

4

1 回答 1

0

首先,直接回答两点:

indicators are not necessary to a strategy, the only hard and fast requirement is that you need at least one rule that will create orders, or at least one rule in the order slot that will create transactions.

the strategy object contains only the specification of the strategy, nothing more, see below.

接下来,解释发生了什么:

quantstrat 广泛使用延迟执行来允许代码重用。策略对象是策略规范的存储位置。它可以通过使用投资组合 = 参数应用于一个或多个投资组合(由 initPortf() 创建)。

策略规范只是您以后要如何应用策略的仓库。在您调用 applyStrategy(...) 之前,不会评估任何内容。这允许有用的属性,例如使用相同的策略对象来测试多个不同的参数集,或针对不同的投资组合结构和成分应用,而无需更改策略规范。

策略对象本身不会被 applyStrategy 改变。在 applyStrategy 内部,创建了一个名为 mktdata 的特殊内部对象,该对象将通过执行策略规范中包含的指标、信号和规则进行修改。

默认情况下,mktdata 对象是通过从 .GlobalEnv 或用户指定的其他环境中检索包含您的历史数据的对象来构建的。将为投资组合中的每个交易品种创建这些对象之一,并在 applyStrategy 的功能范围内进行维护。

应用指标和信号时,这些函数最常见的模式是返回与 mktdata 时间序列长度相同的向量,或返回与 mktdata 时间序列具有相同索引的时间序列对象。如果遵循此模式,这些列将被添加到 mktdata 对象中,并可供以后的指标、信号和规则函数使用。假定指标和信号始终不依赖于路径,并且默认情况下,规则是依赖于路径的。

示例信号函数(例如 sigCrossover 和 sigThreshold)利用此模式来访问和比较 mktdata 中存在的列。ruleSignal 是一个示例规则,它查找信号具有某些特定值的点,然后根据该信息来创建订单。

外部参考:

使用 quantstrat (R/Finance 2013)

quantstrat 简介(FOSS 交易博客)

来自 R:Guy Yollin 的 Quantstrat 示例。指标有必要吗?这些金融工具中存储了什么?

于 2014-12-09T06:44:13.280 回答