Нажмите здесь, чтобы опубликовать эту статью в 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 в сфере криптопрогнозирования, и тем не менее, следующие шаги могут быть предприняты в качестве будущей работы:
- Настройка параметров:
Еще есть место для настройки параметров во время подготовки данных и моделирования.
- Фьюжн и дельты:
Мы обсудили расчет дельты и процент изменений, но никогда не использовали их позже. Это потому, что это часть более крупного подхода, в котором я хочу объединить больше источников данных для прогнозирования. Об этом пойдет речь в следующей статье.