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 可以被视为股票代码。每一行都可以被认为是每小时收盘价。价格日期和小时可以组合起来形成这个时间序列数据的时间戳。
我曾尝试使用fTrading
和PerformanceAnalytics
包来计算最大回撤,但不断出现错误。我不在乎何时出现最大回撤。我只需要最大回撤金额,以便我可以使用它来计算利润/回撤(利润除以最大回撤)比率。
数据:
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_by
name
,并使用cummax
和max
计算drawdown
的值。 Profit
的计算方法是用last
减去first
值,pdd
是profit
除以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 中每一列的利润回撤的主要内容,如果未能解决你的问题,请参考以下文章