Sie sind auf Seite 1von 20

Лабораторная работа №1.

Количественные финансы
Силкин Глеб

18 ноября 2019 г.

1. Установить пакет quantmod/Quanttools


Здесь надо установить пакеты. вапа

2. Изучить получение данных из разных источников


Необходимо получить из источников историю цен на акции вашего тикера США и
индекса S&P500
getSymbols("JNJ",src="yahoo") # get yahoo finance

## [1] "JNJ"

head(JNJ) # начало серии

## JNJ.Open JNJ.High JNJ.Low JNJ.Close JNJ.Volume JNJ.Adjusted


## 2007-01-03 66.13 67.10 66.11 66.40 12845300 45.36119
## 2007-01-04 65.90 67.62 65.90 67.23 11262000 45.92821
## 2007-01-05 66.80 67.25 66.50 66.62 8141100 45.51149
## 2007-01-08 66.51 66.75 66.05 66.51 6180400 45.43634
## 2007-01-09 66.60 66.85 66.13 66.26 7147100 45.26556
## 2007-01-10 66.56 66.56 66.07 66.15 6528700 45.19039

tail(JNJ) # конецц серии

## JNJ.Open JNJ.High JNJ.Low JNJ.Close JNJ.Volume JNJ.Adjusted


## 2019-11-08 131.30 133.04 130.97 133.00 5003000 133.00
## 2019-11-11 132.27 132.52 131.33 131.98 4371400 131.98
## 2019-11-12 132.00 132.09 131.02 131.35 5228700 131.35
## 2019-11-13 131.04 131.49 130.72 131.27 5885400 131.27
## 2019-11-14 131.03 131.36 130.14 130.96 4217500 130.96
## 2019-11-15 131.25 134.97 130.78 134.94 10495100 134.94

getSymbols("^GSPC",src="yahoo") # get yahoo finance

## [1] "^GSPC"

getSymbols("DGS10",src="FRED") # 10-Year Treasury Constant Maturity Rate (DGS10)


from FRED

## [1] "DGS10"

# https://fred.stlouisfed.org/series/DGS10 - проверить серию


head(DGS10)
## DGS10
## 1962-01-02 4.06
## 1962-01-03 4.03
## 1962-01-04 3.99
## 1962-01-05 4.02
## 1962-01-08 4.03
## 1962-01-09 4.05

Получите данные вашего тикера, а также индекса ММВБ с помощью пакета QuantTools
rosneft <- get_finam_data('ROSN', from = '2012-01-01',
to = Sys.Date()) # Сбербанк
# пакет QuantTools возвращает данные в формате data.table/data.frame, а не хts
class(rosneft)

## [1] "data.table" "data.frame"

rosneft <- quant_tools_to_xts(rosneft)


class(rosneft)

## [1] "xts" "zoo"

tail(rosneft,3)

## open high low close volume


## 2019-11-13 458.50 461.45 455.1 459.5 3552170
## 2019-11-14 459.30 460.20 451.7 457.3 4475650
## 2019-11-15 457.35 460.70 453.7 458.0 3000240

micex <- get_finam_data('MICEX', from = '2012-01-01', to = Sys.Date()) # индекс


ММВБ
# пакет QuantTools возвращает данные в формате data.table/data.frame, а не хts
class(micex)

## [1] "data.table" "data.frame"

MICEX <- quant_tools_to_xts(micex)


class(MICEX)

## [1] "xts" "zoo"

tail(MICEX)

## open high low close volume


## 2019-11-08 2996.55 2997.63 2958.55 2973.19 51139297570
## 2019-11-11 2965.19 2972.39 2953.23 2961.46 52158991700
## 2019-11-12 2963.70 2983.48 2944.00 2951.16 62668137303
## 2019-11-13 2938.94 2942.26 2924.23 2933.89 57041242639
## 2019-11-14 2938.87 2948.98 2902.91 2922.45 73661854887
## 2019-11-15 2925.31 2938.15 2914.05 2934.82 56573349968

