1

我有一些股票价格的 OHLC 时间序列:

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 时间序列

从图中可以看出,有两个向下的尖峰,很可能是由于某种数据错误。我想使用多元高斯来检测包含这两个违规数据点的行。

> 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(),而只是使用了鲁棒协方差矩阵函数。协方差矩阵本身对我来说看起来很温和,所以我不确定发生了什么。我想使用协方差矩阵的稳健估计的原因是因为标准协方差矩阵给出了一些误报,因为我在训练集中包含了异常。

有人可以告诉我:

a)如何解决这个问题

b)如果这种方法甚至有意义

谢谢!

PS 我考虑在 Cross Validated 上发布此内容,但认为 SO 更合适,因为这似乎是一个“编程”问题。

4

1 回答 1

1

你走对了。我不知道如何解决这个错误,但我可以建议你如何找到新点的索引。

  1. 您的训练数据可能有少量异常,否则交叉验证和测试结果将受到影响
  2. 在 MATLAB 中计算均值和协方差为

       mu=mean(traindata);
       sigma=cov(traindata);
    
  3. 根据您的要求设置 epsilon

    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. 完毕!
于 2013-05-09T11:55:21.920 回答