Thursday, March 17, 2011

Язык программирования R для биржевого спекулянта


Эта статья посвящена азам работы с R. Если Вы уже знакомы с R она вряд ли Вам будет интересна, если же Вы смутно себе представляете, что это такое и хотите узнать побольше welcome.
Итак, R это де-факто стандарт в области статистической обработки данных. Это одновременно язык программирования и программная среда вычислений с расширенными графическими возможностями. Для многих задач, этот инструмент успешно заменит Excel и Mathcad. И самое важное, R распространяется свободно и бесплатно.



Установка R.

Установить R легко, идем на сайт разработчика, и далее по ссылкам Download R, выбираем ближайшее зеркало, качаем инсталятор, запускаем, проходите по стандартным шагам. Ставим. Всё.

Если у Вас доступ в интернет через HTTP прокси, то потребуется небольшая настройка. Следует добавить в переменные окружения адрес прокси:
http_proxy = http://proxy.host:port
На Windows это можно сделать через Пуск > Панель управления > Система > Дополнительно > Переменные среды.

Мы поставили интерпретатор R и программное окружение. В принципе, этого достаточно для начала. Но если все же хочется еще иметь красивую среду разработки, добро пожаловать на RStudio  все как обычно, качаем, ставим.

Какие модули нужны биржевому спекулянту

R сам по себе хорош, но куда интересней его использовать в связке с дополнительными модулями. А модулей там, великое множество, одни позволяют рисовать графики, другие скачивать данные, третьи открывают дополнительные аналитические возможности, четвертые позволяют интегрироваться со сторонними приложениями и языками программирования. Всего около 2100 модулей только в общем репозитории. Из этого разнообразия нам понадобиться лишь часть:

1) quantmod - это самое главное и основное, этот плагин позволяет получать котировки с Yahoo.Finance, Goolge.Finance и данные федерального резерва США. К сожалению, не работает с российскими площадками, но это мы исправим чуть позже. Кроме того, в нем есть средства построения, анализа и тестирования торговых моделей. Короче, запускаем R и набираем в консоли:
install.packages("quantmod")
2) zoo, xts, TTR - будут установленные вместе с quantmod. В принципе, можно поставить отдельно аналогичными командами. Это тоже незаменимые модули.
zoo и xts предоставляют расширенные возможности для работы с временными рядами.
TTR содержит огромное количество технических индикаторов.

3) e1071 - библиотека для машинного обучения, включает в себя такие алгоритмы как преобразование фурье, наивный байесовский классификатор, кластеризация, svm и другие. Может пригодиться если Вы собираетесь привлекать один из этих алгоритмов для работы.

4) nnet - библиотека для работы с нейронными сетями. Аналогично e1071.

5) tseries - еще одна библиотека для анализа временных рядов.

Примеры использования

Строим котировки IBM

library(quantmod)
getSymbols("IBM", from="2010-01-01")
chartSeries(IBM)

Если все установлено верно, должно получиться что-то подобное:

Добавить на графики MACD, RSI, EMA и другие технические индикаторы? Нет ничего проще:

addMACD()
addEMA(7)
addRSI(n=14)


Полный список доступных индикаторов можно посмотреть тут.

Российский рынок, пишем велосипеды

Замечательно, что существует такой модуль quantmod, и все очень просто и красиво, но только на буржуйских рынках. К сожалению, в наших реалиях ему негде взять данные. Поэтому, мы напишем маленький велосипед, заодно разберемся с синтаксисом. Источником данных станет финам.
На данном этапе мы напишем простой скрипт, позволяющий парсить файл вручную скачанный с финама. Он в любом случае нам пригодится, ведь не финамом единым жив человек. Итак, скрипт:

