Organisation de tout plein de données

Organisation de tout plein de données - SQL/NoSQL - Programmation

Marsh Posté le 13-04-2012 à 11:40:10    

Salut les jeunes [:dawao]
 
Alors vala : je suis en train de coder une appli (client lourd) qui utilise des données fournies par l'utilisateur. Il s'agit de données historiques qui peuvent prendre énormément de place et pour lesquelles je ne contrôle pas la taille : le périmètre peut varier beaucoup selon le style et les envies de l'utilisateur. Un cas simple d'utilisation et qui me paraît le plus probable représente plus de 5 millions de lignes de données (et je sous-estime peut-être, on peut aller au double sans trop de pb, je pense). Un cas un peu sportif pourrait représenter facilement ~700 millions de lignes. Le cas extrême pourrait aller au-delà du milliard.
 
On parle de cotations financières. La fenêtre temporelle peut aller du tick (plus petit changement de prix possible ; par exemple, 1 centime d'euro sur une action comme celle de la SG. Lorsque le marché bouge bien, on peut avoir plusieurs changements de prix par seconde sur les titres liquides) à la journée entière. Le périmètre fonctionnel est l'ensemble des actions dispo sur un marché (ex : sur le NYSE, on a ~1800 titres différents) ; idem pour les futures. Donc en gros, pour quelqu'un qui dispose des données de cotation pour l'ensemble du NYSE sur une fenêtre temporelle de 5 minutes (= 1 ligne de donnée = évolution du prix pendant 5 minutes) sur une période de 10 ans, on a grosso-modo : 1800 (nb de titres) x 10 (années) x 252 (nb de jours par an où le NYSE est ouvert) x 6.5 (nb d'heures par jour d'ouverture du marché) x 12 (nb de fois par heure où on a des données) = 353.8 millions de données. Ramasse tes dents.
 
Je ne dispose pas et ne compte pas fournir ces données dans un premier temps. C'est assez réglementé et le seul truc que je peux faire c'est récupérer les données "end of day" (EOD) mises à dispo par des gens comme Yahoo Finance ou Google. Mais pour les données intraday, l'utilisateur peut tout à fait les acheter auprès de certains organismes et mon appli doit savoir les charger et les utiliser.
 
Ma question c'est : comment je peux stocker et organiser intelligemment ces données ?
 
Actuellement, je joue avec SQLite qui est très bien en termes de perfs et me permet d'utiliser un système de base de données sans avoir à déployer (ou demander à l'utilisateur de déployer) tout un tas de bordel comme Postgres ou MySQL ou que sais-je. Maintenant, si le user me refile 350 millions de lignes à bouffer, j'en fais quoi ? Je découpe et stocke ça comment ? D'ailleurs, dois-je stocker quoi que ce soit, est-ce qu'il ne serait pas plus simple de garder les fichiers que le user me refile pour les parser chaque fois que j'en ai besoin ? J'ai pensé aussi à du NoSQL mais je m'y perds un peu et ne connais pas bien le sujet.
 
Enfin tout ça quoi. Toute idée bienvenue [:dawao] Je défriche vraiment, je sais pas trop dans quelle direction aller.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 13-04-2012 à 11:40:10   

Reply

Marsh Posté le 13-04-2012 à 12:00:49    

La réponse pourrait dépendre de comment tu comptes exploiter ces données ensuite. J'imagine que la solution de stocker les fichiers fournis et de les parser à la demande peut effectivement être valable, mais pour certains cas d'utilisation seulement.

 

Sinon je te dirais bien de regarder du côté de la BI ; ce genre de données se représente bien dans une BDD avec un modèle en étoile


Message édité par R3g le 13-04-2012 à 12:02:30

---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 13-04-2012 à 12:04:48    

C'est juste :jap:
L'utilisation est de charger les données d'un périmètre défini par l'utilisateur ; ex : tout le NYSE ou "tels titres" ou "tous les futures". La fenêtre temporelle et la période restent fixes. Donc en gros, je vais devoir charger les données demandées pour une fenêtre temporelle spécifiée ; ex : toutes les données EOD du NYSE sur une période de 12 ans.
 
