2013-12-18 2 views
2

Я работаю над программой Algorithmic Trading в Python для обучения. Используя Numpy, я стараюсь, чтобы максимизировать скорость логики ядра моделирования:Торговля с помощью Numpy

t=0 
    size = Ticks.shape[0] #Ticks is a numpy array 
    while t<size: 

     if self.toLong(t): 
      self._Trader.Long(Ticks[t,3]) 
      t+=1 
      while t<size: 
       if self.toexitLong(t): 
        self._Trader.exitLong(Ticks[t,3]) 
        break 
       t+=1 

     elif self.toShort(t): 
      self._Trader.Short(Ticks[t,3]) 
      t+=1 
      while t<size: 
       if self.toexitShort(t): 
        self._Trader.exitShort(Ticks[t,3]) 
        break 
       t+=1 

     t+=1 

В принципе, мне нужно применить функцию к каждой строке в 2D массив, но логика, которая применяется к ряду зависит на условиях, установленных логикой в ​​предыдущих строках. Большую часть времени в этом цикле потребляют, просматривая значение в Ticks [t, 3]. Я рассмотрел использование итератора или «np.applyalongaxis» и установил данные для условий, но я не уверен, что это то, что мне нужно. Также стоит отметить, что другие методы, вызываемые этой функцией, используют индексы, которые они передают, для выполнения операций с одним и тем же массивом.

Каков наиболее эффективный способ (вычислительная скорость) запуска этого цикла с помощью Numpy?

+1

Не оптимизация скорости, но похоже, что это может быть написано более четко с помощью цикла 'for' и переменной mode, указывающей, находится ли вы в середине длинного, короткого или ни одного. Увеличение счетчика циклов в 5 местах сильно подвержено ошибкам. – user2357112

+1

Вам действительно нужно увеличивать 't' 1 на 1 и проверять на каждом шаге, нужно ли вводить или выходить из длинного или короткого, или вы можете просто вычислить следующий временной интервал, по которому вы предпримете действие? Кажется, вы не получаете доступ к массиву 'Ticks', чтобы решить, следует ли вводить или выходить из действия. – user2357112

+0

@ пользователь2357112 спасибо. Я изначально написал этот цикл с двумя переменными режима, но я понял, что могу сохранить несколько миллисекунд, не проверяя режим с каждой итерацией. Хотя это может быть неясно, методы ввода/выхода используют индекс, переданный для выполнения операций над массивом. Например, сигналы ввода/выхода могут вызывать, когда среднее из последних 5 цен закрытия> x, поэтому необходимо было бы установить триггер на каждом 't'. Я полагаю, что я мог рассчитать каждый вход/выход сигнала в каждом ряду, а затем «имитировать» после. – user3116841

ответ

1
  1. Перепишите код, чтобы у вас был четкий контур с флагом простого режима и if-else-переключателями для режима.
  2. Используйте numba для jit-компиляции всей функции, которая должна дать ускорение 1-3 порядка.
Смежные вопросы