我刚刚开始学习 R(真的,只有一天的经验),目前我正在尝试将 SQL 代码迁移到 R,只是为了看看它们如何比较。
其中一个用例是计算平均股票购买价格。现在,在我的数据中,我的交易量有负数和正数,并且仅使用 + 交易量来计算平均值。另一方面,具有 - 数量的行需要平均购买价格,因为稍后将使用该价格来计算该销售交易的利润/损失。
样本数据可以这样构建:
df = data.frame(matrix(rnorm(20)*10, nrow=10))
df$X3 <- df$X2 * df$X2
然后我有一个计算平均值的函数:
avgPurchasePrice <- function(volume, eurPrice){
price <- vector(mode="numeric", length=length(volume))
s=0
t=0
for(i in 1:length(volume)){
if(volume[i]>0){
price[i] <- volume[i]*eurPrice[i]+t;
volume[i]<-volume[i]+s;
s <- volume[i];
t <- price[i];
} else {
volume[i] <- s;
price[i] <-t;
}
volume[i]=price[i]/volume[i];
}
volume
}
平均值计算为
df$avgPrice <- avgPurchasePrice(df$X1,df$X3)
问题:这种做法可以吗?我不了解 R,可能有更好的方法/模式来实现这一点,因为这种方法看起来非常“传统”
编辑:
换言之,我认为应该是:对于每个正交易量,计算平均(买入)价格作为总价格与总交易量的比率;对于负音量,使用最后一个值而不更改它
我研究了 dplyr 并想出了这个(仅适用于我的数据文件)
stock %>% group_by(FINANCIAL_INSTRUMENT) %>% mutate( cumPrice=cumsum(vol=ifelse(VOLUME>0,VOLUME,0L)*PricE), cumVol=cumsum(ifelse(VOLUME>0L,VOLUME,0L)),
cumPrice/cumVol)
这是原始代码,几乎没有改进,是使用原生 R 代码与 dplyr 等效的解决方案
set.seed(323)
df = data.frame(matrix(rnorm(20)*10, nrow=10))
df[,2]=abs(df[,2])
colnames(df)<-c("Volume","Price")
#df$EurPrice <- df$Volume * df$Price
avgPurchasePrice <- function(volume, eurPrice){
price <- vector(mode="numeric", length=length(volume))
s=0
t=0
avpr=vector()
for(i in 1:length(volume)){
if(volume[i]>0){
price[i] <- volume[i]*eurPrice[i]+t;
volume[i]<-volume[i]+s;
s <- volume[i];
t <- price[i];
} else {
volume[i] <- s;
price[i] <-t;
}
avpr[i]=price[i]/volume[i];
}
avpr
}
#average
df$avgPrice <- avgPurchasePrice(df$Volume,df$Price)
df$avgPrice2<-cumsum(ifelse(df$Volume>0,df$Volume,0)*df$Price)/cumsum(ifelse(df$Volume>0,df$Volume,0))
df
Volume Price avgPrice avgPrice2 1 -5.332687 2.0293922 NaN NaN 2 12.148825 3.8633988 3.863399 3.863399 3 7.528894 1.3639138 2.907071 2.907071 4 2.158501 6.1042484 3.223110 3.223110 5 8.886568 13.2210598 6.115018 6.115018 6 7.884685 13.7922340 7.682912 7.682912 7 1.436665 8.9700328 7.729090 7.729090 8 -2.235569 2.0624435 7.729090 7.729090 9 8.707973 0.2852434 6.399490 6.399490 10 3.924928 1.0760426 6.002844 6.002844
几个月来我一直在寻找此类问题的答案。虽然不是很集中,但我一直在环顾四周。最近我发现了一个包 PMwR(使用 R 进行投资组合管理),而不是一个快捷公式。 您需要创建一个日记帐,其中包含单价、净额(买入/卖出)、股票名称和日期。
我的例子如下:
Stocks_j <- journal(timestamp = c(Stocks$Date),
amount = c(Stocks$Net),
price = c(Stocks$Unit_price),
instrument = c(Stocks$Stock))
然后利润/损失函数似乎可以计算出你所需要的一切:
pl(Stocks_j)
库存输出示例:
#STOCK_1 盈亏总数值孔径 平均购买 29.3676 平均卖出 40.3341 暨。第 1635 卷
#STOCK_2 盈亏总计 339.955 平均购买 19.45 平均卖出 50.355 暨。第22卷
套餐详情如下: