إتقان ديناميكيات السوق: تحويل تحليلات تكلفة المعاملات باستخدام سجل العمليات الدقيق للغاية – PCAP وAmazon Athena لـ Apache Spark | خدمات ويب أمازون

إتقان ديناميكيات السوق: تحويل تحليلات تكلفة المعاملات باستخدام سجل العمليات الدقيق للغاية – PCAP وAmazon Athena لـ Apache Spark | خدمات ويب أمازون

عقدة المصدر: 3091357

تمت كتابة هذا المنشور بالاشتراك مع برامود ناياك، ولاكشمي كانث مانيم، وفيفيك أغاروال من مجموعة Low Latency Group في LSEG.

يستخدم تحليل تكاليف المعاملات (TCA) على نطاق واسع من قبل التجار ومديري المحافظ والوسطاء لتحليل ما قبل التجارة وما بعد التجارة، ويساعدهم على قياس وتحسين تكاليف المعاملات وفعالية استراتيجيات التداول الخاصة بهم. في هذا المنشور، نقوم بتحليل فروق أسعار عروض الأسعار والطلبات من سجل القراد LSEG – PCAP مجموعة البيانات باستخدام أمازون أثينا لأباتشي سبارك. نوضح لك كيفية الوصول إلى البيانات، وتحديد الوظائف المخصصة لتطبيقها على البيانات، والاستعلام عن مجموعة البيانات وتصفيتها، وتصور نتائج التحليل، كل ذلك دون الحاجة إلى القلق بشأن إعداد البنية التحتية أو تكوين Spark، حتى بالنسبة لمجموعات البيانات الكبيرة.

خلفيّة

تعمل هيئة الإبلاغ عن أسعار الخيارات (OPRA) كمعالج معلومات الأوراق المالية الهامة، حيث تقوم بجمع وتوحيد ونشر تقارير البيع الأخيرة وعروض الأسعار والمعلومات ذات الصلة لخيارات الولايات المتحدة. من خلال 18 بورصة خيارات أمريكية نشطة وأكثر من 1.5 مليون عقد مؤهل، تلعب OPRA دورًا محوريًا في توفير بيانات السوق الشاملة.

في 5 فبراير 2024، تم تعيين شركة Securities Industry Automation Corporation (SIAC) لترقية تغذية OPRA من 48 إلى 96 قناة بث متعدد. ويهدف هذا التحسين إلى تحسين توزيع الرموز واستخدام سعة الخط استجابة لتصاعد نشاط التداول والتقلبات في سوق الخيارات الأمريكية. أوصت SIAC بأن تستعد الشركات لذروة معدلات البيانات التي تصل إلى 37.3 جيجابت في الثانية.

على الرغم من أن الترقية لا تغير على الفور الحجم الإجمالي للبيانات المنشورة، إلا أنها تمكن OPRA من نشر البيانات بمعدل أسرع بكثير. يعد هذا التحول أمرًا بالغ الأهمية لتلبية متطلبات سوق الخيارات الديناميكية.

تبرز OPRA كواحدة من أكثر الخلاصات ضخامة، حيث تبلغ ذروتها 150.4 مليار رسالة في يوم واحد في الربع الثالث من عام 3 ومتطلبات سعة تبلغ 2023 مليار رسالة خلال يوم واحد. يعد التقاط كل رسالة أمرًا بالغ الأهمية لتحليلات تكلفة المعاملات ومراقبة سيولة السوق وتقييم استراتيجية التداول وأبحاث السوق.

حول البيانات

