Thursday, 16 November 2017

Sistema De Comercio Svm


Trading with Support Vector Machines (SVM) Por último, todas las estrellas se han alineado y puedo dedicar un poco de tiempo a las pruebas de nuevos sistemas comerciales, y Support Vector Machines (SVM) son los nuevos 8220toy8221 que me va a mantener ocupado por un mientras. Las SVM son una herramienta bien conocida del área de aprendizaje supervisado de máquinas. Y se utilizan tanto para la clasificación como para la regresión. Para más detalles consulte la literatura. Me parece que la aplicación más intuitiva para el comercio es la regresión, por lo que let8217s empezar por la construcción de un modelo de regresión SVM. Siguiendo nuestra experiencia con los modelos de ARMAGARCH, comenzaremos intentando pronosticar rendimientos, en vez de precios. Del mismo modo, en nuestras primeras pruebas, utilizaremos sólo los retornos de los últimos 5 días como las características que determinan el retorno de un día en particular. Comenzaremos con una historia de 500 días como el conjunto de entrenamiento. En términos más matemáticos, para el conjunto de entrenamiento tenemos N características, para cada una de ellas tenemos M muestras. También tenemos respuestas M. Dada una fila de valores de característica, la matriz izquierda, el SVM se entrena para producir el valor de respuesta. En nuestro ejemplo específico, tenemos cinco columnas (características), cada columna correspondiente a los retornos con un retraso diferente (de 1 a 5). Tenemos 500 muestras y las respuestas correspondientes. Una vez que el SVM está entrenado en este set, podemos empezar a alimentarlo con conjuntos de cinco características, correspondientes a los retornos de los cinco días anteriores, y el SVM nos proporcionará la respuesta, que es el retorno previsto. Por ejemplo, después de entrenar a la SVM en los 500 días anteriores, usaremos las devoluciones de los días 500, 499, 498, 497 y 496 (estas son nuestras como la entrada para obtener el retorno previsto para el día 501. De todos los paquetes disponibles En R, decidí elegir el paquete e1071.Una segunda alternativa fue el paquete kernlab, que todavía estoy planeando probar en el futuro. Entonces he intentado algunas estrategias. Primero he intentado algo muy similar al enfoque de ARMAGARCH 8211 el De los cinco días anteriores. Me sorprendió mucho ver que esta estrategia de desempeño mejor que el ARMAGARCH (esta es la tierra natal de la ARMAGARCH y yo habría sido muy feliz con un rendimiento comparable) A continuación, traté de los mismos cinco , Pero tratando de seleccionar el mejor subconjunto. La selección se realizó con un enfoque codicioso, comenzando con 0 características, y la adición interactiva de la característica que minimiza el error mejor. Este enfoque mejoró aún más las cosas. Por último, he intentado un enfoque diferente con alrededor de Una docena de características. Las características incluyeron retornos en diferentes periodos de tiempo (1 día, 2 días, 5 días, etc), algunas estadísticas (media, mediana, sd, etc) y el volumen. Utilicé el mismo enfoque codicioso para seleccionar características. Este sistema final mostró un muy buen rendimiento también, pero tomó un infierno de un tiempo para correr. Tiempo para terminar este post, los resultados de la prueba de espalda tienen que esperar. Hasta entonces usted puede jugar con el código fuente completo usted mismo. He aquí un ejemplo de cómo usarlo: Comentarios Hola En windows doesn8217t trabajo debido a un problema multicore. Una cosa más que no entiendo se refleja en esto a las filas de los datos del código retsindex (data) datos dataindex (rets) En mi opinión it8217s más eficaces para fusionar series smth como mydtret lt - na. exclude (merge (rets, data) Y tener sólo un objeto de argumento para llamar a la función en lugar de 2 Trabajo interesante, gracias Mike Argh, Windows 8211 Lo uso raramente últimamente. Que sorprendido aún, ya que el paquete paralelo es parte de la distribución de base R. Ahora espero que se abordará pronto Mientras tanto, ¿qué hay de no usar la ejecución paralela También hay otros paquetes que proporcionan la ejecución en paralelo, pero que sería más trabajo Tienes razón sobre la fusión 8211 Todavía me pregunto por qué lo hice de esta manera esta vez :) I8217m recibir errores. Ahora el error es gt datos svmFeatures (tt), c (1,2) Error en match. fun (FUN). Objeto 8216skewness8217 no encontrado Pero cuando hago manualmente objeto de datos recibo error en la predicción svmComputeOneForecast lt - función relacionada con las dimensiones y samplingquotcrossquot It039s difícil para mí para depurar skewness viene del paquete PerformanceAnalytics, que debe instalar desde CRAN. Agregar require (PerformanceAnalytics) como la primera línea de svmFeatures debería solucionar el primer problema. Ahora el error es Error en merge. xts (res, xts (na. trim (longitud de 8216dimnames8217 retras, k 21, alinear 8220right8221) 2 no es igual a la extensión de la matriz que parece que en el código de Windows necesita una gran cantidad de cambios Mike, nunca quise decir que el código se utilizara directamente (hasta ahora solo le proporcionaba fragmentos), pero me sorprende que R en Windows sea tan feo. No estoy seguro de cuál es tu objetivo, pero para analizar el rendimiento de las estrategias, Serie de indicadores que ya están computados. Is8217s pura interés académico en SVM. He utilizado para trabajar con clusters, PCA y estoy curioso cómo SVM está haciendo el mismo trabajo. En las ventanas de un montón de errores están relacionados con los objetos con las fechas como xts es O los marcos de datos. Unix es mejor, pero todos los corredores dar API para Windows. Algunos de ellos en Java y sólo esto podemos utilizar desde UNIX. No don8217t como ganar arquitectura, pero it8217s un hábito ya y don8217t tengo tiempo para cambiar de sistema operativo. Lo probé en Windows 7, 64 bits, versión R 2.15.2.Tengo una advertencia de svmFeatures, que sé cómo solucionar (llamando a sd en un objeto xts / zoo hace una conversión interesante a una matriz), pero no hay problemas. Correr: Gracias I8217ll intentar. Una pregunta si no te importa Por qué estás usando get con la función cetSymbols from quantmod package Yo uso call vers Ejemplo SPY lt - getSymbols (039SPY039, auto. assign FALSE) Tienes mucho que calcular y consumir memoria y toma tiempo para obtener objetos Nombre como una cadena var El mismo error I8217m usando R 2.15.1 Pero I8217m sorprendido con este resultado antes de llamar gt cabeza (datos) 1 función (8230, lista de caracteres (), paquete NULL, lib. loc NULL, 2 verbose getOption (8220verbose8221 ), 4) () () () () () () () () () () () () () () () () (...) Los datos son palabra reservada Y ahora I don039t saben lo que va a las características functionA SVM única comercialización Estrategia Support Vector Machines (SVM) están ganando popularidad en la máquina de aprendizaje de sistemas de comercio. Tienen ventajas de las redes neuronales (NN), ya que se garantiza encontrar la solución óptima. NN puede quedar atrapado en un mínimo local, por lo que mientras obtenga un resultado utilizando NN nunca puede estar seguro de que es óptimo. Además, si NN se inicia con pesos aleatorios, probablemente obtendrá un conjunto diferente de pesos cada vez que ejecute backpropagation en el mismo conjunto de datos. SVMs tienen sus inconvenientes también. Específicamente la selección de los parámetros 8216hyper8217. Estas son la penalidad (C), el ancho gaussiano (g) si se utiliza un núcleo RBF y la insensibilidad a epsilon (e) si se usa Regresión Vectorial de Soporte (SVR). Mi uso de SVM hasta ahora ha sido utilizarlos en la clasificación por lo que sólo tiene que seleccionar los parámetros C y g 8211 Yo uso el núcleo RBF estándar. It8217s lo suficientemente duro tratando de predecir si el mercado va a subir o bajar, y mucho menos por cuánto. Podemos seleccionar estos parámetros usando una búsqueda de cuadrícula. Esto significa que simplemente intentamos cada combinación de parámetros y vemos cuál funcionó mejor. La forma en que se evalúan los parámetros es mediante la validación cruzada n veces. Validación cruzada Esto se explica mejor con un ejemplo. Si tenemos 1000 ejemplares de entrenamiento etiquetados y usamos una validación cruzada de 10 veces, entonces para cada combinación de C, g hacemos lo siguiente: Sacar aleatoriamente 10 de las muestras. Este es nuestro conjunto de 100 sesiones de entrenamiento. Entrenar a la SVM en los 90 restantes y crear un modelo. Utilice el modelo para probar la precisión en el conjunto de retención. Repita el ejercicio 10 veces y tome la precisión media. Lo anterior es una validación cruzada de 10 veces. Podríamos llevar esto a la conclusión lógica y sólo tener una sola instancia en el hold-out 8216set8217. Esta es la validación cruzada "dejar uno por uno". Nos daría la evaluación más precisa de la combinación de parámetros, pero en la práctica 10 veces o incluso 5 veces es lo suficientemente bueno. Entonces, ¿cómo hacemos realmente una validación cruzada El paquete libSVM en csie. ntu. edu. tw/ cjlin / libsvm / contiene algunos scripts de Python en el directorio tools. You8217ll necesidad de instalar Python y Gnuplot. También puede utilizar DeepThought disponible en deep-thought. co. En los ejemplos siguientes, utilizaré DeepThought. Lo primero que necesitamos son algunos datos. I8217ll usará un conjunto de entrenamiento con las siguientes características Hora del día Diferencia promedio de precio de cierre entre los 30 bares anteriores Diferencias promedio de movimiento entre los anteriores 1,2,3,4,5,7,9,13,16,20,25,31 , 45,55,70,100 bares con períodos de MA de 5, 10, 20, 50 y 100 El objetivo es -1 para el precio bajará al cierre de la siguiente barra, 1 para el precio subirá al cierre de La siguiente barra. Una vez que he definido esto en la configuración, ejecuto el comando para extraer el conjunto de entrenamiento. I8217ve también utiliza la escala de min-max. I8217ll discutir la preparación de la característica y la escala en otro artículo. El comando anterior creará archivos de entrenamiento de todos los modelos definidos en la configuración de DeepThought. Después de que el comando haya completado un archivo h4-features. training. data se crea el mismo directorio del cual ejecuté el comando. Esto está en el formato de libSVM así que podemos utilizar las herramientas de libSVM para funcionar la búsqueda de la rejilla, o utilizar la búsqueda de la cuadrilla construida en DeepThought. También se crea el archivo h4-features. training. data. csv que contiene los mismos datos pero en formato CSV para que puedas jugar con él en otras herramientas como R, Python, Excel etc. Para ejecutar la búsqueda de cuadrícula en DeepThought utilizo El comando: Los resultados están en el archivo de registro donde Resultado: es el porcentaje de precisión: Los resultados (poco interesantes) en el medio se han eliminado por brevedad. Podemos ver que el SVM parece favorecer las gammas más pequeñas y el C parece ser un valor razonable. Deberíamos preocuparnos si el mejor gamma era grande y el C pequeño, ya que probablemente significa algún tipo de error de datos. Los siguientes valores más altos son aproximadamente los mismos que los mejores parámetros, lo que indica que la selección de parámetros es relativamente insensible. Nos preocupamos si los valores que dan el mejor resultado son valores atípicos. Backtesting de la única estrategia de SVM El paso final es evaluar cómo un único SVM realiza en un backtest. En este backtest simplemente compramos con un 1 pronóstico y vendemos con un -1 pronóstico. Si somos largos y conseguimos una señal de la compra añadimos otra posición a un tamaño máximo de la posición de 10. Inversamente para las señales de la venta. Utilizando el mejor C de 128 y gamma de 0.00195313 podemos cortar y pasar el fragmento XML siguiente del archivo de registro de búsqueda de cuadrícula en el archivo de configuración de DeepThought: El backtest se ejecuta con el siguiente comando: El backtest de DeepThought opera creando un conjunto de entrenamiento en El cierre de cada barra, el EURUSD H4 en este caso. Cuando se llega al cierre de la siguiente barra se hace una previsión y se entran y / o se cierran las operaciones, entonces el modelo se vuelve a entrenar de nuevo preparado para la siguiente barra. Por lo tanto, se adapta continuamente a las últimas condiciones y todas las pruebas están fuera de la muestra, evitando el ajuste excesivo. Los resultados del backtest fueron: y una trama de la PnL (trazado usando R): Parece un poco ok, pero probablemente no algo we8217d comercio como es. El siguiente artículo discutirá conjuntos para ver si podemos mejorar este resultado. Trading con Support Vector Machines (SVM) (Este artículo fue publicado por primera vez en R Quintuitive y amablemente contribuyó a R-bloggers) Finalmente todas las estrellas se han alineado y puedo Confiadamente dedicar algún tiempo para volver a probar los nuevos sistemas de comercio, y las máquinas de apoyo vector (SVM) son el nuevo 8220toy8221 que va a mantenerme ocupado por un tiempo. Las SVM son una herramienta bien conocida del área de aprendizaje supervisado de máquinas. Y se utilizan tanto para la clasificación como para la regresión. Para más detalles consulte la literatura. Me parece que la aplicación más intuitiva para el comercio es la regresión, por lo que let8217s empezar por la construcción de un modelo de regresión SVM. Siguiendo nuestra experiencia con los modelos de ARMAGARCH, comenzaremos intentando pronosticar rendimientos, en vez de precios. Del mismo modo, en nuestras primeras pruebas, utilizaremos sólo los retornos de los últimos 5 días como las características que determinan el retorno de un día en particular. Comenzaremos con una historia de 500 días como el conjunto de entrenamiento. En términos más matemáticos, para el conjunto de entrenamiento tenemos N características, para cada una de ellas tenemos M muestras. También tenemos respuestas M. Dada una fila de valores de característica, la matriz izquierda, el SVM se entrena para producir el valor de respuesta. En nuestro ejemplo específico, tenemos cinco columnas (características), cada columna correspondiente a los retornos con un retraso diferente (de 1 a 5). Tenemos 500 muestras y las respuestas correspondientes. Una vez que el SVM está entrenado en este set, podemos empezar a alimentarlo con conjuntos de cinco características, correspondientes a los retornos de los cinco días anteriores, y el SVM nos proporcionará la respuesta, que es el retorno previsto. Por ejemplo, después de entrenar a la SVM en los 500 días anteriores, usaremos las devoluciones de los días 500, 499, 498, 497 y 496 (estas son nuestras como la entrada para obtener el retorno previsto para el día 501. De todos los paquetes disponibles En R, decidí elegir el paquete e1071.Una segunda alternativa fue el paquete kernlab, que todavía estoy planeando probar en el futuro. Entonces he intentado algunas estrategias. Primero he intentado algo muy similar al enfoque de ARMAGARCH 8211 el De los cinco días anteriores. Me sorprendió mucho ver que esta estrategia de desempeño mejor que el ARMAGARCH (esta es la tierra natal de la ARMAGARCH y yo habría sido muy feliz con un rendimiento comparable) A continuación, traté de los mismos cinco , Pero tratando de seleccionar el mejor subconjunto. La selección se realizó con un enfoque codicioso, comenzando con 0 características, y la adición interactiva de la característica que minimiza el error mejor. Este enfoque mejoró aún más las cosas. Por último, he intentado un enfoque diferente con alrededor de Una docena de características. Las características incluyeron retornos en diferentes periodos de tiempo (1 día, 2 días, 5 días, etc), algunas estadísticas (media, mediana, sd, etc) y el volumen. Utilicé el mismo enfoque codicioso para seleccionar características. Este sistema final mostró un muy buen rendimiento también, pero tomó un infierno de un tiempo para correr. Tiempo para terminar este post, los resultados de la prueba de espalda tienen que esperar. Hasta entonces usted puede jugar con el código fuente completo usted mismo. He aquí un ejemplo de cómo usarlo: Nunca pierdas una actualización Suscríbete a los bloggers R para recibir correos electrónicos con los últimos mensajes de R. (No volverá a ver este mensaje.)

No comments:

Post a Comment