rollingreturns

Прокрутка периода за период возвращается или различия от цен

Описание

пример

returns = rollingreturns(TT) вычисляет период за период (PoP) возвращается или различия от соответствующих цен. Для каждой даты в расписании TT, возврат представляет PoP, возвращают соответствующей цены по сравнению с ценой один Period ранее.

пример

returns = rollingreturns(___,Name,Value) задает опции с помощью одного или нескольких дополнительных аргументов пары "имя-значение" в дополнение к входным параметрам в предыдущем синтаксисе.

Примеры

свернуть все

То В этом примере показано, как вычислить год по году, прокручиваясь, возвращается в течение пяти лет симулируемых ежедневных цен и также включает осведомленность бизнес-календаря.

Симулируйте пять лет ежедневных цен и сохраните результат в расписании TT. Затем используйте isbusday сохранить только данные для дат бизнеса Нью-Йоркской фондовой биржи (NYSE).

rng(200,'twister')
time = (datetime(2014,1,1):caldays:datetime(2018,12,31))';
price = 100 + 0.1*(0:numel(time) - 1)'.*cumsum(randn(numel(time),1)/100); 
price = round(price*100)/100;                 % Round prices to the nearest penny
TT = timetable(price,'RowTimes',time,'VariableNames',{'Prices'});
TT = TT(isbusday(TT.Properties.RowTimes),:);  % Retain only NYSE business days
head(TT,10)
ans=10×1 timetable
       Time        Prices
    ___________    ______

    02-Jan-2014       100
    03-Jan-2014       100
    06-Jan-2014    100.01
    07-Jan-2014    100.02
    08-Jan-2014    100.02
    09-Jan-2014    100.04
    10-Jan-2014    100.06
    13-Jan-2014    100.11
    14-Jan-2014    100.12
    15-Jan-2014    100.12

Используйте addBusinessCalendar добавить осведомленность бизнес-календаря NYSE. Логика бизнес-календаря определяет, является ли дата предыдущего периода бизнес-датой, и если это не, затем новый рабочий день, предшествующий той дате, найден. Например, начиная с 21-May-2016 суббота и 22-May-2016 воскресенье, цены года по году в течение понедельника 22-May-2017 сравниваются пятница 20 мая 2016.

TT = addBusinessCalendar(TT);  % Add NYSE business calendar

Вычислите год по году, возвращается, и отобразите последние несколько цен, и соответствие возвращается.

returns = rollingreturns(TT, 'Period', calyears);
tail([TT returns])
ans=8×2 timetable
       Time        Prices    Prices_Return_1y
    ___________    ______    ________________

    19-Dec-2018    212.68        0.16941     
    20-Dec-2018    215.54        0.19024     
    21-Dec-2018    217.66        0.18648     
    24-Dec-2018    221.42        0.20882     
    26-Dec-2018    224.81        0.21473     
    27-Dec-2018    222.17        0.19897     
    28-Dec-2018    224.63        0.19142     
    31-Dec-2018    224.37        0.19206     

Об экономических данных часто сообщают в прошлый день каждого месяца или четверти. Таким образом, неоднозначности конца месяца могут возникнуть, когда вычислительный период за период возвращается в течение периодов, которые превышают периодичность, в которой сообщают о данных.

Симулируйте пять лет ежедневных цен и сохраните результат в расписании TT.

rng(200,'twister')
time = (datetime(2014,1,1):caldays:datetime(2018,12,31))';
price = 100 + 0.1*(0:numel(time) - 1)'.*cumsum(randn(numel(time),1)/100); 
price = round(price*100)/100;         % Round prices to the nearest penny
TT = timetable(price,'RowTimes',time,'VariableNames',{'Prices'});
head(TT,10)
ans=10×1 timetable
       Time        Prices
    ___________    ______

    01-Jan-2014       100
    02-Jan-2014       100
    03-Jan-2014       100
    04-Jan-2014       100
    05-Jan-2014    100.01
    06-Jan-2014    100.01
    07-Jan-2014    100.02
    08-Jan-2014    100.02
    09-Jan-2014    100.04
    10-Jan-2014    100.06

