Нажмите здесь, чтобы опубликовать эту статью в LinkedIn »

Финансы всегда были интересны статистикам, психологам, специалистам по обработке данных и другим специалистам по многим причинам, таким как их прибыльность, хаос и психология, стоящая за ними. Если честно, финансовые рынки очень сложно предсказать. Эта непредсказуемость происходит из-за колебаний, которые являются функцией многих параметров, таких как политические решения правительства, местные и глобальные новости и т. Д. Несмотря на такую ​​сложность, все же есть что-то предсказуемое, и это психология рынка! Согласно различным исследованиям и принципам, таким как волновой принцип Эллиотта, финансовые рынки представляют собой циклические волны. В технике это называется циклическим сигналом, и циклы возникают из-за мышления, стоящего за рынком. В качестве простого примера, если криптовалюта X становится очень дорогой, все хотят получить прибыль и начать продавать свою криптовалюту. В какой-то момент почти все являются продавцами, поэтому нет никакого интереса к покупке. Наличие большого количества продавцов и небольшого количества покупателей приводит к падению цены криптовалюты X. Этот образ мышления повторяется в различных формах, создавая циклический паттерн в данных.

Ряд исследований показывают, что тенденции предсказуемы с помощью машинного обучения; однако точные ценности и исключительное поведение, происходящее на рынке, остаются плохо предсказуемыми. С другой стороны, многие инвесторы довольны прогнозами тренда, поскольку они хотят знать, когда покупать или продавать. Большинство инвесторов ищут прибыль, и точные значения не являются их ключевым интересом. Я считаю, что FTS являются хорошими инструментами для прогнозирования тренда, потому что нечеткий механизм по своей сути может справиться с неопределенностями, которые в основном проявляются на финансовом рынке.

Немного теории должно быть достаточно, чтобы начать пробовать! Сказав это, давайте последуем методологии CRISP-DM и приступим к кодированию.

Давайте вспомним проблему, которую мы решаем.

В качестве первого шага в CRISP-DM нам нужно понять бизнес / проблему. Проблема заключается в «прогнозировании цен или тенденций на криптовалюту с использованием исторических данных».

Давайте прочитаем и разберемся с данными

Cryptocompare предоставляет нам богатый набор Rest API для чтения данных криптовалюты. Используя их услуги, мы можем узнать цену биткойна (BTC) по отношению к доллару США (долларам США):

library(jsonlite)
dataset.btc <- fromJSON("https://min-api.cryptocompare.com/data/histoday?fsym=BTC&tsym=USD&limit=2000&aggregate=1&e=CCCAGG")
# head is the old data and tail the new data
tail(dataset.btc$Data)
head(dataset.btc$Data)    

Давайте разбираться в данных

Вот описание данных:

  • Время: UNIX-время данных (это ежедневные данные)
  • Close: цена биткойна в конце дня
  • High: самая высокая цена биткойна в конкретный день.
  • Низкий: самая низкая цена биткойна в конкретный день.
  • Open: цена биткойна на открытие дня
  • Volumefrom: объем торгов от
  • Volumeto: торговая стоимость до

Подготовим данные

Возможно, этот шаг - самый важный. Чем лучше подготовлены данные, тем выше качество прогноза и его точность. Мы рассмотрим несколько возможных способов подготовки данных:

Расчет тренда

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

R предоставляет различные пакеты и методы для расчета трендов, из которых я выбрал пакет «pracma» и функцию «movavg» для сглаживания сигнала и расчета трендов, как показано ниже:

require(pracma)
dataset.btc$Data$high_avg<-movavg(dataset.btc$Data$high,7,"w")     

На приведенном выше рисунке вы можете увидеть цену Litecoin на ее максимальном дневном уровне красным цветом, а сглаженный сигнал, который является трендом цены, - зеленым.

Исправление UNIX Times

Приведенная ниже функция преобразует дату UNIX в удобочитаемый формат.

