Одна вещь, которую мне нужно рассчитать, — это EWMA.
Когда занимаясь исследованием (т. е. историческим «пакетным» миром), у меня есть длинный список цен на акции, и я могу использовать pandas ewm(...).mean() для расчета моего EWMA по этому списку цен .
Позже, при использовании того же кода в производстве (т. е. в реальном времени), я хочу рассчитать EWMA только для последней цены акций без необходимости пересчета всю историю.
Ниже подробно описана проблема, с которой я столкнулся:
Вот код, который имитирует цену акций:
Вот код, который имитирует цену акций:
p>
Код: Выделить всё
import numpy as np
import pandas as pd
def gbm(T, N, mu, sigma, S0):
dt = float(T)/N
t = np.linspace(0, T, N)
W = np.random.standard_normal(size = N)
W = np.cumsum(W)*np.sqrt(dt)
X = (mu-0.5*sigma**2)*t + sigma*W
S = S0*np.exp(X)
return S
dates = pd.date_range('2021-01-01', '2022-01-01')
T = (dates.max()-dates.min()).days / 365
N = len(dates)
mu = 0.03
sigma = 0.5
S0 = 100
df = pd.DataFrame(index=index, data={'value': gbm(T, N, mu, sigma, S0)})
Код: Выделить всё
df['ewma'] = df['value'].ewm(halflife=30).mean()
df.plot()

Хвост моего фрейма данных выглядит следующим образом:

Как известно, формула для расчета EWMA представляет собой предыдущее значение EWMA, уменьшенное на 1-α, и текущее наблюдение, масштабированное на α:

Теперь мы притворяемся, что находимся в производстве , и мы только что получили единственную новую цену. Я добавляю одно новое наблюдение к своим исходным данным:
Код: Выделить всё
df_new = pd.DataFrame(index=[pd.Timestamp('2022-01-02')], data={'value':105})
df = pd.concat([df, df_new])
[img]https://i.sstatic .net/cwj8NdEg.png[/img]
Теперь я хотел бы рассчитать EWMA нового значения.
Очевидно, я могу просто пересчитать вся история EWM по всему кадру данных:
Код: Выделить всё
df['ewma'] = df['value'].ewm(halflife=30).mean()
Я знаю, что могу вручную рассчитать EWMA для новое значение, вычисляя α вручную на основе моего периода полураспада, а затем используя формулу EWMA с предыдущим значением EWMA:
Код: Выделить всё
df = df.tail(2).copy()
halflife = 30
alpha = 1 - np.exp(-np.log(2)/halflife)
df.iloc[-1]['ewma'] = (1-alpha)*df.iloc[-2]['ewma'] + alpha*df.iloc[-1]['value']
Мои исследователи пишут код Python, который использует pandas ewm(...) .mean, и я хочу взять этот код и реализовать его, но не придется пересчитывать всю историю EWMA для каждого отдельного обновления цен.
Я хотел бы предоставить исследователям единый унифицированный интерфейс, который работает как в историческом пакетном мире, так и в реальном мире в реальном времени.
Возможно ли это с пандами?
Могу ли я предоставить pandas некоторое состояние, чтобы оно «продолжало с того места, где остановилось» для нового значения?
Подробнее здесь: https://stackoverflow.com/questions/791 ... ding-a-row
Мобильная версия