Несоответствие вычислений просадки

#r #time-series #finance

#r #временные ряды #финансы

Вопрос:

Я хотел бы попросить вас прояснить следующий вопрос, который имеет для меня чрезвычайное значение, поскольку большая часть моей магистерской диссертации основана на правильной реализации данных, вычисленных в следующем примере. У меня есть список финансовых временных рядов, которые выглядят следующим образом (пример AUDUSD):

              Open   High    Low   Last
1992-05-18 0.7571 0.7600 0.7565 0.7598
1992-05-19 0.7594 0.7595 0.7570 0.7573
1992-05-20 0.7569 0.7570 0.7548 0.7562
1992-05-21 0.7558 0.7590 0.7540 0.7570
1992-05-22 0.7574 0.7585 0.7555 0.7576
1992-05-25 0.7575 0.7598 0.7568 0.7582
 

Из этих данных я вычисляю лог-возврат для последнего столбца, чтобы получить что-то вроде этого

                     Last
1992-05-19 -0.0032957646
1992-05-20 -0.0014535847
1992-05-21  0.0010573620
1992-05-22  0.0007922884
 

Теперь я хочу рассчитать просадки в приведенных выше временных рядах, которые я достигаю с помощью (из пакета PerformanceAnalytics)

     ddStats <- drawdownsStats(timeSeries(AUDUSDLgRetLast[,1], rownames(AUDUSDLgRetLast)))
 

что приводит к следующему результату (вот только первые 5 строк, но он возвращает каждую просадку, включая также однодневные)

          From     Trough         To         Depth Length ToTrough Recovery
1  1996-12-03 2001-04-02 2007-07-13 -0.4298531511   2766     1127     1639
2  2008-07-16 2008-10-27 2011-04-08 -0.4003839141    713       74      639
3  2011-07-28 2014-01-24 2014-05-13 -0.2254426369    730      652       NA
4  1992-06-09 1993-10-04 1994-12-06 -0.1609854215    650      344      306
5  2007-07-26 2007-08-16 2007-09-28 -0.1037999707     47       16       31
 

Теперь проблема заключается в следующем: глубина наихудшей просадки (в соответствии с верхним выводом) составляет -0,4298, тогда как, если я выполняю следующие вычисления «вручную», я получаю

     (AUDUSD[as.character(ddStats[1,1]),4]-AUDUSD[as.character(ddStats[1,2]),4])/(AUDUSD[as.character(ddStats[1,1]),4])
    [1] 0.399373
 

Чтобы было понятнее, это две строки из фрейма данных AUDUSD для дат от и до:

     AUDUSD[as.character(ddStats[1,1]),]
               Open   High    Low   Last
    1996-12-03 0.8161 0.8167 0.7845 0.7975

    AUDUSD[as.character(ddStats[1,2]),]
               Open   High    Low  Last
    2001-04-02 0.4858 0.4887 0.4773 0.479
 

Кроме того, другие отделы просадки не согласны с вычислениями «вручную». Чего мне не хватает? Как получилось, что эти два числа, которые должны быть одинаковыми, отличаются на значительную величину?

Комментарии:

1. Как вы выбрали входное значение для своего «вручную», и можете ли вы проверить, что именно эти значения (например, никаких других промежуточных элементов) используются в drawdownsStats функции?

2. У вас есть исходный код для функций просадки PerformanceAnalytics. Сравните это с вашими вычислениями «вручную».

3. Функция drawdownStats является частью пакета timeseries.

Ответ №1:

Я попытался воспроизвести просадку с помощью:

cumsum(rets) -cummax(cumsum(rets))

где rets — это вектор ваших логарифмических возвратов.

По какой-то причине, когда я вычисляю просадки, которые, скажем, составляют менее 20%, я получаю те же результаты, table.Drawdowns() что и amp; drawdownsStats() , но когда есть большая разница, скажем, просадки более 35%, тогда максимальная просадка начинает расходиться между вычислениями. Более конкретно table.Drawdowns() , amp; drawdownsStats() завышены (по крайней мере, то, что я заметил). Я не знаю, почему это так, но, возможно, что может помочь, если вы используете доверительный интервал для больших просадок (более 35%), используя стандартную ошибку просадки. Я бы использовал: 0.4298531511/sqrt(1127) который является max drawdown/sqrt(depth to trough) . Это даст /- 0,01280437 или просадку от 0,4169956 до 0,4426044 соответственно, при этом нижний интервал 0,4169956 намного ближе к вашему «ручному» вычислению 0,399373. Надеюсь, это поможет.