2010-06-13 14 views
6

Estoy construyendo un sistema de gestión de cartera de negociación que es responsable de la producción, optimización y simulación de carteras de negociación no de alta frecuencia (que se ocupan de barras de datos de 1min o 3min, no de datos de tics).¿Qué lenguaje de programación para la simulación de la cartera de negociación de uso intensivo de cómputo?

Planeo emplear los servicios web de Amazon para asumir toda la carga de la aplicación.

Tengo cuatro opciones que considero como idioma.

  1. Java
  2. C++
  3. C#
  4. Python

Aquí es el alcance de los extremos del alcance del proyecto. No es así como será, quizás nunca, pero está dentro del alcance de los requisitos:

  • Simulación semanal de 10,000,000 sistemas comerciales.
  • (Se espera que cada sistema comercial tenga sus propios métodos de minería de datos, incluidos algoritmos de selección de características que son extremadamente costosos en términos de computación. Imagine las características 500-5000 utilizando envoltorios. No se ejecutan con frecuencia de ninguna manera, pero sigue siendo una consideración)
  • la producción en tiempo real de la cartera w/100.000 estrategias de negociación
  • Tomando en 1 minuto o 3 datos min de todos los mercados de valores/futuros de todo el mundo (aproximadamente 100.000) optimización
  • cartera de carteras con hasta 100.000 estrategias. (Algoritmo bastante intenso)

La velocidad es una preocupación, pero creo que Java puede manejar la carga.

Solo quiero asegurarme de que Java PUEDA manejar los requisitos anteriores cómodamente. No quiero hacer el proyecto en C++, pero lo haré si fuera necesario.

La razón por la que C# está allí es porque pensé que era una buena alternativa a Java, aunque no me gusta Windows en absoluto y preferiría Java si todas las cosas son las mismas.

Python - He leído algo sobre PyPy y pyscho que dicen que python se puede optimizar con la compilación de JIT para ejecutarse a velocidades cercanas a C ... Esa es la única razón por la que está en esta lista, además de ese hecho Python es un lenguaje excelente y probablemente sea el idioma más divertido para codificar, lo cual no es un factor en absoluto para este proyecto, sino un beneficio.

Para resumir:

  • producción en tiempo real
  • simulaciones semanales de un gran número de sistemas
  • optimizaciones semanal/mensual de carteras
  • gran número de conexiones para recopilar datos de

No se trata de intercambios en milisegundos o incluso segundos.La única consideración es si Java puede tratar con este tipo de carga cuando se extiende de una cantidad necesaria de servidores EC2.

Muchas gracias muchachos por su sabiduría.

+0

No hay ninguna razón para suponer que C++ sea más rápido que Java (como parece estar asumiendo), porque ese no es siempre el caso. – Jesper

+0

Bien, punto tomado Jesper. Sé apenas C++ en absoluto. Solo estoy tratando de elegir una dirección y atenerme a ella. Para las personas que defienden Python ... además de los beneficios obvios de usar Python, ¿hay alguna diferencia en el rendimiento entre Java y Python? Considere que esto eventualmente se utilizará para el comercio en vivo: honestamente no puedo decir si Python es mucho más lento que Java o si es más rápido ("cerca de la velocidad C") lo cual está obstaculizando mi decisión. Pensé que iba a ir a Java, pero aún no está escrito en piedra. ¡Gracias a todos! – Bijan

+0

Tenga en cuenta que puede usar Jython en la JVM junto con Java (el idioma). Aunque no estoy seguro de cuán maduro es Jython. Si no conoces bien a Python, me quedaré con Java. –

Respuesta

4

Escogería Java para esta tarea. En términos de RAM, la diferencia entre Java y C++ es que en Java, cada Objeto tiene una sobrecarga de 8 Bytes (usando la JVM de Sun de 32 bits o la JVM de Sun de 64 bits con punteros comprimidos). Entonces, si tiene millones de objetos volando, esto puede hacer la diferencia. En términos de velocidad, Java y C++ son casi iguales en esa escala.

Así que lo más importante para mí es el tiempo de desarrollo. Si comete un error en C++, obtiene un error de segmentación (y a veces ni siquiera lo obtiene), mientras que en Java obtiene una Excepción agradable con un seguimiento de pila. Siempre he preferido esto.

En C++ puede tener colecciones de tipos primitivos, que Java no tiene. Tendría que usar bibliotecas externas para obtenerlas.

Si tiene requisitos en tiempo real, el recolector de basura de Java puede ser una molestia, ya que lleva algunos minutos recolectar un montón de 20 GB, incluso en máquinas con 24 núcleos. Pero si no creas demasiados objetos temporales durante el tiempo de ejecución, también debería estar bien. Es solo que su programa puede hacer que esa recolección de basura se detenga cuando no lo espere.

