Python Pandas: вычисление экспоненциально взвешенных лаговых квадратов доходности (дисперсия)

Я пытаюсь реализовать инвестиционную стратегию AQR «Импульс временного ряда»: https://www.aqr.com/library/journal-articles/time-series-momentum.

Я сталкиваюсь с некоторой путаницей/проблемами в части процесса. На первый взгляд кажется, что у Pandas есть функция для расчета ключевой метрики, «экспоненциально взвешенной лаговой квадратной доходности», как меры волатильности финансового инструмента. Таким образом, формула (с некоторым фоном):

экспоненциально взвешенная доходность с лагом в квадрате

Я понимаю, что у Pandas есть некоторые функции для применения формулы (1) выше к временным рядам. Например, ежедневная доходность по фьючерсному контракту может быть:

[In]: returns

[Out]:

Date
1984-01-03   -0.007299
1984-01-04    0.003614
1984-01-05   -0.007318
1984-01-06   -0.004134
1984-01-09    0.009487
1984-01-10   -0.000896
                ...

Затем я использую pandas.DataFrame.ewm в сочетании с pd.std(), чтобы попытаться реализовать требуемую формулу в одном быстром вкладыше, установив com=60 для соответствия бумаге, это дает:

[In]: np.sqrt(261) * returns.ewm(com=60).std()

[Out]:

Date
1984-01-03         NaN
1984-01-04    0.124664
1984-01-05    0.101879
1984-01-06    0.082925
1984-01-09    0.120588
1984-01-10    0.107411
                ...

Хотя это кажется нормальным... хотя формула в документе использует разницу между значением предыдущего или запаздывающего дохода и экспоненциально взвешенного среднего дохода в текущий временной шаг в его расчете:

введите здесь описание изображения

Буду ли я прав, если скажу, что метод Pandas, который я выполнил выше, не будет использовать отложенный возврат, а вместо этого будет использовать возврат на текущем временном шаге? Таким образом, мне нужно будет запрограммировать свой собственный способ расчета этого в Pandas? Возможно, используя какой-то сдвиг?

Заранее спасибо! Я все еще разбираюсь с нюансами Pandas, и ваша помощь очень ценится.


person Bango    schedule 12.07.2017    source источник


Ответы (1)


Вы можете использовать метод dataframe shift.

df['shift'] = df['column to shift'].shift(-1)

Это сместит column to shift 1 шаг назад. Таким образом, значение shift строки 1 равно значению строки 2 для column to shift и т. д. Для последней строки будет вменено NaN.

Вот так.

    column to shift shift
0   4   1.0
1   1   1.0
2   1   3.0
3   3   4.0
4   4   2.0
5   2   3.0
6   3   2.0
7   2   2.0
8   2   2.0
9   2   NaN

Этого должно быть достаточно, чтобы создать формулу, которую вы хотите использовать.

person error    schedule 12.07.2017
comment
Привет @error, спасибо за вклад. Простите меня, если я что-то упустил, но, как я понимаю, применение np.sqrt(261) * returns.ewm(com=60).std() к этим сдвинутым данным не будет удовлетворять уравнению, поскольку, хотя доходность была смещена, рассчитанное экспоненциально-взвешенное среднее также сдвинулось. В идеале мне нужно иметь возможность подключить среднее значение на текущем временном шаге к возврату на предыдущем временном шаге. - person Bango; 13.07.2017