将技术分析指标应用于多个资产

时间:2017-07-06 13:47:41

标签: r loops finance quantmod algorithmic-trading

我正在尝试将这个简单的技术分析指标应用于称为价格的xts数据框。但我无法设法为信号创建循环。你有什么建议吗?

library(TTR)
library(Hmisc)
library(xts)

prices = structure(c(70.27, 70.29, 70.31, 70.67, 70.41, 70.53, 70.56, 
69.61, 70.32, 69.97, 70.13, 68.88, 68.97, 70.75, 71.32, 71.32, 
71.32, 72.02, 72.48, 73.33, 73.59, 73.93, 73.47, 72.13, 72.17, 
73.18, 72.59, 73.34, 73.43, 72.78, 72.43, 72.3, 71.27, 71.51, 
71.94, 71.1, 69.77, 70.02, 70.26, 69.6, 70.13, 70.13, 71.27, 
70.58, 69.52, 69.58, 69.46, 69.62, 69.07, 69.98, 44.245, 44.125, 
44.09, 44.155, 43.93, 44.305, 44.065, 43.37, 43.685, 43.285, 
43.355, 42.305, 42.65, 43.64, 43.885, 43.885, 43.885, 44.12, 
44.385, 44.78, 44.985, 44.985, 44.865, 44.38, 44.05, 44.65, 44.065, 
44.62, 44.73, 44.32, 44.275, 44.145, 43.615, 43.975, 44.52, 44.335, 
43.585, 43.715, 43.83, 43.735, 44.09, 44.005, 44.775, 44.325, 
43.555, 43.535, 43.325, 43.425, 43.04, 43.45, 166.09, 166.44, 
165.04, 167.69, 168.08, 169.17, 168.67, 167.19, 167.19, 164.39, 
163.26, 159.64, 160.33, 162.83, 163.4, 163.4, 163.4, 164.79, 
166.23, 168.3, 168.29, 169.34, 168.56, 166.81, 165.39, 165.98, 
162.64, 163.78, 164.91, 164, 162.1, 162.25, 161.45, 162.08, 162.37, 
160.09, 157.96, 158.45, 159.95, 159.75, 160.58, 160.51, 164.09, 
161.96, 160.84, 161.41, 159.48, 159.45, 158.09, 158.49, 66, 66.19, 
66.31, 67.17, 66.84, 67.32, 67.26, 66.19, 66.46, 65.62, 65.61, 
63.87, 64.09, 64.73, 65.72, 65.72, 65.72, 66.11, 66.96, 67.53, 
67.57, 67.53, 67.25, 65.98, 65.52, 66.19, 65.23, 66.2, 66.4, 
65.53, 65.52, 65.37, 64.54, 64.57, 64.85, 64, 62.94, 63.18, 63.87, 
63.3, 63.9, 63.83, 64.76, 64, 63.62, 63.92, 63.02, 63.27, 62.33, 
62.65), .indexCLASS = "Date", tclass = "Date", .indexTZ = "UTC", tzone = "UTC", format = "%Y-%m-%d", class = c("xts", 
"zoo"), index = structure(c(1301616000, 1301875200, 1301961600, 
1302048000, 1302134400, 1302220800, 1302480000, 1302566400, 1302652800, 
1302739200, 1302825600, 1303084800, 1303171200, 1303257600, 1303344000, 
1303430400, 1303689600, 1303776000, 1303862400, 1303948800, 1304035200, 
1304294400, 1304380800, 1304467200, 1304553600, 1304640000, 1304899200, 
1304985600, 1305072000, 1305158400, 1305244800, 1305504000, 1305590400, 
1305676800, 1305763200, 1305849600, 1306108800, 1306195200, 1306281600, 
1306368000, 1306454400, 1306713600, 1306800000, 1306886400, 1306972800, 
1307059200, 1307318400, 1307404800, 1307491200, 1307577600), tzone = "UTC", tclass = "Date"), .Dim = c(50L, 
4L), .Dimnames = list(NULL, c("A", "B", "C", "D")))

    #I apply the EMA indicator to the prices xts dataframe
    EMA20fn <- function(x) EMA(x, n=20)
    EMA20prices <- xts(apply(prices, 2, EMA20fn), order.by=index(EMA20fn(prices[,1])))

    #I know how to create the signals (in EMA20prices) for a single asset, but I don't know 
    #what kind of loop it's required to apply the signal to every asset in the dataframe 
    #prices 
    ema20tr <- Lag(ifelse(Lag(prices[,1])<Lag(EMA20prices[,1])& prices[,1]>EMA20prices[,1],1,
                           ifelse(Lag(prices[,1])>Lag(EMA20prices[,1])& prices[,1]<EMA20prices[,1],-1,0)))
    ema20tr[is.na(ema20tr)] <- 0
    ema20sig <- ifelse(ema20tr>1,0,0)
    for(i in 2:length(prices[,1])){ema20sig[i] <- ifelse(ema20tr[i]==1,1,
                           ifelse(ema20tr[i]==-1,0,ema20sig[i-1]))}
    ema20sig[is.na(ema20sig)] <- 1

提前感谢您的答案!

1 个答案:

答案 0 :(得分:2)

您的代码的以下更改将在所有四列上执行您想要的操作(根据问题显示价格数据结构)

ForEach-Object