سجل القراد LSEG – PCAP هو مستودع قائم على السحابة، يتجاوز 30 بيتا بايت، ويحتوي على بيانات السوق العالمية فائقة الجودة. يتم التقاط هذه البيانات بدقة مباشرة داخل مراكز بيانات التبادل، وذلك باستخدام عمليات التقاط متكررة موضوعة بشكل استراتيجي في مراكز بيانات التبادل الرئيسية والاحتياطية الرئيسية في جميع أنحاء العالم. تضمن تقنية الالتقاط الخاصة بـ LSEG التقاط البيانات دون فقدان البيانات وتستخدم مصدرًا زمنيًا لنظام تحديد المواقع العالمي (GPS) للحصول على دقة الطابع الزمني بالنانو ثانية. بالإضافة إلى ذلك، يتم استخدام تقنيات تحكيم البيانات المتطورة لملء أي فجوات في البيانات بسلاسة. بعد التقاط البيانات، تخضع البيانات للمعالجة الدقيقة والتحكيم، ثم يتم تطبيعها إلى تنسيق Parquet باستخدام LSEG في الوقت الحقيقي الترا المباشر (RTUD) معالجات التغذية.

تولد عملية التطبيع، والتي تعد جزءًا لا يتجزأ من إعداد البيانات للتحليل، ما يصل إلى 6 تيرابايت من ملفات الباركيه المضغوطة يوميًا. ويعزى الحجم الهائل من البيانات إلى الطبيعة الشاملة لـ OPRA، التي تغطي بورصات متعددة، وتضم العديد من عقود الخيارات التي تتميز بسمات متنوعة. تساهم زيادة تقلبات السوق ونشاط صناعة السوق في بورصات الخيارات في زيادة حجم البيانات المنشورة على OPRA.

سمات سجل القراد - PCAP تمكن الشركات من إجراء تحليلات مختلفة، بما في ذلك ما يلي:

  • تحليل ما قبل التجارة – تقييم التأثير التجاري المحتمل واستكشاف استراتيجيات التنفيذ المختلفة بناءً على البيانات التاريخية
  • تقييم ما بعد التجارة – قياس تكاليف التنفيذ الفعلية مقابل المعايير لتقييم أداء استراتيجيات التنفيذ
  • الأمثل - تحسين استراتيجيات التنفيذ بناءً على أنماط السوق التاريخية لتقليل تأثير السوق وتقليل تكاليف التداول الإجمالية
  • إدارة المخاطر - تحديد أنماط الانزلاق، وتحديد القيم المتطرفة، وإدارة المخاطر المرتبطة بأنشطة التداول بشكل استباقي
  • إسناد الأداء – فصل تأثير قرارات التداول عن قرارات الاستثمار عند تحليل أداء المحفظة

تتوفر مجموعة بيانات LSEG Tick History – PCAP في تبادل بيانات AWS ويمكن الوصول إليها على سوق AWS. مع تبادل بيانات AWS لـ Amazon S3، يمكنك الوصول إلى بيانات PCAP مباشرة من LSEG خدمة تخزين أمازون البسيطة (Amazon S3)، مما يلغي حاجة الشركات إلى تخزين نسختها الخاصة من البيانات. يعمل هذا النهج على تبسيط إدارة البيانات وتخزينها، مما يوفر للعملاء إمكانية الوصول الفوري إلى PCAP عالي الجودة أو البيانات المعيارية مع سهولة الاستخدام والتكامل والتكامل. وفورات كبيرة في تخزين البيانات.

أثينا لأباتشي سبارك

للمساعي التحليلية ، أثينا لأباتشي سبارك يقدم تجربة مبسطة للكمبيوتر المحمول يمكن الوصول إليها من خلال وحدة تحكم Athena أو Athena APIs، مما يسمح لك ببناء تطبيقات Apache Spark التفاعلية. من خلال وقت تشغيل Spark الأمثل، تساعد Athena في تحليل بيتابايت من البيانات عن طريق زيادة عدد محركات Spark ديناميكيًا في أقل من ثانية. علاوة على ذلك، يتم دمج مكتبات Python الشائعة مثل Pandas وNumPy بسلاسة، مما يسمح بإنشاء منطق تطبيق معقد. تمتد المرونة إلى استيراد المكتبات المخصصة لاستخدامها في دفاتر الملاحظات. يستوعب Athena for Spark معظم تنسيقات البيانات المفتوحة ويتم دمجه بسلاسة مع غراء AWS كتالوج البيانات.

بيانات

