Εξοικείωση με τη δυναμική της αγοράς: Μεταμόρφωση των αναλύσεων κόστους συναλλαγών με εξαιρετικά ακριβές Tick History – PCAP και Amazon Athena για το Apache Spark | Υπηρεσίες Ιστού της Amazon

Εξοικείωση με τη δυναμική της αγοράς: Μεταμόρφωση των αναλύσεων κόστους συναλλαγών με εξαιρετικά ακριβές Tick History – PCAP και Amazon Athena για το Apache Spark | Υπηρεσίες Ιστού της Amazon

Κόμβος πηγής: 3091357

Αυτή η ανάρτηση έχει συνταχθεί από κοινού με τους Pramod Nayak, LakshmiKanth Mannem και Vivek Aggarwal από την ομάδα Low Latency του LSEG.

Η ανάλυση κόστους συναλλαγών (TCA) χρησιμοποιείται ευρέως από εμπόρους, διαχειριστές χαρτοφυλακίου και μεσίτες για ανάλυση πριν και μετά τη συναλλαγή και τους βοηθά να μετρήσουν και να βελτιστοποιήσουν το κόστος συναλλαγών και την αποτελεσματικότητα των στρατηγικών συναλλαγών τους. Σε αυτήν την ανάρτηση, αναλύουμε τα spreads προσφοράς-ζήτησης επιλογών από το LSEG Tick History – PCAP χρήση συνόλου δεδομένων Amazon Athena για το Apache Spark. Σας δείχνουμε πώς μπορείτε να αποκτήσετε πρόσβαση σε δεδομένα, να ορίσετε προσαρμοσμένες συναρτήσεις για εφαρμογή σε δεδομένα, να κάνετε αναζήτηση και να φιλτράρετε το σύνολο δεδομένων και να οπτικοποιήσετε τα αποτελέσματα της ανάλυσης, όλα αυτά χωρίς να χρειάζεται να ανησυχείτε για τη ρύθμιση της υποδομής ή τη διαμόρφωση του Spark, ακόμη και για μεγάλα σύνολα δεδομένων.

Ιστορικό

Η Αρχή Αναφοράς Τιμών Επιλογών (OPRA) χρησιμεύει ως κρίσιμος υπεύθυνος επεξεργασίας πληροφοριών τίτλων, συλλέγοντας, ενοποιώντας και διανέμοντας αναφορές τελευταίας πώλησης, τιμές και σχετικές πληροφορίες για τις US Options. Με 18 ενεργά χρηματιστήρια δικαιωμάτων προαίρεσης των ΗΠΑ και πάνω από 1.5 εκατομμύριο επιλέξιμες συμβάσεις, η OPRA διαδραματίζει κεντρικό ρόλο στην παροχή ολοκληρωμένων δεδομένων αγοράς.

Στις 5 Φεβρουαρίου 2024, η Securities Industry Automation Corporation (SIAC) πρόκειται να αναβαθμίσει τη ροή OPRA από 48 σε 96 κανάλια πολλαπλής εκπομπής. Αυτή η βελτίωση στοχεύει στη βελτιστοποίηση της διανομής συμβόλων και της χρήσης της χωρητικότητας γραμμής ως απάντηση στην κλιμακούμενη εμπορική δραστηριότητα και την αστάθεια στην αγορά δικαιωμάτων προαίρεσης των ΗΠΑ. Η SIAC συνέστησε στις εταιρείες να προετοιμαστούν για μέγιστες ταχύτητες δεδομένων έως και 37.3 GBit ανά δευτερόλεπτο.

Παρά το γεγονός ότι η αναβάθμιση δεν μεταβάλλει άμεσα τον συνολικό όγκο των δημοσιευμένων δεδομένων, επιτρέπει στην OPRA να διαδίδει δεδομένα με σημαντικά ταχύτερο ρυθμό. Αυτή η μετάβαση είναι ζωτικής σημασίας για την αντιμετώπιση των απαιτήσεων της δυναμικής αγοράς επιλογών.

Η OPRA ξεχωρίζει ως μία από τις πιο ογκώδεις ροές, με κορύφωση 150.4 δισεκατομμυρίων μηνυμάτων σε μία ημέρα το τρίτο τρίμηνο του 3 και απαίτηση χωρητικότητας 2023 δισεκατομμυρίων μηνυμάτων σε μία ημέρα. Η λήψη κάθε μηνύματος είναι κρίσιμης σημασίας για την ανάλυση κόστους συναλλαγών, την παρακολούθηση της ρευστότητας της αγοράς, την αξιολόγηση της στρατηγικής συναλλαγών και την έρευνα αγοράς.

Σχετικά με τα δεδομένα