Создайте новое расписание путем выборки TT в прошлый день каждого месяца, который будет подражать ежемесячно созданию отчетов.

monthEndDates = dateshift(TT.Time(1):calmonths:TT.Time(end),'end','month'); 
TT = TT(monthEndDates,:);   % Sample TT at end-of-month dates
head(TT,10)
ans=10×1 timetable
       Time        Prices
    ___________    ______

    31-Jan-2014    100.47
    28-Feb-2014    100.93
    31-Mar-2014       102
    30-Apr-2014    102.28
    31-May-2014    103.22
    30-Jun-2014    103.92
    31-Jul-2014     102.2
    31-Aug-2014    104.79
    30-Sep-2014    103.11
    31-Oct-2014    105.29

Отобразите подмножество дат и сравните прямое вычисление дат в предыдущих месяцах к переключенным в конец месяца, в котором происходит предыдущий период.

dates = timerange(datetime(2016,2,29),datetime(2017,2,28),'month');
[TT.Time(dates) (TT.Time(dates) - calyears) dateshift(TT.Time(dates) - calyears,'end','month')]
ans = 13x3 datetime
   29-Feb-2016   28-Feb-2015   28-Feb-2015
   31-Mar-2016   31-Mar-2015   31-Mar-2015
   30-Apr-2016   30-Apr-2015   30-Apr-2015
   31-May-2016   31-May-2015   31-May-2015
   30-Jun-2016   30-Jun-2015   30-Jun-2015
   31-Jul-2016   31-Jul-2015   31-Jul-2015
   31-Aug-2016   31-Aug-2015   31-Aug-2015
   30-Sep-2016   30-Sep-2015   30-Sep-2015
   31-Oct-2016   31-Oct-2015   31-Oct-2015
   30-Nov-2016   30-Nov-2015   30-Nov-2015
   31-Dec-2016   31-Dec-2015   31-Dec-2015
   31-Jan-2017   31-Jan-2016   31-Jan-2016
   28-Feb-2017   28-Feb-2016   29-Feb-2016

Исследуйте эти результаты и заметьте, что даты во вторых и третьих столбцах последней строки отличаются. А именно, когда текущей датой в первом столбце является 28-Feb-2017 даты во вторых и третьих столбцах отличаются, потому что 2016 високосный год. В более общем плане даты отличаются каждый раз, когда месяц предыдущего периода имеет больше дней, чем текущий месяц, в течение которого вычисляются возвраты. В этом примере даты конца месяцев представляют следующую неоднозначность. Когда текущей датой интереса является 28-Feb-2017, если вычитание одного календарного года производит 28-Feb-2016 или 29-Feb-2016?

Правильный ответ зависит от приложения, и оба подхода являются допустимыми вариантами использования. Эта проблема усилена, например, когда работа с ценовыми данными конца ежемесячного журнала и вычислительный месяц по месяцу возвращается. Обратиться к неоднозначности конца месяца, rollingreturns функционируйте поддерживает EndOfMonth флаг.

returns = rollingreturns(TT, 'Period', calyears, 'EndOfMonth', true);

EndOfMonth флаг гарантирует что rollingreturns функционируйте использует правильную дату конца месяца каждого календарного месяца. В этом примере, возврате на 28-Feb-2017 правильно вычисляется из цены, сообщил 29-Feb-2016 вместо 28-Feb-2016.

