#python #pandas #vectorization #finance
#питон #панды #векторизация #финансы
Вопрос:
Я смотрю на данные OHLC с использованием Панд и немного зацикливаюсь на том, могу ли я избежать цикла для того, чего мне нужно достичь. В принципе, для столбца «высокий» я хочу просмотреть произвольное количество строк, скажем, 10, в поисках ситуации, когда предыдущий максимум находится в пределах 0,01 =gt; предостережение, если максимум равен 81,21, 82,2, 82,19, 81,2, для последней строки (81,2) я бы не включил первую (81,21), так как она уже встречается 82,19, поэтому не хочу иметь абсолютный разрыв 0,02, надеюсь, это имеет смысл.
Я изо всех сил пытаюсь решить, использовать ли скользящее окно, или просто применять по строкам, или есть ли какие-либо хорошие идеи, которые подошли бы, которые мне полностью не хватает? Ниже приведена версия фрейма данных (df) в 10 строк и конечный желаемый вывод (end_df), который будет содержать логический столбец для привязки к диапазону, отметку времени начала диапазона (минимум 2 периода), минимум и максимум в заданном диапазоне и количество периодов.
Я понимаю, что имело бы смысл фильтровать только те строки, в которых разница с предыдущей строкой
Я могу легко найти решение, просто не очень быстрое или элегантное, заранее спасибо, если у вас есть какие-либо мысли, код ниже:
import pandas as pd from numpy import NaN from pandas import NaT # Starting dataframe df df_data = {'columns': ['ts', 'high', 'low'], 'data': [['2021-11-11 21:50:00', 81.18, 81.16], ['2021-11-11 21:51:00', 81.2, 81.17], ['2021-11-11 21:52:00', 81.2, 81.19], ['2021-11-11 21:53:00', 81.2, 81.2], ['2021-11-11 21:54:00', 81.2, 81.17], ['2021-11-11 21:55:00', 81.19, 81.12], ['2021-11-11 21:56:00', 81.16, 81.15], ['2021-11-11 21:57:00', 81.18, 81.16], ['2021-11-11 21:58:00', 81.18, 81.16], ['2021-11-11 21:59:00', 81.21, 81.16]]} df = pd.DataFrame(data=df_data['data'], columns=df_data['columns']) df = df.assign(ts=pd.to_datetime(df.ts)) df = df.set_index('ts') # desired output, end_df end_data = {'columns': ['ts', 'high', 'low', 'range_bound', 'range_start', 'range_periods', 'range_low', 'range_high'], 'data': [['2021-11-11 21:50:00', 81.18, 81.16, False, NaT, 0, NaN, NaN], ['2021-11-11 21:51:00', 81.2, 81.17, False, NaT, 0, NaN, NaN], ['2021-11-11 21:52:00', 81.2, 81.19, True, '2021-11-11 21:51:00', 2, 81.17, 81.2], ['2021-11-11 21:53:00', 81.2, 81.2, True, '2021-11-11 21:51:00', 3, 81.17, 81.2], ['2021-11-11 21:54:00', 81.2, 81.17, True, '2021-11-11 21:51:00', 4, 81.17, 81.2], ['2021-11-11 21:55:00', 81.19, 81.12, True, '2021-11-11 21:51:00', 5, 81.17, 81.2], ['2021-11-11 21:56:00', 81.16, 81.15, False, NaT, 0, NaN, NaN], ['2021-11-11 21:57:00', 81.18, 81.16, False, NaT, 0, NaN, NaN], ['2021-11-11 21:58:00', 81.18, 81.16, True, '2021-11-11 21:57:00', 2, 81.16, 81.18], ['2021-11-11 21:59:00', 81.21, 81.16, False, NaT, 0, NaN, NaN]]} end_df = pd.DataFrame(data=end_data['data'], columns=end_data['columns']) end_df = end_df.assign(ts=pd.to_datetime(end_df.ts), range_start=pd.to_datetime(end_df.range_start)) end_df = end_df.set_index('ts')
Комментарии:
1. Немного неясно, чего вы пытаетесь достичь с помощью этих данных. Разве нет индикаторов, таких как ценовые каналы Дончиана или подобных, которые могли бы помочь? Если вы просто пытаетесь найти торговлю с ограниченным диапазоном, могут помочь другие методы.
2. Я ищу сигналы ниже по течению, когда цена движется в соответствии с диапазоном — просто хотел выяснить, можно ли легко векторизовать этот первый шаг…