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);

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

Примечание

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

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

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

Алгоритмы

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

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

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

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

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

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

Введенный в R2020b