2011-10-14 28 views
4

我有一個我想要處理的OHLC數組股票報價。簡單R任務:在指定行中將指定列除以1000

   Open  High  Low  Close   Volume 
2003-01-05 6111.01 6145.00 6102.70 6145.00   956 
2003-01-08 6145.00 6190.00 5960.00 6135.05  8771 
2003-01-09 6120.01 6250.00 6120.00 6225.00  10579 
2003-01-10 6240.00 6285.00 6225.10 6261.00  8882 
2003-01-13 6231.00 6325.00 6231.00 6270.00  8015 
2003-01-14 6279.00 6295.00 6180.01 6190.00  8461 

公司做了一個分裂@給定的日期,所以我需要1000 作爲我學習[R基礎知識,現在我想弄清楚高興把所有開放式,高,低,接近該日期之前列R解決方案完成此任務。 我已經成功地代碼的代碼的最佳件(無法找到如何申請給定的cols,股票$打開不工作):

apply(stock, 2, function(stock) stock/((index(stock)<"2007-07-20")*1000)) 

然而,結果很奇怪,很多人是inf:

2006-10-26  Inf  Inf  Inf  Inf   Inf 
2006-10-27  Inf  Inf  Inf  Inf   Inf 
2006-10-30  Inf  Inf  Inf  Inf   Inf 
2006-10-31  Inf  Inf  Inf  Inf   Inf 
2006-11-01  Inf  Inf  Inf  Inf   Inf 
2006-11-02  Inf  Inf  Inf  Inf   Inf 
2006-11-03  Inf  Inf  Inf  Inf   Inf 
2006-11-07  Inf  Inf  Inf  Inf   Inf 

非常感謝提前!

+0

謝謝大家的幫助!發佈後20分鐘我的問題已解決! –

回答

2

我不熟悉的OHLC array S,但假設指數方法的工作原理:

relevantRows<-index(stock) < "2007-07-20" 

一旦你得到了持有的所有相關行(事實上,對於成立一個邏輯向量的向量應改變行),你也許可以用這個簡直像這樣:

stock$Open[relevantRows]<-stock$Open[relevantRows]/1000 

這是可能的(取決於OHLC array S上的內部),即使是這樣工作的:

stock[relevantRows, c("Open", "High", "Low", "Close")]<-stock[relevantRows, c("Open", "High", "Low", "Close")]/1000 
+1

Thanks @Nick,您的解決方案非常適合我的需求!你救了我幾個小時,也許還有幾天在掙扎!我欠你一杯啤酒,夥計。謝謝!!! R是美麗的語言,但它有時很難在沒有建議的情況下前進。 –

+0

小心點,男人:你剛剛告訴比利時人你欠他啤酒。但嚴重的是:花費一些時間來低估[Introduction to R](http://cran.r-project.org/doc/manuals/R-intro.pdf)。我在答覆中使用的所有原則都出現在該文件中。我知道這讓我走上正軌,爲更先進的東西做好準備! –

+0

再次感謝@Nick,我一定會通讀本指南。而且我發現了一種更好的方式來指定日期過濾器。也許它並不適用於任何地方,但在我的情況下(xts對象)'stock [「:: 2007-07-19」,c(「Open」,「High」,「Low」,「Close」)] < - stock [「:: 2007-07-19」,c(「打開」,「高」,「低」,「關閉」)]/splitRatio' –

2

如果日期不在20/7/2007之前,那麼(index(stock)<"2007-07-20")FALSE,因此(index(stock)<"2007-07-20")*1000出現爲零。您的Inf值是除以零的結果。

你可以試試這個:

stock[index(stock) < "2007-07-20", -5] <- stock[index(stock) < "2007-07-20", -5]/1000 
+0

感謝@Pete爲我指出那個愚蠢的錯誤,我真的忘了我可以除以零:-0 –

1

可以使用adjRatios功能在TTR包來完成。看起來你已經有一個XTS對象,所以這就是我使用:

library(quantmod) 
x <- structure(c(6111.01, 6145, 6120.01, 6240, 6231, 6279, 6145, 6190, 
6250, 6285, 6325, 6295, 6102.7, 5960, 6120, 6225.1, 6231, 6180.01, 
6145, 6135.05, 6225, 6261, 6270, 6190, 956, 8771, 10579, 8882, 
8015, 8461), .Dim = c(6L, 5L), .Dimnames = list(NULL, c("Open", 
"High", "Low", "Close", "Volume")), index = structure(c(1041746400, 
1042005600, 1042092000, 1042178400, 1042437600, 1042524000), tzone = "", 
tclass = "Date"), class = c("xts", "zoo"), .indexCLASS = "Date", .indexTZ = "") 
s <- xts(1/1000,as.Date("2003-01-10")) 
r <- adjRatios(s,,Cl(x)) 
OHLC(x) * drop(r[,"Split"]) * drop(r[,"Div"]) 

如果您使用雅虎財經的數據,那麼你可以使用adjustOHLC功能quantmod從自動拉裂和股息數據雅虎和調整系列。有關更多選項,請參閱?adjustOHLC

+0

約書亞,其數據來自俄羅斯股票供應商finam。汝,我正在使用rusquant,它是一個基於quantmod的庫,用於獲取俄羅斯股票數據。我也在玩雅虎數據,所以會檢查adjustOHLC功能,看起來對我很有意思。謝謝。 –