我一直在使用这类数据来评估我的毕业论文的一些股票
library(quantmod)
getSymbols("NOK",from="2012-01-01")
data<-NOK
p1<-4
dC<-data[,4]
dO<-data[,1]
emaC<-EMA(dC,n=p1)
w1<-1.1
Profit_L_1<-((lag(dC,-1)-lag(dO,-1))/(lag(dO,-1)))*100
Profit_L_2<-((lag(dC,-2)-lag(dO,-1))/(lag(dO,-1)))*100
Profit_L_3<-((lag(dC,-3)-lag(dO,-1))/(lag(dO,-1)))*100
Profit_L_4<-((lag(dC,-4)-lag(dO,-1))/(lag(dO,-1)))*100
Profit_L_5<-((lag(dC,-5)-lag(dO,-1))/(lag(dO,-1)))*100
Profit_L_all<-ifelse(Profit_L_1>w1,Profit_L_1,
ifelse(Profit_L_2>w1,Profit_L_2,
ifelse(Profit_L_3>w1,Profit_L_3,
ifelse(Profit_L_4>w1,Profit_L_4,
ifelse(Profit_L_5>w1,Profit_L_5,Profit_L_5)))))
ChoosedN<-ifelse(Profit_L_all==Profit_L_1,1,
ifelse(Profit_L_all==Profit_L_2,2,
ifelse(Profit_L_all==Profit_L_3,3,
ifelse(Profit_L_all==Profit_L_4,4,
ifelse(Profit_L_all==Profit_L_5,5,0)))))
Profit_day<-Profit_L_all/ChoosedN
Winloss<-ifelse(Profit_day>0.3,1,
ifelse(Profit_day<=0.3,0,"nothing"))
Pos_emaC_dC_D<-emaC<dC
Pos_emaC_dC_UP<-emaC>dC
frame<-data.frame(Pos_emaC_dC_UP,Pos_emaC_dC_D,Profit_L_all,ChoosedN,Profit_day,Winloss)
colnames(frame)<-c("Pos_emaC_dC_UP","Pos_emaC_dC_D","Profit_L_all","ChoosedN","Profit_day","Winloss")
frame<-frame[complete.cases(frame),]
它的输出是我使用的data.frame,称为frame。很明显没有任何NA。
我已编写此函数以快速评估此框架中变量的组合
quickmycomb<-function (x,y){
combination<-deparse(substitute(y))
df<-subset(x,y)
Success<-length(subset(df,Winloss==1)$Winloss)/length(df$Winloss)
absnumber<-nrow(df)
relnumber<-nrow(df)/nrow(frame)
sl<-data.frame(Success,absnumber,relnumber)
return(sl)
}
当我使用此功能时
quickmycomb(frame,lag(Pos_emaC_dC_D,1) & Pos_emaC_dC_UP)
它表示输出是框架,在这种情况下为86行
Success absnumber relnumber
1 0.6162791 86 0.1396104
但是当我使用这个函数的代码时 子集(框架,&#34;组合&#34;)具有相同的变量组合,如
subset(frame,lag(Pos_emaC_dC_D,1) & Pos_emaC_dC_UP)
它表示输出是带有0行的data.frame! 我不理解它,我认为正确的输出是第二个,但我不知道为什么它不能在函数中工作。 有什么建议应该是问题吗?
答案 0 :(得分:0)
您不能将subset
与条件的变量一起使用,因为子集本身将使用substitute
来查看传递给函数的确切内容。但是,您可以将值传递给子集。一个解决方法是
quickmycomb.1 <- function (x,...) {
df <- subset(x,...)
Success <- length(subset(df,Winloss==1)$Winloss)/length(df$Winloss)
absnumber <- nrow(df)
relnumber <- nrow(df)/nrow(frame)
sl <- data.frame(Success,absnumber,relnumber)
return(sl)
}
备选方案,您可以使用
在函数内部自己处理子集quickmycomb.2 <- function (x,y){
combination <- eval(substitute(y), x, parent.frame())
df <- x[combination, ]
Success <- length(subset(df,Winloss==1)$Winloss)/length(df$Winloss)
absnumber <- nrow(df)
relnumber <- nrow(df)/nrow(frame)
sl <- data.frame(Success,absnumber,relnumber)
return(sl)
}
当你同时运行它们时
quickmycomb.1(frame,lag(Pos_emaC_dC_D,1) & Pos_emaC_dC_UP)
quickmycomb.2(frame,lag(Pos_emaC_dC_D,1) & Pos_emaC_dC_UP)
他们都会产生
Success absnumber relnumber
1 NaN 0 0
就像从当前环境中运行它一样。