data.frame 中每一列的利润回撤

Posted

技术标签:

【中文标题】data.frame 中每一列的利润回撤【英文标题】:profit drawdown of each column in data.frame 【发布时间】:2020-04-19 17:15:31 【问题描述】:

我想计算下面 data.frame 中每一列 A:C 的利润/亏损。标题 A 到 C 可以被视为股票代码。每一行都可以被认为是每小时收盘价。价格日期和小时可以组合起来形成这个时间序列数据的时间戳

我曾尝试使用fTradingPerformanceAnalytics 包来计算最大回撤,但不断出现错误。我不在乎何时出现最大回撤。我只需要最大回撤金额,以便我可以使用它来计算利润/回撤(利润除以最大回撤)比率。

数据:

hourlyclose <- data.frame(pricedate = as.Date('2019-12-18'), hour = c(1,2,3,4,5), A = c(3,5,6,2,4), B = c(1,9,7,11,4), C = c(0,2,5,4,9))

我希望输出第二个 data.frame,其中每个列对应股票代码、利润回撤率和利润(在我的示例每小时关闭 data.frame 中,最后一行减去第一行) .

生成的 data.frame 应如下所示:

Stock     pdd      profit
 A        0.25        1
 B        0.43        3
 C        9.0         9

我希望尽可能多地使用 tidyverse 和其中任何一个财务包进行运营。

回撤定义:回撤是衡量价格在达到或超过之前的高价之前下跌的幅度。

每列的最大回撤:

对于“A”,最大回撤是 4,因为 A 的最高点是 6,然后下降到 2。

对于“B”,有两次回撤,但只有一次最大回撤。股价从 9 跌至 7,跌幅为 2。但股票在下一行达到 11 的新高,但随后下跌至 4,跌幅为 7。因此最大跌幅为 7为“B”。

对于“C”,股价从 5 跌至 4,最大回撤为 1。

【问题讨论】:

【参考方案1】:

我们可以得到长格式的数据,group_byname,并使用cummaxmax计算drawdown的值。 Profit 的计算方法是用last 减去first 值,pddprofit 除以drawdown

library(dplyr)

hourlyclose %>%
  tidyr::pivot_longer(cols = A:C) %>%
  group_by(name) %>%
  summarise(drawdown = max(cummax(value) - value), 
            profit  = last(value) - first(value), 
            pdd = profit/drawdown)

# A tibble: 3 x 4
#  name  drawdown profit   pdd
#  <chr>    <dbl>  <dbl> <dbl>
#1 A            4      1 0.25 
#2 B            7      3 0.429
#3 C            1      9 9    

【讨论】:

这是否正确计算回撤?回撤不仅仅是高点减去低点。如果 B = c(9, 2, 15, 14, 13),则最大回撤为 7。价格的顺序很重要。 @otterdog2000 我没有计算 drawdown 的高 - 低。 diff 计算连续值的差值。您可以尝试使用B = c(9, 2, 15, 14, 13),然后-min(diff(B)) 返回7。如果我的理解正确,请告诉我。 好吧,回撤不仅仅针对连续值。对于 B = c(9, 5, 2, 7, 8),回撤仍然是 7。回撤是衡量价格在达到或超过之前的高值之前下跌的幅度(如果有的话)。 我明白了。然后我误解了drawdown 的概念。我已经使用cummax 更新了答案。你现在能检查一下吗?

以上是关于data.frame 中每一列的利润回撤的主要内容,如果未能解决你的问题,请参考以下文章

如何找出 Redshift 表中每一列的大小?

如何获取 HIVE/PySpark 表中每一列的唯一值?

如何计算熊猫数据框中每一列的唯一性?

选择每年利润最高的 SQL

具有 N 列的二维数组中每一列和每一行的总和

试图弄清楚如何使用列表返回数据框中每一列的平均值