я работаю над новой реализацией операторов в http://www.thalesians.com/archive/public/academic/finance/papers/Zumbach_2000.pdf EDIT: ясное объяснение здесь: https://www.olseninvest.com/customer/pdf/paper/001207-emaOfEma.pdfРеализации рекуррентных отношений на государственных монадах (в Haskell или Scala)
Кратко, это целая куча операторов прохладного временных рядов основанный на рекуррентном соотношении экспоненциальной скользящей средней, где каждое приложение оператора ema() принимает новое значение и предыдущий результат ema. Я не могу сделать латекс в этом обмене стека, но в любом случае моя проблема теперь - проблема программного обеспечения.
Я реализовал это в Scala, сокрыв var глубоко внутри громкоговорителей, которые создают функции EMA. Все это работает, но это супер сложно, потому что вызов ema (5), а затем ema (5) снова, естественно, приведет к другому результату. Я хотел бы попробовать переделать все это, используя State Monads, но я быстро теряюсь в сорняках.
Например, у меня есть следующий упрощенный EMA State монаду в Haskell:
import Control.Monad.State
type EMAState = Double
type Tau = Double
ema :: Tau -> Double -> State EMAState Double
ema tau x = state $ \y ->
let alpha = 1/tau
mu = exp(-alpha)
mu' = 1 - mu
y' = (mu * y) + (mu' * x)
in (y', y')
, которые можно легко проверить в GHCI:
*Main Control.Monad.State> runState (ema 5 10) 0
(1.8126924692201818,1.8126924692201818)
применяя вход 10 к 5-период EMA инициализируется до 0. Это все хорошо и полезно, используя forM. Я могу применять несколько входных значений и т. д. Теперь следующий шаг - реализовать «повторенную EMA», которая является EMA, применяемой к себе N раз.
iEMA[n](x) = EMA(iEMA[n-1](x))
Каждый из этих промежуточных ЕМА должны иметь свое собственное государство, иначе предыдущий результат, чтобы правильно рассчитать вектор итерированными ЕМА. Итак, что я ищу, это то, что, как это (я думаю):
iema :: Int -> Tau -> Double -> State [EMAState] [Double]
который является по существу ромашка цепь ЕМА:
iEMA[3](x) = EMA(EMA(EMA(x,s1),s2),s3) = (x, [s1,s2,s3]) -> ([y1,y2,y3], [s1',s2',s3'])
А если мне все равно это о третья итерация ЕМА ...
... -> (y3, [s1', s2', s3'])
бумага движется оттуда, создавая все более сложные операторы, построенные на итеративных ЕМА и средние из них и т.д., поэтому я хочу, чтобы иметь возможность функционально и просто компоновать с учетом состояния OPERAT ors, создавая все более сложные состояния, но все же довольно простой ввод и вывод.
Я действительно чувствую, что это функциональное программирование, но у меня еще нет опыта, чтобы увидеть, как правильно собрать эти государственные монады. Может ли кто-нибудь указать мне в правильном направлении с этими повторными операторами повторения?
EDIT:
Несколько полезных людей, которые предложили повторное применение одного и того же оператора EMA к входным данным, но это не является достаточным. Каждый оператор ema должен поддерживать свое прежнее значение. Вот пример:
tau 5
mu 0.818730753
muprime 0.181269247
ema1 ema2 ema3
x 0 0 0 <- States_0
1 0.1812 0.03285 0.00595 <- States_1
5 1.0547 0.21809 0.04441 <- States_2
В столбце х представляет собой необработанные входные данные, EMA1 использует его влево для ввода, и это до рецидива/состояния. ema2 использует свой левый для ввода (не x!), и он находится в состоянии. Это ema (ema (x)). Точно ema3 = ema (ema (ema (x))).То, что я хотел бы сделать, что, по моему мнению, должно быть возможным, дано монадой государства ema, сочинить монаду государства ema3 или, еще лучше, монаду государства [ema] с каждой каждой последующей ema, действующей на выходе предыдущего.
Спасибо, что дает мне что-то пожевать. Я, вероятно, попытаюсь сделать версию [(a -> State sa)] -> (a -> State [s] [a]), которая может быть объединена с повторением, чтобы получить Integer -> (a -> State sa) -> (a -> State [s] [a]) Я думаю ... – experquisite
Ответ обновлен. – ErikR
И обновлено снова. – ErikR