【问题标题】:sparseIndexTracking 0.1.0 failure in if(): missing value where TRUE/FALSE neededif() 中的 sparseIndexTracking 0.1.0 失败:需要 TRUE/FALSE 的缺失值
【发布时间】:2018-07-26 20:56:46
【问题描述】:

我有两个数据集。两者都是xts 对象。

 > dput(head(all_data[,2:3]))
    structure(c(0.00108166576527857, 0.00324149108589955, 0, 0, 0.00484652665589658, 
    0.00267952840300101, 0.00606980273141122, 0.00301659125188536, 
    0.00526315789473686, -0.00149588631264019, 0, -0.00299625468164799
    ), class = c("xts", "zoo"), .indexCLASS = c("POSIXct", "POSIXt"
    ), .indexTZ = "UTC", tclass = c("POSIXct", "POSIXt"), tzone = "UTC", index = structure(c(1453716060, 
    1453716120, 1453716180, 1453716240, 1453716300, 1453716360), tzone = "UTC", tclass = c("POSIXct", 
    "POSIXt")), .Dim = c(6L, 2L), .Dimnames = list(NULL, c("ClosePrice_AGL.1", 
    "ClosePrice_AMC")))

> dput(head(all_data[,1]))
    structure(c(0.00108166576527857, 0.00324149108589955, 0, 0, 0.00484652665589658, 
    0.00267952840300101), class = c("xts", "zoo"), .indexCLASS = c("POSIXct", 
    "POSIXt"), .indexTZ = "UTC", tclass = c("POSIXct", "POSIXt"), tzone = "UTC", index = structure(c(1453716060, 
    1453716120, 1453716180, 1453716240, 1453716300, 1453716360), tzone = "UTC", tclass = c("POSIXct", 
    "POSIXt")), .Dim = c(6L, 1L), .Dimnames = list(NULL, "ClosePrice_AGL"))

> dput(head(mydata_train[,1:3]))
    structure(c(-0.00155763239875384, -0.0279251170046803, -0.00225324987963404, 
    -0.000479333950998528, 0.0042195179257094, -0.00163456299477571, 
    -0.00526315789473697, -0.0222222222222221, -0.00431818181818178, 
    -0.00218475886131686, 0.00217864923747269, -0.00217391304347825, 
    -0.00651612903225807, -0.0221442950840964, -0.00385177314384377, 
    0.00333333333333319, -0.00365448504983379, -0.0160053351117039
    ), class = c("xts", "zoo"), .indexCLASS = c("POSIXct", "POSIXt"
    ), tclass = c("POSIXct", "POSIXt"), tzone = "", index = structure(c(1527255180, 
    1527256080, 1527256260, 1527256440, 1527256800, 1527256980), tclass = c("POSIXct", 
    "POSIXt")), .Dim = c(6L, 3L), .Dimnames = list(NULL, c("ACBFF.Close", 
    "APHQF.Close", "WDDMF.Close")))

> dput(head(mydata_train[,4]))
    structure(c(0.00429610046265694, -0.00789733464955589, -0.00165837479270303, 
    -0.00299003322259139, 0.00333222259246901, -0.00199269345732311
    ), class = c("xts", "zoo"), .indexCLASS = c("POSIXct", "POSIXt"
    ), tclass = c("POSIXct", "POSIXt"), tzone = "", index = structure(c(1527255180, 
    1527256080, 1527256260, 1527256440, 1527256800, 1527256980), tclass = c("POSIXct", 
    "POSIXt")), .Dim = c(6L, 1L), .Dimnames = list(NULL, "MJ.Close"))

我正在运行 spIndexTrack 来自:

library(sparseIndexTracking)

  test <- spIndexTrack(all_data[,2:3] , all_data[,1], lambda = 1e-7, u = 0.5, measure = 'ete')

  test <- spIndexTrack(mydata_train[,1:3] , mydata_train[,4], lambda = 1e-7, u = 0.5, measure = 'ete')

第二个函数给出:

 w
ACBFF.Close 0.47083543
APHQF.Close 0.42967200
WDDMF.Close 0.09949257

但第一次失败:

