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的%变化,等等。
答案 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)
这是一个想法,使用dplyr
和tidyr
中的函数。 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.Open
和Stock.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