На выходных перенес свой алгоритм поиска интересных акций с Python на R. Заключается он в том, что алгоритм проходится по всем более менее ликвидным акциям Московской Биржи, выгружает исторические данные за интересующий нас период, считает мат. ожидание дневной доходности, которое является мерой доходности и средне-квадратичное отклонение дневной доходности, которое является мерой риска. Далее сортирует акции по этим критериям и фильтрует с заданными трешхолдами.
Мат.ожидание дневной доходности — это своего рода надежда на будущий рост по тренду. А мера риска в качестве ср.-кв. отклонения связана с тем, что если за день акция может упасть слишком сильно, это создает повышенный риск. Марковиц тоже использовал такие критерии в своей портфельной теории.
Если взять 80 акций Мос. биржи и анализировать данные только за этот год, затем поставить фильтр, то получается следующая выборка.
Также в R с помощью пакета rusquant или quantmod(для Америки) можно построить график и наложить индикаторы.
Видно, что акция подобрана неплохая. Только хватит ли духу купить ее в хай? )
Код на 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”?
Портфельная теория Марковица