LSEG Tick History – PCAP είναι ένα αποθετήριο που βασίζεται σε σύννεφο, που υπερβαίνει τα 30 PB, που φιλοξενεί δεδομένα παγκόσμιας αγοράς εξαιρετικά υψηλής ποιότητας. Αυτά τα δεδομένα συλλέγονται σχολαστικά απευθείας στα κέντρα δεδομένων ανταλλαγής, χρησιμοποιώντας πλεονάζουσες διαδικασίες λήψης στρατηγικά τοποθετημένες σε μεγάλα κύρια και εφεδρικά κέντρα δεδομένων ανταλλαγής δεδομένων παγκοσμίως. Η τεχνολογία λήψης της LSEG διασφαλίζει τη λήψη δεδομένων χωρίς απώλειες και χρησιμοποιεί μια πηγή χρόνου GPS για ακρίβεια χρονικής σήμανσης νανοδευτερόλεπτο. Επιπλέον, χρησιμοποιούνται εξελιγμένες τεχνικές arbitrage δεδομένων για την απρόσκοπτη κάλυψη τυχόν κενών δεδομένων. Μετά τη σύλληψη, τα δεδομένα υφίστανται σχολαστική επεξεργασία και διαιτησία και στη συνέχεια κανονικοποιούνται σε μορφή παρκέ χρησιμοποιώντας Το Real Time Ultra Direct της LSEG (RTUD) χειριστές ζωοτροφών.

Η διαδικασία κανονικοποίησης, η οποία αποτελεί αναπόσπαστο κομμάτι της προετοιμασίας των δεδομένων για ανάλυση, δημιουργεί έως και 6 TB συμπιεσμένων αρχείων Parquet την ημέρα. Ο τεράστιος όγκος δεδομένων αποδίδεται στην περιεκτική φύση του OPRA, που εκτείνεται σε πολλαπλές ανταλλαγές και διαθέτει πολυάριθμες συμβάσεις προαίρεσης που χαρακτηρίζονται από διαφορετικά χαρακτηριστικά. Η αυξημένη αστάθεια της αγοράς και η δραστηριότητα δημιουργίας αγορών στα χρηματιστήρια δικαιωμάτων προαίρεσης συμβάλλουν περαιτέρω στον όγκο των δεδομένων που δημοσιεύονται στο OPRA.

Τα χαρακτηριστικά του Tick History – PCAP επιτρέπουν στις εταιρείες να διεξάγουν διάφορες αναλύσεις, συμπεριλαμβανομένων των εξής:

  • Ανάλυση πριν από τη συναλλαγή – Αξιολογήστε τον πιθανό αντίκτυπο στο εμπόριο και εξερευνήστε διαφορετικές στρατηγικές εκτέλεσης με βάση ιστορικά δεδομένα
  • Αξιολόγηση μετά τη συναλλαγή – Μετρήστε το πραγματικό κόστος εκτέλεσης σε σχέση με δείκτες αναφοράς για την αξιολόγηση της απόδοσης των στρατηγικών εκτέλεσης
  • βελτιστοποιημένη εκτέλεση – Βελτιώστε τις στρατηγικές εκτέλεσης που βασίζονται σε ιστορικά πρότυπα αγοράς για να ελαχιστοποιήσετε τον αντίκτυπο στην αγορά και να μειώσετε το συνολικό κόστος συναλλαγών
  • Διαχείριση κινδύνου – Προσδιορίστε μοτίβα ολίσθησης, εντοπίστε ακραίες τιμές και διαχειριστείτε προληπτικά τους κινδύνους που σχετίζονται με τις εμπορικές δραστηριότητες
  • Αναφορά απόδοσης – Διαχωρίστε τον αντίκτυπο των αποφάσεων συναλλαγών από τις επενδυτικές αποφάσεις κατά την ανάλυση της απόδοσης του χαρτοφυλακίου

Το σύνολο δεδομένων LSEG Tick History – PCAP είναι διαθέσιμο στο Ανταλλαγή δεδομένων AWS και μπορεί να προσπελαστεί στο AWS Marketplace. Με Ανταλλαγή δεδομένων AWS για το Amazon S3, μπορείτε να αποκτήσετε πρόσβαση σε δεδομένα PCAP απευθείας από το LSEG Απλή υπηρεσία αποθήκευσης Amazon (Amazon S3) κουβάδες, εξαλείφοντας την ανάγκη για τις εταιρείες να αποθηκεύουν το δικό τους αντίγραφο των δεδομένων. Αυτή η προσέγγιση απλοποιεί τη διαχείριση και την αποθήκευση δεδομένων, παρέχοντας στους πελάτες άμεση πρόσβαση σε υψηλής ποιότητας PCAP ή κανονικοποιημένα δεδομένα με ευκολία στη χρήση, ενσωμάτωση και σημαντική εξοικονόμηση αποθήκευσης δεδομένων.

