2
require(xts)

data<- c(100,101,102,103,104,99,98,97,94,93,103,90,104,105,110)
date<- Sys.Date()-15:1
file<- xts(data,date)
colnames(file)<- "CLOSE"
file$high<- cummax(file$CLOSE)
file$trade<- ifelse(file$high*.95>=file$CLOSE, 1,ifelse(file$high*.9>=file$CLOSE, 2,0))
file

           CLOSE high trade
2013-07-05   100  100     0
2013-07-06   101  101     0
2013-07-07   102  102     0
2013-07-08   103  103     0
2013-07-09   104  104     0
2013-07-10    99  104     0
2013-07-11    98  104     1
2013-07-12    97  104     1
2013-07-13    94  104     1
2013-07-14    93  104     1
2013-07-15   103  104     0
2013-07-16    90  104     1
2013-07-17   104  104     0
2013-07-18   105  105     0
2013-07-19   110  110     0

我给出的交易列的命令是当.90*column high >= close,交易的结果应该是2。我不明白为什么 2013 年 7 月 14 日和 2013 年 7 月 16 日的贸易栏不等于 2。

我已经得到了上述问题的答案。我的实际问题是别的。我以为我会做研究并完成它,但问题仍然存在。每次收盘价从高位下跌 5%、10%、15%... 时,我需要交易栏给我 +1 或 -1,而当收盘价再次上涨 10% 时,它应该给我 - 1. 当我们在任何给定日期添加 +1 和 -1 时,它不应该是 -ve 或大于 5。

4

2 回答 2

3

为了清楚起见,我认为我更喜欢 Joshua 的方法,但解决您的ifelse条款的方法是交换测试。所以改变这个:

file$trade<- ifelse(file$high*.95>=file$CLOSE, 1,ifelse(file$high*.9>=file$CLOSE, 2,0))

对此:

file$trade<- ifelse(file$high*.90>=file$CLOSE, 2,ifelse(file$high*.95>=file$CLOSE, 1,0))

PS 可能使用 ifelse 会更快(分解为三行时,所有“2”都设置为第一个 0,然后是 1,然后再设置为 2)。在您的“2”结果相对不常见的情况下,我确信差异太小而无法进行基准测试。

于 2013-07-21T00:19:51.823 回答
2

交易栏永远不会是 2,因为无论何时file$high*.9>=file$CLOSETRUEfile$high*.95>=file$CLOSE也是TRUE,而您的第一次ifelse调用是永远不会FALSE

改为执行以下操作:

file$trade <- 0
file$trade[file$high*.95>=file$CLOSE] <- 1
file$trade[file$high*.90>=file$CLOSE] <- 2
于 2013-07-20T10:58:11.470 回答