Наивная модель прогнозирования тенденций рынка. Часть 2

В прошлый раз я сделал основные теоретические выкладки для построения простейшей модели прогнозирования ВРТ – наивной модели.

Напомню, что НМП для ВРТ выглядит так:

si+1=-si                       (1)

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

Сегодня есть возможность провести это самое тестирование. Оно будет заключаться в расчете показателя PL по последним 100 ретроспективным значениям ВРТ на основе НМП. То есть для тестирования будет использоваться предыстория ВРТ.

При этом значения параметра α будут менять последовательно от 0 до 1 с шагом 0.01. Посмотрим, при каких значениях параметра α модель дает точность большую 50%.

Если будущее значение, определённое по НМП и фактическое значение ВРТ вместе окажутся за порогом (по абсолютной величине) или вместе окажутся меньше, либо равны порогу (по абсолютной величине), в этом случае считается, что прогноз оправдался. Иначе прогноз не оправдался.

Как всегда, берем данные EUR/USD, GBP/JPY, AUD/CAD, трансформируем их в ВРТ, очищаем от выбросов и тестируем точность НМП.

Вот наглядные изображения (графики), полученные по результатам тестирования. На графиках зависимость показателя PL от параметра α.

 acPLeuPLgjPL

 Там, где пересекаются синие линии — там PL=50% и соответствующее ему значение α, при котором по результатам тестирования PL=50%.

В общем получается примерно такая «картина». При α=0, порог t=0, и, естественно, прогноз в этом случае 100%. (это потому, что знаки ВРТ чередуются и фактически при α=0 мы прогнозируем знак).

Далее, примерно, при α=0.2-0.3 точность прогнозирования становится менее 50%. И с последующим увеличением α она быстро падает.

Вот такие далеко не впечатляющие результаты.

Но теперь есть ориентир! Любая другая, более сложная модель прогнозирования ВРТ оправдана, если точность прогнозирования будет больше 50% при значениях α больших, нежели у НМП!

Вот скрипт на языке R, как я это все проверял.

#------------------------------
 #Загрузка котировок
 S<-getS(f)
 #Дифференцирование
 dS<-diff(S,1)
 #Получение ВРТ
 csgS<-getCSGS(dS)
 #Последние 1000 значений ВРТ
 x<-csgS[,1][1:1000]
 n<-length(x)
 #Очистка от выбросов
 b<-0.05
 lv<-getlv(x,b)
 x<-fltV(x,lv,b)
 PLV<-100;at<-NA
 while(a<=1)
 {
 #Тестовый интервал
 t<-100
 #Результат тестирования
 res<-testM(x,t)
 #Оценка точности
 PL<-100*sum(res[,1]*res[,2])/t
 if ((PL<50) && (is.na(at))) {at<-a}
 PLV<-c(PLV,PL)
 a<<-a+0.01
 }
 plot(y=PLV,x=seq(from=0,to=1,by=0.01),col="red",type="l",
main=np,xlab=expression(alpha),ylab="PL")
 abline(h=50,col="blue")
 abline(v=at,col="blue")
 print(at)

 И функции, которые использовались и не были описаны ранее:

#----------------------------------------------------------
 #Наивная модель прогнозирования (версия 1)
 predM1<-function(V)
 {
 lenV<-length(V)
 #Ограничения применимости
 if (lenV==0) {return(0)}
 return(-V[lenV])
 }
 #-----------------------------------------------------------
 #тестирование модели
 testM<-function(V,t)
 {
 res<-NULL
 lenV<-length(V)
 #Ограничения применимости
 if (lenV==0) {return(0)}
 if (lenV<=t) {return(0)}
 for(i in (lenV-t):(lenV-1))
 {
 #Расчет дельты
 d<-getd(V[1:i])
 #Расчет порогового значения
 th<-a*d
 #Формирование таблицы прогнозных значений и фактических будущих значений
 res<-rbind(res,as.numeric(c(abs(predM1(V[1:i]))>th,abs(V[i+1]))>th))
 }
 colnames(res)<-c("prv","fv")
 return(res)
 }

 На сегодня достаточно.

Похожие статьи:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *