среда, 13 января 2016 г.

Работа с финансовыми временными рядами в R. Часть 6. Работа с данными в виде объектов Time Series



Представление данных в виде объектов Time Series

Данные временных рядов, разделенные фиксированными промежутками времени, могут быть представлены в виде объектов класса ts. Такие данные обычно являются месячными, квартальными или ежегодными. Объекты класса ts создаются с помощью функции - конструктора ts(). Пример:  

> rtsi.ts = ts(data=rtsi.df$X.CLOSE, frequency = 12,start=c(2013,1), end=c(2014,12))
> class(rtsi.ts)
[1] "ts"

> micex.ts = ts(data=micex.df$X.CLOSE, frequency = 12,start=c(2013,1), end=c(2014,12))
> class(micex.ts)
[1] "ts"
Аргумент "frequency = 12" задает интервал времени между данными - помесячно. Начальный и конечный месяцы задаются в виде векторов из двух элементов, первый из которых задает год, второй - месяц. При выводе объекта ts он показывает даты, соотнесенные с данными.

Функции start() и end() показывают первую и последнюю данные, ассоциированные с данными.


> start(rtsi.ts)
[1] 2013    1
> end(rtsi.ts)
[1] 2014   12

Функция  time() извлекает показатель времени как объект ts.

> time(rtsi.ts)
         Jan      Feb      Mar      Apr      May      Jun      Jul      Aug...
2013 2013.000 2013.083 2013.167 2013.250 2013.333 2013.417 2013.500 2013.583...
2014 2014.000 2014.083 2014.167 2014.250 2014.333 2014.417 2014.500 2014.583...

Частота данных (за год) и временной интервал между наблюдениями можно извлечь из объекта ts с помощью следующих функций:
> frequency(rtsi.ts)
[1] 12
> deltat(rtsi.ts)
[1] 0.08333333
Тем не менее, извлечение подмножества из объекта ts дает нам числовой объект.
> tmp<-rtsi .ts="" span="">
> class(tmp)
[1] "numeric"
> tmp
[1] 1622.13 1534.41 1460.04 1407.21 1331.43

Для того, чтобы извлечь подмножество объекта ts, и при этом сохранить данные в первозданном виде, используйте функцию window().
> tmp = window(rtsi.ts, start=c(2014, 3), end=c(2014,8))
> class(tmp)
[1] "ts"
> tmp
        Mar     Apr     May     Jun     Jul     Aug
2014 1226.10 1155.70 1295.75 1366.08 1219.36 1190.23

Объединение объектов ts
Для объединения объектов rtsi.ts и micex.ts в один объект используется функция cbind().

> rtsmic.ts = cbind(rtsi.ts, micex.ts)
> class(rtsmic.ts)
[1] "mts"    "ts"     "matrix"

Так как rtsmic.ts содержит два объекта, ему присваивается дополнительный класс mts  (multiple time series). Первые пять строк объекта:

> window(rtsmic.ts, start=c(2013, 1), end=c(2013,4))
        rtsi.ts micex.ts
Jan 2013 1622.13  1547.18
Feb 2013 1534.41  1487.46
Mar 2013 1460.04  1440.02
Apr 2013 1407.21  1386.69

Построение графиков объектов ts

У объектов класса ts есть собственный метод для построения графиков (plot.ts).
> plot(rtsi.ts, col="blue", lwd=2, ylab="Adjusted close",main="Monthly closing price of RTS")


Для построения графика подмножества объекта используем функцию window() внутри метода plot.ts():

> plot(window(rtsi.ts, start=c(2014,1), end=c(2014,11)), ylab="Adjusted close",
col="blue", lwd=2,  main="Monthly closing price of RTS")


Для объектов ts с несколькими столбцами (объекты класса mts), можно построить графики двух типов. Первый - отображает каждый ряд в отдельном графике:

> plot(rtsmic.ts)


Второй тип помещает обе серии на одном графике.

