exponenta event banner

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-May-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    

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

свернуть все

График ввода цен, указанный как timetable. Расписание TT должны удовлетворять следующим условиям:

  • Все наблюдения в TT должны быть связаны с целыми датами, указанными как даты без 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 должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как 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 является NaN, то 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.

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

Метод вычисления 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 связаны с датой tth в TT и представляют собой возврат или разницу tth цены P (t) относительно цены в предыдущем периоде P (t-период). Если дата в предыдущем периоде не найдена вTT, то результат NaN для указания отсутствующего значения.

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

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

Алгоритмы

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

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

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

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

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

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

Представлен в R2020b