Athena για το Apache Spark

Για αναλυτικές προσπάθειες, Athena για το Apache Spark προσφέρει μια απλοποιημένη εμπειρία φορητού υπολογιστή, προσβάσιμη μέσω της κονσόλας Athena ή των API της Athena, επιτρέποντάς σας να δημιουργήσετε διαδραστικές εφαρμογές Apache Spark. Με βελτιστοποιημένο χρόνο εκτέλεσης Spark, το Athena βοηθά στην ανάλυση petabyte δεδομένων, κλιμακώνοντας δυναμικά τον αριθμό των κινητήρων Spark που είναι μικρότερος από ένα δευτερόλεπτο. Επιπλέον, κοινές βιβλιοθήκες Python όπως τα panda και το NumPy ενσωματώνονται άψογα, επιτρέποντας τη δημιουργία περίπλοκης λογικής εφαρμογής. Η ευελιξία επεκτείνεται στην εισαγωγή προσαρμοσμένων βιβλιοθηκών για χρήση σε σημειωματάρια. Το Athena for Spark φιλοξενεί τις περισσότερες μορφές ανοιχτών δεδομένων και ενσωματώνεται άψογα με το Κόλλα AWS Κατάλογος Δεδομένων.

Σύνολο δεδομένων

Για αυτήν την ανάλυση, χρησιμοποιήσαμε το σύνολο δεδομένων LSEG Tick History – PCAP OPRA από τις 17 Μαΐου 2023. Αυτό το σύνολο δεδομένων περιλαμβάνει τα ακόλουθα στοιχεία:

  • Καλύτερη προσφορά και προσφορά (BBO) – Αναφέρει την υψηλότερη προσφορά και τη χαμηλότερη ζήτηση για τίτλο σε μια δεδομένη ανταλλαγή
  • Εθνική καλύτερη προσφορά και προσφορά (NBBO) – Αναφέρει την υψηλότερη προσφορά και τη χαμηλότερη ζήτηση για ασφάλεια σε όλα τα χρηματιστήρια
  • συναλλαγές – Καταγράφει ολοκληρωμένες συναλλαγές σε όλα τα χρηματιστήρια

Το σύνολο δεδομένων περιλαμβάνει τους ακόλουθους όγκους δεδομένων:

  • συναλλαγές – 160 MB κατανεμημένα σε περίπου 60 συμπιεσμένα αρχεία Parquet
  • BBO – 2.4 TB κατανεμημένα σε περίπου 300 συμπιεσμένα αρχεία Parquet
  • NBBO – 2.8 TB κατανεμημένα σε περίπου 200 συμπιεσμένα αρχεία Parquet

Επισκόπηση ανάλυσης

Η ανάλυση των δεδομένων OPRA Tick History για την Ανάλυση Κόστους Συναλλαγών (TCA) περιλαμβάνει τον έλεγχο των τιμών αγοράς και των συναλλαγών γύρω από ένα συγκεκριμένο εμπορικό γεγονός. Χρησιμοποιούμε τις ακόλουθες μετρήσεις ως μέρος αυτής της μελέτης:

  • Προσφορές (QS) – Υπολογίζεται ως η διαφορά μεταξύ της ζήτησης BBO και της προσφοράς BBO
  • Αποτελεσματική εξάπλωση (ES) – Υπολογίζεται ως η διαφορά μεταξύ της τιμής συναλλαγής και του μέσου σημείου του BBO (BBO bid + (BBO ask – BBO bid)/2)
  • Αποτελεσματικό/τιμώμενο spread (EQF) – Υπολογίστηκε ως (ES / QS) * 100

Υπολογίζουμε αυτά τα spread πριν από τη συναλλαγή και επιπλέον σε τέσσερα διαστήματα μετά τη συναλλαγή (λίγο μετά, 1 δευτερόλεπτο, 10 δευτερόλεπτα και 60 δευτερόλεπτα μετά τη συναλλαγή).

Ρύθμιση παραμέτρων Athena για Apache Spark

