evgen000
evgen000 личный блог
15 ноября 2015, 03:04

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 данные по этому дню и считать все руками. Но кому как…
18 Комментариев
  • Трансляция сигналов
    15 ноября 2015, 03:32
    Аффтор читай мой пост выше. Ты на правильном пути, только слегка заплутал:) Я придумал это ещё 8 лет назад:) Вот решил поделится, потому что сделал вывод что хрень вечная как у Ларри Вильямса и профит от неё зависит от умения быстро думать, а не от максимальной формализации. Но ты автор ударился в формализацию и это ошибка:)
  • Шура Балаганов
    15 ноября 2015, 03:32
    уважаю труд
  • Mr. Bean
    15 ноября 2015, 04:47
    I-Am, а что в твоём понимании тик?
    • Mr. Bean
      15 ноября 2015, 04:52
      I-Am, по-моему тик это изменение стакана
  • Илья Гаврилов
    15 ноября 2015, 09:07
    ты бы написал, что нужно пользовать rusquant это раз. Второе у меня на первой же строчке ошибка для getSymbols. 

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

     
      • Илья Гаврилов
        15 ноября 2015, 12:59
        evgen000, Да нет это не поможет… Финам в очередной раз изменил формат данных. Вот отсюда вопрос, либо ты давно уже написал эту статью, либо сам пофиксил rusquant. :) Так сделал бы доброе дело и залил на шару… А так статья не очень интересная в плане полезности. Конечно на голову лучше, чем весь тот шлак что встречается на смартлабе, но… Было бы гораздо интереснее если бы ты продемонстрировал эффект от какого-нибудь Parabolic SAR ну и данных нужно поболее. 10 кейсов это вобще не о чем, даже 1000 кейсов мало.
          • Илья Гаврилов
            15 ноября 2015, 13:22
            evgen000, Спасибо! Да, сейчас заработало. Не с первого раза, но после перезапуска RStudio без проблем... 
            Можете порекомендовать хорошую книгу по R? Для начинающего? 
  • INTELLEKTTRADE
    15 ноября 2015, 10:13
    А почему такая маленькая выборка данных? Хотя бы 500 или 1000 объектов… а то кварталы и последние дни… лол… что то более частое, нет?
  • Андрей К
    15 ноября 2015, 11:31
    Ради интереса. А вообще получается находить закономерности? И какой у них срок службы бывает?
  • Brad Tick
    15 ноября 2015, 21:49
    если сильно хочется искать закономерности, то лучше уже с выставлением ордеров на истор данных…
  • xxxyyy
    29 ноября 2015, 15:13
    Отличная статья, спасибо! Пытаюсь перейти с велса на R — для меня отличный наглядный пример.
    Нижеприведённый код сработал только после написания 'пятница' с заглавной буквы)
     hist(MICEX_DAYILY[weekdays(index(MICEX_DAYILY)) %in% 'пятница']$Return *100, col='lightblue', border = "blue", main='MICEX Friday return 2009-2015 г.', xlab = 'Return %')
    

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн