2010-06-13 14 views
6

Sto costruendo un sistema di gestione del portafoglio di negoziazione che è responsabile della produzione, dell'ottimizzazione e della simulazione di portafogli di trading non ad alta frequenza (che si occupano di barre di dati di 1min o 3min, non di tick).Quale linguaggio di programmazione per la simulazione del portafoglio di trading ad alta intensità di calcolo?

Ho intenzione di utilizzare i servizi Web di Amazon per assumere l'intero carico dell'applicazione.

Ho quattro scelte che sto considerando come lingua.

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

Ecco la portata degli estremi della portata del progetto. Questo non è come sarà, forse mai, ma è nel campo di applicazione dei requisiti:

  • Simulazione settimanale di 10.000.000 sistemi di trading.
  • (Ogni sistema di trading prevede i propri metodi di data mining, inclusi algoritmi di selezione delle caratteristiche estremamente costosi.) Immaginate le funzioni 500-5000 usando i wrapper, che non vengono eseguiti spesso con qualsiasi mezzo, ma è comunque una considerazione)
  • di produzione in tempo reale del portafoglio w/100.000 strategie di trading
  • Prendendo in 1 min o 3 dati minimo da tutti i mercati azionari/dei futures in tutto il mondo (circa 100.000) ottimizzazione
  • portafoglio dei portafogli con fino a 100.000 strategie. (algoritmo piuttosto intensivo)

La velocità è un problema, ma credo che Java possa gestire il carico.

Voglio solo assicurarmi che Java possa gestire comodamente i requisiti di cui sopra. Non voglio fare il progetto in C++, ma lo farò se è necessario.

Il motivo per cui C# è attivo è perché ho pensato che fosse una buona alternativa a Java, anche se non mi piace affatto Windows e preferirei Java se tutte le cose fossero uguali.

Python - Ho letto qualcosa su PyPy e pyscho che sostengono che Python può essere ottimizzato con la compilazione JIT per essere eseguito a velocità simili a quelle di C ... Questo è praticamente l'unico motivo per cui è presente in questo elenco, oltre a questo fatto che Python è un ottimo linguaggio e probabilmente sarebbe il linguaggio più divertente da codificare, il che non è affatto un fattore per questo progetto, ma un vantaggio.

Per riassumere:

  • tempo reale la produzione
  • simulazioni settimanali di un gran numero di sistemi
  • settimanali ottimizzazioni/mensili di portafogli
  • un gran numero di connessioni per raccogliere dati da

Non si tratta di transazioni con millisecondo o anche secondo.L'unica considerazione è se Java può eventualmente gestire questo tipo di carico quando si diffonde da una quantità necessaria di server EC2.

Grazie ragazzi per la vostra saggezza.

+0

Non c'è motivo di supporre che C++ sia più veloce di Java (come sembra che tu stia assumendo), perché non è sempre così. – Jesper

+0

Ok, punto preso Jesper. Conosco a malapena qualsiasi C++. Sto solo provando a scegliere una direzione e ad attenervici. Per le persone che difendono Python ... oltre agli ovvi benefici dell'uso di Python, c'è una differenza di prestazioni tra Java e Python? Considera che questo alla fine sarà usato per il trading dal vivo - non posso dire onestamente se Python è molto più lento di Java o se è più veloce ("vicino a C-like speed") che sta ostacolando la mia decisione. Pensavo che stavo andando java ma non è ancora scolpito nella pietra. Grazie a tutti! – Bijan

+0

Si noti che è possibile utilizzare Jython sulla JVM insieme a Java (la lingua). Anche se non sono sicuro di quanto sia maturo Jython. Se non conosci bene Python, allora mi limiterei a restare in Java. –

risposta

4

Selezionerei Java per questa attività. In termini di RAM, la differenza tra Java e C++ è che in Java, ogni oggetto ha un sovraccarico di 8 byte (utilizzando la JVM Sun a 32 bit o la JVM Sun 64 bit con puntatori compressi). Quindi se hai milioni di oggetti che volano in giro, questo può fare la differenza. In termini di velocità, Java e C++ sono quasi uguali a quella scala.

Quindi la cosa più importante per me è il tempo di sviluppo. Se si commette un errore in C++, si ottiene un errore di segmentazione (ea volte non si ottiene nemmeno quello), mentre in Java si ottiene una bella eccezione con una traccia dello stack. Ho sempre preferito questo.

In C++ è possibile avere raccolte di tipi primitivi, che Java non ha. Dovresti usare librerie esterne per ottenerle.

Se si dispone di requisiti in tempo reale, il garbage collector Java può essere una seccatura, poiché richiede alcuni minuti per raccogliere un heap da 20 GB, anche su macchine con 24 core. Ma se non crei troppi oggetti temporanei durante il runtime, anche quello dovrebbe andare bene. È solo che il tuo programma può fare in modo che la raccolta dei dati inutili si fermi ogni volta che non te lo aspetti.

+0

Grazie. Penso che andrò con Java. – Bijan

+0

Questo stesso argomento può essere applicato a C# /. NET? –

5

Scegli la lingua che ti è più familiare. Se li conosci tutti allo stesso modo e la velocità è una vera preoccupazione, scegli C.

+1

Ad essere onesti: se li conosceva tutti ugualmente bene, probabilmente non avrebbe bisogno di chiedere qui. –

+0

Questo è corretto. Conosco solo Java. Il resto ho solo una comprensione superficiale di. – Bijan

4

Scrivilo nella tua lingua preferita. Per me sembra un pitone. Quando si avvia il sistema, è possibile configurarlo e vedere dove si trovano i colli di bottiglia. Dopo aver eseguito alcune ottimizzazioni di base, se è ancora non accettabile, è possibile riscrivere le parti in C.

Una considerazione potrebbe essere la scrittura di questo in python in ferro per sfruttare i vantaggi di clr e dlr in .net. Quindi puoi sfruttare. 4 e le estensioni parallele. Se qualcosa ti darà aumenti delle prestazioni, sarà un po 'il sapore del threading che .net fa molto bene.

Edit:

Volevo solo rendere questa parte chiara. Dalla descrizione, sembra che l'elaborazione parallela/multithreading sia il luogo da cui proviene la maggior parte dei guadagni in termini di prestazioni.

+1

+1, ottimo commento e Jython è anche un'opzione per Python sulla JVM, se è richiesto specificamente qualcosa nello spazio Java. –

+0

Python non è la risposta per tutto in questo mondo. Nel suo caso sono sicuro che Java/C++ sono scelte molto migliori. –

+0

Ho intenzione di impiccarmi dicendo che C++ è una scelta terribile basata sui requisiti dell'OP. Se sei alla velocità, usa C. C++ offre così tante opportunità di impiccarti se non lo conosci bene. Java può essere un'ottima scelta. Ma se l'OP ama usare Python e può usarlo bene, perché non dovrebbe essere la scelta per queste circostanze se l'infrastruttura supporta gli obiettivi di prestazione? –

3

Perché solo una lingua per il sistema? Se fossi in te, costruirò l'intero sistema in Python, ma C o C++ sarà usato per componenti critici per le prestazioni. In questo modo, avrai un sistema molto flessibile ed estensibile con prestazioni sufficientemente veloci. Puoi trovare anche strumenti per generare automaticamente wrapper (ad esempio SWIG, Cython). Python e C/C++/Java/Fortran non sono in competizione tra loro; stanno completando.

5

Mentre io sono un grande fan di Python e personaly non sono un grande amante di Java, in questo caso devo ammettere che Java è la strada giusta da percorrere.

Per molti progetti, le prestazioni di Python non sono un problema, ma nel tuo caso anche le penalità di prestazioni minori si sommano molto rapidamente. So che questa non è una simulazione in tempo reale, ma anche per l'elaborazione in batch è ancora un fattore da tenere in considerazione. Se risulta che il carico è troppo grande per un server virtuale, un'implementazione due volte più veloce dimezzerà i costi del server virtuale.

Per molti progetti vorrei anche sostenere che Python consentirà di sviluppare una soluzione più veloce, ma qui non sono sicuro che sarebbe il caso. Java ha strumenti di sviluppo di livello mondiale e framework di livello enterprise di alto livello per l'elaborazione parallell e la distribuzione cross-server e mentre Python ha soluzioni in questo settore, Java ha chiaramente il vantaggio. Hai anche opzioni di architettura con Java che Python non può eguagliare, come Javaspaces.

Direi che C e C++ impongono troppo un sovraccarico di sviluppo per un progetto come questo. Sono fattibili inthat se hai molta familiarità con quelle lingue sono sicuro che sarebbe fattibile, ma a parte il potenziale per prestazioni più elevate, non hanno nient'altro da offrire.

C# è solo una riscrittura di Java. Non è una brutta cosa se sei uno sviluppatore di Windows e se preferisci Windows userei C# piuttosto che Java, ma se non ti interessa Windows non c'è motivo di preoccuparsi di C#.

0

È utile osservare il ciclo interno del codice numerico. Dopotutto, passerai la maggior parte del tuo tempo di CPU all'interno di questo ciclo.

Se il ciclo interno è un'operazione a matrice, quindi suggerisco python e scipy, ma del ciclo interno se non un'operazione a matrice, quindi mi preoccuperei del rallentamento di python. (O forse vorrei avvolgere C++ in python usando swig o boost :: python)

Il vantaggio di python è che è facile eseguire il debug e risparmiare un sacco di tempo non dovendo compilare tutto il tempo. Questo è particolarmente utile per un progetto in cui trascorri molto tempo a programmare interni profondi.

Problemi correlati