exponenta event banner

Обработка и преобразование дат

Форматы дат

Практически все финансовые данные извлекаются из временных рядов, функции финансового Toolbox™ имеют широкие возможности обработки дат. Функции панели инструментов поддерживают форматы даты или даты и времени как векторы символов, массивы даты и времени или серийные номера дат.

  • Векторы символов даты представляют собой текст, представляющий дату и время, который можно использовать в нескольких форматах. Например, 'dd-mmm-yyyy HH:MM:SS', 'dd-mmm-yyyy', и 'mm/dd/yyyy' все поддерживаемые форматы текста для вектора символов даты. Чаще всего вы работаете с векторами символов даты (например, 14-Sep-1999) при работе с датами.

  • Массивы datetime, созданные с помощью datetime, являются лучшим типом данных для представления точек времени. datetime значения имеют гибкие форматы отображения и до наносекундной точности, а также могут учитывать часовые пояса, переход на летнее и високосное время. Когда datetime объекты используются в качестве входных данных для других функций Financial Toolbox, формат входных данных datetime объект сохраняется. Например:

    originalDate = datetime('now','Format','yyyy-MM-dd HH:mm:ss'); 
      % Find the next business day 
      b = busdate(originalDate)
      b = 
      datetime
       2017-04-20 14:47:39

  • Номера серийных дат представляют календарную дату как количество дней, прошедших с фиксированной базовой даты. В программном обеспечении MATLAB ® серийный номер1 это январь 1 0000 года н.э. Financial Toolbox работает с серийными номерами (например, 730377). MATLAB также использует серийное время для представления долей дней, начинающихся в полночь. Например, 6 вечера равны 0.75 серийные дни, поэтому 18:00 14-Sep-1999, в MATLAB - серийный номер даты 730377.75

Примечание

При указании двузначного года MATLAB предполагает, что этот год находится в пределах 100-летнего периода, в центре которого находится текущий год. См. функцию datenum для получения конкретной информации. Внутренняя обработка даты MATLAB и вычисления не генерируют неоднозначных значений. Однако по возможности используйте серийные номера дат или векторы символов дат, содержащие четырехзначные годы.

Многие функции Financial Toolbox, для которых в качестве входных аргументов требуются даты, принимают векторы символов даты, массивы даты или серийные номера дат. При работе с несколькими датами на уровне командной строки MATLAB более удобны векторы символов даты. При использовании функций Financial Toolbox на большом количестве дат, как при анализе крупных портфелей или денежных потоков, производительность повышается при использовании массивов datetime или серийных номеров дат. Дополнительные сведения см. в разделе Представление дат и времени в MATLAB.

Преобразования дат

Financial Toolbox предоставляет функции, которые преобразуют векторы символов даты в серийные номера дат или из них. Кроме того, можно преобразовать векторы символов или серийные номера дат в массивы datetime.

Функции, преобразующие форматы дат:

datedisp

Отображает числовую матрицу с записями даты, отформатированными как векторы символов даты.

datenum

Преобразует вектор символов даты в порядковый номер даты.

datestr

Преобразует порядковый номер даты в вектор символов даты.

datetime

Преобразует векторы символов даты или серийные номера дат для создания массива datetime.

datevecПреобразует серийный номер даты или вектор символов даты в вектор даты, элементами которого являются [Year Month Day Hour Minute Second].
m2xdate

Преобразует серийный номер MATLAB в серийный номер Excel ®.

x2mdate

Преобразует серийный номер Microsoft ® Excel в серийный номер MATLAB.

Дополнительные сведения см. в разделе Преобразование между массивами Datetime, числами и текстом.

Преобразование между массивами Datetime и векторами символов

Датой может быть символьный вектор, состоящий из полей, связанных с определенной датой и временем. Существует несколько способов представления дат и времени в нескольких текстовых форматах. Например, все следующие векторы символов представляют 23 августа 2010 года в 04:35:42:

'23-Aug-2010 04:35:06 PM'
'Wednesday, August 23'
'08/23/10 16:35'
'Aug 23 16:35:42.946'

Вектор символов даты содержит символы, разделяющие поля, такие как дефис, пробел и двоеточие:

d = '23-Aug-2010 16:35:42'	

Преобразование одного или нескольких векторов символов даты в datetime с использованием массива datetime функция. Для достижения оптимальной производительности укажите формат входных векторов символов в качестве входных данных для datetime.

Примечание

Спецификаторы, которые datetime используется для описания форматов даты и времени, отличающихся от спецификаторов, datestr, datevec, и datenum функции принимают.

t = datetime(d,'InputFormat','dd-MMM-yyyy HH:mm:ss')
t = 

   23-Aug-2010 16:35:42

Хотя строка даты, d, и datetime скаляр, t, похожи, они не равны. Просмотр размера и типа данных каждой переменной.

whos d t
    Name      Size            Bytes  Class       Attributes

  d         1x20               40  char                  
  t         1x1               121  datetime              