> plot(rtsmic.ts, plot.type="single", main="Monthly closing prices on RTS and MICEX", ylab="Adjusted close price",col=c("blue", "red"), lty=1:2)
> legend(2013.0, 1200, legend=c("RTSI","MICEX"), col=c("blue", "red"),lty=1:2)


Работа с объектами ts и расчет доходности

Среди наиболее распространенных операций над временными рядами можно указать расчет временной задержки (лага) или разницы. Для этого используются функции  lag() и diff(). Например, чтобы временную задержку ценовых данных в rtsi.ts на один период, используется команда:

> lag(rtsi.ts)
       
Для временной задержки 12 периодов:
> lag(rtsi.ts, k=12)

Обратите внимание, что происходит, когда мы объединяем объект ts с его лагом:

> cbind(rtsi.ts, lag(rtsi.ts))
        rtsi.ts lag(rtsi.ts)
Dec 2012      NA      1622.13
Jan 2013 1622.13      1534.41
Feb 2013 1534.41      1460.04
Mar 2013 1460.04      1407.21
Apr 2013 1407.21      1331.43
May 2013 1331.43      1275.44
Jun 2013 1275.44      1313.38
Jul 2013 1313.38      1290.96
Aug 2013 1290.96      1422.49
Sep 2013 1422.49      1480.42
Oct 2013 1480.42      1402.93
Nov 2013 1402.93      1442.73
Dec 2013 1442.73      1301.02
Jan 2014 1301.02      1267.27
Feb 2014 1267.27      1226.10
Mar 2014 1226.10      1155.70
Apr 2014 1155.70      1295.75
May 2014 1295.75      1366.08
Jun 2014 1366.08      1219.36
Jul 2014 1219.36      1190.23
Aug 2014 1190.23      1123.72
Sep 2014 1123.72      1091.44
Oct 2014 1091.44       974.27
Nov 2014  974.27       945.51
Dec 2014  945.51           NA

Функция lag() сдвигает временной показатель назад на значение k. Для сдвига временного показателя вперед необходимо использовать отрицательные k.

> lag(rtsi.ts, k=-1)
> lag(rtsi.ts, k=-12)
> cbind(rtsi.ts, lag(rtsi.ts, k=-1))
        rtsi.ts lag(rtsi.ts, k = -1)
Jan 2013 1622.13                   NA
Feb 2013 1534.41              1622.13
Mar 2013 1460.04              1534.41
Apr 2013 1407.21              1460.04
May 2013 1331.43              1407.21
Jun 2013 1275.44              1331.43
Jul 2013 1313.38              1275.44
Aug 2013 1290.96              1313.38
Sep 2013 1422.49              1290.96
Oct 2013 1480.42              1422.49
Nov 2013 1402.93              1480.42
Dec 2013 1442.73              1402.93
Jan 2014 1301.02              1442.73
Feb 2014 1267.27              1301.02
Mar 2014 1226.10              1267.27
Apr 2014 1155.70              1226.10
May 2014 1295.75              1155.70
Jun 2014 1366.08              1295.75
Jul 2014 1219.36              1366.08
Aug 2014 1190.23              1219.36
Sep 2014 1123.72              1190.23
Oct 2014 1091.44              1123.72
Nov 2014  974.27              1091.44
Dec 2014  945.51               974.27
Jan 2015      NA               945.51

Для расчета разницы в ценах за один временной период используется функция diff():
> diff(rtsi.ts)
        Jan     Feb     Mar     Apr     May     Jun     Jul     Aug     Sep     Oct     Nov     Dec
2013          -87.72  -74.37  -52.83  -75.78  -55.99   37.94  -22.42  131.53   57.93  -77.49   39.80
2014 -141.71  -33.75  -41.17  -70.40  140.05   70.33 -146.72  -29.13  -66.51  -32.28 -117.17  -28.76

Обратите внимание, что действие функции diff() эквивалентно разности цены и ее лага:
> rtsi.ts - lag(rtsi.ts, k=-1)
        Jan     Feb     Mar     Apr     May     Jun     Jul     Aug     Sep     Oct     Nov     Dec