في هذا التحليل، استخدمنا مجموعة بيانات LSEG Tick History – PCAP OPRA اعتبارًا من 17 مايو 2023. وتتكون مجموعة البيانات هذه من المكونات التالية:

  • أفضل عرض وعطاء (BBO) – يُبلغ عن أعلى عرض وأدنى طلب للأوراق المالية في بورصة معينة
  • أفضل عرض وعرض وطني (NBBO) – تقارير أعلى عرض وأدنى طلب للأمن في جميع البورصات
  • الصفقات – سجلات الصفقات المكتملة في جميع البورصات

تتضمن مجموعة البيانات أحجام البيانات التالية:

  • الصفقات – 160 ميجابايت موزعة على حوالي 60 ملف باركيه مضغوط
  • BBO – 2.4 تيرابايت موزعة على حوالي 300 ملف باركيه مضغوط
  • البنك الوطني العماني – 2.8 تيرابايت موزعة على حوالي 200 ملف باركيه مضغوط

نظرة عامة على التحليل

يتضمن تحليل بيانات سجل OPRA Tick History لتحليل تكلفة المعاملات (TCA) فحص أسعار السوق والتداولات حول حدث تجاري محدد. نستخدم المقاييس التالية كجزء من هذه الدراسة:

  • انتشار مقتبس (QS) – يتم حسابه على أنه الفرق بين طلب BBO وعرض BBO
  • الانتشار الفعال (ES) – يتم حسابه على أنه الفرق بين سعر التداول ونقطة المنتصف لـ BBO (عرض BBO + (طلب BBO – عرض BBO)/2)
  • الانتشار الفعال/المقتبس (EQF) – يتم حسابه كـ (ES / QS) * 100

نقوم بحساب هذه الفروق قبل التداول بالإضافة إلى ذلك على أربع فترات بعد التداول (بعد ثانية واحدة و1 ثوانٍ و10 ثانية بعد التداول مباشرة).

قم بتكوين أثينا لـ Apache Spark

لتكوين Athena لـ Apache Spark، أكمل الخطوات التالية:

  1. على وحدة تحكم أثينا ، تحت إبداء الأن، حدد قم بتحليل بياناتك باستخدام PySpark وSpark SQL.
  2. إذا كانت هذه هي المرة الأولى التي تستخدم فيها Athena Spark، فاختر قم بإنشاء مجموعة عمل.
  3. في حالة اسم مجموعة العمل¸ أدخل اسمًا لمجموعة العمل، مثل tca-analysis.
  4. في مجلة محرك التحليلات القسم، حدد أباتشي سبارك.
  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 قبل التداول

استخدم الكود التالي لرسم السبريد المقتبس وبنك 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 بعد التداول

استخدم الكود التالي لرسم الفارق السعري لكل سوق ولدى البنك الوطني العماني مباشرة بعد التداول:

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

استخدم الكود التالي لرسم الفارق المقتبس لكل فترة زمنية وكل سوق لـ 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

استخدم الكود التالي لرسم السبريد الفعال لكل فترة زمنية وسوق لـ 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 تلقائيًا عدد وحدات DPU المطلوبة لإكمال الحساب. في كتلة التعليمات البرمجية الأخيرة، حيث نسميها tca_analysis وظيفة، نحن في الواقع نطلب من Spark معالجة البيانات، ثم نقوم بعد ذلك بتحويل إطارات بيانات Spark الناتجة إلى إطارات بيانات Pandas. يشكل هذا الجزء الأكثر كثافة للمعالجة في التحليل، وعندما تقوم Athena Spark بتشغيل هذه الكتلة، فإنها تعرض شريط التقدم والوقت المنقضي وعدد وحدات DPU التي تعالج البيانات حاليًا. على سبيل المثال، في الحساب التالي، تستخدم Athena Spark 18 وحدة DPU.

