【问题标题】:Get trading strategy vector of long positions based on crossing a threshold基于越过阈值获取多头头寸的交易策略向量
【发布时间】:2018-01-23 09:37:54
【问题描述】:

这有点简单,但我真的找不到快速的 (1,2,3)-liner 来解决它。我有一个 10 天回报的滚动平均值向量 - 策略很简单:当滚动平均值从下方穿过零障碍时做多,当它从上方穿过障碍时卖出。 更准确地说,假设滚动平均收益存储在向量 Returns 中。

which(Returns > 0)
[1]    3    4    5    9   10   11   14   18   27   28   29   36   37   38   47   48

基于此,我会在 4、5、6 时做多(在 3 时我们只收到入口信号,在 6 时我们退出)、10、11、12、15、19 等等。 我怎样才能得到这个向量?我已经尝试过 diff,另一种和其他几种组合,但没有什么能真正解决问题。任何帮助将不胜感激。

编辑(基于第一个答案):

Initiate_Long_Position  <- which(ifelse(goLong  == TRUE, 1,0) == 1) 
Terminate_Long_Position <- which(ifelse(goShort  == TRUE, 1,0) == 1) 

if (length(Terminate_Long_Position) > length(Initiate_Long_Position) ){
  Terminate_Long_Position <- Terminate_Long_Position[-1]
}

Days_Long_Returns <- rep(0, dim(ticker)[1])
Daily_returns <- returns(Cl(ticker))
for (i in 1:length(Initiate_Long_Position)){
  Days_Long_Returns[(Initiate_Long_Position[i]+1):(Terminate_Long_Position[i])] <-
  Daily_returns[(Initiate_Long_Position[i]+1):(Terminate_Long_Position[i])]
}

我在 foor 循环中为 Initiate_Long_Position[i] 添加了 +1,因为我们只有在观察到做多信号后才能获得下一个周期的回报,而卖出是“实时”完成的。我是否遗漏了一些东西,即是否正确索引了回报,这样我们就不会考虑在时间 i 使用回报 i-1 的未来?

【问题讨论】:

  • which(ifelse(goLong == TRUE, 1,0) == 1) 与 which(goLong) 相同
  • 在您的示例中,您不会迭代 Initiate_Long_Position。如果该向量是 c(4,5,6),则改为迭代 c(1,2,3)。您的 for 循环说“从 1 运行到向量的长度”(在本例中为 3。

标签: r finance quantmod trading algorithmic-trading


【解决方案1】:

你需要 zoo-package 和 dplyr-package

library(zoo) # to compute rolling means
library(dplyr) # to compute lagged vectors

a <- c(-5:5, 5:-5) # create a sample vector

# rolling mean over the last 3 observations
myRollmeans <- rollmean(a, 3, fill = NA, align = "right")
goLong <- lag(myRollmeans) < 0 & myRollmeans >= 0
goShort <- lag(myRollmeans) > 0 & myRollmeans <= 0

data.frame(myRollmeans, goLong, goShort)

结果

       myRollmeans goLong goShort
1           NA     NA      NA
2           NA     NA      NA
3    -4.000000  FALSE      NA
4    -3.000000  FALSE   FALSE
5    -2.000000  FALSE   FALSE
6    -1.000000  FALSE   FALSE
7     0.000000   TRUE   FALSE
8     1.000000  FALSE   FALSE
9     2.000000  FALSE   FALSE
10    3.000000  FALSE   FALSE
11    4.000000  FALSE   FALSE
12    4.666667  FALSE   FALSE
13    4.666667  FALSE   FALSE
14    4.000000  FALSE   FALSE
15    3.000000  FALSE   FALSE
16    2.000000  FALSE   FALSE
17    1.000000  FALSE   FALSE
18    0.000000  FALSE    TRUE
19   -1.000000  FALSE   FALSE
20   -2.000000  FALSE   FALSE
21   -3.000000  FALSE   FALSE
22   -4.000000  FALSE   FALSE

【讨论】:

  • 谢谢...您能看看我的编辑并检查潜在的错误吗?
  • 请专注于提出编码问题。编辑帖子以扩展问题不是要走的路。
【解决方案2】:

您可以在 Returns 的 sign 上使用 rle 来获得高于 0 或低于 0 的回报的序列。之后,这是一个确定何时做多或做空的案例。如果需要移除进场信号,可以在TIME使用diff,移除超过2个的。

set.seed(23L)
(Returns <- rnorm(50))

#generate sequence of positive and or negative returns
runs <- rle(sign(Returns))

#identify the time to go long or short
trades <- data.frame(
    TIME=seq_along(Returns),
    RETURN=Returns,
    DIRN=rep(runs$values, runs$lengths),
    RUNS=rep(runs$lengths, runs$lengths))
longs <- trades[trades$DIRN==1 & trades$RUNS >= 2,]
shorts <- trades[trades$DIRN==-1 & trades$RUNS >= 2,]

参考: Find consecutive sequence of zeros in R

【讨论】:

  • 感谢关于rle的提醒……我已经有一段时间没有使用它了。
【解决方案3】:

由于我不熟悉交易,所以我试图举一个回报的例子

Returns<-c(-1,-2,-1,1,2,4,1,-2,-3,-2,-1,1,2,4,5,3,2,-1)
LagReturns<-lag(Returns,1)
position=rep("0",length(Returns))
mask1=Returns*LagReturns<0&Returns<0
mask2=Returns*LagReturns<0&Returns>0
position[mask1]="sell"
position[mask2]="long"

在我的理解中,当没有越过零时,你不持仓(“0”),当回报从负数变为正数时,你持仓多头(“多头”),当从正数负数时,你持仓位卖出(“卖出”)

【讨论】:

  • 您的理解是正确的,但是我相信其他答案更符合我目前的问题。
猜你喜欢
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多