说我有一个股票的价格,我想以给定窗口大小以滚动方式找到回归线的斜率。我如何在Julia中完成它?我希望它真的很快,因此不想使用for循环。
通常,您不必担心Julia中的for
循环,因为它们没有R或Python for循环的开销。因此,您只需要担心渐近复杂性,而不必担心解释器开销所引入的潜在大常数因数。
但是,与单纯的O(n²)切片和回归方法相比,使用卷积可以更有效地(渐近地)完成此操作。 DSP.jl程序包提供卷积功能。以下是一个没有截距的示例(它计算滚动beta);可以通过修改公式来支持拦截。
using DSP
# Create some example x (signal) and y (stock prices)
# such that strength of signal goes up over time
const x = randn(100)
const y = (1:100) .* x .+ 100 .* randn(100)
# Create the rolling window
const window = Window.rect(20)
# Compute linear least squares estimate (X^T X)^-1 X^T Y
const xᵗx = conv(x .* x, window)[length(window):end-length(window)+1]
const xᵗy = conv(x .* y, window)[length(window):end-length(window)+1]
const lls = xᵗy ./ xᵗx # desired beta
# Check result against naïve for loop
const βref = [dot(x[i:i+19], y[i:i+19]) / dot(x[i:i+19], x[i:i+19]) for i = 1:81]
@assert isapprox(βref, lls)