Me han dado algunos datos (son datos de ticks financieros) y quiero predecir, basándome en algunas variables observadas, si el próximo movimiento será al alza, a la baja o sin cambios.
Así que he estado tratando de utilizar la regresión logística multinomial, esta es mi primera vez haciendo la regresión logística por lo que quiero comprobar que he hecho esto correctamente y que mis resultados parecen razonables.
En este momento estoy haciendo 3 regresiones logísticas bivariadas.
Así que codifico los datos de forma que tengo tres nuevas series temporales etiquetadas como arriba, abajo y sin cambios. Éstas se generan comprobando si el movimiento n pasos por delante fue hacia arriba, hacia abajo o sin cambios en la serie original y añadiendo un uno a la matriz correspondiente y haciendo que todas las demás entradas sean cero.
A continuación, hago una regresión logística bi-variable de estas matrices de subida, bajada y sin cambios contra los regresores individualmente.
A continuación, puedo calcular la probabilidad de cada uno utilizando la transformación:
$$\textrm{prob} = 1/(1+\exp[-Bx])$$
donde $\beta$ son las betas de las regresiones logísticas bivariadas. Y $x$ es el valor de los regresores.
Esto me da la probabilidad de subir, bajar y no cambiar.
Entonces simplemente comparo si $\textrm{probability of UP} > \textrm{probability of Down}$ si es así, el modelo predice que será al alza y viceversa.
P.1) ¿Es correcta mi metodología? Ahora mismo estoy haciendo todos los cálculos sobre la serie de precios (no sobre la serie de rendimientos)?
P.2) Cuando pruebo esta precisión en la muestra estoy obteniendo un 70% de precisión en la muestra (tanto para los movimientos ascendentes como descendentes)? ¿Es esa una puntuación razonable para la prueba en la muestra?
P.3) La probabilidad del modelo sin cambios es muy baja, normalmente alrededor del 14%. Por lo tanto, nunca se selecciona la opción sin cambios (porque las probabilidades de los movimientos ascendentes y descendentes son siempre mucho mayores). Sin embargo, el cambio más comúnmente observado es sin cambios, con una probabilidad incondicional del 91%. ¿Existe alguna forma de corregir el modelo para que el modelo prevea con exactitud los cambios?
Actualización: ¡Aquí está el código, lamentablemente estoy obteniendo diferencias entre los resultados de la regresión de 2 variables y los resultados de 3 variables!
Posible error entre dos: regresión de 2 variables ejecutada con mnrfit() y una versión equivalente de 3 variables sobre los rendimientos de los activos. Los rendimientos se han clasificado como positivos, negativos o planos. La regresión logística se ejecuta entonces sobre las rtns frente a los rendimientos clasificados (se trata de una simple prueba para comprobar que la regresión funciona como se pretende). Cuando hago esto para la versión de 2 variables, es decir, rtns al alza frente a todo lo demás, la regresión da una estimación de la probabilidad de que una rentabilidad 0 no sea una rentabilidad al alza del 88%. A medida que se incrementa el tamaño de la rentabilidad, la probabilidad de que sea positiva aumenta, convergiendo finalmente a 1 (como cabría esperar). Asimismo, a medida que se introducen rtns cada vez más negativas en el modelo de regresión logística, la probabilidad de que la rtn sea positiva se reduce a cero. Lo mismo ocurre con la estimación de 2 variables de los rendimientos a la baja frente a todo lo demás. Las cifras son similares a las anteriores, pero con los signos de los rendimientos invertidos.
Ahora cuando ejecuto la versión de 3 variables. Inicialmente, las cosas se ven bien: cuando se da una rentabilidad de cero, se estima que la probabilidad de que sea cero es del 86%, con una probabilidad de un movimiento a la baja =6,4% y un movimiento al alza =7,6%, es decir, muy similar al caso de 2 variables. Además, cuando se introducen rentabilidades más y más grandes, la probabilidad de que sea una rentabilidad positiva converge a 1, como cabría esperar, pero cuando se introducen rentabilidades negativas más y más grandes, la probabilidad de que la rentabilidad sea negativa converge a cero, mientras que la probabilidad de que sea igual a cero aumenta a 1. Lo cual es claramente erróneo.
Data1 = LoadMat_SHFE_Range(Contract1, StartDate, EndDate);
rtn=(Data1.Mid(2:end)-Data1.Mid(1:end-1))./(Data1.Mid(1:end-1));
NStep=0;
Up=nan(length(rtn),1);
Down=nan(length(rtn),1);
Flat=nan(length(rtn),1);
RtnClass=nan(length(rtn),1);
for i=1:length(rtn)-NStep
if(rtn(i+NStep)>0)
Up(i)=2;
Down(i)=1;
Flat(i)=1;
elseif(rtn(i+NStep)<0)
Up(i)=1;
Down(i)=2;
Flat(i)=1;
elseif(rtn(i+NStep)==0)
Up(i)=1;
Down(i)=1;
Flat(i)=2;
end
end
[BUp,dev,stats] = mnrfit(rtn,Up);
MatProbUp = mnrval(BUp,0.1);
[BDown,dev,stats] = mnrfit(rtn,Down);
MatProbDown = mnrval(BDown,0.1);
for i=1:length(rtn)
if(rtn(i)>0)
RtnClass(i)=3;
elseif(rtn(i)<0)
RtnClass(i)=2;
elseif(rtn(i)==0)
RtnClass(i)=1;
end
end
[BM,dev,stats] = mnrfit(rtn,RtnClass,'model','ordinal');
[pihat,dlow,hi] = mnrval(BM,0,stats,'model','ordinal');