R 计算平均购买价格

问题描述 投票:0回答:2

我刚刚开始学习 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
2个回答
1
投票

这是原始代码,几乎没有改进,是使用原生 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

0
投票

几个月来我一直在寻找此类问题的答案。虽然不是很集中,但我一直在环顾四周。最近我发现了一个包 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卷

套餐详情如下:

https://cran.r-project.org/web/packages/PMwR/PMwR.pdf

© www.soinside.com 2019 - 2024. All rights reserved.