عندما تقوم بتكوين دفتر Athena Spark الخاص بك، يكون لديك خيار تعيين الحد الأقصى لعدد وحدات DPU التي يمكنه استخدامها. الافتراضي هو 20 وحدة معالجة بيانات، لكننا اختبرنا هذه العملية الحسابية باستخدام 10 و20 و40 وحدة معالجة بيانات لتوضيح كيفية قياس Athena Spark تلقائيًا لتشغيل تحليلنا. لاحظنا أن مقياس Athena Spark خطيًا، حيث يستغرق 15 دقيقة و21 ثانية عندما تم تكوين الكمبيوتر الدفتري باستخدام 10 وحدات معالجة بيانات كحد أقصى، و8 دقائق و23 ثانية عندما تم تكوين الكمبيوتر الدفتري باستخدام 20 وحدة معالجة بيانات، و4 دقائق و44 ثانية عندما تم تكوين الكمبيوتر المحمول تم تكوينه مع 40 وحدة معالجة البيانات (DPUs). نظرًا لأن Athena Spark تفرض رسومًا بناءً على استخدام DPU، وبدقة في الثانية، فإن تكلفة هذه الحسابات متشابهة، ولكن إذا قمت بتعيين حد أقصى أعلى لقيمة DPU، فيمكن لـ Athena Spark إرجاع نتيجة التحليل بشكل أسرع بكثير. لمزيد من التفاصيل حول أسعار Athena Spark برجاء النقر هنا.

وفي الختام

في هذا المنشور، أوضحنا كيف يمكنك استخدام بيانات OPRA عالية الدقة من Tick History-PCAP الخاص بـ LSEG لإجراء تحليلات تكلفة المعاملات باستخدام Athena Spark. إن توفر بيانات OPRA في الوقت المناسب، بالإضافة إلى ابتكارات إمكانية الوصول الخاصة بـ AWS Data Exchange لـ Amazon S3، يقلل بشكل استراتيجي من الوقت اللازم لإجراء التحليلات بالنسبة للشركات التي تتطلع إلى إنشاء رؤى قابلة للتنفيذ لقرارات التداول المهمة. تولد OPRA حوالي 7 تيرابايت من بيانات Parquet الطبيعية كل يوم، كما أن إدارة البنية التحتية لتوفير التحليلات بناءً على بيانات OPRA تمثل تحديًا.

إن قابلية التوسع التي تتمتع بها Athena في التعامل مع معالجة البيانات واسعة النطاق لـ Tick History – PCAP لبيانات OPRA تجعلها خيارًا مقنعًا للمؤسسات التي تبحث عن حلول تحليلية سريعة وقابلة للتطوير في AWS. يوضح هذا المنشور التفاعل السلس بين نظام AWS البيئي وبيانات Tick History-PCAP وكيف يمكن للمؤسسات المالية الاستفادة من هذا التآزر لدفع عملية صنع القرار المستندة إلى البيانات لاستراتيجيات التداول والاستثمار المهمة.


حول المؤلف

برامود ناياك هو مدير إدارة المنتجات لمجموعة Low Latency Group في LSEG. يتمتع برامود بخبرة تزيد عن 10 سنوات في مجال التكنولوجيا المالية، مع التركيز على تطوير البرمجيات والتحليلات وإدارة البيانات. برامود هو مهندس برمجيات سابق ومتحمس لبيانات السوق والتداول الكمي.

لاكشمي كانث مانيم هو مدير المنتج في مجموعة Low Latency Group في LSEG. وهو يركز على منتجات البيانات والأنظمة الأساسية لصناعة بيانات السوق ذات زمن الوصول المنخفض. تساعد LakshmiKanth العملاء على بناء الحلول الأمثل لاحتياجات بيانات السوق الخاصة بهم.

فيفيك أغاروال هو مهندس بيانات أول في مجموعة الكمون المنخفض في LSEG. تعمل Vivek على تطوير وصيانة خطوط أنابيب البيانات لمعالجة وتسليم خلاصات بيانات السوق التي تم التقاطها وخلاصات البيانات المرجعية.

الكيت مموشاج هو مهندس رئيسي في فريق تطوير سوق الخدمات المالية في AWS. تتولى Alket مسؤولية الإستراتيجية الفنية، والعمل مع الشركاء والعملاء لنشر حتى أحمال عمل أسواق رأس المال الأكثر تطلبًا إلى سحابة AWS.

الطابع الزمني:

اكثر من بيانات AWS الضخمة