получить внутридневные графики вашего тикера.


rosneft_intraday <- get_finam_data('ROSN', from = Sys.Date()-5, to = Sys.Date(),
period = 'hour') # Rosneft intraday
# пакет QuantTools возвращает данные в формате data.table/data.frame, а не хts
rosneft_intraday <- quant_tools_to_xts(rosneft_intraday)
tail(rosneft_intraday)

## Warning: timezone of object (UTC) is different than current timezone ().

## open high low close volume


## 2019-11-18 14:00:00 456.80 457.25 456.0 456.65 172620
## 2019-11-18 15:00:00 456.55 456.80 455.6 456.75 148840
## 2019-11-18 16:00:00 456.80 457.65 456.5 457.25 281870
## 2019-11-18 17:00:00 457.20 457.20 454.3 454.55 425900
## 2019-11-18 18:00:00 454.60 455.05 450.1 450.50 538090
## 2019-11-18 19:00:00 450.45 451.35 450.3 451.00 310840

Каково последнее время, когда происходили торги вашим тикером? Ответ: 18го ноября
2019г в 19.00

3. Построить графики серий


Пакет xts дает возможность строить графики для финансовых серий
lineChart(JNJ, theme = 'white') # линейный график

candleChart(JNJ["2017"], theme = 'white') # график данных только за 2017 год


barChart(JNJ["2017"], theme = 'white.mono') # график данных только за 2017 год

постройте график серии вашего тикера с данными за 2015-2019 гг., а также график
серии за март-сентябрь 2019 года
chartSeries(JNJ["2015/2019"], theme = 'white')
chartSeries(JNJ["2019-03/2019-09"], theme = 'white')

chartSeries(GSPC["2015/2019"], theme = 'white')


Постройте график серии вашего российского тикера.
chartSeries(rosneft, theme = 'white', name = "Rosneft stock")

chartSeries(micex, theme = 'white', name ="MICEX index" )


Отличаетcя ли динамика цен на акции вашей компании от динамики индекса? С какими
причинами может связана различная динамика?
Ответ: да, отличается. Акции Роснефти более волатильны, чем индекс ММВБ, но
сонаправлены и, например, между 2014 и 2016 годами можно увидеть, что некоторые
экстремумы (спады и рост) происходили в одно и то же время. Аналогично у
Johnson&Johnson и SP500. Можно увидеть одновременную просадку в 2016г, в начале и
конце 2018. Однако, динамика JNJ и таковая SP500 разнятся сильнее, чем у связки
Роснефть-ММВБ. Меньшая волатильность у индекса связана с тем, что сам индекс
рассчитывается на основе некоторой выборки компаний, тем самым сглаживая
возможные колебания в связи с новостями, отчетностями, изменениями в дивидендной
политике, кадровыми перестановками и т.д.

4. Посчитать лог-доходности
SP500.rtn <- diff(log(GSPC$GSPC.Adjusted)) # расчет лог-доходности индекса S&P
500
JNJ.rtn = diff(log(JNJ$JNJ.Adjusted)) # расчет лог-доходности JNJ

MICEX.rtn <- diff(log(MICEX$close)) # расчет лог-доходности


rosneft.rtn <- diff(log(rosneft$close))
candleChart(SP500.rtn, theme='white')
candleChart(JNJ.rtn, theme='white')

candleChart(MICEX.rtn, theme = 'white') #дополнительно


candleChart(rosneft.rtn, theme = 'white') #дополнительно

для оценки распределения можно использовать гистограммы:


hist(SP500.rtn, breaks = 50)
hist(JNJ.rtn,breaks = 50)

rtns <- merge(MICEX.rtn, JNJ.rtn)


