Рассчитать торговый индикатор в Python - PullRequest
0 голосов
/ 31 августа 2018

Я хотел бы попросить помощи по следующему коду:

di = (sm - 1.0) / 2.0 + 1.0
c1 = 2 / (di + 1.0)
c2 = 1 - c1
c3 = 3.0 * (cd * cd + cd * cd * cd)
c4 = -3.0 * (2.0 * cd * cd + cd + cd * cd * cd)
c5 = 3.0 * cd + 1.0 + cd * cd * cd + 3.0 * cd * cd

asset['i1']=0
asset['i2']=0
asset['i3']=0
asset['i4']=0
asset['i5']=0
asset['i6']=0
asset['i1'] = c1*asset['C']  + c2*(asset['i1'].shift(1))
asset['i2'] = c1*asset['i1'] + c2*(asset['i2'].shift(1))
asset['i3'] = c1*asset['i2'] + c2*(asset['i3'].shift(1))
asset['i4'] = c1*asset['i3'] + c2*(asset['i4'].shift(1))
asset['i5'] = c1*asset['i4'] + c2*(asset['i5'].shift(1))
asset['i6'] = c1*asset['i5'] + c2*(asset['i6'].shift(1))

Как изменить код, чтобы для каждой новой строки рассчитывалось использование предыдущего расчета строки? Проблема в том, что в настоящее время он использует 0 из предыдущего ряда. Цель состоит в том, чтобы рассчитать Coral Trend Indicator в Python. Существует пандас DataFrame, называемый «актив», содержащий цены и даты в качестве метки времени. Значения c1, c2, c3, c4, c5 являются константами индикатора. Нам нужно вычислить "i1, 'i3' ... i6" для всего кадра данных. Каждая строка рассчитывается из предыдущей строки, так или иначе, возможно, следует использовать функцию «применить» на фрейме данных, потому что в данный момент она рассчитывает весь столбец (используя предыдущие определенные нули, а не фактическое значение из предыдущей строки). DataFrame имеет большой размер, если есть более быстрый способ, потому что использование «for» в панде для данных занимает много времени

Спасибо

1 Ответ

0 голосов
/ 01 сентября 2018

Просто создайте цикл for и удерживайте предыдущую переменную следующим образом:

di = (sm - 1.0) / 2.0 + 1.0
c1 = 2 / (di + 1.0)
c2 = 1 - c1
c3 = 3.0 * (cd * cd + cd * cd * cd)
c4 = -3.0 * (2.0 * cd * cd + cd + cd * cd * cd)
c5 = 3.0 * cd + 1.0 + cd * cd * cd + 3.0 * cd * cd


asset['i1'] = c1*asset['C']  + c2*(asset['i1'].shift(1))
var = asset['i1']
for index in range(2,7):
    asset['i'+ str(index)] = c1*var + c2*(asset['i'+ str(index)].shift(1))
...