高效的P& L功能

时间:2013-12-08 18:55:04

标签: r finance

我想从权重向量和价格向量中得到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

它完成了工作,但速度非常慢。 关于如何改进它的任何想法?

1 个答案:

答案 0 :(得分:4)

当尝试将for循环思维模式转换为R时,速度问题很常见,xts是为了以矢量化方式处理类似问题而构建的。我想我们都去过那里。

编辑:在评论中,OP指出权重实际上是交易信号,需要滞后以用作并发权重。在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)] 运算符,但是使用原始向量,我们必须做一些hanky-panky:

y

对您的特定问题进行矢量化的简单方法是将您的权重视为与价格在同一时间范围内的列,并相应地计算您的PnL。使用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)

随着价格和权重的匹配,我们可以计算每次观察收益(净变化)并乘以权重得到PnL:

R

但请注意,xts拥有大量用于管理财务数据的出色工具,远远超出了基本向量和数据框架的功能。作为一种方法,上面的代码是误导性的,因为它回答了你的问题(更快的PnL计算),但没有告诉你语言擅长的地方。相反,请查看quantmodPerformanceAnalytics和{{1}}中可用的工具。