library(dplyr)
library(lubridate)
convertUnix <- function(datast){
# This function inputs the dataframe discussed above and adds a new column which is conversion of Unix date to human readable dates
# Args:
#   datast: cryptocurrency dataframe with aforementioned format
#
# Return:
#   datast: the same dataset + newly added column
data.frame(datast) %>% mutate(date=as.Date(as.POSIXct(time, origin="1970-01-01")))->datast
return(datast)
}

Дельты и фактические значения

При прогнозировании временных рядов распространенной практикой является прогнозирование уровня изменений, а не фактических значений. Это дает лучшее понимание поведения, особенно там, где [«где» или «когда»?] Фактические значения выходят за границы и достигают цифр, которых никогда раньше не было (например, когда цена биткойна достигает 18 тыс. Долларов США, чего никогда не было). произошло в исторических данных за 2017 год). Эти экстремальные значения все еще можно предсказать, если рассчитать дельты (дельта означает уровень изменений). Следующая функция вычисляет эти дельты.

convertPercent <- function(data){
# This function inputs a vector of numbers and returns a vector that is the differences between ith and (i-1)th element
# Args:
#   data: the numeric input vector and thus not a dataframe
# Return:
#   data: the percentage of the changes
data= diff(data)/data[-NROW(data)] * 100
return(data)
}

Давайте смоделируем данные

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

FTS_Predict<- function(data,year,month,day,freq){
# This function builds a time series and predicts the 5 steps ahead
# Args:
#   data: the values that should be predicted (trend or actual data)
#   year: starting point of the data in terms of year
#   month: starting point of the data in terms of month
#   day: starting point of the data in terms of day
#   freq: frequency to build the time series
#
# Return:
#   crypto_predict: the prediction and all attached information (such as accuracy and etc)
#Changing format to TS
crypto<-ts(data,start = c(year,month,day),frequency =freq )
# Finding the best C value by DOC function
# Abbasov-Mamedova model
str.C1<-DOC(crypto,n=7,w=7,D1=0,D2=0,CEF="MAPE",type="Abbasov-Mamedova")
C1<-as.numeric(str.C1[1])
crypto_predict<-fuzzy.ts2(crypto,n=7,w=7,D1=0,D2=0,C=C1,forecast=5,type="Abbasov-Mamedova",trace=TRUE,plot=TRUE)
return(crypto_predict)
}

Давайте оценим результаты

На пятом этапе методологии CRISP-DM мы проводим некоторую (перекрестную) проверку. Следующие криптовалюты протестированы и показаны результаты. Вывод, который мы можем сделать здесь, заключается в том, что предсказание тренда менее ошибочно, чем предсказание фактических значений.

Где:

  • ME (средняя ошибка): sum (et) / n
  • MAE (средняя абсолютная ошибка): sum (| et |) / n
  • MPE (средняя ошибка в процентах): сумма ((et / Yt) * 100) / n
  • MAPE (средняя абсолютная ошибка в процентах): sum ((| et | / Yt) * 100) / n
  • MSE (среднеквадратическая ошибка): sum (et * et) / n
  • RMSE (корень среднеквадратичной ошибки): sqrt (sum (et * et) / n)
  • U (статистика U Тейла): RMSE прогноза / RMSE наивного прогноза.

[Yt - это «серия наблюдений». Ft - это «Прогнозируемая серия». et - это «остаточный ряд». n - размер выборки.]

Заключение и дальнейшая работа

В этой статье я использовал нечеткие временные ряды (FTS) для прогнозирования цен на криптовалюту. Находясь в секторе оценки, FTS является многообещающим методом, особенно для прогнозирования тенденций в криптовалютах.

Цель этой статьи - представить FTS в сфере криптопрогнозирования, и тем не менее, следующие шаги могут быть предприняты в качестве будущей работы:

  • Настройка параметров:

Еще есть место для настройки параметров во время подготовки данных и моделирования.

  • Фьюжн и дельты:

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