Sunday 11 December 2016

Forex Backtesting Python

QSForex es un backtesting basado en eventos de código abierto y una plataforma de trading en vivo para uso en los mercados de divisas (forex), actualmente en un estado alfa. Se ha creado como parte de la serie Forex Trading Diario en QuantStart para proporcionar a la comunidad de comercio sistemática con un motor de comercio robusto que permite la implementación de la estrategia de Forex y las pruebas directas. El software se proporciona bajo una licencia permisiva del MIT (véase abajo). Open-Source - QSForex ha sido lanzado bajo una Licencia de MIT de código abierto extremadamente permisiva, que permite el uso completo en aplicaciones de investigación y comerciales, sin restricciones, pero sin garantía de ningún tipo. Gratis - QSForex es completamente gratuito y no cuesta nada descargar o usar. Colaboración - Como QSForex es de código abierto, muchos desarrolladores colaboran para mejorar el software. Se agregan nuevas funciones con frecuencia. Cualquier error es rápidamente determinado y fijo. Desarrollo de software - QSForex está escrito en el lenguaje de programación de Python para soporte directo de multiplataforma. QSForex contiene un conjunto de pruebas de unidad para la mayoría de su código de cálculo y nuevas pruebas se agregan constantemente para nuevas características. Arquitectura impulsada por eventos - QSForex es completamente orientada a eventos tanto para backtesting como para trading en vivo, lo que lleva a la transición directa de estrategias desde una fase de investigación / prueba hasta una implementación de trading en vivo. Costos de transacción - Los costes de propagación se incluyen de forma predeterminada para todas las estrategias de backtest. Backtesting - QSForex ofrece backtesting de varios días de varias divisas de resolución de ticks. Trading - QSForex actualmente soporta el comercio intraday en vivo utilizando el OANDA Brokerage API a través de una cartera de pares. Métricas de rendimiento - QSForex actualmente admite la medición del rendimiento básico y la visualización de la equidad a través de las bibliotecas de visualización Matplotlib y Seaborn. Instalación y uso 1) Visite oanda / y configure una cuenta para obtener las credenciales de autenticación de la API, que deberá realizar en vivo. Explicar cómo llevar a cabo esto en este artículo: Quantstart / articles / Forex-Trading-Diario-1-Automated-Forex-Trading-con-el-OANDA-API. 2) Clone este repositorio git en una ubicación adecuada en su máquina usando el siguiente comando en su terminal: git clone github / mhallsmoore / qsforex. git. Alternativa puede descargar el archivo zip de la rama principal actual en github / mhallsmoore / qsforex / archive / master. zip. 3) Cree un conjunto de variables de entorno para todas las configuraciones encontradas en el archivo settings. py en el directorio raíz de la aplicación. Alternativamente, puede codificar sus configuraciones específicas sobrescribiendo las llamadas os. environ. get (.) Para cada configuración: 4) Cree un entorno virtual (virtualenv) para el código QSForex y utilice pip para instalar los requisitos. Por ejemplo, en un sistema basado en Unix (Mac o Linux) puede crear un directorio como el siguiente introduciendo los siguientes comandos en el terminal: Esto creará un nuevo entorno virtual para instalar los paquetes en. Suponiendo que descargó el repositorio gist QSForex en un directorio de ejemplo como / projects / qsforex / (cambie este directorio a donde quiera que haya instalado QSForex), entonces para instalar los paquetes necesitará ejecutar los siguientes comandos: Tiempo como NumPy, SciPy, Pandas, Scikit-Learn y Matplotlib deben ser compilados. Hay muchos paquetes necesarios para que esto funcione, así que eche un vistazo a estos dos artículos para obtener más información: También tendrá que crear un enlace simbólico desde su directorio de paquetes de sitio a su directorio de instalación de QSForex para poder llamar Import qsforex dentro del código. Para ello necesitará un comando similar al siguiente: Asegúrese de cambiar / projects / qsforex a su directorio de instalación y /venv/qsforex/lib/python2.7/site-packages/ a su directorio de paquetes de sitios virtualenv. Ahora podrá ejecutar los comandos siguientes correctamente. 5) En esta etapa, si simplemente desea llevar a cabo la práctica o el comercio en vivo, entonces puede ejecutar python trading / trading. py. Que utilizará la estrategia de trading predeterminada de TestStrategy. Esto simplemente compra o vende un par de divisas cada 5 tick. Es puramente para la prueba - no la utilice en un ambiente que vive vivo Si usted desea crear una estrategia más útil, después cree simplemente una nueva clase con un nombre descriptivo, por ejemplo. MeanReversionMultiPairStrategy y asegúrese de que tiene un método calculatesignals. Tendrá que pasar a esta clase la lista de parejas, así como la cola de eventos, como en trading / trading. py. Por favor, vea strategy / strategy. py para más detalles. 6) Con el fin de llevar a cabo cualquier backtesting es necesario generar datos de forex simulados o descargar datos históricos tick. Si desea simplemente probar el software, la forma más rápida de generar un ejemplo de backtest es generar algunos datos simulados. El formato de datos actual utilizado por QSForex es el mismo que el proporcionado por el DukasCopy Historical Data Feed en dukascopy / swiss / english / marketwatch / historical /. Para generar algunos datos históricos, asegúrese de que la configuración de CSVDATADIR en settings. py debe establecerse en un directorio donde desee que los datos históricos se mantengan. A continuación, debe ejecutar generatesimulatedpair. py. Que está en el directorio scripts /. Se espera un solo argumento de línea de comandos, que en este caso es el par de divisas en formato BBBQQQ. Por ejemplo: En esta etapa, el script está codificado para crear un solo mes de datos para enero de 2014. Es decir, verá archivos individuales, del formato BBBQQQYYYYMMDD. csv (por ejemplo, GBPUSD20140112.csv) aparecen en su CSVDATADIR para todos los días hábiles en Ese mes. Si desea cambiar el mes / año de la salida de datos, simplemente modifique el archivo y vuelva a ejecutarlo. 7) Ahora que los datos históricos han sido generados es posible realizar un backtest. El archivo backtest se almacena en backtest / backtest. py. Pero esto sólo contiene la clase Backtest. Para ejecutar realmente un backtest es necesario instanciar esta clase y proporcionarle los módulos necesarios. La mejor manera de ver cómo se hace esto es mirar el ejemplo de implementación de Media Crossover de Moving en el archivo examples / mac. py y usarlo como una plantilla. Esto hace uso de MovingAverageCrossStrategy que se encuentra en strategy / strategy. py. Por defecto, se negocian GBP / USD y EUR / USD para demostrar el uso de varios pares de divisas. Utiliza los datos encontrados en CSVDATADIR. Para ejecutar el ejemplo backtest, simplemente ejecute lo siguiente: Esto llevará algún tiempo. En mi sistema de escritorio Ubuntu en casa, con los datos históricos generados a través de generatesimulatedpair. py. Tarda alrededor de 5-10 minutos para correr. Una gran parte de este cálculo se produce al final del backtest real, cuando se calcula la reducción, así que por favor recuerde que el código no ha colgado Por favor, déjelo hasta su finalización. 8) Si desea ver el rendimiento del backtest, puede utilizar output. py para ver una curva de equidad, retornos de periodo (es decir, tick-to-tick) y una curva de reducción: Y eso es todo. Para comenzar a crear sus propios backtests modificando o añadiendo estrategias en strategy / strategy. py y utilizando datos reales descargados de DukasCopy (dukascopy / swiss / english / marketwatch / historical /). Si tiene alguna pregunta sobre la instalación, por favor no dude en enviarme un correo electrónico a mikequantstart. Si tiene algún error o cualquier otro problema que cree que puede ser debido específicamente a la base de código, no dude en abrir un problema de Github aquí: github / mhallsmoore / qsforex / issues Copyright (c) 2015 Michael Halls-Moore A cualquier persona que obtenga una copia de este software y archivos de documentación asociados (el Software), para tratar el Software sin restricciones, incluyendo, sin limitación, los derechos de usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y O vender copias del Software y permitir que las personas a las que se suministre el Software, con sujeción a las siguientes condiciones: El aviso de copyright anterior y este aviso de permiso se incluirán en todas las copias o partes sustanciales del Software. EL SOFTWARE SE PROPORCIONA TAL CUAL, SIN GARANTÍA DE NINGÚN TIPO, EXPLÍCITA O IMPLÍCITA, INCLUYENDO PERO SIN LIMITARSE A LAS GARANTÍAS DE COMERCIABILIDAD, ADECUACIÓN PARA UN FIN DETERMINADO Y NO INFRACCIÓN. EN NINGÚN CASO, LOS AUTORES O LOS TITULARES DE DERECHOS DE AUTOR SERÁN RESPONSABLES DE CUALQUIER RECLAMACIÓN, DAÑO O CUALQUIER OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN DE CONTRATO, AGRAVIO O DE OTRA MANERA, QUE SURJA DE O EN RELACIÓN CON EL SOFTWARE O EL USO O OTROS NEGOCIOS EN EL SOFTWARE. Descargo de divisas Forex Trading El cambio de divisas en el margen conlleva un alto nivel de riesgo y puede no ser adecuado para todos los inversores. Los resultados anteriores no son indicativos de resultados futuros. El alto grado de apalancamiento puede trabajar en su contra, así como para usted. Antes de decidir invertir en divisas debe considerar cuidadosamente sus objetivos de inversión, nivel de experiencia y apetito de riesgo. Existe la posibilidad de que usted podría sostener una pérdida de parte o la totalidad de su inversión inicial y por lo tanto no debe invertir dinero que no puede permitirse perder. Usted debe ser consciente de todos los riesgos asociados con el comercio de divisas, y buscar asesoramiento de un asesor financiero independiente si tiene alguna duda. Para su back-testing, hay una manera sencilla de descargar archivos de datos masivos en su estrategia o un gran Número de días de negociación simulados - archivos más pequeños - para realizar una PampL basado en ROI de estos díasprofiles - alcista, bajista, reversiones, plana Su estrategia podría no aplicarse perfectamente todos los días, por lo tanto, un reconocimiento de patrón es necesario por lo que podría ser difícil aplicar la misma estrategia Bajo niveles específicos de volatilidad. Para obtener un buen análisis de rendimiento, tendrá que ver para qué tipo de diagrama de comercio de día de su estrategia se realiza mejor y luego ajustar algunos parámetros y / o desarrollar alternativas para aplicar en otras circunstancias. Aquí hay un BPM creado hace algún tiempo para apoyar el análisis de rendimiento de las estrategias iTrade es una iniciativa de educación para ser lanzado a finales de año 2016 602 Vistas middot Ver Upvotes middot No para la reproducción Más respuestas más abajo. ¿Por qué la mayoría de las empresas de trading algorítmicas profesionales (no HFT) utilizan C / C / Java para realizar backtesting y creación de estrategias cuando otros idiomas (como R o Python) proporcionan algunos marcos muy buenos para iterar rápidamente a través de varios prototipos tempranos de diferentes estrategias ¿Dónde puedo vivir la prueba de una estrategia comercial que funciona muy bien cuando se backtested ¿Hay conjuntos de datos gratuitos para backtesting cuantita estrategias ¿Qué son buenos tutoriales sobre backtesting mi estrategia comercial con R / Excel ¿Cuáles son las mejores referencias en python para alguien que le gustaría construir y backtest sus estrategias ¿Hay libros similares al comercio cuantitativo con R, que tiene python como su base ¿Cómo puedo realmente construir un backtest para una estrategia comercial en R O Python ¿Cuáles son algunos de los mejores recursos (libros, blogs) o referencias para backtesting estrategias comerciales en R? ¿Cuál es la anatomía de un backtest de estrategia? ¿Cómo hago para aprender Para programar estrategias de negociación automatizadas sin experiencia en programación Algorithmic Trading: ¿Cuáles son algunos servicios / herramientas de backtesting? Backtesting con Python - Part I Weve pasó los últimos meses en QuantStart backtesting varias estrategias comerciales utilizando Python y pandas. La naturaleza vectorizada de los pandas asegura que ciertas operaciones en grandes conjuntos de datos son extremadamente rápidas. Sin embargo, las formas de backtester vectorizado que hemos estudiado hasta la fecha sufren algunos inconvenientes en la forma en que se simula la ejecución del comercio. En esta serie de artículos vamos a discutir un enfoque más realista de la simulación de estrategia histórica mediante la construcción de un entorno de backtesting impulsado por eventos utilizando Python. Software conducido por eventos Antes de profundizar en el desarrollo de un backtest, necesitamos entender el concepto de sistemas impulsados ​​por eventos. Los videojuegos proporcionan un caso de uso natural para el software impulsado por eventos y proporcionan un ejemplo sencillo para explorar. Un videojuego tiene múltiples componentes que interactúan entre sí en un ajuste en tiempo real a altas velocidades. Esto se maneja ejecutando el conjunto completo de cálculos dentro de un bucle infinito conocido como el bucle de eventos o el bucle de juego. En cada tick del loop de juego se llama a una función para recibir el último evento. Que habrá sido generada por alguna acción previa correspondiente dentro del juego. Dependiendo de la naturaleza del evento, que podría incluir una pulsación de tecla o un clic del ratón, se tomará alguna acción posterior, que terminará el ciclo o generará algunos eventos adicionales. El proceso continuará. He aquí un ejemplo de pseudo-código: El código está continuamente revisando nuevos eventos y luego realizando acciones basadas en estos eventos. En particular, permite la ilusión de manejo de respuestas en tiempo real debido a que el código se está continuamente realizando bucle y se comprueban los eventos. Como quedará claro que esto es precisamente lo que necesitamos para llevar a cabo la simulación de comercio de alta frecuencia. Por qué un Backtester impulsado por eventos Los sistemas impulsados ​​por eventos ofrecen muchas ventajas sobre un enfoque vectorizado: Reutilización de código - Un backtestter basado en eventos, por diseño, puede usarse tanto para backtesting histórico como para transacciones en vivo con un cambio mínimo de componentes. Esto no es cierto en los testers vectorizados en los que todos los datos deben estar disponibles a la vez para realizar el análisis estadístico. Bias de Lookahead - Con un backtestter impulsado por eventos no hay sesgo de lookahead ya que el recibo de datos de mercado se trata como un evento que debe ser actuado. Por lo tanto, es posible gotear un alimentador de eventos con datos de mercado, replicando cómo se comportaría un sistema de gestión de pedidos y cartera. Realismo - Los backtesters dirigidos por eventos permiten personalización significativa sobre cómo se ejecutan los pedidos y se incurren en los costos de transacción. Es sencillo manejar órdenes básicas de mercado y límites, así como mercado en abierto (MOO) y mercado en cierre (MOC), ya que se puede construir un controlador de cambio personalizado. Aunque los sistemas impulsados ​​por eventos tienen muchos beneficios, sufren dos grandes desventajas frente a sistemas vectorizados más sencillos. En primer lugar, son mucho más complejos de implementar y probar. Hay más partes móviles que conducen a una mayor posibilidad de introducir errores. Para mitigar esta metodología adecuada de pruebas de software, tal como el desarrollo basado en pruebas, se puede emplear. En segundo lugar, son más lentos de ejecutar en comparación con un sistema vectorizado. Las operaciones óptimas vectorizadas no pueden utilizarse cuando se realizan cálculos matemáticos. Discutiremos maneras de superar estas limitaciones en artículos posteriores. Descripción general de los backtesters dirigidos por eventos Para aplicar un enfoque basado en eventos a un sistema de backtesting es necesario definir nuestros componentes (u objetos) que manejarán tareas específicas: Event - The Event es la unidad de clase fundamental del sistema impulsado por eventos. Contiene un tipo (como MARKET, SIGNAL, ORDER o FILL) que determina cómo se manejará dentro del ciclo de eventos. Cola de eventos: la cola de eventos es un objeto de cola de Python en memoria que almacena todos los objetos de subclase de eventos generados por el resto del software. DataHandler - El DataHandler es una clase base abstracta (ABC) que presenta una interfaz para manejar datos de mercado históricos o en vivo. Esto proporciona una flexibilidad significativa, ya que los módulos de la Estrategia y la Cartera pueden reutilizarse entre ambos enfoques. El DataHandler genera un nuevo MarketEvent en cada pulsación del sistema (ver abajo). Estrategia - La Estrategia es también un ABC que presenta una interfaz para tomar los datos de mercado y generar SignalEvents correspondientes, que son utilizados en última instancia por el objeto Portfolio. Un SignalEvent contiene un símbolo ticker, una dirección (LONG o SHORT) y un timestamp. Portafolio - Este es un ABC que maneja la gestión de pedidos asociados con posiciones actuales y posteriores para una estrategia. También lleva a cabo la gestión de riesgos en toda la cartera, incluyendo la exposición sectorial y el dimensionamiento de la posición. En una implementación más sofisticada, esto podría ser delegado a una clase RiskManagement. La cartera toma SignalEvents de la cola y genera OrderEvents que se agregan a la cola. ExecutionHandler: ExecutionHandler simula una conexión con una correduría. El trabajo del manejador es tomar OrderEvents de la cola y ejecutarlos, ya sea a través de un enfoque simulado o una conexión real a un corretaje de hígado. Una vez que se ejecutan los pedidos, el manejador crea FillEvents, que describen lo que realmente se realizó, incluyendo cargos, comisiones y resbalones (si se modelan). El bucle - Todos estos componentes se envuelven en un bucle de eventos que maneja correctamente todos los tipos de eventos, encaminándolos al componente apropiado. Este es un modelo bastante básico de un motor de comercio. Existe un margen significativo de expansión, particularmente en lo que se refiere a la utilización de la cartera. Además, los diferentes modelos de costos de transacción también se pueden resumir en su propia jerarquía de clases. En esta etapa introduce una complejidad innecesaria dentro de esta serie de artículos, por lo que actualmente no lo discutiremos más. En tutoriales más recientes, probablemente expandiremos el sistema para incluir realismo adicional. Aquí hay un fragmento de código de Python que demuestra cómo funciona el backtest en la práctica. Hay dos bucles que ocurren en el código. El bucle exterior se utiliza para dar al backtestter un latido. Para el comercio en tiempo real es la frecuencia con la que se encuestan los nuevos datos del mercado. Para las estrategias de backtesting esto no es estrictamente necesario ya que el backtester utiliza los datos de mercado proporcionados en la forma de goteo de alimentación (ver la línea bars. updatebars ()). El bucle interno maneja los Eventos del objeto Cola de eventos. Los eventos específicos se delegan en el componente respectivo y posteriormente se agregan nuevos eventos a la cola. Cuando la cola de eventos está vacía, el latido del corazón continúa: Este es el esquema básico de cómo se diseña un backtestter dirigido por eventos. En el siguiente artículo discutiremos la jerarquía de clases Event.


No comments:

Post a Comment