Για να διαμορφώσετε το Athena για Apache Spark, ολοκληρώστε τα παρακάτω βήματα:

  1. Στην κονσόλα Athena, κάτω Αγορά, Επιλέξτε Αναλύστε τα δεδομένα σας χρησιμοποιώντας PySpark και Spark SQL.
  2. Εάν αυτή είναι η πρώτη φορά που χρησιμοποιείτε το Athena Spark, επιλέξτε Δημιουργία ομάδας εργασίας.
  3. Για Όνομα ομάδας εργασίας¸ πληκτρολογήστε ένα όνομα για την ομάδα εργασίας, όπως π.χ tca-analysis.
  4. Στο Μηχανή Analytics , επιλέξτε Apache Spark.
  5. Στο Πρόσθετες διαμορφώσεις ενότητα, μπορείτε να επιλέξετε Χρησιμοποιήστε προεπιλογές ή παρέχετε ένα έθιμο Διαχείριση ταυτότητας και πρόσβασης AWS ρόλος (IAM) και τοποθεσία Amazon S3 για τα αποτελέσματα υπολογισμού.
  6. Επιλέξτε Δημιουργία ομάδας εργασίας.
  7. Αφού δημιουργήσετε την ομάδα εργασίας, μεταβείτε στο Φορητοί υπολογιστές καρτέλα και επιλέξτε Δημιουργήστε σημειωματάριο.
  8. Εισαγάγετε ένα όνομα για το σημειωματάριό σας, όπως π.χ tca-analysis-with-tick-history.
  9. Επιλέξτε Δημιουργία για να δημιουργήσετε το σημειωματάριό σας.

Εκκινήστε το σημειωματάριό σας

Εάν έχετε ήδη δημιουργήσει μια ομάδα εργασίας Spark, επιλέξτε Εκκινήστε το πρόγραμμα επεξεργασίας σημειωματάριων υπό Αγορά.


Αφού δημιουργηθεί το σημειωματάριό σας, θα ανακατευθυνθείτε στο διαδραστικό πρόγραμμα επεξεργασίας σημειωματάριων.


Τώρα μπορούμε να προσθέσουμε και να εκτελέσουμε τον παρακάτω κώδικα στο σημειωματάριό μας.

Δημιουργήστε μια ανάλυση

Ολοκληρώστε τα παρακάτω βήματα για να δημιουργήσετε μια ανάλυση:

  • Εισαγωγή κοινών βιβλιοθηκών:
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go

  • Δημιουργήστε τα πλαίσια δεδομένων μας για BBO, NBBO και συναλλαγές:
bbo_quote = spark.read.parquet(f"s3://<bucket>/mt=bbo_quote/f=opra/dt=2023-05-17/*")
bbo_quote.createOrReplaceTempView("bbo_quote")
nbbo_quote = spark.read.parquet(f"s3://<bucket>/mt=nbbo_quote/f=opra/dt=2023-05-17/*")
nbbo_quote.createOrReplaceTempView("nbbo_quote")
trades = spark.read.parquet(f"s3://<bucket>/mt=trade/f=opra/dt=2023-05-17/29_1.parquet")
trades.createOrReplaceTempView("trades")

  • Τώρα μπορούμε να προσδιορίσουμε μια συναλλαγή που θα χρησιμοποιηθεί για την ανάλυση κόστους συναλλαγής:
filtered_trades = spark.sql("select Product, Price,Quantity, ReceiptTimestamp, MarketParticipant from trades")

Παίρνουμε την ακόλουθη έξοδο:

+---------------------+---------------------+---------------------+-------------------+-----------------+ 
|Product |Price |Quantity |ReceiptTimestamp |MarketParticipant| 
+---------------------+---------------------+---------------------+-------------------+-----------------+ 
|QQQ 230518C00329000|1.1700000000000000000|10.0000000000000000000|1684338565538021907,NYSEArca|
|QQQ 230518C00329000|1.1700000000000000000|20.0000000000000000000|1684338576071397557,NASDAQOMXPHLX|
|QQQ 230518C00329000|1.1600000000000000000|1.0000000000000000000|1684338579104713924,ISE|
|QQQ 230518C00329000|1.1400000000000000000|1.0000000000000000000|1684338580263307057,NASDAQOMXBX_Options|
|QQQ 230518C00329000|1.1200000000000000000|1.0000000000000000000|1684338581025332599,ISE|
+---------------------+---------------------+---------------------+-------------------+-----------------+

Χρησιμοποιούμε τις επισημασμένες πληροφορίες συναλλαγών στο μέλλον για το εμπορικό προϊόν (tp), την τιμή συναλλαγών (tpr) και το χρόνο συναλλαγών (tt).

  • Εδώ δημιουργούμε έναν αριθμό βοηθητικών συναρτήσεων για την ανάλυσή μας
def calculate_es_qs_eqf(df, trade_price):
    df['BidPrice'] = df['BidPrice'].astype('double')
    df['AskPrice'] = df['AskPrice'].astype('double')
    df["ES"] = ((df["AskPrice"]-df["BidPrice"])/2) - trade_price
    df["QS"] = df["AskPrice"]-df["BidPrice"]
    df["EQF"] = (df["ES"]/df["QS"])*100
    return df