plot(x = as.numeric(rtns[,1]), y = as.numeric(rtns[,2]), xlab='MICEX', ylab='ROS
N')
Диаграмма рассения дает возможность сопоставить две серии между собой. Постройтe
диаграмму рассеяния для доходности вашего тикера и индекса.
rtns <- merge(SP500.rtn, JNJ.rtn)
plot(x = as.numeric(rtns[,1]), y = as.numeric(rtns[,2]), xlab='SP 500 returns, %
', ylab='JNJ returns, %')

hist(SP500.rtn, breaks = 50)


hist(JNJ.rtn,breaks = 50)

rtns <- merge(MICEX.rtn, rosneft.rtn)


plot(x = as.numeric(rtns[,1]), y = as.numeric(rtns[,2]), xlab='MICEX', ylab='ROS
N')
5. Посчитать основные статистики доходностей
#install.packages("fBasics")
library(fBasics)

basicStats(MICEX.rtn)

## close
## nobs 1984.000000
## NAs 1.000000
## Minimum -0.114189
## Maximum 0.051218
## 1. Quartile -0.005761
## 3. Quartile 0.006813
## Mean 0.000357
## Median 0.000319
## Sum 0.708668
## SE Mean 0.000246
## LCL Mean -0.000126
## UCL Mean 0.000841
## Variance 0.000120
## Stdev 0.010976
## Skewness -0.768660
## Kurtosis 8.830871

t.test(as.vector(MICEX.rtn)) # тест Стьюдента на отличие среднего арифметическог


о от нуля

##
## One Sample t-test
##
## data: as.vector(MICEX.rtn)
## t = 1.4499, df = 1982, p-value = 0.1473
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -0.0001260242 0.0008407678
## sample estimates:
## mean of x
## 0.0003573718

# прочитайте документацию по t.test


# http://r-analytics.blogspot.ru/2012/03/t.html
basicStats(rosneft.rtn)

## close
## nobs 1984.000000
## NAs 1.000000
## Minimum -0.064956
## Maximum 0.070589
## 1. Quartile -0.008561
## 3. Quartile 0.009053
## Mean 0.000374
## Median 0.000112
## Sum 0.742374
## SE Mean 0.000339
## LCL Mean -0.000290
## UCL Mean 0.001039
## Variance 0.000228
## Stdev 0.015089
## Skewness 0.196290
## Kurtosis 1.254945

t.test(as.vector(rosneft.rtn))

##
## One Sample t-test
##
## data: as.vector(rosneft.rtn)
## t = 1.1048, df = 1982, p-value = 0.2694
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -0.0002901694 0.0010389078
## sample estimates:
## mean of x
## 0.0003743692

basicStats(JNJ.rtn)

## JNJ.Adjusted
## nobs 3242.000000
## NAs 1.000000
## Minimum -0.105781
## Maximum 0.115373
## 1. Quartile -0.004314
## 3. Quartile 0.005657
## Mean 0.000336
## Median 0.000324
## Sum 1.090173
## SE Mean 0.000184
## LCL Mean -0.000025
## UCL Mean 0.000698
## Variance 0.000110
## Stdev 0.010490
## Skewness -0.175467
## Kurtosis 12.967481

t.test(as.vector(JNJ.rtn))

##
## One Sample t-test
##
## data: as.vector(JNJ.rtn)
## t = 1.8256, df = 3240, p-value = 0.06801
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -2.489986e-05 6.976387e-04
## sample estimates:
## mean of x
## 0.0003363694

basicStats(SP500.rtn)

## GSPC.Adjusted
## nobs 3242.000000
## NAs 1.000000
## Minimum -0.094695
## Maximum 0.109572
## 1. Quartile -0.003903
## 3. Quartile 0.005569
## Mean 0.000244
## Median 0.000663
## Sum 0.789721
## SE Mean 0.000215
## LCL Mean -0.000179
## UCL Mean 0.000666
## Variance 0.000150
## Stdev 0.012260
## Skewness -0.370987
## Kurtosis 10.838248

t.test(as.vector(SP500.rtn))

##
## One Sample t-test
##
## data: as.vector(SP500.rtn)
## t = 1.1314, df = 3240, p-value = 0.258
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -0.0001785856 0.0006659172
## sample estimates:
## mean of x
## 0.0002436658
Какие выводы можно сделать для вашего тикера на основе теста Стьюдента? Ответ:
Поскольку P-Value больше нуля, то нулевая гипотеза отвергается и принимается
альтернативная. Последняя гласит, что 1)медианная лог-доходность индекса ММВБ не
равна нулю. 2)Аналогично у Роснефти, Johnson&Johnson, SP500. Вывод: все 4 давали
какой-либо доход инвесторам.
Проверить вашу серию доходности на нормальность с помощью тестов Колмогорова-
Смирнова и Шапиро-Уилка
ksnormTest(MICEX.rtn)

## Warning in if (class(x) == "fREG") x = residuals(x): длина условия > 1,


## будет использован только первый элемент

##
## Title:
## One-sample Kolmogorov-Smirnov test
##
## Test Results:
## STATISTIC:
## D: 0.4826
## P VALUE:
## Alternative Two-Sided: < 2.2e-16
## Alternative Less: < 2.2e-16
## Alternative Greater: < 2.2e-16
##
## Description:
## Mon Nov 18 22:12:06 2019 by user: rudin

shapiroTest(MICEX.rtn)

## Warning in if (class(x) == "fREG") x = residuals(x): длина условия > 1,


## будет использован только первый элемент

##
## Title:
## Shapiro - Wilk Normality Test
##
## Test Results:
## STATISTIC:
## W: 0.9492
## P VALUE:
## < 2.2e-16
##
## Description:
## Mon Nov 18 22:12:06 2019 by user: rudin

ksnormTest(rosneft.rtn)

## Warning in if (class(x) == "fREG") x = residuals(x): длина условия > 1,


## будет использован только первый элемент

## Warning in ks.test(x, "pnorm", alternative = "two.sided"): ties should not


## be present for the Kolmogorov-Smirnov test
## Warning in ks.test(x, "pnorm", alternative = "less"): ties should not be
## present for the Kolmogorov-Smirnov test

## Warning in ks.test(x, "pnorm", alternative = "greater"): ties should not be


## present for the Kolmogorov-Smirnov test

##
## Title:
## One-sample Kolmogorov-Smirnov test
##
## Test Results:
## STATISTIC:
## D: 0.4796
## P VALUE:
## Alternative Two-Sided: < 2.2e-16
## Alternative Less: < 2.2e-16
## Alternative Greater: < 2.2e-16
##
## Description:
## Mon Nov 18 22:12:06 2019 by user: rudin

shapiroTest(rosneft.rtn)

## Warning in if (class(x) == "fREG") x = residuals(x): длина условия > 1,


## будет использован только первый элемент

##
## Title:
## Shapiro - Wilk Normality Test
##
## Test Results:
## STATISTIC:
## W: 0.9877
## P VALUE:
## 5.657e-12
##
## Description:
## Mon Nov 18 22:12:06 2019 by user: rudin

ksnormTest(JNJ.rtn)

## Warning in if (class(x) == "fREG") x = residuals(x): длина условия > 1,


## будет использован только первый элемент

## Warning in ks.test(x, "pnorm", alternative = "two.sided"): ties should not


## be present for the Kolmogorov-Smirnov test

## Warning in ks.test(x, "pnorm", alternative = "less"): ties should not be


## present for the Kolmogorov-Smirnov test

## Warning in ks.test(x, "pnorm", alternative = "greater"): ties should not be


## present for the Kolmogorov-Smirnov test

##
## Title:
## One-sample Kolmogorov-Smirnov test
##
## Test Results:
## STATISTIC:
## D: 0.4828
## P VALUE:
## Alternative Two-Sided: < 2.2e-16
## Alternative Less: < 2.2e-16
## Alternative Greater: < 2.2e-16
##
## Description:
## Mon Nov 18 22:12:06 2019 by user: rudin

shapiroTest(JNJ.rtn)

## Warning in if (class(x) == "fREG") x = residuals(x): длина условия > 1,


## будет использован только первый элемент

##
## Title:
## Shapiro - Wilk Normality Test
##
## Test Results:
## STATISTIC:
## W: 0.9037
## P VALUE:
## < 2.2e-16
##
## Description:
## Mon Nov 18 22:12:06 2019 by user: rudin

ksnormTest(SP500.rtn)

## Warning in if (class(x) == "fREG") x = residuals(x): длина условия > 1,


## будет использован только первый элемент

## Warning in ks.test(x, "pnorm", alternative = "two.sided"): ties should not


## be present for the Kolmogorov-Smirnov test

## Warning in ks.test(x, "pnorm", alternative = "less"): ties should not be


## present for the Kolmogorov-Smirnov test

## Warning in ks.test(x, "pnorm", alternative = "greater"): ties should not be


## present for the Kolmogorov-Smirnov test

##
## Title:
## One-sample Kolmogorov-Smirnov test
##
## Test Results:
## STATISTIC:
## D: 0.4788
## P VALUE:
## Alternative Two-Sided: < 2.2e-16
## Alternative Less: < 2.2e-16
## Alternative Greater: < 2.2e-16
##
## Description:
## Mon Nov 18 22:12:06 2019 by user: rudin

shapiroTest(SP500.rtn)

## Warning in if (class(x) == "fREG") x = residuals(x): длина условия > 1,


## будет использован только первый элемент

##
## Title:
## Shapiro - Wilk Normality Test
##
## Test Results:
## STATISTIC:
## W: 0.8768
## P VALUE:
## < 2.2e-16
##
## Description:
## Mon Nov 18 22:12:06 2019 by user: rudin

Какие выводы относительно нормальности серии можно сделать на основе этих


тестов? Совпадают ли выводы обоих тестов?
Я думаю, что поскольку в тестах Колмогорова-Смирнова и Шапиро-Уилка P-Value
меньше 0.05, из-за чего H0 отвергается, то здесь можно говорить об отсутствии
нормальности распределений и доходности котировок не совпадают. Выводы обоих
тестов совпадают.

6. Проверить на стационарность
library(tseries)
adf.test(MICEX$close) # тест Дики-Фуллера для исходный значений серии

##
## Augmented Dickey-Fuller Test
##
## data: MICEX$close
## Dickey-Fuller = -2.7149, Lag order = 12, p-value = 0.2757
## alternative hypothesis: stationary

MICEX.rtn = MICEX.rtn[!is.na(MICEX.rtn)] # убрать значения NA из серии


adf.test(MICEX.rtn) # тест Дики-Фуллера для доходностей

## Warning in adf.test(MICEX.rtn): p-value smaller than printed p-value

##
## Augmented Dickey-Fuller Test
##
## data: MICEX.rtn
## Dickey-Fuller = -12.657, Lag order = 12, p-value = 0.01
## alternative hypothesis: stationary

Если функция adf.test выдает ошибку, то скорее всего, у вас есть значения NA в серии
library(urca)
df <- ur.df(MICEX.rtn)
summary(df)

##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression none
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.114647 -0.005745 0.000289 0.006814 0.052015
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## z.lag.1 -1.02584 0.03165 -32.412 <2e-16 ***
## z.diff.lag 0.03363 0.02246 1.497 0.135
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01098 on 1979 degrees of freedom
## Multiple R-squared: 0.4968, Adjusted R-squared: 0.4963
## F-statistic: 977.1 on 2 and 1979 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -32.4118
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau1 -2.58 -1.95 -1.62

Какие выводы можно сделать о стационарности серий доходности? Насколько мы


уверены в этих выводах? Ответ: исходя из полученного значения P-value можно
говорить о стационарности ряда доходности, т.е. о его независимости от времени. Это
вполне соответствует полученным графикам лог-доходности, которые в течение
времени находятся примерно на одном уровне с некоторой вариацией. Однако, R-
квадрат равен только 0.49, что свидетельствует о недостаточной объясняющей силе
модели и неполной уверенности в выводах.

Das könnte Ihnen auch gefallen