Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 替换长度为零:can';我找不到我的循环的问题_R_Loops_Trading_Spread - Fatal编程技术网

R 替换长度为零:can';我找不到我的循环的问题

R 替换长度为零:can';我找不到我的循环的问题,r,loops,trading,spread,R,Loops,Trading,Spread,我试图修改R定量交易一章中的一些代码,以处理收益而不是原始价格。除了我代码中的“损益”部分之外,一切都正常。当查看我的变量时,它不断返回“数量中的错误x[i]=(向量[i]+上一个数量):替换的长度为零”,我似乎找不到任何问题。我已经包括了复制的代码 # LOAD LIBRARIES library(quantmod) library(xts) # FUNCTIONS # ROLLING BETA pcbeta = function(dF){ r = prcomp( ~ dF

我试图修改R定量交易一章中的一些代码,以处理收益而不是原始价格。除了我代码中的“损益”部分之外,一切都正常。当查看我的变量时,它不断返回“数量中的错误x[i]=(向量[i]+上一个数量):替换的长度为零”,我似乎找不到任何问题。我已经包括了复制的代码

# LOAD LIBRARIES
library(quantmod)
library(xts)

# FUNCTIONS

  # ROLLING BETA
  pcbeta = function(dF){
    r = prcomp( ~ dF$x[-1] + dF$y[-1])
    return(r$rotation[2, 1] / r$rotation[1,1])
  }

  rolling_beta = function(z, width){
    rollapply(z, width = width, FUN = pcbeta,
              by.column = FALSE, align = 'right')
  }

# GET TICKER DATA
SPY   = getSymbols('SPY', adjust=T, auto.assign=FALSE)
AAPL  = getSymbols('AAPL', adjust=T, auto.assign=FALSE)

# IN-SAMPLE DATE RANGE
in_start_date = '2011-01-01'
in_end_date   = '2011-12-31'
in_range      = paste(in_start_date, '::', in_end_date, sep='')

# RETRIEVE IN-SAMPLE DATA
x_in = SPY[in_range, 6]
y_in = AAPL[in_range, 6]

dF_in = cbind(x_in, y_in)
names(dF_in) = c('x','y')

# OUT-OF-SAMPLE DATE RANGE
out_start_date= '2012-01-01'
out_end_date  = '2012-12-31'
out_range     = paste(out_start_date, '::', out_end_date, sep='')

# RETRIEVE OUT-OF-SAMPLE DATA
x_out = SPY[out_range, 6]
y_out = AAPL[out_range, 6]

dF_out = cbind(x_out, y_out)
names(dF_out) = c('x', 'y')

# CALCULATE RETURNS (IN AND OUT OF SAMPLE)
returns_in = diff(dF_in) / dF_in 
returns_out = diff(dF_out) / dF_out 

# DEFINE ROLLING WINDOW LENGTH
window_length = 10

# FIND BETAS 
betas_in = rolling_beta(returns_in, window_length)
betas_out = rolling_beta(returns_out, window_length)

# FIND SPREADS
spreadR_in = returns_in$y - betas_in * returns_in$x
spreadR_out = returns_out$y - betas_out * returns_out$x

names(spreadR_in) =  c('spread')
names(spreadR_out) = c('spread')

# FIND THRESHOLD
threshold = sd(spreadR_in, na.rm=TRUE)

# FORM DATA SETS
data_in = merge(returns_in, betas_in, spreadR_in)
data_out = merge(x_out, y_out, returns_out, betas_out, spreadR_out)

names(data_out) = c('xp', 'yp', 'x', 'y', 'betas_out', 'spread')
data_in = data_in[-1]
data_out = data_out[-1]
# GENERATE BUY AND SELL SIGNALS FOR OUT OF SAMPLE
buys = ifelse(data_out$spread > threshold, 1, 0)
sells = ifelse(data_out$spread < -threshold, -1, 0)
data_out$signal = buys+sells

# PROFIT AND LOSS
prev_x_qty = 0
position = 0
trade_size = 100
signal = as.numeric(data_out$signal)
signal[is.na(signal)] = 0
beta = as.numeric(data_out$betas_out)
ratio = (data_out$yp/data_out$xp)
vec = round(beta*trade_size*ratio)

qty_x = rep(0, length(signal))
qty_y = rep(0, length(signal))

