8 votos

¿El futuro lenguaje de programación cuantitativa?

Estoy a punto de comenzar la parte de programación de mi educación para ser Quant. Sé qué lenguajes se están utilizando actualmente y cuán populares son. Sin embargo, tengo varios buenos amigos que están obteniendo sus maestrías en ciencias de la computación y carreras relacionadas que me dicen que C++ y lenguajes similares están seguramente obsoletos para lo que hacen los Quants.

Aunque el trabajo se basa en sí mismo y, por lo tanto, actualmente se necesitan C++ y lenguajes similares, ¿ves un cambio en los lenguajes utilizados en los próximos 10 años? Si es así, ¿qué lenguajes esperados anticipas que se usarán?

P.d. Sé que esto es un poco más basado en discusión de lo que normalmente trata Stackexchange. Sin embargo, estoy encuestando en varios sitios con la esperanza de poder escribir sobre este tema para proporcionar ayuda a aquellos en el futuro (ya que casi no hay nada en la web sobre este tema). Además, como el número de sitios Quant activos es limitado, para adquirir un conjunto de datos lo suficientemente grande como para ser útil, Stackexchange fue un gran recurso a usar. - Disculpa cualquier inconveniente.

12voto

Timothy Carter Puntos 7079

Las personas se equivocan en este problema porque siempre terminan discutiendo las ventajas teóricas de estos lenguajes en lugar de los usos prácticos de los mismos.

Hablando teóricamente:

  • Haskell es elegante y tiene muchas de las ventajas teóricas (concisión del lenguaje, ortogonalidad, polimorfismo paramétrico, ADTs, funciones de orden superior, compilador inteligente), ha estado presente durante 25 años, pero aún no es convencional en las finanzas.

  • Python es un lenguaje feo. La sintaxis es admirada por su expresividad, pero decisiones de diseño como el GIL, tipado dinámico, paradigma orientado a objetos, etc. son inherentemente anti-paralelas y décadas en el futuro, cuando tengamos cientos de núcleos en cada procesador, nuestros hijos se reirán de la oscuridad y obsolescencia de tales lenguajes (entre otras cosas como los disquetes).

Sin embargo, hoy casi todos te animarían a aprender Python. ¿Por qué?

El futuro de un lenguaje (o cualquier tecnología, de hecho) está determinado por su comunidad, la riqueza de sus bibliotecas y herramientas de desarrollo y la naturaleza auto-perpetuante del código legado en ese lenguaje, y nunca por sus ventajas teóricas. Podemos escribir ensayos sobre cómo odiamos a Java; las librerías de ROOT y Boost; la verbosidad de XML, pero estas cosas están aquí para quedarse porque han logrado una masa crítica de usuarios dispuestos a construir herramientas o librerías de nivel de producción en torno a ellos. Docenas de lenguajes funcionales como F# vendrán y se irán, pero C++ casi con certeza permanecerá debido a la gran cantidad de código legado en C++. Además, C++ '11 es un gran hito en la resolución de los problemas teóricos a lo largo de su camino de desarrollo.

Algunas opciones que abordaría con cautela:

  • Lenguajes construidos en torno a paradigmas concurrentes y funcionales: Scala, F#. Diría que los abordes con cautela porque se usan en producción en Dropbox, Lime, Tower Research, Credit Suisse, etc., pero estos lenguajes han tardado mucho más en llegar a un uso convencional de lo que esperarías dadas las tendencias actuales en la arquitectura del procesador. Es difícil para mí decirte si invertir tu tiempo ahora en estos lenguajes valdrá la pena exactamente dentro de 5 años, pero todos parecemos estar de acuerdo en que eventualmente lo hará.
  • Lenguajes específicos de dominio: Julia. Desafortunadamente, Julia se comercializa con "bucles internos numéricos de velocidad C". Atrae al mismo subconjunto de la multitud de Python que discutiría con estos usuarios de Julia que esto es irrelevante ya que siempre pueden recurrir a Cython. Ambas multitudes profesan un paradigma condenado y atraen a desarrolladores de baja calidad. (Digo desafortunadamente, porque Julia tiene muchas cosas que la gente no se da cuenta: multimétodos paramétricos de tipo, corutinas simétricas, interfaces limpias con lenguajes externos, influencias de Lisp y soporte de metaprogramación, etc.)

Con eso, alentaría algunas opciones:

  • Lenguajes con soporte de los gigantes: Go, Swift, C#. Aparte del soporte de Google, Go se ha vuelto muy popular en China; Microsoft ha dado un gran paso adelante al abrir el código de C#; y siempre surgen muchas herramientas de desarrollo de UI de alta calidad alrededor de los lenguajes principales de Apple.
  • Lenguajes destinados a reemplazar a C/C++ como un lenguaje de programación de nivel de sistemas: D, Nimrod. D ya cuenta con el respaldo de Facebook, y Nimrod retiene la expresividad de la sintaxis de Python mientras logra impresionantes resultados y se utiliza para ciertos proyectos de programación de nivel de sistemas. Sin embargo, ten en cuenta que ambos aún se basan en el enfoque de recolección de basura para la gestión de la memoria.

