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