Я пытаюсь получить прямую n-минутную доходность акций в день, учитывая кадр данных со строками, соответствующими доходам через некоторые интервалы.
Я пытался использовать dask и многопоточность скользящего вычисления для каждой группы, но, похоже, это самый быстрый способ сделать это, что я могу выяснить. Тем не менее, для большого кадра данных (миллионы строк) (252 дня и 1000 акций) этот шаг занимает до 40 минут.
ret_df.sort_values(['date','time','stock'], ascending=False, inplace=True)
gb = ret_df.groupby(['date','stock'])
forward_sum_df = gb.rolling(4, on='time', min_periods = 0)['interval_return'].sum().reset_index()
Это вернет сумму следующих 4 раз (по дате и запасу) для каждой строки в кадре данных, как и ожидалось, но делает это довольно медленно. Спасибо за помощь!
РЕДАКТИРОВАТЬ: добавлен пример для уточнения
date stock time interval_ret
0 2017-01-03 10000001 09:30:00.000000 0.001418
1 2017-01-03 10000001 09:40:00.000000 0.000000
2 2017-01-03 10000001 09:50:00.000000 0.000000
3 2017-01-03 10000001 10:00:00.000000 -0.000474
4 2017-01-03 10000001 10:10:00.000000 -0.001417
5 2017-01-03 10000001 10:20:00.000000 -0.000944
6 2017-01-03 10000001 10:30:00.000000 0.000000
7 2017-01-03 10000001 10:40:00.000000 0.000000
8 2017-01-03 10000001 10:50:00.000000 0.000000
9 2017-01-03 10000001 11:00:00.000000 -0.000472
и т. Д. На складе 10000002 ... и дата 2017-01-04 ....
Например, если мой период удержания составляет 30 минут вместо 10 минут, я хотел бы суммировать 3 строки 'interval_ret', сгруппированные по дате и запасу. Пример:
date stock time interval_ret_30
0 2017-01-03 10000001 09:30:00.000000 0.001418
1 2017-01-03 10000001 09:40:00.000000 0.000000 - 0.000474
2 2017-01-03 10000001 09:50:00.000000 0.000000 - 0.000474 - 0.001417
3 2017-01-03 10000001 10:00:00.000000 -0.000474 - 0.001417 - 0.000944
4 2017-01-03 10000001 10:10:00.000000 -0.001417 - 0.000944
5 2017-01-03 10000001 10:20:00.000000 -0.000944
6 2017-01-03 10000001 10:30:00.000000 0.000000
7 2017-01-03 10000001 10:40:00.000000 -0.000472
8 2017-01-03 10000001 10:50:00.000000 -0.000472
9 2017-01-03 10000001 11:00:00.000000 -0.000472