#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. Надеюсь, это поможет.