2010-02-19 22 views
15

Actualmente estoy trabajando en un componente de un producto de negociación que permitirá a un desarrollador de estrategia o cuantitativo escribir sus propias estrategias personalizadas. Obviamente no puedo hacer que escriban estas estrategias en lenguajes nativamente compilados (o incluso en un lenguaje que se compila en un bytecode para ejecutarse en una vm) ya que sus ciclos de desarrollo/prueba tienen que ser del orden de minutos.Lenguaje de scripting para el desarrollo de la estrategia comercial

He visto lua, python, ruby ​​hasta el momento y realmente he disfrutado de todos ellos hasta el momento, pero aún así los encontré un poco "de bajo nivel" para mis usuarios objetivo. ¿Debo de alguna manera escribir mi propio intérprete + intérprete para respaldar un lenguaje con un mínimo de soporte para bucles, evaluación aritmética simple, expresión lógica, o existe alguna otra recomendación que cualquiera de ustedes pueda tener? Gracias por adelantado.

+1

¿Necesita completar su idioma o necesita saber que se detendrá? – Earlz

Respuesta

10

Mark-Jason Dominus, el autor del módulo de Perl Text::Template, tiene algunas ideas que podrían ser relevantes:

Cuando la gente hace una plantilla módulo como éste, que casi siempre inicio por la invención de un especial sintaxis para sustituciones. Por ejemplo, ellos compilarlo para que una cadena como %% VAR %% se reemplace con el valor de $ VAR. Luego se dan cuenta de la necesidad de formato adicional , por lo que ponen en algunos sintaxis especial para el formateo. Luego, necesitan un bucle, por lo que inventan una sintaxis de bucle . Muy pronto tienen nuevo y pequeño lenguaje de plantilla.

Este enfoque tiene dos problemas: Primero, su pequeño lenguaje está paralizado. Si necesita hacer algo que el autor no ha pensado, pierde. Segundo: ¿Quién quiere aprender otro idioma?

Si escribe su propio mini-lenguaje, podría terminar en la misma situación: mantener una gramática y un analizador para una herramienta que está paralizada por el diseño.

Si un lenguaje de programación real parece un nivel demasiado bajo, la solución puede no ser abandonar el idioma sino proporcionar a los usuarios finales funciones de utilidad de nivel superior, para que puedan operar con conceptos familiares sin obtener atascado en las malas hierbas del lenguaje subyacente.

que permite a los usuarios principiantes operar a un alto nivel; sin embargo, usted y cualquier usuario final con una gran habilidad para ello, sus superusuarios, aún pueden aprovechar toda la potencia de Ruby, Python o lo que sea.

+2

Respuesta de muy buena calidad; Gracias. ¡Creo que la mayoría de nosotros deberíamos darnos cuenta de que no somos diseñadores de lenguaje, somos desarrolladores! Me gusta la idea de diseñar herramientas basadas en GUI junto con una interfaz de script para mis usuarios avanzados; Realmente lo mejor de ambos mundos. – Pierreten

1

Se necesitarán módulos personalizados, independientemente de lo que elija, que definan los constructos de alto nivel de su empresa.

A continuación se detallan algunas de las necesidades que imagino: es posible que ya tenga algunas de estas: una forma de obtener posiciones actuales, cotizaciones actuales e históricas, datos de rendimiento previos, etc. en la aplicación. Define/backtest/envía varios tipos de órdenes (límite/mercado/stop, qué intercambio, desencadenadores) o parámetros de opciones, etc. Probablemente necesites varias cajas de arena para probar, así como las reales.

Quants quieren poder hacer operaciones de matriz, cálculo estocástico, PDE.
Si quisiera hacerlo en python, cargar NumPy sería un comienzo.

También podría comenzar con un sistema patentado diseñado para hacer investigación financiera matemática, como algo construido sobre Mathematica o Matlab.

8

Parece que es posible que necesite crear algún tipo de lenguaje específico de dominio (DSL) para los usuarios que podría crearse libremente en la parte superior del idioma de destino. Ruby, Python y Lua tienen sus diferentes peculiaridades con respecto a la sintaxis, y hasta cierto punto algunas de ellas pueden ser masajeadas con definiciones de funciones inteligentes.

Un ejemplo de una DSL bastante robusta es Cucumber que implementa una estrategia interesante de conversión de verborrea específica del usuario a código ejecutable real a través de una serie de expresiones regulares aplicadas a los datos de entrada.