+0

Gracias. Creo que voy a ir con Java. – Bijan

+0

¿Se puede aplicar este mismo argumento a C# /. NET? –

5

Elija el idioma que le resulte más familiar. Si los conoce a todos por igual y la velocidad es una preocupación real, seleccione C.

+1

Para ser honesto: si los conocía a todos igual de bien, entonces probablemente no tendría que preguntar aquí. –

+0

Eso es correcto. Solo sé Java. El resto solo tengo una comprensión superficial de. – Bijan

4

Escríbalo en su idioma preferido. Para mí eso suena a pitón. Cuando empiece a ejecutar el sistema, puede crear un perfil y ver dónde están los cuellos de botella. Una vez que realice algunas optimizaciones básicas si aún no es aceptable, puede volver a escribir porciones en C.

Una consideración podría ser escribir esto en iron python para aprovechar el clr y dlr en .net. Entonces puede aprovechar .net 4 y extensiones paralelas. Si algo le da un aumento en el rendimiento, será un poco de subprocesamiento lo que .net hace extremadamente bien.

Editar:

sólo quería hacer esta parte clara. De la descripción, parece que el procesamiento en paralelo/multihilo es donde la mayoría de las ganancias de rendimiento vendrán.

+1

+1, gran comentario, y Jython también es una opción para Python en la JVM, si algo en el espacio de Java se requiere específicamente. –

+0

Python no es la respuesta para todo en este mundo. En este caso, estoy seguro de que Java/C++ son opciones mucho mejores. –

+0

Me voy a ahorcar diciendo que C++ es una opción terrible basada en los requisitos de OP. Si buscas velocidad, utiliza C. C++ ofrece tantas oportunidades para ahorcarte si no lo conoces bien. Java puede ser una gran elección. Pero si al OP le gusta usar Python, y puede usarlo bien, ¿por qué no sería la opción para estas circunstancias si la infraestructura es compatible con los objetivos de rendimiento? –

3

¿Por qué solo un idioma para su sistema? Si yo fuera usted, construiré todo el sistema en Python, pero C o C++ se usarán para componentes de rendimiento crítico. De esta manera, tendrá un sistema muy flexible y extensible con un rendimiento lo suficientemente rápido. Puede encontrar incluso herramientas para generar contenedores automáticamente (por ejemplo, SWIG, Cython). Python y C/C++/Java/Fortran no compiten entre sí; se están complementando

5

Si bien soy un gran admirador de Python y personalmente no soy un gran amante de Java, en este caso tengo que admitir que Java es el camino correcto a seguir.

Para muchos proyectos, el rendimiento de Python no es un problema, pero en su caso incluso las penalizaciones de rendimiento menores se acumularán extremadamente rápido. Sé que esto no es una simulación en tiempo real, pero incluso para el procesamiento por lotes, sigue siendo un factor a tener en cuenta. Si resulta que la carga es demasiado grande para un servidor virtual, una implementación que es dos veces más rápida reducirá a la mitad los costos de su servidor virtual.

Para muchos proyectos también argumentaría que Python te permitirá desarrollar una solución más rápido, pero aquí no estoy seguro de que sea el caso. Java tiene herramientas de desarrollo de clase mundial y marcos de nivel empresarial de primer nivel para el procesamiento en paralelo y la implementación de servidores cruzados, y mientras que Python tiene soluciones en esta área, Java claramente tiene la ventaja. También tiene opciones de arquitectura con Java que Python no puede igualar, como Javaspaces.

Argumentaría que C y C++ imponen una sobrecarga de desarrollo demasiado grande para un proyecto como este. Son viables, si estás familiarizado con esos idiomas, estoy seguro de que sería factible, pero aparte del potencial para un mayor rendimiento, no tienen nada más que aportar.

C# es solo una reescritura de Java. Eso no es malo si eres un desarrollador de Windows y si prefieres Windows, usaría C# en lugar de Java, pero si no te importa Windows no hay motivo para preocuparte por C#.

0

Es útil para mirar el bucle interno de su código numérico. Después de todo, pasarás la mayor parte del tiempo de tu CPU dentro de este ciclo.

Si el bucle interno es una operación de matriz, entonces sugiero python y scipy, pero del bucle interno si no es una operación de matriz, entonces me preocuparía que python sea lento. (O tal vez envolvería C++ en python usando swig o boost :: python)

El beneficio de python es que es fácil de depurar, y ahorra mucho tiempo al no tener que compilar todo el tiempo. Esto es especialmente útil para un proyecto en el que invierte mucho tiempo programando internos profundos.

Cuestiones relacionadas