Блог им. hannimed

Подбрасываем монетку с помощью языка R

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


На СЛ я часто замечаю, как умные и опытные люди моделируют или вычисляют всё в экселе. Это тоже отличный инструмент, но я думаю им стоит обратить внимание на язык R и попробовать, ничего сложного, как оказалось, там нет. Конечно какие-то базовые навыки программирования всё же потребуются.


Далее я напишу, как бесплатно и легально настроить свой компьютер для запуска среды. Потом приведу пример с подбрасыванием монетки 
(прошу прощения, если такая тема уже была, сделал поиск по сайту, из последних ничего не нашел).

Настройка среды для запуска R

Сразу хочу сказать, что ничего сложного в настройке нет. Нужно скачать пару файлов и последовательно их установить. Никаких особых настроек и сложных выборов, качаем и ставим, всё заработает.


Сначала вам необходимо поставить само ядро для языка R, его можно взять здесь cran.r-project.org/Там есть версии для всех популярных ОС, но я полагаю здесь большинство использует Windows, тогда переходим на cran.r-project.org/bin/windows/base/ и кликаем по «Download R 3.5.3 for Windows» (79Мб). Далее устанавливаем этот файл.


Затем нам нужно скачать саму среду разработки на языке R. Их большое множество, платных и бесплатных. Будем использовать самую популярную и бесплатную версию, идём сюда www.rstudio.com/products/rstudio/download/ и под самой левой опцией FREE, жмем зеленую кнопку Download (около 150Мб). После скачивания, устанавливаем и можно запускать.

Простой пример работы в RStudio

После того как вы открыли R студию, вы увидите открытую консоль слева. Давайте попробуем что-нибудь написать здесь, чтобы подогреть ваш интерес. Введите в консоль rnorm(10) — вы увидите 10 цифр сгенерированных по нормальному распределению. Введите hist(rnorm(100)) — вы увидите гистограмму для 100 цифр сгенерированных по нормальному распределению. Не правда ли удобно? Всего пара команд, одна строка, а у вас уже сгенерированные данные и график. Другие языки для этого требуют гораздо больше времени и умений.
Подбрасываем монетку с помощью языка R


Пример с подбрасыванием монетки

Теперь давайте попробуем подбросить монетку. Скажем мы хотим подбросить монетку N раз, в случае орла мы умножаем результат на 1.01, в случае решки на 0.99. И построим график. Для этого создадим небольшой скрипт. Можно конечно сделать это и в консоли, но для общего развития сделаем скрипт. Выберем File -> New File -> R Script.


В окно скрипта, запишем следующий скрипт (можно скопировать и вставить):

x <- 100         # начальное значение
n <- 100         # количество подбрасываний
a <- array(n)   # пустой массив для результата

# lognormal
toss <- function(x)
   ifelse(rnorm(1, 0) > 0, x * 1.01, x * 0.99)  # если сл. число > 0 то умножаем на 1.01, иначе на 0.99

for (i in 1:n) {   # цикл от 1 до n
  x <- toss(x)    # подбрасываем и записываем результат в x
  a[i] <- x         # записываем x в массив результатов
}

plot(a, type = «l»)   # строим график результата

