Описание проблемы:
У меня есть два кадра данных pandas:market_data: содержит временные метки и соответствующие цены финансовых инструментов.
trades: содержит временные метки сделок, а также инструмент и объем торгов.
Пример данных:
- Кадр данных о сделках:
временная метка
инструмент
количество
2024-01-01T09:02
AAPL
100
2024-01-01T09:07
GOOG
50
- Рыночные данные:
timestamp
mid_price
2024-01-01T09:00:01
100.1
2024-01 -01T09:00:02
100.1
2024-01-01T09:00:03
100.13
2024-01-01T09:00:04
100.14
.. .
...
2024-01-01T23:59:58
101.3
Для каждой сделки в DataFrame сделок мне нужно вычислить стабильную цену инструмента, начиная с из временной метки сделки. Окончание периода стабильных цен определяется, когда изменение цен в скользящем окне рыночных данных превышает определенный порог. Кроме того, если окно стабильной цены превышает максимальный срок, мне нужно пропустить сделку и перейти к следующей.
Текущий подход:
Я реализовал функцию Compute_stable_price(), которая перебирает рыночные данные из временной метки сделки, проверяя изменение цены в скользящем окне до тех пор, пока оно не превысит пороговое значение или пока размер окна не превысит максимальный предел. Сделка пропускается, если размер окна превышает максимальный предел. Затем я применяю эту функцию к каждой метке времени сделки в DataFrame сделок.
Код: Выделить всё
# Function to compute stable price
def compute_stable_price(trade_timestamp, market_data, threshold=0.5, max_window=10):
trade_price = market_data.filter(pl.col("timestamp") == trade_timestamp)["price"][0]
start_index = market_data.filter(pl.col("timestamp") == trade_timestamp).head_index()[0]
end_index = start_index
window_size = 1
while end_index < len(market_data) - 1:
end_index += 1
window = market_data.slice(start_index, end_index + 1)["price"]
price_variation = window.pct_change().std()
if price_variation > threshold or window_size > max_window:
break
window_size += 1
if window_size
Подробнее здесь: [url]https://stackoverflow.com/questions/77965034/optimizing-polars-algorithm-dynamic-rolling-window[/url]