¿Alguno de los mencionados ha logrado una masa crítica de buenos desarrolladores? No lo creo. ¡La verdadera solución para ti es que un lenguaje de programación realmente no es difícil de aprender! Lo más importante es que aprendas a diseñar un programa en lugar de un lenguaje específico. Dedica tiempo a los 6 paradigmas principales de lenguajes:

  • Programación imperativa (C) y abstracciones de clases (C++, C#, Java)
  • Abstracción funcional (Lisp, ML, F#)
  • Especificaciones declarativas (plantillas de C++, Haskell, Prolog)
  • Abstracción sintáctica (Lisp)
  • Paralelismo (Cilk, SISAL, Clojure, Erlang)
  • Corutinas (C#, F#, Haskell, Scheme, Icon)

El trading cuantitativo a menudo invoca conceptos de estos tres campos centrales:

  • Algoritmos, patrones de diseño y estructuras de datos: B-trees, skip lists, memoización, DP, etc.
  • Programación de sistemas: Dirección de memoria, ensamblador, enlace, heap/stack, caché, etc.
  • Bases de datos: Normalización, commit de dos fases, replicación, espejado, diseño de esquemas, etc.

Y si te acercas más al extremo del desarrollador cuantitativo:

  • Sistemas distribuidos
  • Sistemas operativos
  • Redes

8voto

Norene Bult Puntos 41

Vas a obtener una amplia gama de respuestas con este tipo de pregunta, pero voy a dar mi punto de vista. No voy a responder tu pregunta sobre la "próxima gran cosa" en lenguajes de programación, porque eso es simplemente una encuesta de opinión. En cambio, voy a describirte las características de algunos lenguajes populares (y maduros y bien soportados/documentados), para que puedas elegir uno para tus necesidades. Todos estos lenguajes han estado disponibles por al menos 10 años, por lo que demuestra que han resistido la prueba del tiempo. Vamos a dividir las necesidades de programación de un quant en diferentes segmentos: investigación y producción.

Cuando se realiza investigación (por ejemplo, probando una estrategia) muchas personas (incluyéndome a mí) prefieren usar un lenguaje interpretado de alto nivel para reducir el número de líneas de código entre una idea y los resultados de la prueba. Esto se debe a que, aunque estos lenguajes suelen ser mucho más lentos que sus contrapartes compiladas, el tiempo del programador es mucho más valioso que el tiempo de ejecución en esta etapa del juego. Sin embargo, vale la pena tener en cuenta que se está investigando mucho para hacer que estos lenguajes sean más rápidos, ¡porque son tan fáciles de usar! Estos lenguajes te permiten hacer cambios pequeños, corregir errores y visualizar resultados en muchas menos líneas de código que lenguajes como C/C++/Java. Casi siempre son compatibles con (y vienen con) una amplia variedad de bibliotecas específicas de dominio que amplían la funcionalidad del lenguaje.

Algunos de los lenguajes de investigación más populares son Matlab, Python (con numpy) y R. Alguien que nunca haya programado en su vida puede aprender los conceptos básicos de estos lenguajes y escribir algo de código simple en menos de un día. Una alternativa gratuita a Matlab es Octave, si no quieres gastar en el paquete comercial. Sin embargo, si eliges Octave, debes tener en cuenta que es casi el lenguaje de cálculo científico más lento disponible. Un lenguaje en el que debes mantener la vista en el futuro es un lenguaje llamado Julia. Este es un lenguaje interpretado (más o menos) que está diseñado de tal manera que logra un rendimiento similar al de C en una amplia variedad de tareas de cálculo numérico. (Hay muchos documentos interesantes por ahí si te interesa cómo lo hacen). Es un lenguaje muy joven que está cambiando rápidamente (y rompiendo la compatibilidad con versiones anteriores), por lo que puede ser mejor esperar a que madure un poco más antes de invertir tiempo/recursos en aprenderlo.

Para el código de producción, eliges un lenguaje basado en las demandas de tu aplicación. Si intentas hacer HFT y ejecutarlo desde un lenguaje interpretado, vas a tener un mal momento. Los lenguajes interpretados simplemente no son lo suficientemente rápidos (¡todavía!) para competir con los lenguajes compilados. Si buscas rendimiento puro, no vas a vencer a C o C++ (Fortran excluido de esta discusión porque realmente no soy fanático, y nunca animaría a nadie a usarlo). Estos lenguajes ofrecen al programador un control muy detallado sobre cada aspecto de la ejecución del programa, pero si no quieres el control, de todos modos tienes que lidiar con él. Si no estás escribiendo en ensamblador, C es tan "cercano al metal" como puedes llegar.

El primer paso atrás desde la familia C/C++ te llevará a Java y C#. La gran característica que notarás aquí es la "Recolección de Basura". Si no sabes qué es esto, no te preocupes por los detalles, pero te ahorra tener que administrar manualmente el consumo de memoria de tu programa. Dado que la idea de que no hay almuerzo gratis debería ser familiar para los lectores de este sitio, podrías suponer que esto conlleva un costo de rendimiento, que puede ser paralizante si dependes de un sistema en tiempo real. El recolector de basura se siente un poco como un hipo en medio de una ejecución por lo demás fluida. En la mayoría de las aplicaciones, no lo vas a notar. Hay una razón por la que la aviónica de los aviones de combate no se escribe en Java, y esta es la razón. Si sientes que tu sistema necesita el mismo nivel de control en tiempo real que un avión, no elijas lenguajes con Recolección de Basura.

A partir de aquí, empiezas a alejarte de los lenguajes que la gente parece utilizar actualmente para programación cuantitativa. Voy a hacer una declaración a favor de uno último que es muy importante, si no es para la ejecución de modelos. Scripts de Bash/Shell. Si estás en un sistema *nix, absolutamente necesitas estar familiarizado con estos para automatizar tareas de mantenimiento del sistema.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X