Периодичная скользящие возвраты или различия от цен
задает опции с использованием одного или нескольких необязательных аргументов пары "имя-значение" в дополнение к входным параметрам в предыдущем синтаксисе.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
TT
- График входа ценВходное расписание цен, заданное как 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')
'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
.
Примечание
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
'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 строк связаны с 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
следующим образом:
Для каждой даты, t в TT
, дата t -period вычисляется .
Если дата t -period является рабочей датой, то эта дата является датой «один период назад»
Если дата t -period не является рабочей датой, то каждый календарный день, предшествующий t -period, исследуется неоднократно до тех пор, пока не будет найдена бизнес-дата, в которую эта дата является датой «один период назад», или предыдущая дата происходит до первой даты в TT
, на какую точку предыдущая бизнес-дата не существует в TT
.
Если дата «один период назад» найдена в TT
, затем регистрируется соответствующий P цены (t -period) и вычисляется обратный R (t). Однако, если дата «один период назад» не найдена в TT
, тогда предыдущий ценовой P (t -period) принимается отсутствующим (то есть неявным NaN
), и возврат R (t) = NaN
.
Предыдущие шаги повторяются до тех пор, пока дата t -period не будет предшествовать первой дате, найденной в TT
, в эту точку алгоритм прекращает работу.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.