我想从权向量和价格向量中得到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
它完成了任务,但却非常缓慢。我有什么办法改进它吗?
发布于 2013-12-08 11:30:53
速度问题是常见的,当试图转换为循环思维为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))
在价格和权重相匹配的情况下,我们可以计算每个观察回报(净变化)并乘以权重得到PnL:
y$rtn <- c(0, diff(y$prices))
y$PnL <- y$weights * y$rtn
cumsum(y$PnL)
但是,请注意,R
拥有丰富的金融数据管理工具,远远超出了基本向量和data.frames的能力。作为一种方法,上面的代码具有误导性,因为它回答了您的问题(更快的PnL计算),但没有告诉您语言的优点。相反,看看xts
、quantmod
和PerformanceAnalytics
中可用的工具。
https://stackoverflow.com/questions/20457522
复制