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

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

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

e6acb0f62c1aab980104ad113f3af587.jpeg

データを処理するとき、後続のベクトル化操作を考慮して、データまたは中間結果が元のデータを転置することを期待する場合があります。つまり、各行は異なる瞬間を表し、各列は株式を表します。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分としてtime.minute()でピボット、シンボル

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 hasrank(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]
価格= 173.27 173.26 173.24 173.25 173.26 173.27 161.51 161.50 161.49 161.50 161.51 
quotes = table(シンボル、時間、価格)
weights = dict( `AAPL`FB、0.6 0.4)
ETF =シンボル、時間、価格*ウェイト[シンボル]をweightedPriceとして選択引用符
から、時間、記号でETFピボットからlast(weightedPrice)を選択ます。

結果は次のとおりです。

時間
AAPLFB 
----------------------------- ------- ------ 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 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行のコードで実行できます。コードは簡潔であり、中間プロセスデータテーブルを生成する必要がないため、メモリ不足の問題を効果的に回避し、計算を大幅に改善します。速度。

時間、シンボルでETFピボットからrowSum(ffill(last(weightedPrice)))を選択します。

結果は次のとおりです。

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.51cto.com/15022783/2608863