Преобразовать a datetime массив к вектору символов, использующему char или cellstr. Например, преобразуйте текущую дату и время в метку времени для добавления к имени файла.

t = datetime('now','Format','yyyy-MM-dd''T''HHmmss')
t = 

  datetime

   2016-12-11T125628
S = char(t);
filename = ['myTest_',S]
filename =

    'myTest_2016-12-11T125628'

Преобразование серийных номеров дат в массивы Datetime

Серийное время может представлять собой доли дней, начинающихся в полночь. Например, 6 вечера равны 0.75 серийные дни, поэтому символьный вектор '31-Oct-2003, 6:00 PM' в MATLAB - номер даты 731885.75.

Преобразование одного или нескольких номеров серийных дат в datetime с использованием массива datetime функция. Укажите тип преобразуемого номера даты:

t = datetime(731885.75,'ConvertFrom','datenum')
t = 

  datetime

   31-Oct-2003 18:00:00

Преобразование массивов Datetime в числовые значения

Некоторые функции MATLAB принимают числовые типы данных, но не значения datetime в качестве входных данных. Чтобы применить эти функции к данным даты и времени, сначала преобразуйте значения datetime в значимые числовые значения, а затем вызовите функцию. Например, log функция принимает double входные данные, но не datetime входные данные. Предположим, что у вас есть datetime массив дат, охватывающих курс исследовательского исследования или эксперимента.

t = datetime(2014,6,18) + calmonths(1:4)
t = 

  1×4 datetime array

   18-Jul-2014   18-Aug-2014   18-Sep-2014   18-Oct-2014

Вычитание исходного значения. Например, исходным значением может быть начальный день эксперимента.

dt = t - datetime(2014,7,1)
dt = 

  1×4 duration array

    408:00:00   1152:00:00   1896:00:00   2616:00:00

dt является duration массив. Новообращенный dt в double массив значений в единицах лет, дней, часов, минут или секунд с использованием years, days, hours, minutes, или seconds функция, соответственно.

x = hours(dt)
x =

         408        1152        1896        2616

Пройти double массив в качестве входных данных для log функция.

y = log(x)
y =

    6.0113    7.0493    7.5475    7.8694

Преобразование входных данных с помощью datenum

datenum функция важна для эффективного использования программного обеспечения Financial Toolbox. datenum принимает входной вектор символов даты в любом из нескольких форматов, с 'dd-mmm-yyyy', 'mm/dd/yyyy', или 'dd-mmm-yyyy, hh:mm:ss.ss' форматы являются наиболее распространенными. Входной символьный вектор даты может иметь до шести полей, образованных буквами и цифрами, разделенными любыми другими символами, так что:

  • Поле дня является целым числом от 1 через 31.

  • Поле месяца является целым числом от 1 через 12 или алфавитный символьный вектор, содержащий не менее трех символов.

  • Поле года является неотрицательным целым числом. Если указаны только два числа, то предполагается, что год находится в пределах 100-летнего периода, ориентированного на текущий год. Если год опущен, по умолчанию используется текущий год.

  • Поля часов, минут и секунд являются необязательными. Они целые числа, разделенные двоеточием или 'am' или 'pm'.

Например, если текущим годом является 1999 год, то все эти даты эквивалентны:

'17-May-1999'
'17-May-99'
'17-may'
'May 17, 1999'
'5/17/99'
'5/17'

Кроме того, оба этих формата представляют одно и то же время.

'17-May-1999, 18:30'
'5/17/99/6:30 pm'

Формат по умолчанию для ввода только чисел соответствует соглашению США. Поэтому 3/6 - это 6 марта, а не 3 июня.

С datenum, можно преобразовать даты в формат серийных дат, сохранить их в матричной переменной, а затем передать переменную в функцию. Кроме того, можно использовать datenum непосредственно в списке входных аргументов функции.

Например, рассмотрим функцию bndprice которая вычисляет цену облигации с учетом доходности до погашения. Сначала настройте переменные для доходности до срока погашения, ставки купона и необходимых дат.

Yield       = 0.07;
CouponRate  = 0.08;
Settle      = datenum('17-May-2000');
Maturity    = datenum('01-Oct-2000');

Затем вызовите функцию с переменными.

bndprice(Yield,CouponRate,Settle,Maturity)
ans =

  100.3503

Также можно преобразовать векторы символов даты в серийные номера дат непосредственно в списке аргументов ввода функции.

bndprice(0.07,0.08,datenum('17-May-2000'),... 
datenum('01-Oct-2000'))
ans =

  100.3503

bndprice является примером функции, предназначенной для обнаружения наличия векторов символов даты и автоматического преобразования. Для таких функций, как bndprice, векторы символов даты могут передаваться непосредственно.

bndprice(0.07,0.08,'17-May-2000','01-Oct-2000')
ans =

  100.3503

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

Помните, что при создании вектора входных символьных векторов даты используйте вектор столбца и убедитесь, что все символьные векторы имеют одинаковую длину. Для обеспечения одинаковой длины символьных векторов заполните их пробелами или нулями. Дополнительные сведения см. в разделе Ввод вектора символов.