"parseQuotes" <-
function(From)
{
    require(xts) #загрузить модуль xts, он нам нужен
    fr <- read.csv(From, as.is = TRUE) #читаем данные из файла
    fr <- xts(as.matrix(fr[,(5:9)]), as.Date(strptime(fr[,3], "%Y%m%d")))
    # функция strptime позволяет нам распарсить дату в заданном формате, в данном случае формат определяется выражением "%Y%m%d"
    # для интрадей данных последнюю строчку надо заменить на
#fr&lt;-xts(as.matrix(fr[,(4:9)]),as.POSIXct(strptime(paste(fr[,3],fr[,4]), "%Y%m%d %H%M%S")))
    colnames(fr) <- c('Open','High','Low','Close','Volume') #присваивамем новые имена колонам для совместимости с xts
    return(fr)
}
Что здесь произошло? Мы создали функцию parseQuotes, которая берет в качестве параметров полный путь к файлу на диске, получает из него котировки и возвращает OHLC (Open-High-Low-Close) объект совместимый с quantmod.

Важно! Формат записи в файл в финаме должен быть выбран такой: TICKER,PER,DATE,TIME,OPEN,HIGH,LOW,CLOSE,VOL. Все остальные значения по-умолчанию. Готово, теперь можно скачать, к примеру, данные по фьючерсу на индекс РТС и построить соответствующий график.
RTS <- parseQuotes("C:\\SPFB.RTS_070315_110315.txt")
chartSeries(RTS)

На этом, на сегодня всё. Продолжение следует...

11 comments:

  1. Сергей, здравствуйте! вы не подскажете, как в R смерджить 2 временных ряда по разным бумагам? например, для того, чтобы регрессию прогнать?

    ReplyDelete
  2. Добрый день, Антон!
    Например с помощью функции cbind (в том случае если у вас уже есть временные ряды):

    ROSN <- parseQuotes("C:\\ROSN_110319_110519.txt")
    GAZP <- parseQuotes("C:\\GAZP_110319_110519.txt")
    merged <- cbind(GAZP, ROSN)

    ReplyDelete
    Replies
    1. Функция cbind не работает, если ряды имеют неодинаковую длину.
      Есть ли функция, которая выбирает из временных рядов только значения с совпадающими датами?

      Delete
    2. используйте merge (left, right, inner), ваш КО.

      Delete
  3. Как можно построить график функции желательности.

    ReplyDelete
  4. Так же как и график любой другой функции, по точкам:
    x <- seq(-5, 5, by=0.05)
    y <- 1/(exp(1/exp(x)))
    plot(x,y, type='l')

    ReplyDelete
  5. не могли бы помочь написать программу для сортировки массива слиянием?

    ReplyDelete
  6. Мог бы ответить на конкретные вопросы, но домашнее задание все равно придется делать самостоятельно. И вообще, причем тут R?

    ReplyDelete
  7. parseQuotes
    function(From)
    {
    require(xts) #загрузить модуль xts, он нам нужен
    fr <- read.csv(From, as.is = TRUE) #читаем данные из файла
    # fr <- xts(as.matrix(fr[,(5:9)]), as.Date(strptime(fr[,3], "%Y%m%d")))
    # функция strptime позволяет нам распарсить дату в заданном формате, в данном случае формат определяется выражением "%Y%m%d"
    # для интрадей данных последнюю строчку надо заменить на
    fr <-xts(as.matrix(fr[,5:9]),as.POSIXct(strptime(paste(fr[,3],fr[,4]), "%Y%m%d %H%M%S")))
    colnames(fr) <- c('Open','High','Low','Close','Volume') #присваивамем новые имена колонам для совместимости с xts
    return(fr)
    }

    ReplyDelete
  8. Здравствуйте Сергей.
    Не могли бы вы немного рассказать об использовании библиотеки nnet?
    С уважением.

    ReplyDelete
  9. Сергей, помогите пожалуйста с виджетами в R. Есть средство TKrplot для построения в окне графика и "снятия" координат в любой точке графика. В качестве примера в TCLTK приведен R-скрипт InteractGraph.r, который прекрасно работает. Но мне необходимо построить не график зависимости Y от X, а изображение. Но как только я пробую заменить в скрипте функцию plot() на image(), окно выводится пустое с ошибкой об отсутствии image device. Причем этот же image() в программе без виджетов строит изображение, но в файл, так как предварительно там задан png(). Почему такое происходит и может быть в виджетах надо использовать что-то другое? Заранее спасибо за ответ.
    vor54@list.ru

    ReplyDelete