市場ダイナミクスの習得: 超正確なティック履歴によるトランザクションコスト分析の変革 – Apache Spark 用 PCAP と Amazon Athena |アマゾン ウェブ サービス

市場ダイナミクスの習得: 超正確なティック履歴によるトランザクションコスト分析の変革 – Apache Spark 用 PCAP と Amazon Athena |アマゾン ウェブ サービス

ソースノード: 3091357

この投稿は、LSEG の Low Latency グループの Pramod Nayak、LakshmiKanth Mannem、Vivek Aggarwal との共著です。

取引コスト分析 (TCA) は、トレーダー、ポートフォリオ マネージャー、ブローカーによって取引前および取引後の分析に広く使用されており、取引コストと取引戦略の有効性を測定および最適化するのに役立ちます。この記事では、オプションの買値と売値のスプレッドを分析します。 LSEG ティック履歴 – PCAP データセットを使用して Apache Spark 用 Amazon Athena。大規模なデータセットであっても、インフラストラクチャのセットアップや Spark の構成を心配することなく、データにアクセスし、データに適用するカスタム関数を定義し、データセットをクエリおよびフィルターし、分析結果を視覚化する方法を示します。

経歴

オプション価格報告局 (OPRA) は、重要な証券情報処理機関として機能し、米国オプションの最終販売レポート、相場、関連情報を収集、統合、配布します。 18 のアクティブな米国オプション取引所と 1.5 万件を超える対象契約を擁する OPRA は、包括的な市場データを提供する上で極めて重要な役割を果たしています。

5 年 2024 月 48 日、Securities Industry Automation Corporation (SIAC) は、OPRA フィードを 96 個のマルチキャスト チャネルから 37.3 個のマルチキャスト チャネルにアップグレードする予定です。この機能強化は、米国オプション市場の取引活動とボラティリティの激化に対応して、シンボルの配布とライン容量の利用を最適化することを目的としています。 SIAC は、最大 XNUMX GBits/秒のピーク データ レートに備えることを企業に推奨しています。

このアップグレードにより公開データの総量は直ちに変更されませんが、OPRA は大幅に速い速度でデータを配布できるようになります。この移行は、ダイナミックなオプション市場の需要に応えるために極めて重要です。

OPRA は最も大量のフィードの 150.4 つとして際立っており、3 年第 2023 四半期には 400 日で XNUMX 億メッセージのピークに達し、XNUMX 日で XNUMX 億メッセージの容量ヘッドルーム要件があります。あらゆるメッセージをキャプチャすることは、取引コスト分析、市場流動性の監視、取引戦略の評価、市場調査にとって重要です。

データについて

LSEG ティック履歴 – PCAP は、30 PB を超えるクラウドベースのリポジトリであり、超高品質の世界市場データが格納されています。このデータは、世界中の主要なプライマリおよびバックアップ エクスチェンジ データ センターに戦略的に配置された冗長キャプチャ プロセスを使用して、エクスチェンジ データ センター内で細心の注意を払って直接キャプチャされます。 LSEG のキャプチャ テクノロジは、ロスレス データ キャプチャを保証し、GPS タイム ソースを使用してナノ秒のタイムスタンプ精度を実現します。さらに、洗練されたデータアービトラージ技術を採用して、データギャップをシームレスに埋めます。キャプチャに続いて、データは細心の注意を払って処理と調停を受け、次に次の方法を使用して Parquet 形式に正規化されます。 LSEGのリアルタイムウルトラダイレクト (RTUD) フィード ハンドラー。

分析用のデータの準備に不可欠な正規化プロセスでは、6 日あたり最大 XNUMX TB の圧縮 Parquet ファイルが生成されます。膨大な量のデータは、複数の取引所にまたがり、多様な属性を特徴とする多数のオプション契約を特徴とする OPRA の包括的な性質に起因すると考えられます。市場のボラティリティの増大とオプション取引所でのマーケットメイク活動により、OPRA で公開されるデータ量がさらに増加し​​ています。

Tick History – PCAP の属性により、企業は次のようなさまざまな分析を行うことができます。

  • 取引前分析 – 潜在的な取引への影響を評価し、履歴データに基づいてさまざまな実行戦略を検討します
  • 取引後の評価 – ベンチマークと比較して実際の実行コストを測定し、実行戦略のパフォーマンスを評価します
  • 最適化 実行 – 過去の市場パターンに基づいて執行戦略を微調整し、市場への影響を最小限に抑え、全体的な取引コストを削減します
  • 危機管理 – スリッページパターンを特定し、異常値を特定し、取引活動に関連するリスクを積極的に管理します
  • パフォーマンスの帰属 – ポートフォリオのパフォーマンスを分析する際に、取引の決定の影響を投資の決定から分離する

LSEG Tick History – PCAP データセットは、次の場所で入手できます。 AWSデータ交換 でアクセスできます AWS Marketplace Amazon S3 の AWS データ交換、LSEG から直接 PCAP データにアクセスできます。 Amazon シンプル ストレージ サービス (Amazon S3) バケットを利用できるため、企業が独自のデータのコピーを保存する必要がなくなります。このアプローチにより、データの管理とストレージが合理化され、クライアントは使いやすく、統合され、高品質の PCAP または正規化されたデータに即座にアクセスできるようになります。 データストレージの大幅な節約.

Apache Spark 用の Athena

分析の取り組みについては、 Apache Spark 用の Athena は、Athena コンソールまたは Athena API からアクセスできる簡素化されたノートブック エクスペリエンスを提供し、インタラクティブな Apache Spark アプリケーションを構築できます。 Athena は、最適化された Spark ランタイムを使用して、Spark エンジンの数を 1 秒未満で動的にスケーリングすることで、ペタバイト規模のデータの分析を支援します。さらに、pandas や NumPy などの一般的な Python ライブラリがシームレスに統合されているため、複雑なアプリケーション ロジックを作成できます。柔軟性は、ノートブックで使用するカスタム ライブラリのインポートまで拡張されます。 Athena for Spark は、ほとんどのオープンデータ形式に対応しており、 AWSグルー データカタログ。

データセット

この分析では、17 年 2023 月 XNUMX 日の LSEG Tick History – PCAP OPRA データセットを使用しました。このデータセットは次のコンポーネントで構成されています。

  • 最高入札価格(BBO) – 特定の取引所における証券の最高買値と最低売値をレポートします。
  • 全国最高入札価格 (NBBO) – すべての取引所にわたる証券の最高入札額と最低要求額をレポートします。
  • トレード – すべての取引所で完了した取引を記録します

データセットには次のデータ ボリュームが含まれます。

  • トレード – 160 MB が約 60 個の圧縮された Parquet ファイルに分散
  • BBO – 2.4 TB を約 300 の圧縮された Parquet ファイルに分散
  • NBBO – 2.8 TB を約 200 の圧縮された Parquet ファイルに分散

分析の概要

取引コスト分析 (TCA) のために OPRA ティック履歴データを分析するには、特定の取引イベントに関する市場相場と取引を精査する必要があります。この調査の一環として次の指標を使用します。

  • 引用スプレッド (QS) – BBOアスクとBBOビッドの差として計算されます
  • 実効スプレッド(ES) – 取引価格と BBO の中間点の差として計算されます (BBO ビッド + (BBO アスク – BBO ビッド)/2)
  • 実効スプレッド/相場スプレッド (EQF) – (ES / QS) * 100として計算されます。

これらのスプレッドは取引前に計算され、さらに取引後の 1 つの間隔 (取引直後、10 秒、60 秒、XNUMX 秒) で計算されます。

Apache Spark 用に Athena を構成する

Apache Spark 用に Athena を構成するには、次の手順を実行します。

  1. Athena コンソールの次の場所にあります。 始める選択 PySpark と Spark SQL を使用してデータを分析する.
  2. Athena Spark を初めて使用する場合は、選択してください ワークグループを作成.
  3. ワークグループ名¸ ワークグループの名前を入力します。 tca-analysis.
  4. 分析エンジン セクション、選択 Apache Spark.
  5. 追加の構成 セクション、選択できます デフォルトを使用 またはカスタムを提供する AWS IDおよびアクセス管理 (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) の 5 つの時間間隔のいずれかの引用符が含まれています。

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をプロット

次のコードを使用して、取引直後に各市場と 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

BBO の各時間間隔および各市場の QS をプロットする

次のコードを使用して、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

各時間間隔と BBO の市場の EQF をプロットします。

次のコードを使用して、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 DPU で構成されている場合は 21 分 10 秒、ノートブックが 8 DPU で構成されている場合は 23 分 20 秒、ノートブックが最大 4 DPU で構成されている場合は 44 分 40 秒かかります。 XNUMX 個の DPU で構成されています。 Athena Spark は DPU 使用量に基づいて XNUMX 秒あたりの粒度で課金するため、これらの計算のコストは同様ですが、より高い最大 DPU 値を設定すると、Athena Spark は分析の結果をより速く返すことができます。 Athena Spark の価格の詳細については、ここをクリックしてください。 こちら.

まとめ

この投稿では、LSEG の Tick History-PCAP からの高忠実度 OPRA データを使用して、Athena Spark を使用してトランザクション コスト分析を実行する方法を説明しました。 OPRA データをタイムリーに利用できるようになり、Amazon S3 向けの AWS Data Exchange のアクセシビリティ革新によって補完され、重要な取引上の意思決定のための実用的な洞察を作成したいと考えている企業の分析にかかる時間が戦略的に短縮されます。 OPRA は毎日約 7 TB の正規化された Parquet データを生成しますが、OPRA データに基づいた分析を提供するインフラストラクチャの管理は困難です。

Tick History – PCAP for OPRA データの大規模なデータ処理を処理する Athena のスケーラビリティにより、AWS で迅速かつスケーラブルな分析ソリューションを求める組織にとって、Athena は魅力的な選択肢となります。この投稿では、AWS エコシステムと Tick History-PCAP データの間のシームレスな相互作用と、金融機関がこの相乗効果を活用して重要な取引および投資戦略においてデータ主導の意思決定を推進する方法を示します。


著者について

プラモド・ナヤック LSEG の低遅延グループの製品管理ディレクターです。 Pramod は金融テクノロジー業界で 10 年以上の経験があり、ソフトウェア開発、分析、データ管理に重点を置いています。 Pramod は元ソフトウェア エンジニアで、市場データと定量的取引に情熱を注いでいます。

ラクシュミカント・マンネム LSEG の低遅延グループのプロダクト マネージャーです。彼は、低遅延市場データ業界向けのデータおよびプラットフォーム製品に焦点を当てています。 LakshmiKanth は、お客様が市場データのニーズに合わせて最適なソリューションを構築できるよう支援します。

ヴィヴェク・アガルワル LSEG の低遅延グループのシニア データ エンジニアです。 Vivek は、取得した市場データ フィードと参照データ フィードの処理と配信のためのデータ パイプラインの開発と維持に取り組んでいます。

アルケット・メムシャジ AWS の金融サービス市場開発チームの主任アーキテクトです。 Alket は技術戦略を担当し、パートナーや顧客と協力して、最も要求の厳しい資本市場のワークロードも AWS クラウドにデプロイします。

タイムスタンプ:

より多くの AWSビッグデータ