一、实验介绍--hawkes过程参数估计
1.1 实验知识点
- hawkes过程模拟加速
- 最大似然估计 hawkes 最优参数
1.2 实验环境
- R 3.4.1
- Rstudio
二、Hawkes 过程参数估计
2.1 指数核 Hawkes 过程模拟优化
在上一章中,我们对指数核函数的 Hawkes 过程进行了模拟 , 但是当我们把 事件个数调大时,比如从 100 调到 1000 时,可以发现程序运行的时间大大增加了, 这是由于在算时刻对应的强度时需要调用前面所有的事件时刻,所以复杂度是 O(N^2).
所以可以根据这个性质把计算复杂度降低到 O(N):
set.seed(728)
n <- 100000
params <- c(0.5 , 0.3 , 1.2)
mu <- params[1]
alpha <- params[2]
beta <- params[3]
# recursively update intensity
event_time <- numeric(n)
last_kernel_sum <- numeric(n)
for (i in 1:n) {
if (i==1) {
lambda_star <- mu
event_time[1] <- rexp(1 , rate=lambda_star)
}
else {
lambda_last <- mu + last_kernel_sum[i-1]
lambda_star <- lambda_last + alpha
event_time[i] <- event_time[i-1] + rexp(1 , rate=lambda_star)
last_kernel_sum[i] <- (last_kernel_sum[i-1]+alpha) * exp(-beta*(event_time[i] - event_time[i-1]))
lambda_this <- mu + last_kernel_sum[i]
while ( runif(1) > lambda_this / lambda_star) {
# thinning procedure , delete this point and make new
lambda_star <- lambda_this
event_time[i] <- event_time[i] + rexp(1 , rate=lambda_star)
last_kernel_sum[i] <- (last_kernel_sum[i-1]+alpha) * exp(-beta*(event_time[i] - event_time[i-1]))
lambda_this <- mu + last_kernel_sum[i]
}
}
}
2.2 Hawkes 过程参数估计
我们可以将公式转化为代码:
log_likelihood <- function(params , event) {
mu = params[1]
alpha = params[2]
beta = params[3]
n = length(event)
t_n = event[n]
kernel_sum <- numeric(n)
for (i in 2:n) {
kernel_sum[i] = (kernel_sum[i-1]+alpha) * exp(-beta*(event[i] - event[i-1]))
}
lambda <- kernel_sum + mu
L = sum( log(lambda) ) - mu * t_n - alpha*n/beta + alpha/beta*sum(exp(-beta*(t_n-event)))
#print(L)
-L
}
因为后面的函数 nlminb 所做的是使函数的值最小化 , 上面的似然函数中我们输入的是负的似然函数。
nlminb(c(1,1,1) , log_likelihood ,event= event_time)
## $par
## [1] 0.4983477 0.3057706 1.2047607
##
## $objective
## [1] 136883.5
##
## $convergence
## [1] 0
##
## $iterations
## [1] 24
##
## $evaluations
## function gradient
## 37 93
##
## $message
## [1] "relative convergence (4)"
经过优化得到的参数非常接近我们的真实参数(0.5,0.3,1.2) , 这说明极大似然估计非常有效。
Hawkes 过程的核函数可以指定多种形式 , 除了指数核函数以外 , 还可以使用幂律核函数 ,甚至不指定核函数的具体形式, 使用非参数的方法求取核函数 。
下一节我们将使用真实的高频订单流数据开始我们的旅程。