2013-04-09 5 views
1

У меня есть временные ряды OHLC для некоторых цен на акцию:OHCL Time Series - Обнаружение Anomaly с многомерным гауссовским распределением

library(quantmod) 
library(mnormt) 
library(MASS) 

download.file("http://dl.dropbox.com/u/25747565/941.RData", destfile="test.RData") 
load("test.RData") 
chartSeries(p) 

941 OHLC time series

Как видно из графика, есть два вниз шипов, скорее всего, из-за какой-то ошибки данных. Я хочу использовать многомерный гауссов для определения строк, содержащих эти два оскорбительных точки данных.

> x[122,] 
941.Open 941.High 941.Low 941.Close 
    85.60  86.65  5.36  86.20 
> x[136,] 
941.Open 941.High 941.Low 941.Close 
    84.15  85.60  54.20  85.45 

Вот мой код, чтобы соответствовать распределению и вычислить вероятности каждой точки данных:

x <- coredata(p[,1:4]) 
mu <- apply(x, 2, mean) 
sigma <- cov.rob(x)$cov 
prob <- apply(x, 1, dmnorm, mean = mu, varcov = sigma, log = TRUE) 

Однако этот код подбрасывает следующее сообщение об ошибке:

Error in pd.solve(varcov, log.det = TRUE) : x appears to be not symmetric 

Эта ошибка не возникало, когда я использовал стандартную функцию cov() для вычисления матрицы ковариации, но только с помощью функции надежной ковариационной матрицы. Ковариантная матрица сама по себе выглядит довольно мягкой, поэтому я не уверен, что происходит. Причины, по которым я хочу использовать надежную оценку ковариационной матрицы, состоит в том, что стандартная ковариационная матрица давала несколько ложных срабатываний, так как я включал аномалии в моем наборе тренировок.

Может кто-нибудь сказать мне:

а) как исправить эту

б) если этот подход даже имеет смысл

Спасибо!

P.S. Я считал, что вы разместили это на Cross Validated, но подумал, что SO был более уместным, поскольку это похоже на проблему программирования.

ответ

1

Вы идете вправо. Я не знаю, как исправить ошибку, но я могу предложить вам, как найти индексы новых точек.

  1. Данные подготовки могут иметь небольшое количество аномалий в противном случае перекрестной проверки и результаты испытаний будут страдать
  2. Вычислить среднее и ковариации в MATLAB в

    mu=mean(traindata); 
        sigma=cov(traindata); 
    
  3. множества эпсилон согласно вашему требованию

    count=0; 
        Actual=[]; 
        for j=1:size(cv,1) 
        p=mvnpdf(cv(j,:),mu,sigma); 
         if p<eplison 
         count=count+1; 
         Actual=[Actual;j]; 
          fprintf('j=%d \t p=%e\n',j,p); 
        end 
    end 
    
  4. порог настройки если результаты не являются удовлетворительными

  5. Оценка модели с использованием F-1 балл (если F-1 балл равен 1, вы сделали это правильно)
  6. Применить модель на тестовых данных
  7. сделано!