【发布时间】:2017-06-28 15:34:07
【问题描述】:
我最近一直在玩 R 中的技术交易技巧。
我确实发现成为问题的一件事,特别是对于大量高频信息,是从信号向量生成策略向量。我想知道使用dplyr 是否有更快的方法?
让我们从下载 Apple 的股票开始,然后生成短期和长期移动平均线
library("TTR")
library("quantmod")
library("PerformanceAnalytics")
library("dplyr")
getSymbols("AAPL", src = "google")
stock <- AAPL
stock <- window(stock['2015-10-01::2017-01-01'])
# Plot if you want to see
#lineChart(stock)
Short <- EMA(Cl(stock), n=5)
Long <- EMA(Cl(stock), n=6)
我们现在有了选定的股票,让我们生成信号向量,当两条移动平均线交叉时指示买入和卖出订单
# Signal
Signal <-
Lag(ifelse(
Lag(Short) < Lag(Long) & Short > Long, 1,
ifelse(
Lag(Short) > Lag(Long) & Short < Long, -1, 0)
))
Signal[is.na(Signal)] <- 0
之后我们使用这个信号来构建策略——这是高频数据中需要很长时间的部分——这显然是由于for循环
# Strategy
Strategy <- ifelse(Signal > 1, 0, 1)
for (i in 1:length(Cl(stock))) {
Strategy[i] <-
ifelse(Signal[i] == 1, 1, ifelse(Signal[i] == -1, 0, Strategy[i - 1]))
}
x <- as.numeric(Strategy$Lag.1)
x[is.na(x)] <- 0
我目前的dplyr方法如下,但是生成的策略错误
dplyr_strat <-
Signal %>% tbl_df() %>%
mutate(Change = if_else(Lag.1 == -1, "Sell", "Buy", "NoChange") ) %>%
mutate(Strategy = ifelse(Change == "Buy", 1,
ifelse( Change == "Sell", 0,
lag(Strategy)) ) ) %>% select(Strategy)
y <- as.numeric(dplyr_strat$Strategy)
然后测试
all.equal(x,y)
【问题讨论】:
-
您能否提供示例时间序列数据和预期输出?要求人们下载数据只是为了解决您的问题。
-
大多数金融相关的问题都使用
quantmod的getSymbols功能,所以它并没有问太多。 “提供”数据带来的另一个问题是,与财务问题一样,您需要长时间处理日常数据。这不能打包成一个简单的小数据框。预期的输出应该是dplyr输出应该与for循环输出相匹配。因此all.equal(x,y)应该返回TRUE -
你认为什么是“错误的”?什么是正确的答案/预期的输出?
-
我没有测试过这个。变异应该更接近你的原始。类似
dplyr_strat <- Signal %>% tbl_df() %>% mutate(Strategy = ifelse(Signal == 1, 1, ifelse(Signal == -1, 0, lag(Strategy)))) -
仔细想想,我认为你不能使用依赖于修改(变异)值的函数。这些应用于原始数据帧..而不是突变数据帧。我无法立即找到支持这一点的参考
标签: r dplyr technical-indicator