Как рассчитать значение между двумя датами в кадре данных? - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь рассчитать годовой доход от торговой стратегии в 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

1 Ответ

0 голосов
/ 10 июля 2018

Попробуйте это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...