[TT(dates,:) returns(dates,:)]
ans=13×2 timetable
       Time        Prices    Prices_Return_1y
    ___________    ______    ________________

    29-Feb-2016    135.59         0.21671    
    31-Mar-2016    138.47         0.25052    
    30-Apr-2016    131.44         0.11598    
    31-May-2016    129.34        0.083068    
    30-Jun-2016    133.86        0.077865    
    31-Jul-2016    132.78        0.046253    
    31-Aug-2016    140.32         0.11871    
    30-Sep-2016    136.52        0.087549    
    31-Oct-2016    141.27         0.10652    
    30-Nov-2016    140.76          0.1053    
    31-Dec-2016    135.96        0.057643    
    31-Jan-2017    129.52       0.0099025    
    28-Feb-2017    136.36       0.0056789    

Входные параметры

свернуть все

Введите расписание цен в виде a timetable. Расписание TT должен удовлетворить следующим условиям:

  • Все наблюдения в TT должен быть сопоставлен с целыми датами, заданными как datetimes без HH:MM:SS компонент времени (никакой компонент времени суток).

  • TT даты должны быть отсортированы в порядке возрастания.

  • TT не должен иметь никаких дублирующихся дат.

  • Каждая переменная в TT должен содержать или один числовой вектор или числовую матрицу цен. Например, предположите TT содержит три переменные ежедневных цен.

             Time        Price1    Price2         Prices     
          ___________    ______    ______    ________________
          24-Dec-2018    221.42    442.84    221.42    442.84
          25-Dec-2018    220.62    441.24    220.62    441.24
          26-Dec-2018    224.81    449.62    224.81    449.62
          27-Dec-2018    222.17    444.34    222.17    444.34
          28-Dec-2018    224.63    449.26    224.63    449.26
          29-Dec-2018    225.36    450.72    225.36    450.72
          30-Dec-2018    226.73    453.46    226.73    453.46
          31-Dec-2018    224.37    448.74    224.37    448.74
    Соответствующий ежедневный returns отформатированы, когда три возвращается для трех ценовых переменных.
            Time        Price1_Return    Price2_Return       Prices_Return    
          ___________    _____________    _____________   _____________________
          24-Dec-2018           NaN              NaN            NaN         NaN
          25-Dec-2018     -0.003613        -0.003613      -0.003613   -0.003613
          26-Dec-2018      0.018992         0.018992       0.018992    0.018992
          27-Dec-2018     -0.011743        -0.011743      -0.011743   -0.011743
          28-Dec-2018      0.011073         0.011073       0.011073    0.011073
          29-Dec-2018      0.003249         0.003249       0.003249    0.003249
          30-Dec-2018      0.006079         0.006079       0.006079    0.006079
          31-Dec-2018     -0.010409        -0.010409      -0.010409   -0.010409

Примечание

Чтобы включать осведомленность бизнес-календаря и учетную запись в течение многих нерабочих дней (например, выходные, праздники, закрытия рынка), необходимо сначала использовать addBusinessCalendar функция, чтобы заполнить пользовательское свойство для входа TT. Например, чтобы добавить логику бизнес-календаря, чтобы включать только рабочие дни NYSE, можно использовать TT = addBusinessCalendar(TT).

Типы данных: timetable

Аргументы name-value

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: returns = rollingreturns(TT,'Period',calweeks(1),'EndOfMonth',true,'Method','continuous')

Период, чтобы вычислить период за период возвращается в виде разделенной запятой пары, состоящей из 'EndMonthRule' и скалярная календарная длительность (например, caldays, calweeks, или calmonths).

Значением по умолчанию является временной шаг, заданный в TT (TT.Properties.TimeStep), но только когда TT.Properties.TimeStep не NaN. Если TT.Properties.TimeStep isnan, затем Period требуется.

Типы данных: double

Флаг конца месяца указывает, сравниваются ли цены в текущей дате с последней датой месяца для предыдущего PeriodВ виде разделенной запятой пары, состоящей из 'EndOfMonth' и скалярное логическое значение true или false.

  • Если вы устанавливаете EndOfMonth к true (логический 1), означая, что текущие цены сравниваются с ценами конца месяца предыдущего Period.

  • Если вы устанавливаете EndOfMonth к false (логический 0), означая, что текущие цены сравниваются с ценами, зарегистрированными в фактическую дату предыдущего Period.

