2013-12-08 29 views
3

我想從權重向量和價格向量中獲取P & L.高效損益函數

data$weight[] <- c(NA,NA,1,NA,NA,NA,0,NA,NA,1,NA,NA,NA,0,NA,NA,1,NA,0,NA,NA,NA) 

1只意味着買入和0手段銷售

y <- seq(1:length(data$weight)) 

我已經寫:

na_following_zero <- na.locf(c(1,data$weight))[-1]==0 & is.na(data$weight) #Ben Bolker's code 
PL <- rep(NA,length(data$weight)) 
PL[1]=0 
for (i in 2:length(data$weight)) { 
if (is.na(data$weight[i]) && i<which.max(data$weight==1)) {PL[i]=PL[i-1]} 
if (data$weight[i] %in% 1) {PL[i]=PL[i-1]} 
if (is.na(data$weight[i]) && i>which.max(data$weight==1) && !na_following_zero[i]) {PL[i]=PL[i-1]+y[i]-y[i-1]} 
if (data$weight[i] %in% 0) {PL[i]=PL[i-1]+y[i]-y[i-1]} 
if (na_following_zero[i]) {PL[i]=PL[i-1]} 
} 

預期輸出:

[1] 0 0 0 1 2 3 4 4 4 4 5 6 7 8 8 8 8 9 10 10 10 10 

,它能夠完成任務,但它非常慢。 關於如何改進它的任何想法?

+0

請顯示您的示例向量的預期輸出。 –

回答

4

速度問題在試圖將一個for-loop思維模式轉換爲R時很常見,這個模塊是爲了以矢量化方式處理類似問題而構建的。我想我們都去過那裏。

編輯:在評論中,OP指出權重實際上是交易信號,需要被滯後才能用作併發權重。在xts這將是lag()運營商,但與原始載體,我們必須做一些搗鬼的:

wgts <- c(NA,NA,1,NA,NA,NA,0,NA,NA,1,NA,NA,NA,0,NA,NA,1,NA,0,NA,NA,NA) 
wgts2 <- c(0, wgts) 
wgts2 <- wgts2[1:length(wgts)] 

一個簡單的方法向量化您的具體問題來對待你的權重作爲在同一列時間表作爲您的價格並據此計算您的PnL。使用y因爲你的價格系列中,我們填補你的砝碼系列前鋒:

y <- data.frame(prices=1:length(wgts), weights=na.locf(wgts2)) 

隨着匹配了價格和權重,我們可以計算出每個觀測收益(淨更改)以及由重相乘得到盈虧表現:

y$rtn <- c(0, diff(y$prices)) 
y$PnL <- y$weights * y$rtn 
cumsum(y$PnL) 

但是,請注意,R擁有豐富的財務數據管理工具,遠遠超出了基本向量和數據框架的功能。作爲一種方法,上面的代碼具有誤導性,因爲它可以回答你的問題(更快的PnL計算),但不會告訴你語言擅長的地方。相反,請查看xts,quantmodPerformanceAnalytics中提供的工具。

+0

謝謝,我會用cumsum而不是sum,但這就是主意。 – user1627466

+0

來看看它更接近輸出向量不是預期的 – user1627466

+0

你是對的。你的權重是交易信號,需要被延遲一步才能達到合適的權重。等一下,我調整了代碼。 – khoxsey