SciFi
SciFi личный блог
06 июня 2016, 12:02

Поиск акций для инвестирования по критериям доходности и риска с помощью R

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

Мат.ожидание дневной доходности — это своего рода надежда на будущий рост по тренду. А мера риска в качестве ср.-кв. отклонения связана с тем, что если за день акция может упасть слишком сильно, это создает повышенный риск. Марковиц тоже использовал такие критерии в своей портфельной теории.

Если взять 80 акций Мос. биржи и анализировать данные только за этот год, затем поставить фильтр, то получается следующая выборка.

Поиск акций для инвестирования по критериям доходности и риска с помощью R

Также в R с помощью пакета rusquant или quantmod(для Америки) можно построить график и наложить индикаторы. 

Поиск акций для инвестирования по критериям доходности и риска с помощью R

Видно, что акция подобрана неплохая. Только хватит ли духу купить ее в хай? ) 

Код на R

# ПОИСК АКЦИЙ ДЛЯ ИНВЕСТИРОВАНИЯ ПО КРИТЕРИЮ ДОХОДНОСТЬ И РИСК

#install.packages("tseries")
# Установка пакета tseries (анализ временных рядов и количественные финансы)

#install.packages("rusquant", repos="http://R-Forge.R-project.org")
# Установка пакета rusquant (адаптированная под Россию версия quantmod)

library(tseries)
library(rusquant)
# Подключение библиотек

Tikers <- read.csv('market80.csv', header = TRUE, sep = ";")
# Читаем из файла тикеры акций
# Файл с тикерами акций получаем с сайта ММВБ http://moex.com/s1163

assetsName <- as.character(Tikers[,1])
# Сохраняем названия тикеров в отдельную переменную для удобства

system.time(getSymbols(assetsName, from='2016-01-01', to=Sys.Date(), src='Finam'))
# Загружаем данные по тикерам c Финам
# Замеряем сколько на загрузку потребовалось времени в секундах

for (i in 1:length(assetsName))  { ifelse ( i==1,
                                            returns <- dailyReturn(eval(parse(text=assetsName[1]))),
                                            returns <- cbind(returns,dailyReturn(eval(parse(text=assetsName[i])))))}
# Сохраняем в отдельную таблицу доходность каждого дня для каждого тикера

names(returns) <- as.character(Tikers[,1])
# Присваиваем новые названия колонок

stat.data <- as.data.frame( t(sapply(returns, function(cl) list(means=mean(cl,na.rm=TRUE), 
              sds=sd(cl,na.rm=TRUE)))))
# Получаем среднюю доходность и стандартное отклонение, сохраняем в отдельную таблицу

stat.data <- as.data.frame(lapply(stat.data, unlist))
# Убираем список, который образовался на предыдущем этапе

attach(stat.data)
# Прицепляем таблицу для короткого доступа к данным

newdata <- stat.data[order(-means, sds),]
# Сортируем по убыванию мат. ожидания доходности и возрастанию ср.-кв. отклонения

newdata.subset <- subset(newdata, means > 0.002 & sds < 0.02)
# Оставляем только те активы, доходность которых выше требуемого нам значения, а 
# отклонение ниже.

View(newdata.subset)
# Визуализируем полученную таблицу

detach(stat.data)
# Отцепляем таблицу

candleChart(BANE)
# Строим свечной график интересующей нас акции из списка

addEMA(20, col="green")
# Добавляем индикатор EMA(20)

addCCI()
# Добавляем индикатор CCI

Список использованных источников

Выгрузка тикеров из Мос. биржи по параметрам

R. Считаем корреляцию.

Индекс товарного канала (CCI)

means and SD for columns in a dataframe with NA values


Add Technical Indicator to Chart

How to combine multiple conditions to subset a data-frame using “OR”?

Портфельная теория Марковица

0 Комментариев

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

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