Преобразование выходных данных с помощью datestr

datestr функция преобразует порядковый номер даты в один из 19 различных форматов вывода вектора символов даты, показывающих дату, время или и то, и другое. Выводом по умолчанию для дат является вектор символов «день-месяц-год», например: 24-Aug-2000. datestr полезна для подготовки выходных отчетов.

datestr Формат

Описание

01-Mar-2000 15:45:17

день-месяц-год час: минута: секунда

01-Mar-2000

день-месяц-год

03/01/00

месяц/день/год

Mar

месяц, три буквы

M

месяц, одна буква

3

номер месяца

03/01

месяц/день

1

день месяца

Wed

день недели, три буквы

W

день недели, одно письмо

2000

год, четыре числа

99

год, два числа

Mar01

месяц год

15:45:17

час: минута: секунда

03:45:17 PM

час: минута: вторая половина дня или вторая половина дня

15:45

час: минута

03:45 PM

час: минута утра или PM

Q1-99

календарный квартал-год

Q1

календарный квартал

Текущая дата и время

today и now функции возвращают последовательные числа даты для текущей даты и текущей даты и время, соответственно.

today
ans =

      736675
now
ans =

   7.3668e+05

Функция MATLAB date возвращает вектор символов для текущей даты.

date
ans =

    '11-Dec-2016'

Определение конкретных дат

Financial Toolbox предоставляет множество функций для определения конкретных дат. Например, предположим, что процедура учета запланирована на последнюю пятницу каждого месяца. Используйте lweekdate функция - вернуть эти даты на 2000 год. Входной аргумент 6 указывает пятницу.

Fridates = lweekdate(6,2000,1:12);
Fridays = datestr(Fridates)
Fridays =

  12×11 char array

    '28-Jan-2000'
    '25-Feb-2000'
    '31-Mar-2000'
    '28-Apr-2000'
    '26-May-2000'
    '30-Jun-2000'
    '28-Jul-2000'
    '25-Aug-2000'
    '29-Sep-2000'
    '27-Oct-2000'
    '24-Nov-2000'
    '29-Dec-2000'

Другим примером необходимости конкретных дат может быть то, что ваша компания закрывается на Мартина Лютера Кинга-младшего. День, который является третьим понедельником января. Вы можете использоватьnweekdate определение конкретных сроков на 2011 - 2014 годы.

MLKDates = nweekdate(3,2,2011:2014,1);
MLKDays = datestr(MLKDates)
MLKDays =

  4×11 char array

    '17-Jan-2011'
    '16-Jan-2012'
    '21-Jan-2013'
    '20-Jan-2014'

Определение праздничных дней

Учет праздников и других неторговых дней важен при анализе финансовых дат. Financial Toolbox предоставляет holidays функция, которая содержит праздники и специальные неторговые дни для Нью-Йоркской фондовой биржи с 1950 по 2030 год включительно. Кроме того, можно использовать nyseclosures для оценки всех известных или ожидаемых закрытий Нью-Йоркской фондовой биржи с 1 января 1885 года по 31 декабря 2050 года. nyseclosures возвращает вектор серийных номеров дат, соответствующих закрытию рынка между датами StartDate и EndDate, включительно.

В этом примере используйте holidays определить стандартные праздники в последней половине 2012 года.

LHHDates = holidays('1-Jul-2012','31-Dec-2012');
LHHDays = datestr(LHHDates)
LHHDays =

  6×11 char array

    '04-Jul-2012'
    '03-Sep-2012'
    '29-Oct-2012'
    '30-Oct-2012'
    '22-Nov-2012'
    '25-Dec-2012'

Затем можно использовать busdate определение следующего рабочего дня в 2012 году после этих праздников.

LHNextDates = busdate(LHHDates);
LHNextDays = datestr(LHNextDates)
LHNextDays =

  6×11 char array

    '05-Jul-2012'
    '04-Sep-2012'
    '31-Oct-2012'
    '31-Oct-2012'
    '23-Nov-2012'
    '26-Dec-2012'

Определение дат движения денежных средств

Для определения сроков движения денежных средств по ценным бумагам с периодическими платежами используйте cfdates. Эта функция учитывает купоны в год, базу подсчета дней и правило конца месяца. Например, можно определить даты денежных потоков для ценной бумаги, выплачивающей четыре купона в год в последний день месяца, используя actual/365 на основе количества дней. Для этого введите дату расчета, дату погашения и параметры для Period, Basis, и EndMonthRule.

PayDates = cfdates('14-Mar-2000','30-Nov-2001',4,3,1);
PayDays = datestr(PayDates)
PayDays =

  7×11 char array

    '31-May-2000'
    '31-Aug-2000'
    '30-Nov-2000'
    '28-Feb-2001'
    '31-May-2001'
    '31-Aug-2001'
    '30-Nov-2001'

См. также

| | | | | | | | | | | | | | |

Связанные примеры

Подробнее

Внешние веб-сайты