使用ifelse在R中创建运行计数

时间:2015-08-16 17:48:05

标签: r quantmod quantitative-finance

我正在尝试在R中进行一些定量建模。我没有收到错误消息,但结果并不是我真正需要的。

我是新手,但这是我的完整代码示例。

`library(quantmod)
#Building the data frame and xts to show dividends, splits and technical indicators
getSymbols(c("AMZN"))
Playground <- data.frame(AMZN)
Playground$date <- as.Date(row.names(Playground))
Playground$wday <- as.POSIXlt(Playground$date)$wday #day of the week
Playground$yday <- as.POSIXlt(Playground$date)$mday #day of the month
Playground$mon <- as.POSIXlt(Playground$date)$mon #month of the year
Playground$RSI <- RSI(Playground$AMZN.Adjusted, n = 5, maType="EMA") #can add Moving Average Type with maType = 
Playground$MACD <- MACD(AMZN, nFast = 12, nSlow = 26, nSig = 9)
Playground$Div <- getDividends('AMZN', from = "2007-01-01", to = Sys.Date(), src = "google", auto.assign = FALSE)
Playground$Split <- getSplits('AMZN', from = "2007-01-01", to = Sys.Date(), src = "google", auto.assign = FALSE)
Playground$BuySignal <- ifelse(Playground$RSI < 30 & Playground$MACD < 0, "Buy", "Hold")

在我开始使用某些逻辑条件来提出决策点时,一切都很顺利。

Playground$boughts <- ifelse(Playground$BuySignal == "Buy", lag(Playground$boughts) + 1000, lag(Playground$boughts))

它会执行,但结果将只是NA。我想这是因为你试图将NA添加到一个数字,但我不是100%肯定。你如何告诉电脑我希望你保持一个已经购买了多少钱的运行记录?

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

每当你想做像这样的ifelse时 如果...做某事,否则保持不变:不要使用ifelse

试试这个

ind <- which(Playground$BuySignal == "Buy")
Playground$boughts[ind] <- lag(Playground$boughts) + 1000

答案 1 :(得分:1)

所以我们希望每次买入信号都能买入1000股?

您的问题源于MACD idicator。它实际上生成了两列,macd和signal。你必须决定要保留哪一个。

ST_Intersects

这应该可以解决手头的问题。

另外,请检查ifelse的参考。返回值的类有时会很棘手,因此Floo0建议的方法更可取。

另外,我主张使用1和0而不是买卖来显示你持有的天气。它使数学更容易。

我强烈建议您阅读一些关于使用PerformanceAnalytics进行回溯测试的初学者教程。它们使得前进变得更加容易。

顺便说一下,你错过了代码中的这一行:

Playground$MACD <- MACD(AMZN, nFast = 12, nSlow = 26, nSig = 9)$signal

希望它有所帮助。

编辑:我忘了提到显而易见的事了。丢弃MACD为NA的前几行 类似的东西:

游乐场&lt; - 游乐场[-c(1:26),]

相关问题