2013-08-30 3 views
2

Je travaille sur EBS, le marché Forex Limit Order Book (LOB): voici un exemple de LOB dans une tranche de temps de 100 millisecondes:Résumé des données énormes, Comment gérer avec R?

datetime|side(0=Bid,1=Ask)| distance(1:best price, 2: 2nd best, etc.)| price 
2008/01/28,09:11:28.000,0,1,1.6066 
2008/01/28,09:11:28.000,0,2,1.6065 
2008/01/28,09:11:28.000,0,3,1.6064 
2008/01/28,09:11:28.000,0,4,1.6063 
2008/01/28,09:11:28.000,0,5,1.6062 

2008/01/28,09:11:28.000,1,1,1.6067 
2008/01/28,09:11:28.000,1,2,1.6068 
2008/01/28,09:11:28.000,1,3,1.6069 
2008/01/28,09:11:28.000,1,4,1.6070 
2008/01/28,09:11:28.000,1,5,1.6071 

2008/01/28,09:11:28.500,0,1,1.6065 (I skip the rest) 

Pour résumer les données, ils ont deux règles (j'ai changé un peu de simplicité):

  1. S'il n'y a pas de changement dans LOB en cours acheteur ou vendeur côté, ils ne seront pas enregistrer de ce côté. Regardez la dernière ligne des données, milliseconde était 000 et maintenant est 500, ce qui signifie qu'il n'y avait aucun changement à LOB de chaque côté pendant 100, 200, 300 et 400 millisecondes (mais ces informations sont importantes pour tout calcul).

  2. Le dernier prix (seulement le dernier) est retiré d'un côté donné du carnet de commandes. Dans ce cas, un seul enregistrement avec rien dans le champ de prix. Encore une fois, il n'y aura pas d'enregistrement pour tout le secteur à ce moment-là.

    Exemple: 2008/01/28,09: 11: 28.800,0,1,

Je veux calculer minAsk-maxBid (1,6067 à 1,6066) ou prix moyen pondéré (en utilisant la taille de tous distances comme poids, il y a une colonne de taille dans mes données réelles). Je veux faire pour l'ensemble de mes données. Mais comme vous le voyez, les données ont été résumées et ce n'est pas une routine. J'ai écrit un code pour produire l'ensemble des données (pas seulement un résumé). C'est bien pour un petit ensemble de données mais pour un grand, je crée un énorme fichier. Je me demandais si vous avez des conseils sur la façon de gérer les données? Comment combler les lacunes alors qu'il est efficace.

+2

Je vous suggère de filtrer et diviser vos données en deux data.frames: un pour les meilleures offres et un pour les meilleures demandes. Ensuite, pour chacun de ces deux data.frames, utilisez 'findInterval' pour calculer la colonne correspondante' ask' ou 'bid'. Ensuite, vous saurez comment atteindre le minimum. – flodel

+0

@ flodel- Merci, cela peut fonctionner ici, mais il ya des calculs plus compliqués que j'ai besoin de toutes les distances, pas seulement les meilleures offres ou demandes.Exemple simple, si je veux calculer le prix pondéré alors j'ai besoin de toutes les distances et je ne peux pas le filtrer. J'ai édité ma question. – mitra

+0

pour un horodatage donné et côté, vous avez toujours cinq prix? Veuillez définir le prix moyen pondéré. Utilise-t-il les dix prix à un moment donné, et peut-être les tailles comme poids? – flodel

Répondre

3

Vous n'avez pas donné un bon exemple reproductible donc ce sera pseudo/non testé. Lisez attentivement les documents et faites les ajustements nécessaires.

Je vous suggère de premier filtre et diviser vos données en deux data.frames:

best.bid <- subset(data, side == 0 & distance == 1) 
best.ask <- subset(data, side == 1 & distance == 1) 

Ensuite, pour chacun de ces deux data.frames, utilisez findInterval pour calculer la meilleure demande correspondante ou meilleure offre :

best.bid$ask <- best.ask$price[findInterval(best.bid$time, best.ask$time)] 
best.ask$bid <- best.bid$price[findInterval(best.ask$time, best.bid$time)] 

(. pour cela fonctionne, vous pourriez avoir à transformer la date/heure en une mesure linéaire, par exemple le temps en secondes depuis l'ouverture du marché)

Ensuite, il s Hould être facile:

min.spread <- min(c(best.bid$ask - best.bid$price, 
        best.ask$bid - best.ask$price)) 

Je ne suis pas sûr que je comprends la fin de la particularité de jour, mais je parie que vous pourriez calculer la propagation à la clôture du marché et l'ajouter à l'appel min final.


Pour les prix moyens pondérés, utilisent la même idée, mais au lieu des deux best.bid et best.ask data.frames, vous devriez commencer par deux weighted.avg.bid et weighted.avg.ask data.frames.

Questions connexes