Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.80 KB | None | 0 0
  1. import numpy as np
  2. from sympy import Symbol
  3. from sympy.solvers import solve
  4. from scipy.optimize import fsolve
  5. from functools import lru_cache
  6.  
  7.  
  8. class ARMA(object):
  9.     def __init__(self, process, m, n):
  10.         self.process = process
  11.         self.m = m
  12.         self.n = n
  13.         self.z = None
  14.  
  15.         self.betas = np.array(list(fsolve(self.beta_equations_system, np.ones(self.m), factor=0.1)))
  16.         result = fsolve(self.alpha_equations_system, np.ones(self.n * 2 + 2), factor=0.1, full_output=True)
  17.         self.alphas = np.array(list(result[0][0:self.n + 1]))
  18.         self.norm = np.linalg.norm(result[1]['fvec'])
  19.  
  20.         self.is_model_exists = not (result[2] != 1 and self.norm >= 1e-1)
  21.  
  22.     @lru_cache(maxsize=None)
  23.     def normalized_correlation(self, k):
  24.         k = abs(k)
  25.         if k <= self.m + self.n:
  26.             return self.process.normalized_correlation(k)
  27.         else:
  28.             ncf = 0
  29.             for i in range(1, self.m + 1):
  30.                 ncf += self.betas[i - 1] * self.normalized_correlation(k - i)
  31.             return ncf
  32.  
  33.     @lru_cache(maxsize=None)
  34.     def std(self, count=10):
  35.         result = 0
  36.         for i in range(1, count + 1):
  37.             result += (self.normalized_correlation(i) - self.process.normalized_correlation(i)) ** 2
  38.         return result
  39.  
  40.     @lru_cache(maxsize=None)
  41.     def is_model_stable(self):
  42.         if self.z is None:
  43.             z = Symbol("z")
  44.             expression = 1
  45.             for i in range(self.m):
  46.                 expression -= self.betas[i] * (z ** -(i + 1))
  47.             self.z = solve(expression, z)
  48.         if self.m == 2 and self.n == 3:
  49.             print(list(self.z))
  50.         return all(abs(z) < 1 for z in self.z)
  51.  
  52.     def beta_equations_system(self, beta):
  53.         result = []
  54.         for i in range(self.n + 1, self.n + self.m + 1):
  55.             current = -self.process.correlation_function(i)
  56.             for j in range(1, self.m + 1):
  57.                 current += beta[j - 1] * self.process.correlation_function(i - j)
  58.             result.append(current)
  59.         return result
  60.  
  61.     def alpha_equations_system(self, factors):
  62.         result = []
  63.  
  64.         for i in range(0, self.n + 1):
  65.             current = -self.process.correlation_function(i)
  66.             for j in range(1, self.m + 1):
  67.                 current += self.betas[j - 1] * self.process.correlation_function(i - j)
  68.             for j in range(i, self.n + 1):
  69.                 current += factors[j] * factors[self.n + 1 + j - i]
  70.             result.append(current)
  71.  
  72.         for i in range(0, self.n + 1):
  73.             current = factors[i] - factors[self.n + 1 + i]
  74.             for j in range(1, min(i, self.m) + 1):
  75.                 current += self.betas[j - 1] * factors[self.n + 1 + i - j]
  76.             result.append(current)
  77.  
  78.         return result
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement