高周波データ処理スキル:データパースペクティブの適用

 

高周波データ処理スキル:データパースペクティブの適用

ピボットは、データを整理するための一般的な要件であり、転置またはパースペクティブとも呼ばれます。

高周波データは通常、次の図の形式で保存されます。特定の瞬間の株式に関する情報の各行。

データを処理するとき、後続のベクトル化操作を考慮して、データまたは中間結果が元のデータを転置することを期待する場合があります。つまり、各行は異なる瞬間を表し、各列は株式を表します。DolphinDBでは、元のデータまたはグループ化された集計の結果を、ピボットバイステートメントで置き換えることができます。ベクトル化操作で使用する場合、高頻度のデータ処理と計算で、行と列の変換は戦略コードを単純化するだけでなく、コードの効率も向上させます。詳細については、次の2つの例を参照してください。

1.株式リターンのペアワイズ相関を計算します

ペア取引とリスクヘッジ(ヘッジ)では、特定の株式バスケット間のペアワイズ相関を計算する必要があることがよくあります。このような複雑な計算は、従来のデータベースでは実行できず、一般的な統計ソフトウェアを使用するには、データの移行だけでなく、面倒なコードも必要になります。以下では、DolphinDBを使用して、株式リターンのペアワイズ相関を計算します。

まず、米国株式の高頻度取引データベースをロードします。

quotes = loadTable("dfs://TAQ", "quotes")

次に、2009年8月4日に最も頻繁に価格が変更された500銘柄を選択します。

dateValue=2009.08.04
num=500
syms = (exec count(*) from quotes where date = dateValue, time between 09:30:00 : 15:59:59, 0<bid, bid<ofr, ofr<bid*1.1 group by Symbol order by count desc).Symbol[0:num]

以下では、ピボットバイを使用て高頻度データの次元を分レベルのデータに減らし、元のデータの構造を変更して分レベルの株価マトリックスを生成します。各列は株式、各行は分です。

priceMatrix = exec avg(bid + ofr)/2.0 as price from quotes where date = dateValue, Symbol in syms, 0<bid, bid<ofr, ofr<bid*1.1, time between 09:30:00 : 15:59:59 pivot by time.minute() as minute, Symbol

DolphinDBの言語は非常に柔軟です。ここで、pivot byは、データをピボットテーブルに変換するだけでなく、「groupby」機能を備えた集計関数でも使用できます。

それぞれ高階関数を使用して、価格マトリックスを収益率マトリックスに変換します。

retMatrix = each(def(x):ratios(x)-1, priceMatrix)

高階関数pcrossを使用して、これらの500株間のリターンのペアワイズ相関を計算します。

corrMatrix = pcross(corr, retMatrix)

各株式との相関が最も高い10の株式を選択します。

mostCorrelated = select * from table(corrMatrix).rename!(`sym`corrSym`corr) context by sym having rank(corr,false) between 1:10

SPYとの相関が最も高い10銘柄を選択します。

select * from mostCorrelated where sym='SPY' order by corr desc

Quotesには合計2,693億個のデータがあります。2009年8月4日には約1億9千万個のデータがありました。上記の計算にはわずか1,952ミリ秒しかかかりませんでした

2.株式ポートフォリオの価値を計算します

インデックスアービトラージ取引のバックテストを実施する場合、特定の株式ポートフォリオの価値を計算する必要があります。データ量が非常に多い場合は、一般的なデータ分析システムをバックテストで使用するため、非常に高いシステムメモリと速度が必要になります。DolphinDBデータベースは下から最適化されていますが、ハードウェア要件は高くありません。

この例では、簡単にするために、インデックスがAAPLとFBの2つの株のみで構成され、タイムスタンプの精度がナノ秒であり、インデックスコンポーネントの重みが重みディクショナリに格納されていると想定しています。

Symbol=take(`AAPL, 6) join take(`FB, 5)
Time=2019.02.27T09:45:01.000000000+[146, 278, 412, 445, 496, 789, 212, 556, 598, 712, 989]
Price=173.27 173.26 173.24 173.25 173.26 173.27 161.51 161.50 161.49 161.50 161.51
quotes=table(Symbol, Time, Price)
weights=dict(`AAPL`FB, 0.6 0.4)
ETF = select Symbol, Time, Price*weights[Symbol] as weightedPrice from quotes
select last(weightedPrice) from ETF pivot by Time, Symbol;

結果は次のとおりです。

Time                          AAPL    FB
----------------------------- ------- ------
2019.02.27T09:45:01.000000146 103.962
2019.02.27T09:45:01.000000212         64.604
2019.02.27T09:45:01.000000278 103.956
2019.02.27T09:45:01.000000412 103.944
2019.02.27T09:45:01.000000445 103.95
2019.02.27T09:45:01.000000496 103.956
2019.02.27T09:45:01.000000556         64.6
2019.02.27T09:45:01.000000598         64.596
2019.02.27T09:45:01.000000712         64.6
2019.02.27T09:45:01.000000789 103.962
2019.02.27T09:45:01.000000989         64.604

タイムスタンプの精度はナノ秒であるため、基本的にすべてのトランザクションのタイムスタンプは一貫していません。バックテスト中のデータ行の数が非常に多く(数億または数十億行)、インデックス構成要素の数も多い場合(S&P500インデックスの500構成ストックなど)、従来の分析システムを使用して、インデックスいつでも値を計算する必要があります。元のデータテーブルの3つの列(時間、ストックコード、価格)を、同じ長さでインデックス構成株の数の幅+1のデータテーブルに変換する必要があります。 NULLを入力してから、各行を計算します。インデックス構成株のインデックス価格への寄与の合計。このアプローチでは、元のデータテーブルよりも何倍も大きい中間プロセスデータテーブルが生成され、システムメモリが不足する可能性があります。同時に、計算​​速度も非常に遅いです。

DolphinDBのピボットバイステートメントを使用すると、上記のすべての手順を1行のコードで実行できます。コードは簡潔であり、中間プロセスデータテーブルを生成する必要がないため、メモリ不足の問題を効果的に回避し、計算を大幅に改善します。速度。

select rowSum(ffill(last(weightedPrice))) from ETF pivot by Time, Symbol;

結果は次のとおりです。

Time                          rowSum
----------------------------- -------
2019.02.27T09:45:01.000000146 103.962
2019.02.27T09:45:01.000000212 168.566
2019.02.27T09:45:01.000000278 168.56
2019.02.27T09:45:01.000000412 168.548
2019.02.27T09:45:01.000000445 168.554
2019.02.27T09:45:01.000000496 168.56
2019.02.27T09:45:01.000000556 168.556
2019.02.27T09:45:01.000000598 168.552
2019.02.27T09:45:01.000000712 168.556
2019.02.27T09:45:01.000000789 168.562
2019.02.27T09:45:01.000000989 168.566

 

DolphinDB下取:DolphinDB

おすすめ

転載: blog.csdn.net/qq_41996852/article/details/111151322