私は日中の時間とパンダの見積もりデータを扱っており、重み付けされた中間価格を計算する良い方法を見つけるのに苦労しています. 現在、データは 4 つのデータフレーム (bid_price、bid_quantity、ask_price、ask_quantity) として表されており、各データフレームの列は個々の商品であり、インデックスはタイムスタンプです。(したがって、単一の入札価格は次のように参照できます。
bid_price['AAPL'][datetime(2013,1,1,9,30,0,0)]
私が適用したいミッドポイント式は、商品のビッド/アスク スプレッドに依存します。現在のスプレッドが最小ティック増分よりも広い場合、ミッドポイントはその時点でのビッド価格とアスク価格の単純平均になります。スプレッドが最小値に等しい場合、ミッドポイントはビッドとアスクの量に基づいて加重されます。
現在のコードは次のとおりです。
def get_midprice(bid_price, bid_quantity, ask_price, ask_quantity, tick_increment=0.01):
if (ask_price - bid_price) > tick_increment:
return (ask_price + bid_price) / 2
else:
return ((bid_price * ask_quantity) + (ask_price * bid_quantity)) / (bid_quantity + ask_quantity)
これは単一のデータポイントで機能し、パンダの以前のバージョンでは、4 つのデータフレームを渡したときにも機能しました。現在、4 つのデータフレームで例外が発生します。
raise ValueError("Cannot call bool() on DataFrame.")
ValueError: Cannot call bool() on DataFrame.
これは、この変更によるものだと思います: https://github.com/pydata/pandas/pull/1073
この問題は明らかにループによって解決できますが、大規模なデータセットでは、これは非常に遅くなります。より良い方法はありますか?