def get_trade_before_n_seconds(trade_time, df, seconds=0, groupby_col = None):
    nseconds=seconds*1000000000
    nseconds += trade_time
    ret_df = df[df['ReceiptTimestamp'] < nseconds].groupby(groupby_col).last()
    ret_df['BidPrice'] = ret_df['BidPrice'].astype('double')
    ret_df['AskPrice'] = ret_df['AskPrice'].astype('double')
    ret_df = ret_df.reset_index()
    return ret_df

def get_trade_after_n_seconds(trade_time, df, seconds=0, groupby_col = None):
    nseconds=seconds*1000000000
    nseconds += trade_time
    ret_df = df[df['ReceiptTimestamp'] > nseconds].groupby(groupby_col).first()
    ret_df['BidPrice'] = ret_df['BidPrice'].astype('double')
    ret_df['AskPrice'] = ret_df['AskPrice'].astype('double')
    ret_df = ret_df.reset_index()
    return ret_df

def get_nbbo_trade_before_n_seconds(trade_time, df, seconds=0):
    nseconds=seconds*1000000000
    nseconds += trade_time
    ret_df = df[df['ReceiptTimestamp'] < nseconds].iloc[-1:]
    ret_df['BidPrice'] = ret_df['BidPrice'].astype('double')
    ret_df['AskPrice'] = ret_df['AskPrice'].astype('double')
    return ret_df

def get_nbbo_trade_after_n_seconds(trade_time, df, seconds=0):
    nseconds=seconds*1000000000
    nseconds += trade_time
    ret_df = df[df['ReceiptTimestamp'] > nseconds].iloc[:1]
    ret_df['BidPrice'] = ret_df['BidPrice'].astype('double')
    ret_df['AskPrice'] = ret_df['AskPrice'].astype('double')
    return ret_df

  • Στην παρακάτω συνάρτηση, δημιουργούμε το σύνολο δεδομένων που περιέχει όλα τα εισαγωγικά πριν και μετά τη συναλλαγή. Το Athena Spark καθορίζει αυτόματα πόσες DPU θα ξεκινήσει για την επεξεργασία των δεδομένων μας.
def get_tca_analysis_via_df_single_query(trade_product, trade_price, trade_time):
    # BBO quotes
    bbos = spark.sql(f"SELECT Product, ReceiptTimestamp, AskPrice, BidPrice, MarketParticipant FROM bbo_quote where Product = '{trade_product}';")
    bbos = bbos.toPandas()

    bbo_just_before = get_trade_before_n_seconds(trade_time, bbos, seconds=0, groupby_col='MarketParticipant')
    bbo_just_after = get_trade_after_n_seconds(trade_time, bbos, seconds=0, groupby_col='MarketParticipant')
    bbo_1s_after = get_trade_after_n_seconds(trade_time, bbos, seconds=1, groupby_col='MarketParticipant')
    bbo_10s_after = get_trade_after_n_seconds(trade_time, bbos, seconds=10, groupby_col='MarketParticipant')
    bbo_60s_after = get_trade_after_n_seconds(trade_time, bbos, seconds=60, groupby_col='MarketParticipant')
    
    all_bbos = pd.concat([bbo_just_before, bbo_just_after, bbo_1s_after, bbo_10s_after, bbo_60s_after], ignore_index=True, sort=False)
    bbos_calculated = calculate_es_qs_eqf(all_bbos, trade_price)

    #NBBO quotes
    nbbos = spark.sql(f"SELECT Product, ReceiptTimestamp, AskPrice, BidPrice, BestBidParticipant, BestAskParticipant FROM nbbo_quote where Product = '{trade_product}';")
    nbbos = nbbos.toPandas()

    nbbo_just_before = get_nbbo_trade_before_n_seconds(trade_time,nbbos, seconds=0)
    nbbo_just_after = get_nbbo_trade_after_n_seconds(trade_time, nbbos, seconds=0)
    nbbo_1s_after = get_nbbo_trade_after_n_seconds(trade_time, nbbos, seconds=1)
    nbbo_10s_after = get_nbbo_trade_after_n_seconds(trade_time, nbbos, seconds=10)
    nbbo_60s_after = get_nbbo_trade_after_n_seconds(trade_time, nbbos, seconds=60)

    all_nbbos = pd.concat([nbbo_just_before, nbbo_just_after, nbbo_1s_after, nbbo_10s_after, nbbo_60s_after], ignore_index=True, sort=False)
    nbbos_calculated = calculate_es_qs_eqf(all_nbbos, trade_price)

    calc = pd.concat([bbos_calculated, nbbos_calculated], ignore_index=True, sort=False)
    
    return calc

  • Τώρα ας καλέσουμε τη συνάρτηση ανάλυσης TCA με τις πληροφορίες από την επιλεγμένη συναλλαγή μας:
tp = "QQQ 230518C00329000"
tpr = 1.16
tt = 1684338579104713924
c = get_tca_analysis_via_df_single_query(tp, tpr, tt)

Οραματιστείτε τα αποτελέσματα της ανάλυσης

Τώρα ας δημιουργήσουμε τα πλαίσια δεδομένων που χρησιμοποιούμε για την οπτικοποίησή μας. Κάθε πλαίσιο δεδομένων περιέχει εισαγωγικά για ένα από τα πέντε χρονικά διαστήματα για κάθε ροή δεδομένων (BBO, NBBO):

bbo = c[c['MarketParticipant'].isin(['BBO'])]
bbo_bef = bbo[bbo['ReceiptTimestamp'] < tt]
bbo_aft_0 = bbo[bbo['ReceiptTimestamp'].between(tt,tt+1000000000)]
bbo_aft_1 = bbo[bbo['ReceiptTimestamp'].between(tt+1000000000,tt+10000000000)]
bbo_aft_10 = bbo[bbo['ReceiptTimestamp'].between(tt+10000000000,tt+60000000000)]
bbo_aft_60 = bbo[bbo['ReceiptTimestamp'] > (tt+60000000000)]

nbbo = c[~c['MarketParticipant'].isin(['BBO'])]
nbbo_bef = nbbo[nbbo['ReceiptTimestamp'] < tt]
nbbo_aft_0 = nbbo[nbbo['ReceiptTimestamp'].between(tt,tt+1000000000)]
nbbo_aft_1 = nbbo[nbbo['ReceiptTimestamp'].between(tt+1000000000,tt+10000000000)]
nbbo_aft_10 = nbbo[nbbo['ReceiptTimestamp'].between(tt+10000000000,tt+60000000000)]
nbbo_aft_60 = nbbo[nbbo['ReceiptTimestamp'] > (tt+60000000000)]

Στις επόμενες ενότητες, παρέχουμε παράδειγμα κώδικα για τη δημιουργία διαφορετικών απεικονίσεων.

Οικόπεδο QS και NBBO πριν από το εμπόριο

Χρησιμοποιήστε τον ακόλουθο κώδικα για να σχεδιάσετε το εισηγμένο spread και το NBBO πριν από τη συναλλαγή:

fig = px.bar(title="Quoted Spread Before The Trade",
    x=bbo_bef.MarketParticipant,
    y=bbo_bef['QS'],
    labels={'x': 'Market', 'y':'Quoted Spread'})
fig.add_hline(y=nbbo_bef.iloc[0]['QS'],
    line_width=1, line_dash="dash", line_color="red",
    annotation_text="NBBO", annotation_font_color="red")
%plotly fig

Οικόπεδο QS για κάθε αγορά και NBBO μετά το εμπόριο

Χρησιμοποιήστε τον ακόλουθο κώδικα για να σχεδιάσετε το περιθώριο τιμών για κάθε αγορά και NBBO αμέσως μετά τη συναλλαγή:

fig = px.bar(title="Quoted Spread After The Trade",
    x=bbo_aft_0.MarketParticipant,
    y=bbo_aft_0['QS'],
    labels={'x': 'Market', 'y':'Quoted Spread'})
fig.add_hline(
    y=nbbo_aft_0.iloc[0]['QS'],
    line_width=1, line_dash="dash", line_color="red",
    annotation_text="NBBO", annotation_font_color="red")
%plotly fig

Οικόπεδο QS για κάθε χρονικό διάστημα και κάθε αγορά για BBO

Χρησιμοποιήστε τον ακόλουθο κώδικα για να σχεδιάσετε το προσφερόμενο spread για κάθε χρονικό διάστημα και κάθε αγορά για το BBO:

fig = go.Figure(data=[
    go.Bar(name="before trade", x=bbo_bef.MarketParticipant.unique(), y=bbo_bef['QS']),
    go.Bar(name="0s after trade", x=bbo_aft_0.MarketParticipant.unique(), y=bbo_aft_0['QS']),
    go.Bar(name="1s after trade", x=bbo_aft_1.MarketParticipant.unique(), y=bbo_aft_1['QS']),
    go.Bar(name="10s after trade", x=bbo_aft_10.MarketParticipant.unique(), y=bbo_aft_10['QS']),
    go.Bar(name="60s after trade", x=bbo_aft_60.MarketParticipant.unique(), y=bbo_aft_60['QS'])])