for(i in 1:length(signal)){

  if(signal[i] == 1 && position == 0){
    #buy the spread
    prev_x_qty = vec[i]
    qty_x[i] = -prev_x_qty
    qty_y[i] = trade_size
    position = 1
  }

  if(signal[i] == -1 && position == 0){
    #buy the spread
    prev_x_qty = vec[i]
    qty_x[i] = prev_x_qty
    qty_y[i] = -trade_size
    position = -1
  }

  if(signal[i] == 1 && position == -1){
    # we are short the spread and need to buy
    qty_x[i] = -(vec[i] + prev_x_qty)
    prev_x_qty = vec[i]
    qty_y[i] = 2 * trade_size
    position = 1
  }

  if(signal[i] == -1 && position == 1){
    # we are short the spread and need to buy
    qty_x[i] = (vec[i] + prev_x_qty)
    prev_x_qty = vec[i]
    qty_y[i] = -2 * trade_size
    position = -1
  }
}
#加载库
图书馆(quantmod)
图书馆(xts)
#功能
#滚动测试
pcbeta=功能(dF){
r=prcomp(~dF$x[-1]+dF$y[-1])
返回(r$轮换[2,1]/r$轮换[1,1])
}
滚动β=函数(z,宽度){
滚动应用(z,宽度=宽度,乐趣=pcbeta,
by.column=FALSE,align=right)
}
#获取股票行情数据
SPY=getSymbols('SPY',adjust=T,auto.assign=FALSE)
AAPL=getSymbols('AAPL',adjust=T,auto.assign=FALSE)
#抽样日期范围
开始日期='2011-01-01'
截止日期='2011-12-31'
in_range=粘贴(in_start_date'::'、in_end_date、sep=“”)
#检索样本内数据
x_in=间谍[在_范围内,6]
y_in=AAPL[在_范围内,6]
dF_in=cbind(x_in,y_in)
名称(dF_in)=c('x','y'))
#超出样本日期范围
输出开始日期='2012-01-01'
截止日期='2012-12-31'
out_range=粘贴(out_start_date'::'、out_end_date、sep=“”)
#检索样本外数据
x_out=SPY[out_range,6]
y_out=AAPL[超出范围,6]
dF_out=cbind(x_out,y_out)
名称(dF_out)=c('x','y')
#计算回报(样本内和样本外)
返回_in=diff(dF_in)/dF_in
返回_out=diff(dF_out)/dF_out
#定义滚动窗口长度
窗长=10
#找到贝塔
betas_in=滚动_beta(返回_in,窗口长度)
betas\u out=滚动beta(返回\u out,窗口长度)
#寻找价差
spreadR_in=以$y为单位返回_-betas_in*以$x为单位返回_
spreadR\u out=返回\u out$y-betas\u out*返回\u out$x
名称(撒布器_in)=c(‘撒布’)
名称(排列)=c(‘排列’)
#查找阈值
阈值=标准偏差(撒布器_英寸,na.rm=真)
#表单数据集
data\u in=merge(返回\u in、betas\u in、spreader\u in)
数据输出=合并(x输出、y输出、返回输出、betas输出、spreadR输出)
名称(数据输出)=c('xp','yp','x','y','betas\u out','spread')
data_in=data_in[-1]
数据输出=数据输出[-1]
#生成样本外的买卖信号
购买=ifelse(数据输出$spread>threshold,1,0)
销售=ifelse(数据超出$spread<-阈值,-1,0)
data\u out$signal=买入+卖出
#盈亏
上一个数量=0
位置=0
贸易规模=100
信号=数字(数据输出$信号)
信号[is.na(信号)]=0
beta=数值(数据输出$beta输出)
比率=(数据输出$yp/数据输出$xp)
vec=圆形(贝塔*交易规模*比率)
数量x=代表(0,长度(信号))
数量y=代表(0,长度(信号))
用于(1中的i:长度(信号)){
if(信号[i]==1&&position==0){
#购买价差
上一个数量=向量[i]
数量x[i]=-上一个数量
数量y[i]=交易规模
位置=1
}
如果(信号[i]=-1&&position==0){
#购买价差
上一个数量=向量[i]
数量x[i]=上一个数量
数量y[i]=交易规模
位置=-1
}
if(信号[i]==1&&position==-1){
#我们做空了价差,需要买入
数量x[i]=-(向量[i]+上一个数量)
上一个数量=向量[i]
数量y[i]=2*交易规模
位置=1
}
if(信号[i]=-1&&position==1){
#我们做空了价差,需要买入
数量x[i]=(向量[i]+上一个数量)
上一个数量=向量[i]
数量y[i]=-2*交易规模
位置=-1
}
}

是否希望行
prev\u x\u qty=vec[i]
位于行
qty\u[i]=(vec[i]+prev\u x\u qty)
之前?@42-否。我正在从上一次迭代中获取该值,然后进行更新。然后您应该输入一些调试
print
语句,看看它(或“+”的另一个参数)不存在的原因。@42-尝试过,但仍然对它视而不见。如果您将
vec[I]
s更改为
vec[[I]]
s它应该运行您想让行
prev\u x\u qty=vec[i]
在行
qty\u[i]=(vec[i]+prev\u x\u qty)
之前吗?@42-不,我不想。我正在从上一次迭代中获取该值,然后进行更新。然后您应该输入一些调试
print
语句,看看它(或“+”的另一个参数)不存在的原因。@42-尝试过,但仍然对它视而不见。如果您将
vec[I]
s更改为
vec[[I]
s,它应该运行