我正在建立一个数据框来决定何时买入和卖出股票。
我的第一个数据框看起来像这样,其中观察值是给定时间点给定比率的百分比顺序。
AAPL <- c(0.25,0.25,0.25,0.5,0.5,0.75,0.5,1,1,0.5,0.5,0.5,0.25)
df <- data.frame (AAPL)
我想写一个条件,如果观察值低于0.4,我想买入股票(1),如果高于0.6,我想卖出(-1)。
我想要的是这样的东西我从来没有买过我尚未售出的股票。
AAPL.new <- c(1,0,0,0,0,-1,0,0,0,0,0,0,1)
df.new <- data.frame (AAPL.new)
到目前为止,我已经构建了以下功能:
selection <- function(x) {
sapply(seq_along(x), function(i){
if (i==1 & x[1]<0.4) {
1
} else if (is.na(x[i])) {
0
} else if (x[i] < 0.4 & is.na(x[i-1])) {
1
} else if (x[i] < 0.4 & x[i-1] > 0.4) {
1
} else if (x[i] > 0.6 & is.na(x[i-1])) {
-1
} else if (x[i] > 0.6 & x[i-1] < 0.6) {
-1
} else {
0
}
})
}
但是,此函数产生的结果是:
AAPL.new <- c(1,0,0,0,0,-1,0,-1,0,0,0,0,1)
这是错误的,因为我在没有购买的情况下卖出两倍的股票(在观察6和8中以两个“-1”表示)。
我是一名初学者,从Excel中的小样本转移到R中的大样本。
提前感谢您的帮助。
答案 0 :(得分:0)
根据我的理解!!!: 。第一个aapl和boolean canibuy作为全局变量。 canibuy是一种变种,可以帮助您了解您的购买或销售水平。
aapl<<-c(0.25, 0.25, 0.25, 0.5, 0.5, 0.75, 0.5, 1, 1, 0.5, 0.5, 0.5,
0.25)
canibuy<<-T
iequal1<-function(xi){
retvalue<-0
if(is.na(xi)) {retvalue<-0
} else if(xi<.4){
retvalue<-1;canibuy<<-F
}else {
retvalue<-0;canibuy<<-T
}
return(retvalue)
}
####check with values
iequal1(0);canibuy
iequal1(.5);canibuy
iequal1(.6);canibuy
inotequal1<-function(i){
retvalue<-0
if(canibuy){
if(is.na(aapl[i])) { retvalue<-0
}else if(aapl[i]<.4){
retvalue<-1;canibuy<<-F
}else{
retvalue<-0
}
}else {
if(is.na(aapl[i])) { retvalue<-0
}else if(aapl[i]>.6){
retvalue<--1;canibuy<<-T
}else{
retvalue<-0
}
}
return(retvalue)
}
selection<-function(){
sapply(seq_along(aapl),function(i){
retvalue<-0
if(i==1){##i==1
retvalue<-iequal1(aapl[i])
}else{
retvalue<-inotequal1(i)
}
return(retvalue)
}
)
}
selection()
##[1] 1 0 0 0 0 -1 0 0 0 0 0 0 1