def vratio(ts, lag=2, cor='hom'): """ the implementation found in the blog Leinenbock http://www.leinenbock.com/variance-ratio-test/ """ # t = (std((a[lag:]) - (a[1:-lag+1])))**2; # b = (std((a[2:]) - (a[1:-1]) ))**2; n = len(ts) mu = sum(ts[1:] - ts[:-1]) / n m = (n - lag + 1) * (1 - lag / n) # print( mu, m, lag) b = sum(np.square(ts[1:] - ts[:-1] - mu)) / (n - 1) t = sum(np.square(ts[lag:] - ts[:-lag] - lag * mu)) / m vratio = t / (lag * b) la = float(lag) if cor == 'hom': varvrt = 2 * (2 * la - 1) * (la - 1) / (3 * la * n) elif cor == 'het': varvrt = 0 sum2 = sum(np.square(ts[1:] - ts[:-1] - mu)) for j in range(lag - 1): sum1a = np.square(ts[j + 1:] - ts[j:-1] - mu) sum1b = np.square(ts[1:n - j] - ts[0:n - j - 1] - mu) sum1 = np.dot(sum1a, sum1b) delta = sum1 / (sum2**2) varvrt = varvrt + ((2 * (la - j) / la)**2) * delta zscore = (vratio - 1) / np.sqrt(float(varvrt)) pval = bsopt.cnorm(zscore) return vratio, zscore, pval
def vratio(ts, lag=2, cor='hom'): """ the implementation found in the blog Leinenbock http://www.leinenbock.com/variance-ratio-test/ """ # t = (std((a[lag:]) - (a[1:-lag+1])))**2; # b = (std((a[2:]) - (a[1:-1]) ))**2; n = len(ts) mu = sum(ts[1:] - ts[:-1]) / n m = (n - lag + 1) * (1 - lag / n) # print( mu, m, lag) b = sum(np.square(ts[1:] - ts[:-1] - mu)) / (n - 1) t = sum(np.square(ts[lag:] - ts[:-lag] - lag * mu)) / m vratio = t / (lag * b) la = float(lag) if cor == 'hom': varvrt = 2 * (2 * la - 1) * (la - 1) / (3 * la * n) elif cor == 'het': varvrt = 0; sum2 = sum(np.square(ts[1:] - ts[:-1] - mu)) for j in range(lag - 1): sum1a = np.square(ts[j + 1:] - ts[j:-1] - mu) sum1b = np.square(ts[1:n - j] - ts[0:n - j - 1] - mu) sum1 = np.dot(sum1a, sum1b) delta = sum1 / (sum2 ** 2) varvrt = varvrt + ((2 * (la - j) / la) ** 2) * delta zscore = (vratio - 1) / np.sqrt(float(varvrt)) pval = bsopt.cnorm(zscore) return vratio, zscore, pval
def calc_weight(self, xr): weight = np.zeros(self._dim) xx_adj = xr - self._xs npdf = bsopt.pnorm(xx_adj / self._stdev) * self._stdev ncdf = bsopt.cnorm(xx_adj / self._stdev) diff_pdf = npdf[1:] - npdf[:-1] diff_cdf = ncdf[1:] - ncdf[:-1] for i in range(1, self._dim - 1): weight[i] = (-xx_adj[i + 1] * diff_cdf[i] + diff_pdf[i]) / (self._xs[i + 1] - self._xs[i]) \ + (xx_adj[i-1] * diff_cdf[i-1] - diff_pdf[i-1]) / (self._xs[i] - self._xs[i-1]) weight[0] = ncdf[0] + (-xx_adj[1] * diff_cdf[0] + diff_pdf[0]) / (self._xs[1] - self._xs[0]) weight[self._dim - 1] = 1 - ncdf[-1] + ( xx_adj[self._dim - 2] * diff_cdf[self._dim - 2] - diff_pdf[self._dim - 2]) / (self._xs[self._dim - 1] - self._xs[self._dim - 2]) return weight