Otro candidato podría ser JavaScript, o algún tipo de puente DSL a JavaScript, ya que eso permitiría que la estrategia se ejecute desde el lado del cliente o desde el servidor. Eso podría ayudar a escalar su aplicación ya que las máquinas de los clientes a menudo tienen un poder de computación excedente en comparación con un servidor muy cargado.

+1

Tcl es excelente para implementar DSL –

+3

Ruby es particularmente bueno para escribir DSL (paréntesis y bloques opcionales lo facilitan). Echa un vistazo a este artículo de Martin Fowler en Ruby's Rake: http://martinfowler.com/articles/rake.html – horseyguy

0

Esto puede ser un poco simplista, pero muchos usuarios de Quant están acostumbrados a trabajar con las macros de Excel & VBA. Sería útil algo como VBSCript, ya que pueden tener alguna experiencia en esta área.

0

Los idiomas existentes son "un poco" bajo nivel "para mis usuarios objetivo".

Sin embargo, todo lo que necesita es "un mínimo de apoyo para recorrer, aritmética simple, evaluación de la expresión lógica"

No entiendo el problema. Solo quieres algunas características. ¿Qué pasa con la lista de idiomas que proporcionó? ¿En realidad ofrecen esas características?

¿Qué es la desconexión? No dude en actualizar su pregunta para ampliar el problema.

+0

Gran punto S.Lott, cometí el error de no separar a los usuarios avanzados de los principiantes. Estoy planeando incluir a Ruby para las secuencias de comandos ahora para dichos usuarios avanzados. – Pierreten

0

Usaría Common Lisp, que es compatible con el desarrollo rápido (tiene una imagen en ejecución y puede compilar/recompilar funciones individuales) y adaptar el idioma a su dominio. Debería proporcionar funciones y macros como elementos básicos para expresar estrategias, y todo el lenguaje estaría disponible para que el usuario los combine.

0

Primero defina el idioma - si es posible, use el seudonuuaje llamado EBN, es muy simple (vea la entrada de Wikipedia).

Luego, una vez que tenga eso, elija el idioma. Casi seguramente querrás usar un DSL. Ruby y Lua son muy buenos en eso, IMO.

Una vez que comience a trabajar en él, puede encontrar que vuelve a su definición y lo modifica. Pero esa es la orden correcta para hacer las cosas, creo.

0

¿Hay algo en el sentido de Processing en el nivel de complejidad que está fotografiando? El procesamiento es un buen ejemplo de tomar un lenguaje completo (Java) y reducir/simplificar la sintaxis disponible en solo un subconjunto aplicable al dominio del problema (dominio del problema = visualización en el caso de Procesamiento).

Aquí hay una pequeña comparación lado a lado de los documentos de procesamiento.

Java:

g.setColor(Color.black) 
fillRect(0, 0, size.width, size.height); 

de procesamiento:

background(0); 

Como otros han sugerido, es posible que pueda escribir simplemente suficientes funciones de alto nivel tal que la mayor parte de la complejidad está oculta para el usuario pero aún conserva la capacidad de hacer más cosas de bajo nivel cuando sea necesario. El lenguaje de cableado para Arduino sigue esta estrategia de usar una capa delgada de funciones de alto nivel encima de C para hacerlo más accesible para los que no son programadores ni para los aficionados.

1

He estado trabajando en una biblioteca de operaciones algorítmicas de Python (en realidad para backtesting, no para operaciones reales). Es posible que desee echarle un vistazo: http://gbeced.github.com/pyalgotrade/

0

He estado en la misma construcción de barcos y el comercio con mi propio software. Java no es genial porque quieres algo más alto como dices. He tenido mucho éxito usando el eclipse project xtext. http://www.eclipse.org/Xtext Hace todas las conexiones de analizadores de construcción, etc. para usted y al usar eclipse puede generar código rápidamente con editores funcionales. Sugiero investigar esto al considerar otras opciones también. Esto combinado con el marco de modelado de eclipses es muy poderoso para construir DSL rápidamente que suena como usted lo necesita. - Duncan

1

Consulte http://www.tadeveloper.com para un marco de backtesting con MATLAB como lenguaje de scripting. MATLAB tiene la ventaja de que es muy potente, pero no es necesario ser un programador para usarlo.

Cuestiones relacionadas