2016-11-17 40 views
-1

我試圖使用for循環估計許多股票的隔夜收益,並將其存儲在具有股票名稱的數據框中作爲列名。 trade具有原始盤中數據,並且trade2已清除盤中數據。 list.namess有股票名稱。這是我的代碼:使用for循環估算許多股票的隔夜收益並將其存儲在股票名稱作爲列名的數據框中

require(xts) 
require(highfrequency) 
OvernightRet<-list() 
list.namess<- list.files(pattern="*.IS Equity") 
list.namess<- list.namess[2] 
for(Q in 1:length(list.namess)){ 
    trade<-readRDS(list.namess[Q]) 
    trade<-xts(trade[,-1], order.by = trade[,1]) 
    colnames(trade)[c(1,2)]<-c("PRICE", "SIZE") 
    #Unduplicating 
    trade2<-do.call(rbind, lapply(split(trade,"days"), mergeTradesSameTimestamp)) 
    trade2<-trade2[,1] 

    fun.first= function(x) first(x) 
    fun.last= function(x) last(x) 
    A=do.call(rbind, lapply(split(trade2, "days"), FUN=fun.first)) 
    B=do.call(rbind, lapply(split(trade2, "days"), FUN=fun.last)) 
    OvernightRetA <- (as.numeric(A)-as.numeric(lag.xts(B)))/as.numeric(lag.xts(B)) 
    colnames(OvernightRetA)<-list.namess[Q] 
    OvernightRet[[Q]]<-OvernightRetA 
} 
df.OvernightRet<-do.call(merge, OvernightRet) 

然而,它給人的錯誤,不能夠重命名OvernightRetA可能是因爲:

Error in `colnames<-`(`*tmp*`, value = "ACEM IS Equity.rds") : 
     attempt to set 'colnames' on an object with less than two dimensions 
    In addition: There were 50 or more warnings (use warnings() to see the first 50) 
    > df.OvernightRet<-do.call(merge, OvernightRet) 

Error in as.data.frame(x) : argument "x" is missing, with no default 

由於貿易和trade2是巨大的,不適合用於dput。我發佈了打開(A),關閉(B)和名稱列表(list.namess)的錯誤重現性。

dput(head(A,10)) 
structure(c(231.9, 236.35, 230, 226.85, 229.05, 225.7, 226.95, 
224.55, 227, 234.65), class = c("xts", "zoo"), .indexCLASS = c("POSIXct", 
"POSIXt"), .indexTZ = "Asia/Calcutta", tclass = c("POSIXct", 
"POSIXt"), tzone = "Asia/Calcutta", Price = 1L, index = structure(c(1459481850, 
1459741066, 1459827433, 1459913867, 1460000236, 1460086630, 1460345867, 
1460432285, 1460518631, 1460950628), tzone = "Asia/Calcutta", tclass = c("POSIXct", 
"POSIXt")), .Dim = c(10L, 1L), .Dimnames = list(NULL, "PRICE")) 


dput(head(B,10)) 
structure(c(235.35, 231.2, 226.1, 229.05, 226.45, 225.75, 224.55, 
223.75, 231.1, 228.6), class = c("xts", "zoo"), .indexCLASS = c("POSIXct", 
"POSIXt"), .indexTZ = "Asia/Calcutta", tclass = c("POSIXct", 
"POSIXt"), tzone = "Asia/Calcutta", Price = 1L, index = structure(c(1459508732, 
1459767943, 1459854348, 1459940748, 1460027143, 1460113538, 1460374518, 
1460465873, 1460545568, 1460977541), tzone = "Asia/Calcutta", tclass = c("POSIXct", 
"POSIXt")), .Dim = c(10L, 1L), .Dimnames = list(NULL, "PRICE")) 

dput(list.namess) "ACEM IS Equity.rds" 

請幫我解決這個錯誤。

+0

您遇到的錯誤是什麼?包含確切的錯誤消息。確保您的樣本數據能夠再現您獲得的完全相同的錯誤。 – MrFlick

+0

@MrFlick,問候,正如我所提到的,trade和trade2是非常大的數據集,不適合dput。你認爲隔夜返回代碼行14-17的代碼是否正常? – runjumpfly

+0

錯誤意味着'OvernightRetA'不是矩陣或data.frame,所以它沒有列,所以你不能設置'colnames()'。你沒有花時間說出期望的輸出結果或者你想要做什麼,所以目前還不清楚你想要發生什麼。 – MrFlick

回答

0

我相信這個問題,正如錯誤信息所暗示的,是您正試圖將列標題分配給單個值。您可以通過將上面的行更改爲:

OvernightRetA <- as.data.frame(as.numeric(A)-as.numeric(lag.xts(B)))/as.numeric(lag.xts(B))

+0

謝謝aakash,這將在df.OvernightRet <-do.call(merge,OvernightRet) – runjumpfly

+0

期間出現問題。爲什麼不在循環中將庫存名稱和返回值存儲爲數據框中的行,然後在循環完成後使用't()'進行轉置?將stock_name存儲在col1中,值爲col2 – aakash

+0

親愛的aakash,這是錯誤:> df.OvernightRet <-do.call(merge,OvernightRet) as.data.frame(y):參數「y」缺失沒有默認 – runjumpfly