2013          -87.72  -74.37  -52.83  -75.78  -55.99   37.94  -22.42  131.53   57.93  -77.49   39.80
2014 -141.71  -33.75  -41.17  -70.40  140.05   70.33 -146.72  -29.13  -66.51  -32.28 -117.17  -28.76

Вычислить разницу в ценах с лагом 12 (то есть разница за год для месячных данных) можно следующим образом:

> diff(rtsi.ts, lag = 12)
        Jan     Feb     Mar     Apr     May     Jun     Jul     Aug     Sep     Oct     Nov     Dec
2014 -321.11 -267.14 -233.94 -251.51  -35.68   90.64  -94.02 -100.73 -298.77 -388.98 -428.66 -497.22

что эквивалентно функции:

> rtsi.ts - lag(rtsi.ts, k=-12)

А вот что получится, если скомбинировать объект ts с его разницей за один временной период:

> cbind(rtsi.ts, diff(rtsi.ts))
        rtsi.ts diff(rtsi.ts)
Jan 2013 1622.13            NA
Feb 2013 1534.41        -87.72
Mar 2013 1460.04        -74.37
Apr 2013 1407.21        -52.83
May 2013 1331.43        -75.78
Jun 2013 1275.44        -55.99
Jul 2013 1313.38         37.94
Aug 2013 1290.96        -22.42
Sep 2013 1422.49        131.53
Oct 2013 1480.42         57.93
Nov 2013 1402.93        -77.49
Dec 2013 1442.73         39.80
Jan 2014 1301.02       -141.71
Feb 2014 1267.27        -33.75
Mar 2014 1226.10        -41.17
Apr 2014 1155.70        -70.40
May 2014 1295.75        140.05
Jun 2014 1366.08         70.33
Jul 2014 1219.36       -146.72
Aug 2014 1190.23        -29.13
Sep 2014 1123.72        -66.51
Oct 2014 1091.44        -32.28
Nov 2014  974.27       -117.17
Dec 2014  945.51        -28.76

Используя вместе функции diff() и lag(), можно рассчитать простую доходность за один временной период:
> rtsiRetSimple.ts = diff(rtsi.ts)/lag(rtsi.ts, k=-1)
> micexRetSimple.ts = diff(micex.ts)/lag(micex.ts, k=-1)
> window(cbind(rtsiRetSimple.ts, micexRetSimple.ts),  start=c(2014,4), end=c(2014,11))
        rtsiRetSimple.ts micexRetSimple.ts
Apr 2014      -0.05741783      -0.046213731
May 2014       0.12118197       0.096492370
Jun 2014       0.05427745       0.030970022
Jul 2014      -0.10740220      -0.065545456
Aug 2014      -0.02388958       0.015294177
Sep 2014      -0.05587996       0.007396249
Oct 2014      -0.02872602       0.054851992
Nov 2014      -0.10735359       0.030373471

Аналогично рассчитывается простая доходность за 12 периодов:

> diff(rtsi.ts, lag=12)/lag(rtsi.ts, k=-12)

Используя совместно функции  log() и diff(), можно рассчитать непрерывно начисляемый сложный процент:

> rtsiRet.ts = diff(log(rtsi.ts))
> micexRet.ts = diff(log(micex.ts))
> window(cbind(rtsiRet.ts, micexRet.ts), start=c(2014,4),  end=c(2014,11))
         rtsiRet.ts  micexRet.ts
Apr 2014 -0.05913218 -0.047315670
May 2014  0.11438346  0.092116330
Jun 2014  0.05285565  0.030500128
Jul 2014 -0.11361919 -0.067792295
Aug 2014 -0.02417957  0.015178400
Sep 2014 -0.05750196  0.007369031
Oct 2014 -0.02914668  0.053400465
Nov 2014 -0.11356473  0.029921329

Расчет непрерывно начисляемого сложного процента за 12 временных периодов производится с помощью команды:

> diff(log(sbux.ts), lag=12)

Комментариев нет:

Отправить комментарий