Скользящая доходность за период или разницы от цен
указывает параметры, использующие один или несколько необязательных аргументов пары имя-значение в дополнение к входным аргументам в предыдущем синтаксисе.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
TT - График ввода ценГрафик ввода цен, указанный как 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.74returns форматируются как три возврата для трех ценовых переменных. 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')'Period' - Период для вычисления возвратов за периодTT.Properties.TimeStep
(по умолчанию) | длительность скалярного календаряПериод для вычисления результатов периода над периодом, указанный как пара, разделенная запятыми, состоящая из 'EndMonthRule' и длительность скалярного календаря (например, caldays, calweeks, или calmonths).
По умолчанию используется временной шаг, определенный в TT (TT.Properties.TimeStep), но только когда TT.Properties.TimeStep не является NaN. Если TT.Properties.TimeStep является NaN, то Period требуется.
Типы данных: double
'EndOfMonth' - Флаг конца месяца указывает, сравниваются ли цены на текущую дату с последней датой месяца за предыдущий Period
false (по умолчанию) | значение true или falseФлаг конца месяца указывает, сравниваются ли цены на текущую дату с последней датой месяца для предыдущего 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
'Method' - Метод вычисления returns от цен'simple' (по умолчанию) | символьный вектор со значением 'simple', 'continuous', или 'difference'Метод вычисления 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
returns - десятичная доходность или разница между периодами;Десятичные возвраты или разницы за период, возвращаемые в виде расписания того же размера и формата, что и входной аргумент 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 следующим образом:
Для каждой даты t в TT, вычисляется дата t-периода.
Если дата t-period является бизнес-датой, то эта дата является датой «один период назад».
Если дата t-периода не является рабочей датой, то каждый календарный день, предшествующий t-периоду, проверяется повторно до тех пор, пока не будет найдена рабочая дата, в этот момент эта дата является датой «один период назад», или предшествующая дата наступает до первой даты в TT, в который момент не существует предыдущей рабочей даты в TT.
Если дата «один период назад» найдена в TTзатем записывают соответствующую цену P (t-период) и вычисляют возврат R (t). Однако, если дата «один период назад» не найдена вTT, то предыдущая цена P (t-период) предполагается отсутствующей (то есть неявнойNaN) и возвращаемое значение R (t) =NaN.
Предыдущие шаги повторяются до даты t-периода, предшествующей первой дате, найденной в TT, в этот момент алгоритм завершается.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.