Блог им. egenui

R. Как искать закономерности на рынке

Для начала небольшое вступление. Как-то Тимофей написал пост, с вопросом о том каким образом искать закономерности на рынке 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')
R. Как искать закономерности на рынке
Ну как видите утверждение о том что в пятницу рынок растет ложно.

Посмотрим еще одно утверждение которое является популярным, звучит оно следующим образом «Последний день квартала рынки растут»

Принято считать что связанно это с тем что управляющие хотят показать положительную доходность. И так, у нас уже есть данные, найдем в наших данных последний день квартала, и проделаем тоже самое построим гистограмму. 
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 &')

R. Как искать закономерности на рынке
ну по сути тоже ничего особенного хотя и есть небольшой перевес в положительную сторону, давайте посмотрим сколько бы вы заработали если покупали на открытии последнего дня квартала и продавали на закрытии того же дня.
R. Как искать закономерности на рынке
результат 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. Как искать закономерности на рынке
Вывод: В общем количество идеи ограниченно только вашей фантазией, R это очень мощный инструмент для анализа данных, то что проделали выше делается за несколько минут. Можно кончно все делать руками, искать нужные дни, выписывать в excel данные по этому дню и считать все руками. Но кому как…
★63
18 комментариев
Аффтор читай мой пост выше. Ты на правильном пути, только слегка заплутал:) Я придумал это ещё 8 лет назад:) Вот решил поделится, потому что сделал вывод что хрень вечная как у Ларри Вильямса и профит от неё зависит от умения быстро думать, а не от максимальной формализации. Но ты автор ударился в формализацию и это ошибка:)
уважаю труд
I-Am, для этих целей надо покупать рыночные данные вместе с историей стакана, протестировать можно все.
avatar
I-Am, а откуда вы знаете что в данный тик в стакане есть нужный вам объем по необходимой цене? Для таких низкочастотных стратегий наверно не совсем корректно тестить систему без истории стакана, но я в этом плохо разбираюсь. Ну если конечно у вас работает и так то и вправду нафиг тестить ). Да и статья же не об этом )
avatar
I-Am, а что в твоём понимании тик?
avatar
I-Am, по-моему тик это изменение стакана
avatar
ты бы написал, что нужно пользовать rusquant это раз. Второе у меня на первой же строчке ошибка для getSymbols. 

Error in data.frame(names, res, markets) :
arguments imply differing number of rows: 13006, 13008

 
Илья Гаврилов, попробуй использовать меньший период, например не с 2009 года а с 2011
avatar
evgen000, Да нет это не поможет… Финам в очередной раз изменил формат данных. Вот отсюда вопрос, либо ты давно уже написал эту статью, либо сам пофиксил rusquant. :) Так сделал бы доброе дело и залил на шару… А так статья не очень интересная в плане полезности. Конечно на голову лучше, чем весь тот шлак что встречается на смартлабе, но… Было бы гораздо интереснее если бы ты продемонстрировал эффект от какого-нибудь Parabolic SAR ну и данных нужно поболее. 10 кейсов это вобще не о чем, даже 1000 кейсов мало.
Илья Гаврилов, Странно. Я только что проверил, все работает.
install.packages(«rusquant», repos='http://R-Forge.R-project.org', type=«source»)
library(rusquant)
getSymbols('SBER', from='2015-01-01', src='Finam')
avatar
evgen000, Спасибо! Да, сейчас заработало. Не с первого раза, но после перезапуска RStudio без проблем... 
Можете порекомендовать хорошую книгу по R? Для начинающего? 
Илья Гаврилов, http://ashipunov.info/shipunov/school/books/rbook.pdf

r.psylab.info/library/
avatar
А почему такая маленькая выборка данных? Хотя бы 500 или 1000 объектов… а то кварталы и последние дни… лол… что то более частое, нет?
avatar
INTELLEKTTRADE, так напишите сами, я в качестве примера )
avatar
Ради интереса. А вообще получается находить закономерности? И какой у них срок службы бывает?
avatar
Андрей К, у таких закономерностей срок жизни совсем небольшой
avatar
если сильно хочется искать закономерности, то лучше уже с выставлением ордеров на истор данных…
avatar
Отличная статья, спасибо! Пытаюсь перейти с велса на R — для меня отличный наглядный пример.
Нижеприведённый код сработал только после написания 'пятница' с заглавной буквы)
 hist(MICEX_DAYILY[weekdays(index(MICEX_DAYILY)) %in% 'пятница']$Return *100, col='lightblue', border = "blue", main='MICEX Friday return 2009-2015 г.', xlab = 'Return %')
avatar

теги блога evgen000

....все тэги



UPDONW
Новый дизайн