(если плохо копируется, код также есть на гитхабе https://github.com/dmitryy/finance/blob/master/RScripts/1.%20toss%20the%20coin.r)

Нажмем на кнопку с зеленой стрелочкой Source, это позволяет запустить весь файл. Увидим нечто подобное на графике:
Подбрасываем монетку с помощью языка R


Каждый раз нажимая на кнопку, график будет меняться. Таким образом мы написали небольшую простенькую модель поведения актива, используя до селе нам не известный язык R. Далее попробую написать что-то более сложное и описать, если кому-то будет интересно.


Более подробная документация на русском языке по R tsamsonov.github.io/r-geo-course/ 

Также буду благодарен, если подскажите другие источники для обучения, т.к. я сам только начинаю его осваивать.
★35 | ₽ 100
Тьфу, блин… Я монетку при помощи языка подбрасываю до небес
А тут ещё R какоета
avatar

Дмитрий Ш

Поскольку на этом сайте обитает много любителей С Диез,
то можно добавить сюда еще и ссылку на R for .NET

https://archive.codeplex.com/?p=rdotnet
avatar

_sg_

_sg_, он фиговато работает насколько мне известно. Особенно с новыми версиями R. А у Вас получилось раскочегарить rdotnet?
avatar

ch5oh

ch5oh, 
Я пару простых примеров запускал. Глубже не копал.
В основном я ориентируюсь на Python.
Но поскольку Microsoft включил поддержку R даже в MSSQL Server https://docs.microsoft.com/ru-ru/sql/advanced-analytics/r/sql-server-r-services?view=sql-server-2017,
то стоит на него обратить более пристальное внимание.
avatar

_sg_

_sg_, у майкрософт Р получится с щупальцами в самых неподходящих местах. Наверное, примерно как они С++ изуродовали...

 

И опять же: много Вы знаете людей, готовых купить SQL Server? =D

avatar

ch5oh

ch5oh,
В принципе удобно иметь данные и R — аналитику в одном месте в MSSQL Server.
На сколько качественно сделано сказать ничего не могу.
 
avatar

_sg_

_sg_, а вообще R — классный для прототипирования статистических алгоритмов.

Но в тот момент, когда надо выходить в продакшен вдруг выясняется, что он на 3 порядка(!) медленнее C#… Уже полгода грущу с этим знанием...

avatar

ch5oh

ch5oh, А что если я скажу, что продакшен может быть почти целиком на R? :) У R есть интеграция с C++, так что плохо векторизуемые вещи можно реализовать на нём.
В целом-то язык весьма быстрый. Году в 2011-2012 появился JIT, который очень сильно улучшил ситуацию. Проблема в том, что надо многие нюансы знать, чтобы код эффективный получался. Например, в каком случае тот или иной объект S4 разворачивается во что-то примитивное для выполнения операции, а затем заворачивается обратно. Или какие из базовых типов являются immutable и приводят к куче копирований при модификации: если вам нужен map<string, object> — следует юзать environment, а не list. Или какое сочетание параметров colClasses и stringsAsFactors нужно указать функции read.csv, чтобы она прожевала гигабайтный csv файл за пару секунд вместо минут.
avatar

Eugene Logunov

Eugene Logunov, =) уже понял, что Вы эксперт в R. И наверняка умеете его всячески нагибать и раскладывать в удобном и эффективном положении. Да и торговые стратегии могут быть разные.

 

Но лично я был изрядно разочарован. Все же 3 порядка разницы на сопоставимом коде. Может быть, дело действительно в том, что хранение данных нужно было организовывать в Окружении. Может быть, еще в чем-то. К сожалению, вместо получения искомого результата была получена необходимость дополнительно скакать с бубном вокруг кода и уговаривать его работать чуть пошустрее.

 

Поэтому чукча сначала сделал в R кластер на snow, потом сделал кластер на C#… =) и тут-то и выяснилось, что никакой кластер, оказывается, не нужен.

avatar

ch5oh

Достоинство R в том, что все вышеизложенное можно написать просто в одну строчку так;)
plot(100*cumprod(1+sign(rnorm(100))/100), type = «l»)   
avatar

AlexeyTikhonov

AlexeyTikhonov, очень круто, именно из-за ожидания таких каментов и отважился запилить пост :)
avatar

Dmitryy

AlexeyTikhonov, как человек, который виртуально подбрасывал монетки в экселе, вижуал бейсике, паскале, сишарпе, и питоне должен признать, что это строка мне нравится :)
avatar

wrmngr

Почему R а не Python?
avatar

Value

Value, питон сакс. =)
avatar

ch5oh

Value, я и на питон смотрю, но R мне показался интересным именно из-за того, что строит графики на лету и имеет кучу встроенных математических функций. Например, можно зайти на сайт мосбиржи, экспортнуть историю фьюча, импортнуть в РСтудии, и уже строить графики, искать волу, доходности и прочее, без танцев с бубнами, как будто бы в самом экселе работаешь. Но, конечно, приходится по началу много гуглить :)

В питоне возможно тоже есть среда где графики на лету строятся? 
avatar

Dmitryy

Dmitryy, справедливости ради стоит отметить, что у питона есть оболочка Jupiter Notebook, где графики выводить ненамного сложнее
avatar

wrmngr

=) Читайте про функцию sample()

С ее помощью можно не только монетку бросить, но и десяток костяшек запульнуть.

 

Как раз собирался пост наваять для любителей неправильно трактовать ЦПТ.

 

Если интересно. ;-)

avatar

ch5oh

ch5oh, супер, буду ждать пост :)
avatar

Dmitryy

ch5oh, sample() и быстрее будет (в разы!) чем ifelse+for.
avatar

Eugene Logunov

онлайн компилятор многих языков

https://rextester.com/l/r_online_compiler
https://rextester.com

рассказывается в моих темах


Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.

Залогиниться

Зарегистрироваться
....все тэги
UPDONW