【问题标题】:How to calculate a value between two dates in a dataframe?如何计算数据框中两个日期之间的值?
【发布时间】:2018-12-13 06:25:47
【问题描述】:

我正在尝试计算 R 中交易策略的年回报率。我尝试了各种方法,但始终得到不一致的结果。

这是一些测试数据;

             CumBal
2007-01-03 1000000.0
2007-01-04 1000000.0
2007-01-05 1114999.4
2007-01-08  889999.4
2007-01-09 1109997.6
2007-01-10 1179998.8
2007-01-11 1229998.8
2007-01-12 1050000.0
2007-01-16  979998.8
2007-01-17 1284997.6
        ...
2018-05-10 2161996.3
2018-05-11 2161996.3
2018-05-14 2161996.3
2018-05-15 2161996.3
2018-05-16 2137496.0
2018-05-17 2128995.8
2018-05-18 2128995.8
2018-05-21 2128995.8
2018-05-22 2128995.8

策略的总体结果是;

                            Results
Balance                1000000.0000
Final Balance          2133996.1000
Net-Profit             1133996.1000
CAGR                         0.0681
Total Return (%)             1.1340
Sharpe Ratio                 0.0000
Profit Factor                1.1432
Max Loss on Inv %           -0.1100
Max loss on Inv £     -664999.4000
Total Number of Trade      259.0000
% of Win Trades              0.2432
Win:Loss                     0.5207
Ulcer Peformance Index       0.0000

我面临的问题是计算每月和每年的回报。我想这样做来确定年度和月度回报的标准差来计算夏普比率。我试过使用PerformanceAnalytics 包,但是得到的结果与实际性能不一致;

table.CalendarReturns(a.1)
      Jan Feb Mar  Apr  May Jun Jul  Aug Sep   Oct  Nov Dec CumBal
2007  0.0   0   0  0.0  0.0   0   0  0.0   0   0.0  0.0 0.0     NA
2008  0.0   0   0  0.0 12.7   0   0  0.0   0 -18.9  0.0 0.0   -8.6
2009  0.0   0   0  0.0  0.0   0   0  0.0   0   0.0  0.0 0.0     NA
2010 -1.2   0   0  0.0  0.0   0   0  0.0   0   0.0  0.0 0.0   -1.2
2011  0.0   0   0  0.0  0.7   0   0  0.0   0   0.0  0.0 0.0    0.7
2012  0.0   0   0  0.0  0.0   0   0  0.0   0   0.0  0.0 0.0     NA
2013  0.0   0   0 -0.5  0.0   0   0  0.0   0   0.0 -0.5 0.4   -0.5
2014  0.0   0   0  0.0  0.0   0   0  0.3   0   0.0  0.0 0.0    0.3
2015  0.0   0   0  0.0  0.0   0   0  0.0   0   0.0  0.0 0.0     NA
2016 -3.8   0   0 -0.6  0.0   0   0 -0.5   0   0.0  0.3 0.0   -4.5
2017  0.0   0   0  0.0  0.0   0   0  0.0   0   0.0  0.0 0.0     NA
2018 -0.7   0   0  0.0  0.0   0   0   NA  NA    NA   NA  NA   -0.7

然后我尝试了论坛上一位成员的建议,即使用Return.calculaute(),然后使用to.monthly,然后使用table.CalendarReturns()。但是to.monthly 以某种方式输出下面的结果,因此table.CalendarReturns() 不起作用;

a.1 <- data.frame(a.1)
    a.z <- Return.calculate(a.1)
    a.q <- to.monthly(a.z)

结果是……

> a.q
             a.z.Open     a.z.High      a.z.Low    a.z.Close
Jan 2007  0.000000000 0.3112236464 -0.201793831  0.000000000
Feb 2007  0.000000000 0.0000000000  0.000000000  0.000000000
                           ...
Apr 2018  0.000000000 0.0000000000 -0.047367213  0.000000000
May 2018  0.000000000 0.0000000000 -0.011332235  0.000000000
Jun 2018  0.000000000 0.0023486660  0.000000000  0.000000000
Jul 2018  0.000000000 0.0000000000  0.000000000  0.000000000