fig.update_layout(barmode='group',title="BBO Quoted Spread Per Market/TimeFrame",
    xaxis={'title':'Market'},
    yaxis={'title':'Quoted Spread'})
%plotly fig

Οικόπεδο ES για κάθε χρονικό διάστημα και αγορά για BBO

Χρησιμοποιήστε τον ακόλουθο κώδικα για να σχεδιάσετε το πραγματικό spread για κάθε χρονικό διάστημα και αγορά για το BBO:

fig = go.Figure(data=[
    go.Bar(name="before trade", x=bbo_bef.MarketParticipant.unique(), y=bbo_bef['ES']),
    go.Bar(name="0s after trade", x=bbo_aft_0.MarketParticipant.unique(), y=bbo_aft_0['ES']),
    go.Bar(name="1s after trade", x=bbo_aft_1.MarketParticipant.unique(), y=bbo_aft_1['ES']),
    go.Bar(name="10s after trade", x=bbo_aft_10.MarketParticipant.unique(), y=bbo_aft_10['ES']),
    go.Bar(name="60s after trade", x=bbo_aft_60.MarketParticipant.unique(), y=bbo_aft_60['ES'])])
fig.update_layout(barmode='group',title="BBO Effective Spread Per Market/TimeFrame",
    xaxis={'title':'Market'}, 
    yaxis={'title':'Effective Spread'})
%plotly fig

Οικόπεδο EQF για κάθε χρονικό διάστημα και αγορά για BBO

Χρησιμοποιήστε τον ακόλουθο κώδικα για να σχεδιάσετε την αποτελεσματική/αναφερόμενη διαφορά για κάθε χρονικό διάστημα και αγορά για το BBO:

fig = go.Figure(data=[
    go.Bar(name="before trade", x=bbo_bef.MarketParticipant.unique(), y=bbo_bef['EQF']),
    go.Bar(name="0s after trade", x=bbo_aft_0.MarketParticipant.unique(), y=bbo_aft_0['EQF']),
    go.Bar(name="1s after trade", x=bbo_aft_1.MarketParticipant.unique(), y=bbo_aft_1['EQF']),
    go.Bar(name="10s after trade", x=bbo_aft_10.MarketParticipant.unique(), y=bbo_aft_10['EQF']),
    go.Bar(name="60s after trade", x=bbo_aft_60.MarketParticipant.unique(), y=bbo_aft_60['EQF'])])
fig.update_layout(barmode='group',title="BBO Effective/Quoted Spread Per Market/TimeFrame",
    xaxis={'title':'Market'}, 
    yaxis={'title':'Effective/Quoted Spread'})
%plotly fig

Απόδοση υπολογισμού Athena Spark

Όταν εκτελείτε ένα μπλοκ κώδικα, το Athena Spark καθορίζει αυτόματα πόσες DPU χρειάζεται για να ολοκληρώσει τον υπολογισμό. Στο τελευταίο μπλοκ κώδικα, όπου καλούμε το tca_analysis λειτουργία, στην πραγματικότητα δίνουμε εντολή στο Spark να επεξεργαστεί τα δεδομένα και, στη συνέχεια, μετατρέπουμε τα πλαίσια δεδομένων Spark που προκύπτουν σε πλαίσια δεδομένων Pandas. Αυτό αποτελεί το πιο εντατικό μέρος επεξεργασίας της ανάλυσης και όταν το Athena Spark εκτελεί αυτό το μπλοκ, δείχνει τη γραμμή προόδου, τον χρόνο που έχει παρέλθει και πόσες DPU επεξεργάζονται δεδομένα αυτήν τη στιγμή. Για παράδειγμα, στον ακόλουθο υπολογισμό, το Athena Spark χρησιμοποιεί 18 DPU.

Όταν διαμορφώνετε τον φορητό υπολογιστή Athena Spark, έχετε την επιλογή να ορίσετε τον μέγιστο αριθμό DPU που μπορεί να χρησιμοποιήσει. Η προεπιλογή είναι 20 DPU, αλλά δοκιμάσαμε αυτόν τον υπολογισμό με 10, 20 και 40 DPU για να δείξουμε πώς το Athena Spark κλιμακώνεται αυτόματα για να εκτελέσει την ανάλυσή μας. Παρατηρήσαμε ότι το Athena Spark κλιμακώνεται γραμμικά, χρειαζόταν 15 λεπτά και 21 δευτερόλεπτα όταν ο φορητός υπολογιστής είχε ρυθμιστεί με μέγιστο 10 DPU, 8 λεπτά και 23 δευτερόλεπτα όταν ο φορητός υπολογιστής είχε διαμορφωθεί με 20 DPU και 4 λεπτά και 44 δευτερόλεπτα όταν το notebook ήταν διαμορφωμένο με 40 DPU. Επειδή το Athena Spark χρεώνει με βάση τη χρήση της DPU, με ακρίβεια ανά δευτερόλεπτο, το κόστος αυτών των υπολογισμών είναι παρόμοιο, αλλά αν ορίσετε υψηλότερη μέγιστη τιμή DPU, το Athena Spark μπορεί να επιστρέψει το αποτέλεσμα της ανάλυσης πολύ πιο γρήγορα. Για περισσότερες λεπτομέρειες σχετικά με την τιμολόγηση του Athena Spark, κάντε κλικ εδώ.

