Для начала небольшое вступление. Как-то Тимофей написал пост, с вопросом о том каким образом искать закономерности на рынке
http://smart-lab.ru/blog/286459.php, на что я ответил что закономерности на рынке искать надо метододами DataMining'а и пытаться отыскать на графике цен что-то глазами это пустая трата времени, и этой дествительно так.
В числовом ряде искать закономерности глазами это чистое безумие, Сегодня будет пара примеров того как эти самые закономерности можно искать, в частности поговорим о закономерностях типа
«в последнюю неделю квартала последний час торговли зеленый чаще чем красный», подобную закономерность заметить глазами невозможно, но найдя что-то подобное можно построить примитивную, а следователно идеальную не ограниченную степенями свободы систему. И так.
Для начала нам понадобяться сами данные.
getSymbols('MICEX', from='2009-01-01', src='Finam', period='hour')
Давайте разберем несколько выдумманых гипотез относительно доходностей рынка в определенный период.
Первая гипотеза звучит так
«В пятницу рынки обычно растут»
Проверим данное утверждение:
Преобразуем часовые данные в дневные и посчитаем доходность за каждый день
MICEX_DAYILY <- to.daily(MICEX_HOUR)
MICEX_DAYILY$Return <- dailyReturn(MICEX_DAYILY)
Далее среди всех дней выберем пятницы и построим гистограмму доходности а так же добавим на гистограмму такие показатели как среднее и стандартное отклонение
hist(MICEX_DAYILY[weekdays(index(MICEX_DAYILY)) %in% 'пятница']$Return *100, col='lightblue', border = "blue", main='MICEX Friday return 2009-2015 г.', xlab = 'Return %')
abline(v = sd(MICEX_DAYILY[weekdays(index(MICEX_DAYILY)) %in% 'пятница']$Return *100) , col='green')
abline(v = sd(MICEX_DAYILY[weekdays(index(MICEX_DAYILY)) %in% 'пятница']$Return *100) *-1, col='red')
abline(v = mean(MICEX_DAYILY[weekdays(index(MICEX_DAYILY)) %in% 'пятница']$Return *100), col='black')
Ну как видите утверждение о том что в пятницу рынок растет ложно.
Посмотрим еще одно утверждение которое является популярным, звучит оно следующим образом
«Последний день квартала рынки растут»
Принято считать что связанно это с тем что управляющие хотят показать положительную доходность. И так, у нас уже есть данные, найдем в наших данных последний день квартала, и проделаем тоже самое построим гистограмму.
hist(MICEX_DAYILY[endpoints(MICEX_DAYILY, on = 'quarters')]$Return *100,col = 'lightblue' , border = 'blue' ,breaks = 10, main = 'Last quarter day return 2009-2015', xlab = 'Return &')
ну по сути тоже ничего особенного хотя и есть небольшой перевес в положительную сторону, давайте посмотрим сколько бы вы заработали если покупали на открытии последнего дня квартала и продавали на закрытии того же дня.
результат 6%.
Ну и последняя гипотеза
«в последнюю неделю квартала последний час торговли зеленый чаще чем красный»
Для начала подготовим данные.
> temp <- MICEX_HOUR[endpoints(MICEX_HOUR, on = 'quarters')]
> temp[.indexhour(temp) %in% c(18)]
Так как оказалось что данные с Финама по последним часам квартала за 2012-2013 год битые, брал данные только за 2014-2015
temp$Return <- Delt(temp$MICEX.Open, temp$MICEX.Close)
temp <- temp['2014/2015']
Даных немного, вот они
MICEX.Open MICEX.High MICEX.Low MICEX.Close MICEX.Volume Return
2014-03-31 18:00:00 1359.89 1369.29 1359.70 1369.29 9358593897 0.0069123238
2014-06-30 18:00:00 1469.20 1476.38 1468.19 1476.38 4875800860 0.0048870133
2014-09-30 18:00:00 1415.32 1417.44 1411.07 1411.07 4106077578 -0.0030028545
2014-12-30 18:00:00 1393.77 1401.16 1392.30 1396.61 3107614804 0.0020376389
2015-03-31 18:00:00 1620.70 1626.18 1618.25 1626.18 2849980040 0.0033812550
2015-06-30 18:00:00 1644.90 1655.24 1644.90 1654.55 6319242715 0.0058666180
2015-09-30 18:00:00 1643.58 1644.27 1634.07 1642.97 4327525815 -0.0003711410
2015-11-13 18:00:00 1729.27 1731.09 1723.63 1728.17 5590636195 -0.0006361066
Данных для гистограммы слишком мало, поэтому просто выведу текстом
Средный выигрыш — 0.2%
Стандартное отклонение -0.3%
Доходность по стратегии купить на открытии последней часовой свечи квартала и продать на закрытии — 2% при 8 сделках, что в общем-то неплохо.
Доходность такой стратегии
Вывод: В общем количество идеи ограниченно только вашей фантазией, R это очень мощный инструмент для анализа данных, то что проделали выше делается за несколько минут. Можно кончно все делать руками, искать нужные дни, выписывать в excel данные по этому дню и считать все руками. Но кому как…
Error in data.frame(names, res, markets) :
arguments imply differing number of rows: 13006, 13008
install.packages(«rusquant», repos='http://R-Forge.R-project.org', type=«source»)
library(rusquant)
getSymbols('SBER', from='2015-01-01', src='Finam')
Можете порекомендовать хорошую книгу по R? Для начинающего?
r.psylab.info/library/
Нижеприведённый код сработал только после написания 'пятница' с заглавной буквы)