【问题讨论】:

  • 使用PerformanceAnalytics 包,将CumBal 视为价格并使用Return.calculate 获得每日回报。然后使用to.monthly 将每日收益转换为每月收益。然后可以使用table.CalendarReturns 正确显示每月回报表。
  • 好像不行,我试过了; a.1 &lt;- data.frame(a.1) a.z &lt;- Return.calculate(a.1) a.q &lt;- to.monthly(a.z) table.CalendarReturns(a.q)table.CalendarReturns 不起作用,因为 to.monthly 这样做; &gt; a.q a.z.Open a.z.High a.z.Low a.z.Close Jan 2007 0.000000000 0.3112236464 -0.201793831 0.000000000 Feb 2007 0.000000000 0.0000000000 0.000000000 0.000000000 我现在将编辑帖子以包含此内容。有什么想法吗?
  • 我希望您的输入数据是xts 格式。然后table.CalendarReturns(df_in_xts_format) 应该为您提供所需的月/年回报表。如果这没有帮助,那么您可能需要使用 dput(df) 使用示例数据更新您的帖子,以便我们可以重现问题。
  • 除了验证您的数据是否为xts 格式之外,请查看您的数据值。您 2018 年的结果显示变化不大,有些日子根本没有变化。如果这是大多数数据的典型情况,那么a.q 结果可能是正确的。 table.CalendarReturns 默认情况下仅显示一位数,因此较小的回报将显示为零。最后,我们需要在月表输入中进行更正。试试table.CalendarReturns(a.q[,4], digits = 4)。如果我们有您几个月的数据,这将更容易解决。

标签: r dataframe time-series finance


【解决方案1】:

试试这个:

a.1=xts(CumBal)

# this functions needs monthly returns
table.CalendarReturns(Return.calculate(to.monthly(a.1,drop.time=F)[,4]))

# for annualized Sharpe and SD
a.z <- Return.calculate(a.1) #daily

# all sample
table.AnnualizedReturns(a.z, scale = NA, Rf = 0, geometric = TRUE,
                        digits = 4)
library(lubridate)  # for year
# Columns are "Annualized Return" "Annualized Std Dev" "Annualized Sharpe (Rf=0%)"
# set a different value of daily risk free rate if needed (Rf)
do.call("rbind",
        tapply(a.z,year(a.z),function(xz)table.AnnualizedReturns(xz, scale = NA, Rf = 0, geometric = TRUE,
                        digits = 4)))

do.call("rbind",
        tapply(a.z,as.yearmon(time(a.z)),function(xz)table.AnnualizedReturns(xz, scale = NA, Rf = 0, geometric = TRUE,
                                                        digits = 4)))

你会得到类似这样的东西:

# > table.AnnualizedReturns(a.z, scale = NA, Rf = 0, geometric = TRUE,
# +                         digits = 4)
                               x
# Annualized Return         0.3398
# Annualized Std Dev        0.6307
# Annualized Sharpe (Rf=0%) 0.5388

#"Annualized Return" "Annualized Std Dev"  "Annualized Sharpe (Rf=0%)"

# > do.call("rbind",
#           +         tapply(a.z,as.yearmon(time(a.z)),function(xz)table.AnnualizedReturns(xz, scale = NA, Rf = 0, geometric = TRUE,
#                                                                                          +                                                         digits = 4)))
# [,1]   [,2]     [,3]
# mar 2007  -0.6389 0.5401  -1.1828
# abr 2007   0.1660 0.6364   0.2608
# ...
# abr 2009  -0.9403 0.7410  -1.2689
# mai 2009   0.5594 0.4922   1.1365
# jun 2009  -0.2650 0.6384  -0.4151
# ...
# jul 2011   2.4026 0.6563   3.6610
# ago 2011   0.0385 0.6570   0.0586
# set 2011   5.1043 0.6925   7.3708
# ...
# abr 2018  -0.9262 0.7404  -1.2509
# mai 2018  -0.4648 0.7755  -0.5993

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2012-02-26
    • 2023-03-07
    • 2010-10-07
    • 2018-03-04
    • 2012-01-06
    相关资源
    最近更新 更多