手算时间序列
简单移动平均
手动实现一个计算简单移动平均的函数:
1
2
3
4
5
6
7
8
9
10
11mySMA <- function (x, n) { sma <- c() sma[1:(n-1)] <- NA for (i in n:length(x)) { sma[i] <- mean(x[(i-n+1):i]) } return(sma) } x = c(2, 3, 3, 4, 2, 3, 3, 5, 2, 3) mySMA(x, n = 4)
R 语言中的 TTR 包提供的 SMA 函数也可以实现简单移动平均的计算。
1
2
3library(TTR) SMA(x, n = 4)
手动计算的结果和使用程序包的结果是一样的,证明简单移动平均手写函数的逻辑是正确的。
指数移动平均
设时间序列为
y
1
,
y
2
,
…
,
y
t
,
…
y_1,y_2,dots,y_t,dots
y1,y2,…,yt,… ,
α
alpha
α为加权系数,
0
<
α
<
1
0<alpha<1
0<α<1,一次指数平滑公式为:
S
t
(
1
)
=
α
y
t
+
(
1
−
α
)
S
t
−
1
(
1
)
S_t^{(1)}=alpha y_t + (1-alpha)S_{t-1}^{(1)}
St(1)=αyt+(1−α)St−1(1)
手写函数实现指数移动平均:
1
2
3
4
5
6
7
8
9
10
11
12
13
14myEMA <- function (price,n){ ema <- c() ema[1:(n-1)] <- NA ema[n]<- mean(price[1:n]) beta <- 2/(n+1) for (i in (n+1):length(price)){ ema[i]<-beta * price[i] + (1-beta) * ema[i-1] } return(ema) } x = c(2, 3, 3, 4, 2, 3, 3, 5, 2, 3) myEMA(x, n = 4)
再来试试 TTR 包提供的指数移动平均:
1
2EMA(x, n=4)
手动计算的结果和使用程序包的结果是一样的,证明指数移动平均手写函数的逻辑是正确的。
上述手写函数,没有把加权系数 β beta β作为参数,而是在函数里缺省计算得出,可以进一步改进:
1
2
3
4
5
6
7
8
9
10
11
12myEMA1 <- function (price,n,beta){ ema <- c() ema[1:(n-1)] <- NA ema[n]<- mean(price[1:n]) for (i in (n+1):length(price)){ ema[i]<-beta * price[i] + (1-beta) * ema[i-1] } return(ema) } myEMA1(x, n = 4,beta=0.4)
参考资料
Datawhale 开源文档:https://github.com/datawhalechina/team-learning-data-mining/tree/master/TimeSeries
感谢Datawhale对开源学习的贡献!
最后
以上就是细腻乌龟最近收集整理的关于手算时间序列手算时间序列的全部内容,更多相关手算时间序列手算时间序列内容请搜索靠谱客的其他文章。
发表评论 取消回复