Error in if (abs(a + 1) < 1e-06) { : 
  missing value where TRUE/FALSE needed

我没有NAs

all_data <- all_data[complete.cases(all_data),]

any(is.na(all_data) == TRUE)

我所有的数据都是数字。

storage.mode(my_data) <- "numeric"

我可以毫无错误地运行回归:

lm(all_data[,1] ~ all_data[,2:3]) 

这不是我的数据框中有 0 的结果

all_data[all_data==0] <- 1e-9

尝试包装为矩阵:

as.matrix(all_data)

不知道出了什么问题。


如果有人想使用在线 google/yahoo 数据运行完整的工作示例,您可以使用:

library(sparseIndexTracking)
library(xts)
library(gquote)
library(PerformanceAnalytics)

#######################################
############  SET PARAMETERS  #########
#######################################

# Data

minute_interval <- 3
n_periods <- 10000




#######################################
############  GET DATA  #########
#######################################


# pull yahoo / google data for the portfolio (2 stocks)

mydata <- merge(getIntradayPrice('ACBFF', period=n_periods, interval = minute_interval),
                getIntradayPrice('APHQF', period=n_periods, interval = minute_interval),
                getIntradayPrice('WDDMF', period=n_periods, interval = minute_interval),
                getIntradayPrice('MJ', period=n_periods, interval = minute_interval),
                getIntradayPrice('HMLSF', period=n_periods, interval = minute_interval)
)

#select just closing prices
mydata <- mydata[,c(1,6, 11, 16)]


# remove NA values

mydata <- mydata[complete.cases(mydata),]

# replace all with returns of the two series - can use 'log' or 'discrete'
mydata <- Return.calculate(mydata, method = 'discrete')


# remove NA values again

mydata <- mydata[complete.cases(mydata),]

## split set into first 50% training data second 50% test data

mydata_train <- mydata[1:floor(nrow(mydata) * 0.5),]
mydata_test <-  mydata[floor(nrow(mydata) * 0.5 +1):nrow(mydata),]


# remove NA values again

mydata_train <- mydata_train[complete.cases(mydata_train),]

# Generate weights see : https://cran.r-project.org/web/packages/sparseIndexTracking/vignettes/SparseIndexTracking-vignette.pdf



w_ete <- spIndexTrack(mydata_train[,1:3] , mydata_train[,4], lambda = 1e-7, u = 1.5, measure = 'ete')
w_ete

我被困住了。不确定是否有人可以提供帮助。提前致谢。

【问题讨论】:

    标签: r xts na zoo


    【解决方案1】:

    数据准备

    spIndexTrack 首先在您的输入对象上应用as.matrix,因为该函数需要一个矩阵和一个向量

     spIndexTrack(X, r, lambda, u = 1, measure = c("ete", "dr", "hete", "hdr"),
       hub = NULL, w0 = NULL, thres = 1e-09)
    

    参数:

       X: m-by-n matrix of net returns (m samples, n assets).
    
       r: m dimensional vector of the net returns of the index.
    

    因此,为简单起见,您只需 dput(datamat &lt;- as.matrix(all_data)),即

    datamat <- 
    structure(c(0.00108166576527857, 0.00324149108589955, 0, 0, 0.00484652665589658, 
    0.00267952840300101, 0.00108166576527857, 0.00324149108589955, 
    0, 0, 0.00484652665589658, 0.00267952840300101, 0.00606980273141122, 
    0.00301659125188536, 0.00526315789473686, -0.00149588631264019, 
    0, -0.00299625468164799), .Dim = c(6L, 3L), .Dimnames = list(
    c("2016-01-25 10:01:00", "2016-01-25 10:02:00", "2016-01-25 10:03:00", 
    "2016-01-25 10:04:00", "2016-01-25 10:05:00", "2016-01-25 10:06:00"
    ), c("ClosePrice_AGL", "ClosePrice_AGL.1", "ClosePrice_AMC"
    )))
    

    然后设置

    X <- datamat[, 2:3]
    r <- datamat[, 1]
    

    找出问题

    注意X[, 1]r 是相同的:

    identical(X[, 1], r)
    #[1] TRUE
    

    您可以运行lm(r ~ 0 + X),但r 可以用X[, 1] 完美解释,X[, 2] 的系数最终为零:

    XClosePrice_AGL.1    XClosePrice_AMC  
            1.000e+00         -6.346e-19  
    

    根据SparseIndexTracking vignette: explanation of the algorithmsspIndexTrack 正在使用类似套索的正则化进行约束最小二乘

    • 回归系数必须为非负且总和为 1,这样它们才能给出有效的投资组合;
    • 正则化强制选择稀疏变量。

    对于上述Xr,非约束普通最小二乘法已经为您提供了最佳稀疏投资组合:(1, 0)。你还期望spIndexTrack 做什么?

    ## your call to `spIndexTrack`
    spIndexTrack(X, r, lambda = 1e-7, u = 0.5, measure = 'ete')
    

    特别是,您设置了u = 0.5,它要求任何投资组合权重不大于0.5。鉴于最佳权重向量为(1, 0),该算法可能会遇到很大困难。

    我认为你最好不要更改默认值u = 1。此默认值意味着该算法能够将除一个特征之外的所有特征缩小为零。

    现在,即使以下操作也会失败。

    spIndexTrack(X, r, lambda = 1e-7, u = 1, measure = 'ete')
    

    因此我打算将正则化设置为零,即lambda = 0,但仍然失败。我必须将其设置为一个微小的负数才能使其工作:

    spIndexTrack(X, r, lambda = -1e-16, u = 1, measure = 'ete')
    #                            w
    #ClosePrice_AGL.1 9.999996e-01
    #ClosePrice_AMC   3.633128e-07
    

    如您所见,结果接近(1, 0)


    包的数值稳定性不足

    我在 CRAN 上检查了这个包。截至今天(2018-07-30),它仍处于第一个版本(版本 0.1.0)。

    看了spIndexTrack的R代码,发现基本没有做数值稳定性的测试。你得到的错误只是因为你得到一个0 / 0,因此一个NaN 变量a

    我没有兴趣通过数学算法来考虑应该进行哪些先前的数值测试。以下建议是最可靠的,但可能过于受限,但您问题中的另一个工作示例(与 mydata_train 相关)满足此条件。

    • X有满秩,即qr(X)$rank等于ncol(X)
    • cbind(X, r) 具有满秩,即 lm(r ~ 0 + X) 不会以全零残差结束。

    包作者有责任考虑这一点。但最后,该函数应首先检查数值错误并返回早期信息错误。

    【讨论】:

    • 嗨。从来没有给你一个适当的感谢你。感谢您抽出时间回复。我已经恢复到再次使用这个包,你的帖子再次得到了很好的帮助
    猜你喜欢
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多