计算相对于前一天的差异

时间:2017-09-08 14:25:51

标签: r

Stock.Open <- c(102.25,102.87,102.25,100.87,103.44,103.87,103.00)
Stock.Close <- c(102.12,102.62,100.12,103.00,103.87,103.12,105.12)
day<-c(1:7)
df<-data.frame(day,Stock.Close,Stock.Open)

如何计算每天w.r.t到前一天stock.open和stock.close的%差异。 例如:我想在day1,day2和day2,day3,day3,day4之间计算Stock.open的%变化,等等。

5 个答案:

答案 0 :(得分:3)

已编辑:

之前的解决方案具有按当前值计算的比率,而不是之前的值(请参阅编辑历史记录)

更新解决方案:

library(tidyverse)
df %>% bind_cols(map(df[2:3],~c(NA,diff(.x))/lag(.x)))
#   day Stock.Close Stock.Open Stock.Close1  Stock.Open1
# 1   1      102.12     102.25           NA           NA
# 2   2      102.62     102.87  0.004896201  0.006063570
# 3   3      100.12     102.25 -0.024361723 -0.006027024
# 4   4      103.00     100.87  0.028765481 -0.013496333
# 5   5      103.87     103.44  0.008446602  0.025478338
# 6   6      103.12     103.87 -0.007220564  0.004156999
# 7   7      105.12     103.00  0.019394880 -0.008375854

答案 1 :(得分:1)

您可以使用quantmod::Delt

library(quantmod)
Delt(Stock.Open)

     Delt.1.arithmetic
[1,]                NA
[2,]       0.006063570
[3,]      -0.006027024
[4,]      -0.013496333
[5,]       0.025478338
[6,]       0.004156999
[7,]      -0.008375854

Delt(Stock.Close)

     Delt.1.arithmetic
[1,]                NA
[2,]       0.004896201
[3,]      -0.024361723
[4,]       0.028765481
[5,]       0.008446602
[6,]      -0.007220564
[7,]       0.019394880

您还可以使用

计算开 - 关百分比变化
Delt(Stock.Open, Stock.Close)

     Delt.0.arithmetic
[1,]      -0.001271394
[2,]      -0.002430252
[3,]      -0.020831296
[4,]       0.021116288
[5,]       0.004156999
[6,]      -0.007220564
[7,]       0.020582524

正如 Moody_Mudskipper 指出的那样,您可以使用

将结果添加到现有数据框中
# purrr
library(purrr)
df[4:5] <- map(df[2:3],Delt)

# base R
df[4:5] <- Map(Delt, df[2:3])

获取开盘百分比变化的日常百分比变化

df$ans <- Delt(Stock.Open, Stock.Close) / lag(Delt(Stock.Open, Stock.Close))

  day Stock.Close Stock.Open Delt.0.arithmetic
1   1      102.12     102.25                NA
2   2      102.62     102.87         1.9114865
3   3      100.12     102.25         8.5716616
4   4      103.00     100.87        -1.0136810
5   5      103.87     103.44         0.1968622
6   6      103.12     103.87        -1.7369655
7   7      105.12     103.00        -2.8505424

答案 2 :(得分:0)

这是一个想法,使用dplyrtidyr中的函数。 lag可以移动值,默认值为1。每行准备就绪后,我们可以使用mutate计算百分比变化。 replace_na是替换NA的一种方法。

library(dplyr)
library(tidyr)

df2 <- df %>%
  mutate(Pre.Open = lag(Stock.Open)) %>%
  mutate(Percent.Change = (Stock.Open - Pre.Open) / Pre.Open * 100) %>%
  replace_na(list(Percent.Change = 0))
df2
  day Stock.Close Stock.Open Pre.Open Percent.Change
1   1      102.12     102.25       NA      0.0000000
2   2      102.62     102.87   102.25      0.6063570
3   3      100.12     102.25   102.87     -0.6027024
4   4      103.00     100.87   102.25     -1.3496333
5   5      103.87     103.44   100.87      2.5478338
6   6      103.12     103.87   103.44      0.4156999
7   7      105.12     103.00   103.87     -0.8375854

更新

如果您想同时计算Stock.OpenStock.Close百分比变化,可以使用以下代码。

library(dplyr)
df2 <- df %>%
  mutate_at(vars(starts_with("Stock")), funs(Percent = (. - lag(.))/lag(.) * 100)) %>%
  replace(is.na(.), 0)
df2
  day Stock.Close Stock.Open Stock.Close_Percent Stock.Open_Percent
1   1      102.12     102.25           0.0000000          0.0000000
2   2      102.62     102.87           0.4896201          0.6063570
3   3      100.12     102.25          -2.4361723         -0.6027024
4   4      103.00     100.87           2.8765481         -1.3496333
5   5      103.87     103.44           0.8446602          2.5478338
6   6      103.12     103.87          -0.7220564          0.4156999
7   7      105.12     103.00           1.9394880         -0.8375854

答案 3 :(得分:0)

第二个最短的解决方案(没有外部库):

df$relDiff.Stock.Open = c(NA,diff(df$Stock.Open,lag=1))/df$Stock.Open*100
df$relDiff.Stock.Close = c(NA,diff(df$Stock.Close,lag=1))/df$Stock.Close*100

结果

  day Stock.Close Stock.Open relDiff.Stock.Open relDiff.Stock.Close
1   1      102.12     102.25                 NA                  NA
2   2      102.62     102.87          0.6027024           0.4872345
3   3      100.12     102.25         -0.6063570          -2.4970036
4   4      103.00     100.87         -1.3680976           2.7961165
5   5      103.87     103.44          2.4845321           0.8375854
6   6      103.12     103.87          0.4139790          -0.7273080
7   7      105.12     103.00         -0.8446602           1.9025875

答案 4 :(得分:0)

dplyr,lag和lead中非常好的功能。您也可以使用data.table包。

library(dplyr) df <- df %>% mutate(Diff.Previous = Stock.Open - lag(Stock.Close) ) df

  day Stock.Close Stock.Open Diff.Previous
1   1      102.12     102.25            NA
2   2      102.62     102.87          0.75
3   3      100.12     102.25         -0.37
4   4      103.00     100.87          0.75
5   5      103.87     103.44          0.44
6   6      103.12     103.87          0.00