Примечание

EndOfMonth флаг предназначается, чтобы обратиться к вычислениям даты конца месяца при вычислении дат предыдущего Period один или несколько месяцев в прошлом.

Например, предположите, что вы имеете ежемесячные цены, о которых сообщают в конце каждого месяца, и хотите вычислить год по году, возвращается (то есть, Period = calyears(1)). Когда текущей датой интереса является 28-Feb-2017, установка EndOfMonth = true (логический 1) гарантирует, что возвращается вычисленный для 28-Feb-2017 сравните цены на 28-Feb-2017 тем на 29-Feb-2016 вместо 28-Feb-2016.

Точно так же предположите, что вы имеете ежемесячные цены, о которых сообщают в конце каждого месяца, и хотите вычислить месяц по месяцу, возвращается (то есть, Period = calmonths(1)). Когда текущей датой интереса является 30-Apr-2020, установка EndOfMonth = true (логический 1) гарантирует, что возвращается вычисленный для 30-Apr-2020 сравните цены на 30-Apr-2020 тем на 31-Mar-2020 вместо 30-Mar-2020.

Типы данных: логический

Метод для вычисления returns от цен в виде разделенной запятой пары, состоящей из 'Method' и скалярный вектор символов.

  • 'simple' — Вычислите простые (пропорциональные) возвраты: R(t) = P(t)/P(t-period) - 1.

  • 'continuous' — Вычислите непрерывные (логарифмические) возвраты: R(t) = log(P(t)/P(t-period)).

  • 'difference' — Вычислите различия (изменения периода за период): R(t) = P(t) - P(t-period)

Типы данных: char

Выходные аргументы

свернуть все

Десятичное число периода за период возвращается или различия, возвращенные как расписание, одного размера и формат как входной параметр TT. Возвраты или различия в строке t сопоставлены с t th дата в TT и представляйте возврат или различие t th цена P (t) относительно цены в предыдущий период P (t - период). Если дата в предыдущий период не найдена в TT, затем результатом является NaN указать на отсутствующее значение.

Имена переменных в выходе append _Return или _Difference к именам переменных в TT для возвратов и различий, соответственно, сопровождаемый периодом используется в результатах периода за период. Например, если TT имеет переменную под названием ABC и возвраты недели по неделе вычисляются для Period из calweeks(1), соответствующую выходную переменную называют ABC_Returns_1w.

rollingreturns функция агрегации, в которой частота, в который зарегистрированы цены, должен равняться или превысить в который returns или различия вычисляются. Например, ежедневные цены могут ежедневно использоваться для расчета, еженедельно, или ежемесячный returns, но вычисление ежедневного returns от еженедельных или ежемесячных цен обычно не имеет никакого смысла.

Алгоритмы

Результаты периода за период вычисляются для каждой даты в TT можно следующим образом:

  1. Для каждой даты t в TT, дата t - период вычисляется.

    • Если дата t - период является бизнес-датой, то эта дата является датой "один период назад"

    • Если дата t - период не является бизнес-датой, то каждый календарный день, предшествуя t - период неоднократно исследуется, пока бизнес-дата не найдена, в которой точке эта дата является датой "один период назад", или предыдущая дата происходит до первого свидания в TT, в которой точке никакая предыдущая бизнес-дата не существует в TT.

  2. Если дата "один период назад" найдена в TT, затем соответствующая цена, P (t - период) зарегистрирован и возврат R (t), вычисляется. Однако, если дата "один период назад" не найдена в TT, затем предыдущая цена P (t - период) принята, отсутствуя (то есть, неявный NaN), и возврат R (t) = NaN.

  3. Предыдущие шаги повторяются до даты t - период предшествует первому свиданию, найденному в TT, в которой точке алгоритм останавливается.

Смотрите также

| |

Введенный в R2020b