A partir de là, je vais calculer divers indicateurs (choisis par l'utilisateur) au fur et à mesure que je lis les données ordonnées par date.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 13-04-2012 à 12:31:10    

L'intérêt d'utiliser une BD va vraiment dépendre de si les calculs demandés sont toujours les mêmes (des plages de dates et c'est tout) ou si l'utilisateur veut pouvoir varier les critères.
Un fichier plat, si tu veux être un minimum performant, ça ne se lit que dans un sens: du début à la fin. Dès que tu vas commencer à taper aléatoirement dans les données, ça va ramer autant qu'une BD sans index. Donc si tu veux appliquer des critères sur d'autres colonnes, tu peux oublier.


Message édité par el muchacho le 13-04-2012 à 12:38:20

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 13-04-2012 à 12:43:14    

Taiche a écrit :

C'est juste :jap:
L'utilisation est de charger les données d'un périmètre défini par l'utilisateur ; ex : tout le NYSE ou "tels titres" ou "tous les futures". La fenêtre temporelle et la période restent fixes. Donc en gros, je vais devoir charger les données demandées pour une fenêtre temporelle spécifiée ; ex : toutes les données EOD du NYSE sur une période de 12 ans.
 
A partir de là, je vais calculer divers indicateurs (choisis par l'utilisateur) au fur et à mesure que je lis les données ordonnées par date.


Comme dit précédemment, ça dépend de ce que tu veux faire des données.
 
Tes indicateurs sont calculés par période. C'est quoi la granularité la + fine que tu souhaites ? Si c'est des indicateurs au plus fin à la journée, tu peux déjà aggreger tes données par jour dans ta DB.

Reply

Marsh Posté le 13-04-2012 à 12:46:12    

J'ai pas compris l'utilisation des données, en fait. C'est l'appli qui fait des calculs sur les indicateurs ? Les calculs ont-ils réellement besoin d'être faits sur des centaines de millions de données, ou on peut faire de l'échantillonnage (ce qui revient à prendre une granularité plus grosse) ? Quelles sont les contraintes de temps, hardware ?

Message cité 1 fois
Message édité par el muchacho le 13-04-2012 à 12:49:22

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 13-04-2012 à 12:48:18    

Ça dépend surtout des budgets infras dont tu disposes, et des contraintes éventuelles de temps réel.
Déjà, zieute du côté des cubes de données, y a des applis open source qui font ça me semble bien. Ca prépare des axes d'analyses à partir d'une base de données (en gros ça précalcule les agrégats nécessaires aux utilisateurs).

 

Chez nous on fait du BI dans la finance justement, à base de 2-3 milliards de lignes (pour le type de traitement le plus gros, on en a plein d'autres), à traiter au fil de l'eau, la majeure partie durant la nuit et une autre durant la journée (en fonction des closing internationaux).
On a déployé une solution à base de Sybase IQ (base orientée colonne) + suite Microsoft SQL Server (SSIS pour les intégration, SSAS pour la restitution sous forme de cubes).

 

Mais on n'a pas de contrainte de temps réel, du coup on a une latence moy. d'environ 2-5min sur la mise à dispo des données. Par contre pour la restitution, c'est ultra rapide.
Et ça demande également pas mal de taf : tuning de perfs surtout, modèles de données adaptés à mettre en place (schémas en étoile), mécanisme de découpage des données récentes/archives pour réduire la taille des tables de faits, etc.

 

Avec des contraintes TR je regarderais plutôt vers des bases in-memory qui permettent de tout charger en mémoire une base de départ, et d'y charger les MAJ ultra rapidement (sans parler des restitutions).
J'connais pas trop les noms de produits qui font ça mais pendant un temps y avait un POC ActivePivot qui tournaient dans la boîte (j'sais pas ce que ça vaut).

 

En tout cas zieute les outils BI, j'connais pas trop ce qui se fait en opensource mais y en a, ça peut faire une bonne base de départ/de réflexion.

Message cité 2 fois
Message édité par Elmoricq le 13-04-2012 à 12:50:29
Reply

Marsh Posté le 13-04-2012 à 12:55:21    

Suivant les traitements à effectuer, je pense que ça va se jouer entre un SGBD ou un BI (pour info, Pentaho est un BI en GPL qui est très bien). Si les tables risque d'être très grosses, il y a la solution de les partitionner (en colonnes ou en lignes) suivant des critères.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 13-04-2012 à 13:02:27    

Elmoricq a écrit :

Ça dépend surtout des budgets infras dont tu disposes, et des contraintes éventuelles de temps réel.
Déjà, zieute du côté des cubes de données, y a des applis open source qui font ça me semble bien. Ca prépare des axes d'analyses à partir d'une base de données (en gros ça précalcule les agrégats nécessaires aux utilisateurs).

 

Chez nous on fait du BI dans la finance justement, à base de 2-3 milliards de lignes (pour le type de traitement le plus gros, on en a plein d'autres), à traiter au fil de l'eau, la majeure partie durant la nuit et une autre durant la journée (en fonction des closing internationaux).
On a déployé une solution à base de Sybase IQ (base orientée colonne) + suite Microsoft SQL Server (SSIS pour les intégration, SSAS pour la restitution sous forme de cubes).


Voila, on est déjà dans le monde du "big data", pas exactement le domaine de l'appli de bureau de base, sauf à coup d'algos et de structures de données sophistiquées et d'hypothèses permettant de réduire la majorité des données à du bruit que l'on peut ignorer.

 

edit: exemple http://wiki.pentaho.com/display/DA [...] +with+Weka

Citation :


Mais on n'a pas de contrainte de temps réel, du coup on a une latence moy. d'environ 2-5min sur la mise à dispo des données. Par contre pour la restitution, c'est ultra rapide.


C'est à dire ?

Citation :


Et ça demande également pas mal de taf : tuning de perfs surtout, modèles de données adaptés à mettre en place (schémas en étoile), mécanisme de découpage des données récentes/archives pour réduire la taille des tables de faits, etc.

 

Avec des contraintes TR je regarderais plutôt vers des bases in-memory qui permettent de tout charger en mémoire une base de départ, et d'y charger les MAJ ultra rapidement (sans parler des restitutions).
J'connais pas trop les noms de produits qui font ça mais pendant un temps y avait un POC ActivePivot qui tournaient dans la boîte (j'sais pas ce que ça vaut).

 

En tout cas zieute les outils BI, j'connais pas trop ce qui se fait en opensource mais y en a, ça peut faire une bonne base de départ/de réflexion.


Les bases in memory, ça permet vraiment de gérer autant de données ??? Là, je pense qu'on tape dans les To de données disque, quand même. Après, en RAM, ils réduisent p-ê l'espace utilisé. 1 milliard de floats, ça ne prend que quelques Go de RAM.

Message cité 2 fois
Message édité par el muchacho le 13-04-2012 à 13:16:25

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 13-04-2012 à 13:30:38    

el muchacho a écrit :


C'est à dire ?

 

On a deux modes de restitution : cubes de données consultables par les utilisateurs directement sous excel (qui a en natif des modules BI), et récupération en masse par d'autres applications des périmètres qui les intéressent.
Avec les cubes, les traders naviguent dans leur TCD en jouant avec les filtres, colonnes etc de manière assez intuitive. Alors c'est pas super mesurable, du coup je n'ai pas trop de chiffres à te donner, juste si tu ne demandes pas n'importe quoi (genre la somme de toutes les valeurs depuis 1 an sur tout le périmètre entier), la navigation est fluide. Les requêtes les plus lentes prennent quelques secondes, et souvent c'est excel (2007 parce que 2010 semble bien + rapide) qui prend du temps au formatage.
Pour la restitution en masse, quand c'est bien fait, on a en perf la bande passante réseau (qui est plutôt très grosse chez nous).
La recopie base à base d'une cinquantaine de millions de lignes (60 colonnes) se fait en env. 30min.

 
el muchacho a écrit :


Les bases in memory, ça permet vraiment de gérer autant de données ??? Là, je pense qu'on tape dans les To de données disque, quand même. Après, en RAM, ils réduisent p-ê l'espace utilisé. 1 milliard de floats, ça ne prend que quelques Go de RAM.

 

J'ai pas le détail, je pense qu'au-delà d'une certaine masse de données ce n'est plus une solution intéressante. Mais c'est idéal pour le temps réel par contre.

 

Sinon un autre ajout : pour les traitements en masse (insertion/restitution) et pour les requêtes par axe d'analyse (dimensions), il vaut mieux en SGBD s'orienter vers une base orientée colonne que vers une base transactionnelle classique.
Le défaut des bases colonnes par contre, c'est que ça n'aime pas trop les requêtes unitaires en grand nombre, et il y a pas mal de contraintes nouvelles à intégrer, mais c'est une autre piste à étudier pour taiche.
Edit : j'ai entendu parler d'infobright en bien sur les sgbd colonnes gratuites

Message cité 1 fois
Message édité par Elmoricq le 13-04-2012 à 13:32:45
Reply

Marsh Posté le 13-04-2012 à 13:30:38   

Reply

Marsh Posté le 13-04-2012 à 13:42:22    

D'après ce que je lis, j'ai pas l'impression qu'il ai besoin d'analyse multidimensionnelle ou de cubes (enfin faut voir la gueule des indicateurs à calculer).
 
Par contre vu les volumes et si il y a des gros moyens ça vaut le coup de regarder les trucs à base de bases de données "vectorielles" genre SybaseIQ ou Qlikview.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 13-04-2012 à 13:44:48    

C'est ce que je mets dans mon dernier post : zieuter les DB orientés colonne.
Sybase IQ c'est pas donné par contre :o


Message édité par Elmoricq le 13-04-2012 à 13:45:51
Reply

Marsh Posté le 13-04-2012 à 13:47:48    

Certains SGBD gèrent la compression des tables. Ça permet sur de grosses volumétrie comme celles dont tu parles de faire moins d'I/O, en compensant par du calcul CPU. C'est en général très intéressant, surtout que les serveurs (et aussi les postes clients) sont en principe très large en terme de CPU contrairement à l'I/O qui reste toujours un sacré goulot d'étranglement (sortir 4 Go de data, même sur de la fibre et des baies ave de gros cache, ça prends du temps ... ). N'empeche quand même que si tu fais un select sur 700 millions de lignes, même si il y a moins a sortir du disque, ça restera très long.
 
Une autre solution, c'est de gérer du partitionnement de table. Une table peux être partitionnée suivants certaines règles. Le plus courant est la date, mais tu peux choisir tout un tas de critères. Tu peux très bien avoir, par exemple,  une partition par jour, et lorsque tu insère une donnée, le SGBD place la data directement dans la bonne partition. C'est entièrement transparent pour le select, tu ne fais qu'niterroger ta table, sans te préoccuper de la partition.
Ce type de système est très intéressant pour limiter le nombre de lignes que tu interroges, d'autant plus que tu peux avoir des indexes locaux à la partition. Par exemple si les consultations se font beaucoup sur la journée courante, tu ne récupère que les quelques lignes du jours, que tu peux éventuellement stocker en RAM comme suggéré plus haut (je ne pense pas que tu auras 1 To de data pour une seule journée). Le tout après est de définir le critère de partitionnement (un jour / deux jours / une semaine / ou sur d'autres critère scomme le nom d'une action, etc.), et de le gérer correctement (les indexes globaux posent des soucis par exemple, si tu veux dropper une partition).
 
Ces deux solutions fonctionnent plutôt pas mal chez Oracle, mais j'avoue ne pas bien connaître les autres SGBD...

Reply

Marsh Posté le 13-04-2012 à 13:51:40    

T'as Infinidb aussi qui a une version community : http://infinidb.org/
Mieux qu'Infobright de ce que j'ai pu tester (au niveau compatibilité SQL).
 
Récemment pour des tests j'ai chargé 170 millions de lignes à partir d'un CSV.
Le loading avec leur loader a pris 700 secondes dans une VM sur mon PC.
Taille de la base après loading : 2Go (le CSV faisait 18Go). En MyISAM avec nos index on était aux environ de 70Go (20Go de données et le reste d'index).

Reply

Marsh Posté le 13-04-2012 à 13:53:34    

drapal


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 13-04-2012 à 13:59:19    

J'ai pas bien compris le besoin en terme de latence, nombre de users et si tu comptais faire du Write
 
 
j'ai du louper autre chose parce que passer de SQLite à Cassandra c'est un peu le grand écart par exemple [:petrus75]
T'as quand meme la couche intermediaire avec des vrais bases de données et des vrais serveurs, du partionnement et du caching par exemple [:spamafote]


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 13-04-2012 à 14:31:00    

Le pb est intéressant, mais c'est vraiment l'usage des données derrière qui va jouer.
 
Mettons que ce soit de l'exploration, genre afficher des parties arbitraires de la courbe d'une valeur, je partirais bien sur un stockage hiérarchique de ce genre :
T'as à stocker la séquence :
1 4 2 6 8 5 9 4
Tu groupes récursivement les éléments 2 à 2 en calculant la moyenneet l'écart entre les deux :
(2.5, -1.5)  (4, -2)  (6.5, -1.5)  (6.5, 2.5)
puis :
        (3.5, -0.75)                 (6.5, 0.0)
     -1.5            -2           -1.5          2.5
puis :
                      (4.875, -1.625)
          -0.75                              0.0
-1.5                -2             -1.5             2.5
Tu peux interroger une valeur au tick près comme la moyenne sur une sous-section arbitraire en log(n).
Tu stockes des bouts de sous-arbres par paquets de 4k qui vont bien pour être pote avec ton disque dur et banco, log2(un miyard)/log2(4096/sizeof(float)) t'as un worst case de 4 accès disques à la louche, sans compter les premiers niveaux que tu gardes en ram [:bien]
(Par contre, y'a 2-3 trucs tricky à gérer pour la précision des données auxquels il faut faire gaffe, mais rien de très complexe)


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 13-04-2012 à 15:29:54    

Putain, je pose une question toute conne, je pars bouffer 2h et c'est le bordel [:pingouino] On peut pas vous faire confiance [:icon8]
 
 
Plus sérieusement, merci [:prosterne] Je vais déjà répondre aux questions, puis on verra.

ratibus a écrit :

Comme dit précédemment, ça dépend de ce que tu veux faire des données.


Pour les connaisseurs, il s'agit de backtesting. En gros, un trader ou gérant ou quant va vouloir analyser les perfs d'une stratégie de trading sur une période donnée. Selon sa personnalité et son style, il va vouloir tester sa strat sur une fenêtre temporelle (ou time frame, que j'abrégerai en TF par la suite [:dawao]) précise. Pour valider sa strat, il va vouloir la faire tourner soit sur une période précise (ex : crise de 2008, crash de 1987, bull market des années 80, etc...) soit sur une période très longue genre 20-25 ans pour voir ce que ça donne. Tout dépend des données dont il dispose et de ce qu'il a envie de tester.
Les indicateurs dont je parle représentent sa stratégie. Ca peut aller de quelque chose d'extrêmement simple (moyenne mobile) à de plus compliqué (calculs poussés pour options exotiques ; dans un 1er temps, je ne traiterai pas ce cas). Ca va jouer uniquement sur le CPU, je pense. Chaque indicateur va avoir des paramètres d'entrée (ex : une moyenne mobile sur 20 périodes ou 54 ou 14, etc...), donc il est a priori exclus de stocker aussi les indicateurs en base. Même s'ils ne sont pas censé bouger (la moyenne mobile 20 périodes entre le 12/05/2008 et le 11/06/2008 ne changera pas).

ratibus a écrit :

Tes indicateurs sont calculés par période. C'est quoi la granularité la + fine que tu souhaites ? Si c'est des indicateurs au plus fin à la journée, tu peux déjà aggreger tes données par jour dans ta DB.


Le plus fin c'est le "tick" soit le changement de prix. C'est particulier car ce n'est pas vraiment une donnée temporelle. Pour l'expérience, on va dire que la granularité la plus fine est celle de 1 minute. 1 ligne de données = 4 doubles (open, high, low, close) + 2 strings (timestamp de la donnée + symbole du titre ou de l'instrument financier concerné) + 1 int (volume échangé durant cette période car je ne regarde que des marchés listés pour l'instant). Ca peut varier mais avec ça on a les infos nécessaires.
 
L'aggrégation de données, j'y avais (un peu) pensé. En fait, je n'ai besoin que des données le plus fines ; en effet, avec 5 lignes de 1m, je peux calculer les données sur 5m, et on peut extrapoler pour les autres TF. Mais l'inverse fait perdre des infos, ce qui est pénible lorsque le gars veut changer de TF (genre il teste sur du 5m et il veut faire un test sur du 1m) :D

el muchacho a écrit :

J'ai pas compris l'utilisation des données, en fait. C'est l'appli qui fait des calculs sur les indicateurs ? Les calculs ont-ils réellement besoin d'être faits sur des centaines de millions de données, ou on peut faire de l'échantillonnage (ce qui revient à prendre une granularité plus grosse) ? Quelles sont les contraintes de temps, hardware ?


Hardware inconnu, c'est celui de l'utilisateur et je ne le maîtrise pas [:petrus75] Après, il faudra être réaliste, le gars pourra pas stocker 40M de lignes avec un disque dur de 400 Mo :D La config "recommandée" (comme pour les JV) serait un PC quad-core avec un HDD 500 Go, un OS 64 bits et 4 à 6 Go de RAM. Je vais regarder côté GPU si y a pas moyen que je lui délègue tout ou partie du calcul des indicateurs (je pense que c'est clairement le cas) mais une CG assez récente genre 2 ans mini serait bien. On parle de config recommandée, pas nécessaire [:dawao]
Contrainte de temps : ba honnêtement, y en a pas vraiment. J'aimerais que le test de l'utilisateur prenne quelques minutes, mais c'est évidemment fonction du périmètre et duy hardware. Typiquement, aujourd'hui, avec mes 4.8M de lignes dans SQLite (= 14 ans d'histo du NYSE pour une TF jour soit 1 ligne = 1 cotation pour un jour donné ; la DB pèse 550 Mo), j'arrive à lire + faire tourner 2 moyennes mobiles sur tout le périmètre en environ 24 secondes sur un quad-core 2.67 GHz avec HDD 7200 tours de base. Donc idéalement, sur le même type de config, je fais tourner tout le bordel sur ~50M de lignes en moins de 5 minutes. Si j'arrive à faire intervenir le GPU de façon significative, évidemment, les chiffres changeront mais j'ai pas encore d'idée sur le sujet.

Elmoricq a écrit :

Ça dépend surtout des budgets infras dont tu disposes, et des contraintes éventuelles de temps réel.


0 temps réel. Budget = le mien [:marc] C'est une appli perso que je fais essentiellement pour apprendre des technos et me prendre la tête sur comment organiser le merdier :D Ca a un peu fait tilt quand j'ai commencé à regarder tout ce qui est parallélisation en .Net + les histoires de NoSQL, je me suis dit qu'y avait moyen d'apprendre tout ça pour pas trop cher.
Donc effectivement, on va éviter les solutions chéros propriétaires style Sybase ou Oracle :D

Elmoricq a écrit :


Déjà, zieute du côté des cubes de données, y a des applis open source qui font ça me semble bien. Ca prépare des axes d'analyses à partir d'une base de données (en gros ça précalcule les agrégats nécessaires aux utilisateurs).
 
Chez nous on fait du BI dans la finance justement, à base de 2-3 milliards de lignes (pour le type de traitement le plus gros, on en a plein d'autres), à traiter au fil de l'eau, la majeure partie durant la nuit et une autre durant la journée (en fonction des closing internationaux).
On a déployé une solution à base de Sybase IQ (base orientée colonne) + suite Microsoft SQL Server (SSIS pour les intégration, SSAS pour la restitution sous forme de cubes).
 
Mais on n'a pas de contrainte de temps réel, du coup on a une latence moy. d'environ 2-5min sur la mise à dispo des données. Par contre pour la restitution, c'est ultra rapide.
Et ça demande également pas mal de taf : tuning de perfs surtout, modèles de données adaptés à mettre en place (schémas en étoile), mécanisme de découpage des données récentes/archives pour réduire la taille des tables de faits, etc.
[...]
En tout cas zieute les outils BI, j'connais pas trop ce qui se fait en opensource mais y en a, ça peut faire une bonne base de départ/de réflexion.


:jap: Donc ouais, pas trop de trucs proprio, mais apparemment vous avez tous l'air d'accord sur la BI et les cubes, donc je vais voir [:dawao]

el muchacho a écrit :

Voila, on est déjà dans le monde du "big data", pas exactement le domaine de l'appli de bureau de base, sauf à coup d'algos et de structures de données sophistiquées et d'hypothèses permettant de réduire la majorité des données à du bruit que l'on peut ignorer.
 
edit: exemple http://wiki.pentaho.com/display/DA [...] +with+Weka


[:romf]
Oui big data, mais ces data sont potentiellement accessibles par n'importe qui cherche à les obtenir. Exemple de vendeur de data au tick près : http://www.tickdata.com
Là en gros, tu peux acheter un bon paquet de données pour style 1500$. C'est cher, mais les traders intraday un peu sérieux vont pas hésiter à investir pour tester leurs strats, c'est un peu leur gagne-pain.
Y a déjà des applis qui font ça mais bien souvent c'est sur des données EOD (donc pas d'intraday) donc moins de volume. Pour ceux qui font de l'intraday, c'est souvent vite limité à une période ou alors ils stockent rien en local et récup les données depuis un provider. J'aimerais voir si c'est possible de changer ça dans le monde d'aujourd'hui ; je pense que oui mais c'est surtout le "comment" :D

el muchacho a écrit :

Les bases in memory, ça permet vraiment de gérer autant de données ??? Là, je pense qu'on tape dans les To de données disque, quand même. Après, en RAM, ils réduisent p-ê l'espace utilisé. 1 milliard de floats, ça ne prend que quelques Go de RAM.


To je sais pas. Probablement pour les cas extrêmes, mais si 4.8M de lignes = 550 Mo, je pense qu'on peut extrapoler en disant que 500M de lignes =~ 60 Go, ce qui reste raisonnable. P'têt pas en un seul fichier mais bon, tu vois l'idée.

Elmoricq a écrit :

On a deux modes de restitution : cubes de données consultables par les utilisateurs directement sous excel (qui a en natif des modules BI), et récupération en masse par d'autres applications des périmètres qui les intéressent.
Avec les cubes, les traders naviguent dans leur TCD en jouant avec les filtres, colonnes etc de manière assez intuitive. Alors c'est pas super mesurable, du coup je n'ai pas trop de chiffres à te donner, juste si tu ne demandes pas n'importe quoi (genre la somme de toutes les valeurs depuis 1 an sur tout le périmètre entier), la navigation est fluide. Les requêtes les plus lentes prennent quelques secondes, et souvent c'est excel (2007 parce que 2010 semble bien + rapide) qui prend du temps au formatage.


Ma dernière mission était pas mal en rapport avec ça :D Microsoft Analysis Services, des jobs d'analyse de risque ou de pricing qui prennent XX minutes sur une ferme et dont les résultats s'affichent dans Excel via un plugin. C'est intéressant mais stait un peu bloaté de partout et surtout très cher d'un point de vue infra. Mon opinion est qu'une bonne partie de ces trucs peuvent tourner en local, surtout chez un trader ayant 2 grosses cartes 3D en SLI pour afficher de la 2D sur 6 écrans [:dawao]

Elmoricq a écrit :

Sinon un autre ajout : pour les traitements en masse (insertion/restitution) et pour les requêtes par axe d'analyse (dimensions), il vaut mieux en SGBD s'orienter vers une base orientée colonne que vers une base transactionnelle classique.
Le défaut des bases colonnes par contre, c'est que ça n'aime pas trop les requêtes unitaires en grand nombre, et il y a pas mal de contraintes nouvelles à intégrer, mais c'est une autre piste à étudier pour taiche.
Edit : j'ai entendu parler d'infobright en bien sur les sgbd colonnes gratuites


Oui, c'est aussi pour ça que je regardais NoSQL. Je sais pas ce que fait infobright mais leur site a l'air d'aller dans ce sens. Je vais regarder :jap:
Après, l'autre problématique, c'est le déploiement (je reviens là-dessus par la suite [:dawao]).

Nukolau a écrit :

Certains SGBD gèrent la compression des tables. Ça permet sur de grosses volumétrie comme celles dont tu parles de faire moins d'I/O, en compensant par du calcul CPU. C'est en général très intéressant, surtout que les serveurs (et aussi les postes clients) sont en principe très large en terme de CPU contrairement à l'I/O qui reste toujours un sacré goulot d'étranglement (sortir 4 Go de data, même sur de la fibre et des baies ave de gros cache, ça prends du temps ... ). N'empeche quand même que si tu fais un select sur 700 millions de lignes, même si il y a moins a sortir du disque, ça restera très long.


Disons qu'après, c'est ce que je dis plus haut : l'utilisateur peut pas demander la lune non plus. Demander un backtest sur un histo de 350-400M de lignes, faut pas s'attendre à ce que les résultats tombent en 10s.

Nukolau a écrit :


Une autre solution, c'est de gérer du partitionnement de table. Une table peux être partitionnée suivants certaines règles. Le plus courant est la date, mais tu peux choisir tout un tas de critères. Tu peux très bien avoir, par exemple,  une partition par jour, et lorsque tu insère une donnée, le SGBD place la data directement dans la bonne partition. C'est entièrement transparent pour le select, tu ne fais qu'niterroger ta table, sans te préoccuper de la partition.
Ce type de système est très intéressant pour limiter le nombre de lignes que tu interroges, d'autant plus que tu peux avoir des indexes locaux à la partition. Par exemple si les consultations se font beaucoup sur la journée courante, tu ne récupère que les quelques lignes du jours, que tu peux éventuellement stocker en RAM comme suggéré plus haut (je ne pense pas que tu auras 1 To de data pour une seule journée). Le tout après est de définir le critère de partitionnement (un jour / deux jours / une semaine / ou sur d'autres critère scomme le nom d'une action, etc.), et de le gérer correctement (les indexes globaux posent des soucis par exemple, si tu veux dropper une partition).
 
Ces deux solutions fonctionnent plutôt pas mal chez Oracle, mais j'avoue ne pas bien connaître les autres SGBD...


Vala, Oracle + base distante et tout :D Difficile dans mon cas.

Dion a écrit :

J'ai pas bien compris le besoin en terme de latence, nombre de users et si tu comptais faire du Write
 
j'ai du louper autre chose parce que passer de SQLite à Cassandra c'est un peu le grand écart par exemple [:petrus75]
T'as quand meme la couche intermediaire avec des vrais bases de données et des vrais serveurs, du partionnement et du caching par exemple [:spamafote]


Pas de write pour l'instant. La solution doit être standalone, c'est-à-dire que tout est chez l'utilisateur. Appli en local, base en local, calculs en local. J'ai pas trop peur pour les calculs, mais plutôt pour les données. Avoir une base en local permet d'avoir des bonnes perfs de chargement, mais du coup ça veut dire tout stocker chez le user et aussi s'interdire de partir sur n'importe quel SGBD. Je me vois pas dire "bon alors mon gars, pour utiliser l'appli, installe MongoDB/Cassandra/whatever", et pour ce qui est d'avoir un serveur de données, c'est difficile car certaines données ne peuvent pas se refiler gratos comme ça [:petrus75] Les rares qui s'y sont essayés se sont fait taper dessus par les organismes de marchés (ex : CME, CBOT, etc...), donc bofbof.

0x90 a écrit :

Le pb est intéressant, mais c'est vraiment l'usage des données derrière qui va jouer.
 
Mettons que ce soit de l'exploration, genre afficher des parties arbitraires de la courbe d'une valeur, je partirais bien sur un stockage hiérarchique de ce genre :
T'as à stocker la séquence :
1 4 2 6 8 5 9 4
Tu groupes récursivement les éléments 2 à 2 en calculant la moyenneet l'écart entre les deux :
(2.5, -1.5)  (4, -2)  (6.5, -1.5)  (6.5, 2.5)
puis :
        (3.5, -0.75)                 (6.5, 0.0)
     -1.5            -2           -1.5          2.5
puis :
                      (4.875, -1.625)
          -0.75                              0.0
-1.5                -2             -1.5             2.5
Tu peux interroger une valeur au tick près comme la moyenne sur une sous-section arbitraire en log(n).
Tu stockes des bouts de sous-arbres par paquets de 4k qui vont bien pour être pote avec ton disque dur et banco, log2(un miyard)/log2(4096/sizeof(float)) t'as un worst case de 4 accès disques à la louche, sans compter les premiers niveaux que tu gardes en ram [:bien]
(Par contre, y'a 2-3 trucs tricky à gérer pour la précision des données auxquels il faut faire gaffe, mais rien de très complexe)


Alors là pour le coup, j'ai pas bien pigé [:joce] Tu stockes quoi au final en base/sur ton disque ? Et comment tu fais pour retrouver le bordel ?
 
 
Bref, merci à tous pour vos réponses, j'en attendais pas tant :D Après, vous êtes un peu partis sur des solutions de DB distantes, ce qui est difficile à mettre en oeuvre pour moi actuellement. Si c'est vraiment mieux je regarderai, mais pour l'instant c'est un peu sportif. L'objectif de l'appli est simple mais ses conditions d'utilisation le sont nettement moins. Le nombre de données dépend clairement des envies de l'utilisateur et aussi de son hardware. Du bonheur, quoi [:dawao]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 13-04-2012 à 15:43:10    

Taiche a écrit :


Alors là pour le coup, j'ai pas bien pigé [:joce] Tu stockes quoi au final en base/sur ton disque ? Et comment tu fais pour retrouver le bordel ?

 

Je stocke une version transformée de ta séquence de nombre, de taille ~équivalente, mais qui permet facilement et rapidement de récupérer un sous-ensemble de la séquence. C'est un peu dans l'esprit du tuilage google maps, mais en 1D avec des floats. Cela dit t'as l'air de plutôt viser des traitements batch plutôt que de la ballade, donc c'est pas spécialement intéressant pour toi.
Ce que tu vas plutôt viser c'est de la compression pour pas de ton cpu/gpu ait à attendre que le disque ramène les données, tu devrais ptêtre regarder du coté des algos de compression de son lossless.
[edit]
Du coup au niveau "architecte", je verrais plus des fichiers avec un format custom que des grandes db.

Message cité 1 fois
Message édité par 0x90 le 13-04-2012 à 15:44:57

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 13-04-2012 à 15:51:01    

0x90 a écrit :

Je stocke une version transformée de ta séquence de nombre, de taille ~équivalente, mais qui permet facilement et rapidement de récupérer un sous-ensemble de la séquence. C'est un peu dans l'esprit du tuilage google maps, mais en 1D avec des floats. Cela dit t'as l'air de plutôt viser des traitements batch plutôt que de la ballade, donc c'est pas spécialement intéressant pour toi.


OK, je comprenais pas comment ça pouvait s'appliquer :D

0x90 a écrit :


Ce que tu vas plutôt viser c'est de la compression pour pas de ton cpu/gpu ait à attendre que le disque ramène les données, tu devrais ptêtre regarder du coté des algos de compression de son lossless.


C'est un peu l'idée. Aujourd'hui avec SQLite c'est pas flagrant parce que leur driver bouffe pas mal de CPU pour lire les données (je sais pas trop pourquoi), donc en mettant tous mes cores dessus, ça fonctionne assez bien (50% du temps total = lecture des données, 50% suivants = calcul des indicateurs), mais si j'arrive à mettre le GPU à contribution, ça sera probablement plus visible.

0x90 a écrit :

Du coup au niveau "architecte", je verrais plus des fichiers avec un format custom que des grandes db.


J'y avais pensé ce midi mais je me disais que c'était con [:joce] Reste l'organisation du bordel ; 1 instrument = 1 fichier dans lequel je mettrais toutes les cotations ? Ou je sépare aussi par TF ? Fichiers binaires compressés, du coup ?
Faut que je fasse le test, c'est aussi une idée [:canaille]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 13-04-2012 à 16:37:03    

Taiche a écrit :


Le plus fin c'est le "tick" soit le changement de prix. C'est particulier car ce n'est pas vraiment une donnée temporelle. Pour l'expérience, on va dire que la granularité la plus fine est celle de 1 minute. 1 ligne de données = 4 doubles (open, high, low, close) + 2 strings (timestamp de la donnée + symbole du titre ou de l'instrument financier concerné) + 1 int (volume échangé durant cette période car je ne regarde que des marchés listés pour l'instant). Ca peut varier mais avec ça on a les infos nécessaires.
 
L'aggrégation de données, j'y avais (un peu) pensé. En fait, je n'ai besoin que des données le plus fines ; en effet, avec 5 lignes de 1m, je peux calculer les données sur 5m, et on peut extrapoler pour les autres TF. Mais l'inverse fait perdre des infos, ce qui est pénible lorsque le gars veut changer de TF (genre il teste sur du 5m et il veut faire un test sur du 1m) :D


Tu peux mettre du numérique je pense pour ces 2 infos ;) Tu gagneras de la place.
Par contre je comprends pas pourquoi t'as 4 doubles par tick.
J'ai du mal comprendre mais genre dans ta table tick t'as pas les champs suivant : date, titre_id, valeur, volume ?
C'est quoi ton schéma en fait ? :D

Reply

Marsh Posté le 13-04-2012 à 16:50:03    

Le symbole sous forme de numérique ?  [:anefay:1] On parle de noms style "GLE" pour la Société Générale ou "AAPL" pour Apple. Des symboles Bloomberg, quoi. Possible qu'on puisse convertir ouais, mais je sais pas si c'est une suepr opération :D Pour la date oui, mais je sais pas jusqu'à quand le gars va vouloir remonter (y a des tarés pour remonter jusqu'au 17ème siècle, alors bon...).
 
Le pb dans tes champs, c'est "valeur". De quelle valeur on parle ? La façon conventionnelle de représenter l'évolution du cours d'un titre, c'est open (= prix à l'ouverture, au début de ta TF), high (= plus haut pendant ta TF), low (= plus bas) et close (= valeur à la clôture). Ca te donne pas le chemin parcouru, mais à partir de ces valeurs tu construis les graphiques les plus courants : bar charts, chandeliers japonais, etc... Et c'est aussi à partir de ces données que tu vas calculer pas mal d'indicateurs (ex : points pivots). Donc t'as besoin des 4 :D
Pour un tick simple oui, les données sont différentes, t'as juste besoin du prix, mais pour la plupart des données histo, t'as 4 valeurs à considérer.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 13-04-2012 à 16:59:26    

Taiche a écrit :

Le symbole sous forme de numérique ?  [:anefay:1] On parle de noms style "GLE" pour la Société Générale ou "AAPL" pour Apple. Des symboles Bloomberg, quoi. Possible qu'on puisse convertir ouais, mais je sais pas si c'est une suepr opération :D Pour la date oui, mais je sais pas jusqu'à quand le gars va vouloir remonter (y a des tarés pour remonter jusqu'au 17ème siècle, alors bon...).

 

Le pb dans tes champs, c'est "valeur". De quelle valeur on parle ? La façon conventionnelle de représenter l'évolution du cours d'un titre, c'est open (= prix à l'ouverture, au début de ta TF), high (= plus haut pendant ta TF), low (= plus bas) et close (= valeur à la clôture). Ca te donne pas le chemin parcouru, mais à partir de ces valeurs tu construis les graphiques les plus courants : bar charts, chandeliers japonais, etc... Et c'est aussi à partir de ces données que tu vas calculer pas mal d'indicateurs (ex : points pivots). Donc t'as besoin des 4 :D
Pour un tick simple oui, les données sont différentes, t'as juste besoin du prix, mais pour la plupart des données histo, t'as 4 valeurs à considérer.


Le symbôle sous forme numérique : table de référentiel. T'as jamais fait de foreign key ? :p Heureusement que tes codes font pas 150 caractères :o

 

Je vois bien à quoi correspondent tes 4 valeurs au niveau fonctionnel, mais du coup comment tu intègres la notion de tick avec cette modélisation ?
Ta TF c'est un intervalle si j'ai bien compris. Donc pour moi tes 4 valeurs sur ta TF c'est déjà de la données consolidées.
Les données brutes ce sont les cours des symbôles. A partir de ces données brutes tu consolides ce que tu veux.

 

Pour reprendre ton exemple de fournisseur, ça correspond aux trade data dispo ici http://www.tickdata.com/products/equities/
D'ailleurs ils mettent ça dans leur doc (pour le format US) :

Citation :

Fields for User-Defined Interval-Based Bars
Selecting Interval Tick-Based Bars, Time-Based Bars, Daily Bars, Weekly Bars or Monthly Bars, to be built from Trade Data, the following fields are available.


Message cité 2 fois
Message édité par ratibus le 13-04-2012 à 17:22:22
Reply

Marsh Posté le 13-04-2012 à 17:41:20    

En l'occurence, pour optimiser l'espace, une foreign key, ça n'a pas grand intérêt parce que ça va prendre autant d'espace qu'un symbole de 3 caractères. Par contre, j'ai jamais compris pourquoi le volume n'était pas pris en compte en analyse technique.

 

Je me suis déjà amusé à faire du backtracking dans un lointain passé sur un logiciel adhoc (AmiBroker), mais je ne faisais pas ça sur des millions de données, juste sur le cours de cloture des 10 dernières années, ce qui faisait quelques milliers de valeurs
J'avais même développé un indicateur suiveur plutôt efficace. Mais les outils existants intègrent un langage de programmation complet et un optimiseur pour le backtracking. Tu comptes faire ça sur ton outil, Taiche ?
Et est-ce que ça a vraiment un intérêt de faire ça sur des grosses masses de données ?

 

En tout cas, pour moi, vu que ce sont des données purement temporelles, une base de données n'est pas forcément nécessaire, des fichiers binaires avec un format adhoc iraient probablement aussi bien et seraient probablement ce qu'il y a de plus rapide. L'idée de compression de son de 0x90 peut sembler pas mal mais ça signifie nécessairement une perte et une granularité minimale. Un répertoire par symbole, des fichiers de données lisibles en parallèle par des threads ou en mmap (à voir si c'est possible en C#), et s'il faut faire super vite, le tout sur du raid 0 ou des disques parallèles. Les traitements en RAM par lots si la mémoire dispo n'est pas suffisante.

 

Mais il faut bien faire attention aux limitations qu'on s'impose si on part sur ce type d'option.

 

Hop, pour le fun, j'ai retrouvé ma formule magique de suivi de cours qui déchirait tout :o

Code :
  1. // Moyenne mobile qui déchire tout copyright el muchacho :o
  2. #include_once <VolatilityWeightMA.afl>
  3. function HullDEMAKauf(series, p) {
  4. diff = 2*DEMA(series, int(p/2)) - DEMA(series, p);
  5. return VolatilityWeightMA( diff, int(sqrt(p)) );
  6. }
  7. P = ParamField("Price field",-1);
  8. Periods = Param("Periods", 26, 2, 100, 1, 10 );
  9. hull = HullDEMAKauf(P, Periods);
  10. epsilon = 0.01;
  11. Lpml = IIf(hull < Ref(hull,-1) && hull < Ref(hull, 1), 1, 0);
  12. Lpmh = IIf(hull > Ref(hull,-1) && hull > Ref(hull, 1), 1, 0);
  13. GR =ExRem(LpmH,Lpmh);
  14. RD =ExRem(Lpml,Lpml);
  15. PlotShapes(IIf(GR!=0,shapeSmallCircle,shapeNone),colorRed,0,hull,0);
  16. PlotShapes(IIf(RD!=0,shapeSmallCircle,shapeNone),colorGreen,0,hull,0);
  17. Plot( hull, _DEFAULT_NAME(), ParamColor( "Color", colorCycle ), ParamStyle("Style" ) );


où VolatilityWeightMA est la moyenne pondérée par la volatilité et DEMA = "Double Exponential Moving Average" :o

Message cité 3 fois
Message édité par el muchacho le 13-04-2012 à 20:27:33

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 13-04-2012 à 18:01:10    

ratibus a écrit :


Le symbôle sous forme numérique : table de référentiel. T'as jamais fait de foreign key ? :p Heureusement que tes codes font pas 150 caractères :o


Ba c'est ce que dit muchacho après ; pour le coup je vois pas l'intérêt, mes symboles faisant en général 4 caractères max, avec quelques trucs exotiques à 5 ou 6. J'en suis pas encore à économiser là-dessus :D

ratibus a écrit :


Je vois bien à quoi correspondent tes 4 valeurs au niveau fonctionnel, mais du coup comment tu intègres la notion de tick avec cette modélisation ?
Ta TF c'est un intervalle si j'ai bien compris. Donc pour moi tes 4 valeurs sur ta TF c'est déjà de la données consolidées.
Les données brutes ce sont les cours des symbôles. A partir de ces données brutes tu consolides ce que tu veux.
 
Pour reprendre ton exemple de fournisseur, ça correspond aux trade data dispo ici http://www.tickdata.com/products/equities/
D'ailleurs ils mettent ça dans leur doc (pour le format US) :

Citation :

Fields for User-Defined Interval-Based Bars
Selecting Interval Tick-Based Bars, Time-Based Bars, Daily Bars, Weekly Bars or Monthly Bars, to be built from Trade Data, the following fields are available.




Oui OK, mais seulement si tu disposes des données tick et que tu veux les utiliser. Un trader swing ou long terme, il va utiliser des données déjà consolidées et la granularité au tick près il s'en fout. Donc il achètera les données qu'il voudra (ou il les chopera carrément depuis Yahoo [:dawao]) et s'il ne me fournit que des données consolidées, va falloir que je me débrouille avec :D
Je ne considère pas les données tick dans un premier temps pour mon dev, d'une part parce que c'est pas ce qu'il y a de plus utilisé et ensuite parce que j'en ai pas pour tester facilement :D Après, la lecture + consolidation, ça sera juste un traitement supplémentaire.

el muchacho a écrit :

Par contre, j'ai jamais compris pourquoi le volume n'était pas pris en compte en analyse technique.


Il l'est sur les plateformes sérieuses ; en forex, qui est OTC, tu n'as pas de notion de volume donc ça bloque pas mal de possibilités. Mais pour tous les marchés listés, la notion de volume est importante et utilisée, oui.

el muchacho a écrit :

Je me suis déjà amusé à faire du backtracking dans un lointain passé sur un logiciel adhoc, mais je ne faisais pas ça sur des millions de données, juste sur le cours de cloture.  
J'avais même développé un indicateur suiveur plutôt efficace.
Est-ce que ça a vraiment un intérêt de faire ça sur des grosses masses de données ?


Développer un système de trading, c'est pas simple. Tu veux que ton système fonctionne sur divers marchés, sur des TF différentes et à des périodes différentes, sinon c'est un système mal foutu qui présente un risque non négligeable de t'amener à la ruine. Par exemple, si tu fais un système qui ne marche que sur des bull markets (buy and hold, anyone ? [:clooney10]), il va un peu te péter à la gueule dans des marchés comme 2007-2008 ou 2002-2003.
Donc stu veux tester par exemple 20 ans d'histo sur 40 futures différents, avec des données EOD, ba c'est tout de suite 200k lignes dans la tronche. Ca fait pas trop peur. Mais si tu passes sur de l'intraday, genre des données 5m, ba hop, on multiplie tout le monde par 12x23 (pas mal de futures sont ouverts 23h par jour) et c'est tout de suite 5.5M de lignes. Alors imagine si t'as 1000 actions au lieu de 40 futures [:dawao]

el muchacho a écrit :


En tout cas, pour moi, vu que ce sont des données purement temporelles, une base de données n'est pas forcément nécessaire, des fichiers binaires avec un format adhoc iraient probablement aussi bien et seraient probablement ce qu'il y a de plus rapide. Un répertoire par symbole, des fichiers de données lisibles en parallèle par des threads ou en mmap (à voir si c'est possible en C#), et s'il faut faire super vite, le tout sur du raid 0 ou des disques parallèles. Les traitements en RAM par lots si la mémoire dispo n'est pas suffisante.
 
Mais il faut bien faire attention aux limitations qu'on s'impose si on part sur ce tyoe d'option.


Ba vala, justement je me demande quelles sont les limitations. Je vois ce que tu disais plus haut, à savoir la lecture "unidirectionnelle" genre on va pas se faire chier à faire des recherches sur telle donnée et tout, mais je peux déléguer ça au CPU via le LINQ de .Net qui est super pratique et rapide (du coup, puisqu'on a tout en RAM).
Donc je sais pas trop, je vais tester ça aussi ce WE, on verra bien. Je connais pas trop ce qui est derrière le memory mapping, je creuserai (quand je récupèrerai Internet, vu la Freebox est en rade depuis hier [:marc]).
 
Merci en tout cas :jap: Si je réponds pas avant lundi, c'est normal [:petrus75]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 13-04-2012 à 18:05:17    

Je réponds aux bouts que t'as édités :D

el muchacho a écrit :

Mais les outils existants intègrent un langage de programmation complet et un optimiseur pour le backtracking. Tu comptes faire ça sur ton outil, Taiche ?


Oui, dans une certaine mesure :jap: Y a quelques solutions pour compiler du .Net à la volée au runtime, j'ai appris ça cette semaine. Je connais rien au sujet, mais ça me donne envie d'apprendre :D

el muchacho a écrit :

Hop, pour le fun, j'ai retrouvé ma formule magique de suivi de cours qui déchirait tout :o
[...]


Oui, la HullMA, j'aime bien la courbe que ça donne mais j'ai jamais trop joué avec :D


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 13-04-2012 à 18:06:54    

Si tu codes proprement, normalement, tu peux atteindre la bande passante de ton disque, qui peut monter à 100-150 Mo/s de données, à multiplier par le nombre de disques/plateaux si tu fais du raid ou du SSD.

 
Taiche a écrit :


Oui, la HullMA, j'aime bien la courbe que ça donne mais j'ai jamais trop joué avec :D


Mon truc, la haut, ça bat tout (ce que je connais) :o colle le cours à la culotte sans overshoot ou undershoot. [:bien]

Message cité 1 fois
Message édité par el muchacho le 13-04-2012 à 18:09:25

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 13-04-2012 à 18:09:45    

:love:
http://msdn.microsoft.com/en-us/li [...] dfile.aspx \o/


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 13-04-2012 à 18:10:47    

Taiche a écrit :


Développer un système de trading, c'est pas simple. Tu veux que ton système fonctionne sur divers marchés, sur des TF différentes et à des périodes différentes, sinon c'est un système mal foutu qui présente un risque non négligeable de t'amener à la ruine. Par exemple, si tu fais un système qui ne marche que sur des bull markets (buy and hold, anyone ? [:clooney10]), il va un peu te péter à la gueule dans des marchés comme 2007-2008 ou 2002-2003.
Donc stu veux tester par exemple 20 ans d'histo sur 40 futures différents, avec des données EOD, ba c'est tout de suite 200k lignes dans la tronche. Ca fait pas trop peur. Mais si tu passes sur de l'intraday, genre des données 5m, ba hop, on multiplie tout le monde par 12x23 (pas mal de futures sont ouverts 23h par jour) et c'est tout de suite 5.5M de lignes. Alors imagine si t'as 1000 actions au lieu de 40 futures [:dawao]


 
Tes fongibles tu veux pas les traiter par position ?

Reply

Marsh Posté le 13-04-2012 à 18:11:08    

el muchacho a écrit :


Mon truc, la haut, ça bat tout (ce que je connais) :o colle le cours à la culotte sans overshoot ou undershoot. [:bien]


Ba c'est le principe des HullMachin, sauf que du coup t'as pas vraiment de valeur ajoutée par rapport au prix brut et quand le marché "choppe" (= zig-zague), ba tu te fais chopper avec :D


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 13-04-2012 à 18:11:09    

Par contre, 64 bits obligatoires, pour les volumes de données en quesiton.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 13-04-2012 à 18:13:23    

Taiche a écrit :


Ba c'est le principe des HullMachin, sauf que du coup t'as pas vraiment de valeur ajoutée par rapport au prix brut et quand le marché "choppe" (= zig-zague), ba tu te fais chopper avec :D


Pas faux, mais t'as tout de même bcp moins de bruit, avec très peu de retard par rapport au cours (ce qui est le pb des moyennes). Tu peux appliquer tes algos sur la moyenne plut^to que sur le cours lui-même.

Message cité 1 fois
Message édité par el muchacho le 13-04-2012 à 18:14:32

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 13-04-2012 à 18:16:24    

Elmoricq a écrit :

Tes fongibles tu veux pas les traiter par position ?


:??: Je viens d'apprendre la définition de fongible, mais je vois pas ce que tu veux dire [:joce]
Je me sers des données justement pour savoir s'il doit y avoir ouverture ou fermeture de pos, une fois les signaux générés par les indicateurs, les données peuvent se faire dégager par le garbage collector, j'en ai plus trop besoin (sauf quand je voudrai faire un chart pour chaque trade mais c'est une autre histoire). Donc je pige pas trop :??:

el muchacho a écrit :

Par contre, 64 bits obligatoires, pour les volumes de données en quesiton.


Disons que ça permet de créer un cache en tout cas. Je sais pas, je connais pas bien le sujet, je vais jouer avec :jap:
Après ouais, la limite de ~1.2 Go de RAM par process sous Win32 c'est clairement la merde [:dawao]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 13-04-2012 à 18:17:06    

el muchacho a écrit :

Pas faux, mais t'as tout de même bcp moins de bruit, avec très peu de retard par rapport au cours (ce qui est le pb des moyennes). Tu peux appliquer tes algos sur la moyenne plut^to que sur le cours lui-même.


Oui, c'est ce que j'avais bien aimé justement, t'avais un bon rapport latence/bruit avec cet indicateur. Mais ch'ais pas, j'ai pas accroché.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 13-04-2012 à 18:25:06    

Taiche a écrit :


Disons que ça permet de créer un cache en tout cas. Je sais pas, je connais pas bien le sujet, je vais jouer avec :jap:
Après ouais, la limite de ~1.2 Go de RAM par process sous Win32 c'est clairement la merde [:dawao]


Pour le memory map, tu vois ton fichier comme un grand tableau en RAM, donc sous win32 (comme sous nulix d'ailleurs, enfin la limite est un peu plus haute, vers 1,7Go de mémoire), tu ne pourras pas mapper des fichiers de plus de 1,2 Go grosso merdo. Donc tu découpes tes fichiers en segments d'1Go voire 512Mo (ce qui n'est pas une mauvaise idée en soit, soi dit en passant, ça facilite bien des choses, pour la gestion de transfers de fichiers par ex) que tu traites un à un, ou en // si l'algo le permet. C'est probablement une bonne solution, ça ne sera pas plus lent et ça passera sur win32.


Message édité par el muchacho le 13-04-2012 à 18:34:40

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 13-04-2012 à 19:29:15    

Taiche a écrit :


:jap: Donc ouais, pas trop de trucs proprio, mais apparemment vous avez tous l'air d'accord sur la BI et les cubes, donc je vais voir [:dawao]


Le but du cube c’est de permettre l’analyse multidimensionnelle, c’est à dire d’étudier des indicateurs agrégés en faisant varier le niveau de granularité. En gros tu vas précalculer tous les agrégats et les stocker en base. Tu pourras par exemple avoir la valeur de ton action minute par minute, et précalculer des moyennes horaires, quotidiennes, etc. pour y accéder rapidement.
 
Ca n’a pas l’air de correspondre à ton besoin.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 13-04-2012 à 19:31:31    

Taiche a écrit :


:??: Je viens d'apprendre la définition de fongible, mais je vois pas ce que tu veux dire [:joce]
Je me sers des données justement pour savoir s'il doit y avoir ouverture ou fermeture de pos, une fois les signaux générés par les indicateurs, les données peuvent se faire dégager par le garbage collector, j'en ai plus trop besoin (sauf quand je voudrai faire un chart pour chaque trade mais c'est une autre histoire). Donc je pige pas trop :??:

 

Les futures par ex. (mais fonctionne entre autres aussi pour les options listées ou les bonds) sont fongibles, cad que tu peux les agréger par position sur un contrat+date de livraison (pour les futures), ce qui réduit le nombre de lignes à traiter de manière drastique :)


Message édité par Elmoricq le 13-04-2012 à 19:32:51
Reply

Marsh Posté le 13-04-2012 à 20:15:18    

R3g a écrit :


Le but du cube c’est de permettre l’analyse multidimensionnelle, c’est à dire d’étudier des indicateurs agrégés en faisant varier le niveau de granularité. En gros tu vas précalculer tous les agrégats et les stocker en base. Tu pourras par exemple avoir la valeur de ton action minute par minute, et précalculer des moyennes horaires, quotidiennes, etc. pour y accéder rapidement.

 

Ca n’a pas l’air de correspondre à ton besoin.


Si si, c'est pas idiot, il peut stocker plusieurs niveaux de granularité et y accéder plus rapidement, comme ça: exemple, un tableau de cotations à la seconde, un à la minute, un à l'heure, par exemple. Il gagne un facteur 3600 entre la seconde et l'heure, en grossissant de façon assez marginale la taille de ses données.
Par ailleurs, le tableau des heures permet d'indexer le tableau des minutes et celui des minutes d'indexer le tableau des secondes en indiquant dans quel fichier et à quel endroit taper pour tomber sur une date donnée à la minute près. On peut faire de l'accès direct de cette manière, on est alors au maximum à 59 secondes de la date exacte voulue. Comme une seule lecture disque permet de lire 8 ko d'un coup, on doit pouvoir même indexer toutes les 5 mn sans pertes de perf.

Message cité 1 fois
Message édité par el muchacho le 14-04-2012 à 08:55:07

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 13-04-2012 à 20:17:46    

Taiche a écrit :

Bref, merci à tous pour vos réponses, j'en attendais pas tant :D Après, vous êtes un peu partis sur des solutions de DB distantes, ce qui est difficile à mettre en oeuvre pour moi actuellement. Si c'est vraiment mieux je regarderai, mais pour l'instant c'est un peu sportif. L'objectif de l'appli est simple mais ses conditions d'utilisation le sont nettement moins. Le nombre de données dépend clairement des envies de l'utilisateur et aussi de son hardware. Du bonheur, quoi [:dawao]


J'ai l'impression que tu te prends la tete pour pas grand chose, tes worst case sont quand meme hyper rares et les strategies de trading pluri annuels sont fait dans des trucs souvent un peu plus optimises et budgetes que ce que tu as :o
Je pense que reflechir sur les mecanismes d'import export etc... rendront ton truc plus utilisables que de vouloir gratter 4sec sur SQLite :o
 

ratibus a écrit :


Le symbôle sous forme numérique : table de référentiel. T'as jamais fait de foreign key ? :p Heureusement que tes codes font pas 150 caractères :o

 
Tu connais sans doute mieux la techno que moi derriere et les optimisations qui peuvent s'appliquer mais se cogner une FK dans une table de 350MM de lignes pour pointer sur un referentiel de symbol ca me semble un poil couteux [:pingouino]
 

el muchacho a écrit :

Par contre, j'ai jamais compris pourquoi le volume n'était pas pris en compte en analyse technique.


Toi on sens que tu bosses sur des trucs qui sentent le souffre :D


---------------
When it comes to business/legal topics, just assume almost everyone commenting has no idea what they’re taking about and have no background in these subjects because that’s how it really is. Harkonnen 8-> Elmoricq 8====>
Reply

Marsh Posté le 15-04-2012 à 07:48:29    

el muchacho a écrit :


Si si, c'est pas idiot, il peut stocker plusieurs niveaux de granularité et y accéder plus rapidement, comme ça: exemple, un tableau de cotations à la seconde, un à la minute, un à l'heure, par exemple. Il gagne un facteur 3600 entre la seconde et l'heure, en grossissant de façon assez marginale la taille de ses données.
Par ailleurs, le tableau des heures permet d'indexer le tableau des minutes et celui des minutes d'indexer le tableau des secondes en indiquant dans quel fichier et à quel endroit taper pour tomber sur une date donnée à la minute près. On peut faire de l'accès direct de cette manière, on est alors au maximum à 59 secondes de la date exacte voulue. Comme une seule lecture disque permet de lire 8 ko d'un coup, on doit pouvoir même indexer toutes les 5 mn sans pertes de perf.


Ba disons que c'est un peu le plan aussi, oui. Je sais pas au niveau optim et indexage, mais ne serait-ce que d'un point de vue temps de traitement, je me vois pas me taper les données au tick près pour aggréger sur une TF horaire.

Dion a écrit :

J'ai l'impression que tu te prends la tete pour pas grand chose, tes worst case sont quand meme hyper rares et les strategies de trading pluri annuels sont fait dans des trucs souvent un peu plus optimises et budgetes que ce que tu as :o
Je pense que reflechir sur les mecanismes d'import export etc... rendront ton truc plus utilisables que de vouloir gratter 4sec sur SQLite :o


Ba des traders intraday y en a, spa rare. J'aimerais pouvoir gérer ce cas-là.
Après, le budget, je m'en fous un peu ; stun truc perso, je fais ça essentiellement pour apprendre certaines technos. Mais pour l'optim, pour avoir vu ce qui se faisait dans les grosses banques françaises... comment dire [:petrus75] J'ai vu des fermes de calcul de machines virtuelles avec des cons de process monothreadés, des trucs bloatés jusqu'à la moëlle pour faire 3 calculs de pricing à la con, franchement ça m'a fait mal. Justement, je pense que si je peux montrer ce que donne une appli pas trop con faite en "hobby" par un gars tout seul, ça peut m'aider par la suite [:dawao]
'fin comme je disais, c'est plus pour moi que pour répondre à un réel besoin :D
Sinon, tu parles d'import/export :??: Dans quel cadre ? Oui, pour importer les données de l'utilisateur y a un vrai boulot, mais encore faut-il savoir commnt stocker le bordel ensuite :D Si je pars sur une DB plutôt que du fichier plat, ou vers du NoSQL, le mécanisme sera nettement différent.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed