2012-10-03 73 views
1

我目前使用R鍵做了一些研究,我想知道是否有人有任何奇思妙想或者對如何創建以下變量的任何預先包裝的功能:創建回溯長度可變大於x%的回報更大

我有一個單一的價格系列,例如說金融資產的每日收盤價,可以說是10年。 (其一個XTS對象)

我選擇我的X爲2%

對於我的價格數據的每一天。我想知道爲了創造一個(可能是絕對的)回報(假設您有先見之明的交易時間)大於x%,您需要回去的最少天數。該變量會讓我知道生成該x%回報所需的天數/月/年數。如果需要返回超出數據的開始以產生大於x%的回報,則NA在早期階段被返回。

我可以想到一些手動和笨拙的方法來做到這一點,但它使用大量的循環來檢查日期/價格的負載,以便爲每一天返回正確的值,然後該過程重複進行第二天......它在十年數據或日內數據上相當有問題,因此得票率將提供更快的解決方案......

+0

你能提供一些數據的例子嗎?當我們不知道你的輸入數據是什麼樣的時候,試圖生成解決方案是非常困難的。 – thelatemail

+0

使用'dput(head(data))'給我們一個子集,你可以更新你的答案。 – Maiasaura

回答

1

首先,您應該反轉時間序列,以便x值最小的正值是最接近的時間,而較遠的過去點是在右邊。然後,你可以把當前值和說:

set.seed(123) 
yval=cumsum(0.01*rnorm(100)) 
plot(1:100, yval, type="b") 
which(rev(yval) < 0.95*yval[100]) 
which(rev(yval) < (1- 0.05)*yval[100])[1] 
[1] 5 

如果你已經具備,我們可以與任何需要的轉換已經幫助日期,時間或日期歸類變量的樣本數據集。

+0

這與Joshua的答案是否相等(在CPU週期中),還是反轉數據會帶來一些好處(超出了使用[1]獲取最後一項的方便性)? –

+0

逆向只是允許在我腦海中更容易的矢量化。我不知道它是否相同。 –

+0

Joshua Ulrich通過'quantmod'和'getSymbols'進行抽取的樣本數據代表了我的問題...在您的示例中,結果僅針對特定的一天/點。即最後一點。你將如何去完成整個數據集的矢量化? –

2

我沒有看到任何方式做到這一點沒有for循環,但下面的解決方案是相當快(我的2.2Ghz筆記本電腦每10,000行約1秒)。

請注意,我服用XTS的coredata對象並丟棄dim屬性(經由drop),它返回一個矢量。我這樣做是因爲xts/zoo中的數學運算按索引對齊,所以您需要從分子中刪除索引,然後才能計算回報。

但是,由於分子爲numeric類,分母爲xts類,因此會導致分配調用NextMethod。我通過在數值向量上執行除法來避免這種開銷。

library(quantmod) 
getSymbols("^GSPC",from="1900-01-01") 

x <- Ad(GSPC) 

lookback <- function(x, p) { 
    # lookback() assumes x is xts 
    # select first column, take coredata, drop dims 
    dcx <- drop(coredata(x[,1])) 
    # initialize result object 
    f <- dcx*NA 
    # loop over all rows in 'x' 
    for(i in 1:nrow(x)) { 
    # Calculate cumulative return through today 
    r <- dcx[i]/dcx-1 # or log(dcx[i]/dcx) 
    # This really slows things down: 
    # r <- dcx[i]/x-1 
    # 
    # Find which returns are greater than 'p' 
    w <- which(abs(r[1:i]) > p) 
    # If any returns are greater than 'p', then 
    # record the closest location to 'p' 
    if(length(w)!=0) 
     f[i] <- max(w)-i 
    } 
    # return an xts object 
    xts(f, index(x)) 
} 
nrow(x) 
# [1] 15791 
system.time(lookback(x,0.02)) 
# user system elapsed 
# 15.761 0.152 16.040 
+0

非常酷,謝謝! –