Συμπέρασμα

Σε αυτήν την ανάρτηση, δείξαμε πώς μπορείτε να χρησιμοποιήσετε δεδομένα OPRA υψηλής πιστότητας από το Tick History-PCAP της LSEG για την εκτέλεση αναλύσεων κόστους συναλλαγών χρησιμοποιώντας το Athena Spark. Η έγκαιρη διαθεσιμότητα των δεδομένων OPRA, σε συνδυασμό με τις καινοτομίες προσβασιμότητας του AWS Data Exchange για το Amazon S3, μειώνει στρατηγικά τον χρόνο για τα αναλυτικά στοιχεία για εταιρείες που θέλουν να δημιουργήσουν χρήσιμες πληροφορίες για κρίσιμες εμπορικές αποφάσεις. Η OPRA παράγει περίπου 7 TB κανονικοποιημένων δεδομένων Parquet κάθε μέρα και η διαχείριση της υποδομής για την παροχή αναλυτικών στοιχείων με βάση τα δεδομένα OPRA είναι δύσκολη.

Η επεκτασιμότητα του Athena στον χειρισμό μεγάλης κλίμακας επεξεργασίας δεδομένων για το Tick History – PCAP για δεδομένα OPRA το καθιστά μια συναρπαστική επιλογή για οργανισμούς που αναζητούν γρήγορες και επεκτάσιμες λύσεις ανάλυσης στο AWS. Αυτή η ανάρτηση δείχνει την απρόσκοπτη αλληλεπίδραση μεταξύ του οικοσυστήματος AWS και των δεδομένων Tick History-PCAP και πώς τα χρηματοπιστωτικά ιδρύματα μπορούν να επωφεληθούν από αυτήν τη συνέργεια για να οδηγήσουν στη λήψη αποφάσεων βάσει δεδομένων για κρίσιμες στρατηγικές συναλλαγών και επενδύσεων.


Σχετικά με τους Συγγραφείς

Pramod Nayak είναι Διευθυντής Διαχείρισης Προϊόντων της Ομάδας Low Latency στο LSEG. Η Pramod έχει πάνω από 10 χρόνια εμπειρίας στον κλάδο της χρηματοοικονομικής τεχνολογίας, εστιάζοντας στην ανάπτυξη λογισμικού, την ανάλυση και τη διαχείριση δεδομένων. Ο Pramod είναι πρώην μηχανικός λογισμικού και παθιασμένος με τα δεδομένα της αγοράς και τις ποσοτικές συναλλαγές.

LakshmiKanth Mannem είναι Διαχειριστής προϊόντων στην ομάδα χαμηλού λανθάνοντος χρόνου της LSEG. Επικεντρώνεται σε προϊόντα δεδομένων και πλατφόρμας για τη βιομηχανία δεδομένων αγοράς χαμηλής καθυστέρησης. Η LakshmiKanth βοηθά τους πελάτες να δημιουργήσουν τις βέλτιστες λύσεις για τις ανάγκες τους σε δεδομένα αγοράς.

Vivek Aggarwal είναι Senior Data Engineer στην Ομάδα Low Latency του LSEG. Η Vivek εργάζεται για την ανάπτυξη και τη συντήρηση αγωγών δεδομένων για την επεξεργασία και την παράδοση ροών δεδομένων αγοράς που έχουν συλληφθεί και ροών δεδομένων αναφοράς.

Alket Memushaj είναι Κύριος Αρχιτέκτονας στην ομάδα Ανάπτυξης Αγοράς Χρηματοοικονομικών Υπηρεσιών στο AWS. Η Alket είναι υπεύθυνη για την τεχνική στρατηγική, συνεργαζόμενη με συνεργάτες και πελάτες για την ανάπτυξη ακόμη και των πιο απαιτητικών φόρτων εργασίας των κεφαλαιαγορών στο AWS Cloud.

Σφραγίδα ώρας:

Περισσότερα από Μεγάλα δεδομένα AWS