2013-12-18 49 views
2

我正在研究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 

基本上,我需要在一個二維數組的函數適用於每一行,但被應用到該行的邏輯是依賴根據先前行的邏輯設定的條件。在這個循環中大部分時間都是通過在Ticks [t,3]查找值來消耗的。我曾考慮過使用 迭代器或「np.applyalongaxis」併爲條件設置數據成員,但我不確定是否需要。還值得注意的是,這個函數調用的其他方法使用它們傳遞的索引在同一個數組上執行操作。

使用Numpy運行此循環的最有效(計算速度)方法是什麼?

+1

不是速度優化,但它看起來像用'for'循環和一個'mode'變量可以更清楚地寫出這個變量,表明您是處於長時間,短時間還是非長時間。在5個地方遞增循環計數器是非常容易出錯的。 – user2357112

+1

您是否真的需要將1加1並檢查每一步是否進入或退出長或短,或者您是否可以直接計算下一個您將採取行動的時間步?你似乎沒有訪問'Ticks'數組來決定是否進入或退出一個動作。 – user2357112

+0

@ user2357112謝謝。我最初用一對夫婦模式變量編寫了這個循環,但是我意識到我可以通過每次迭代都不檢查模式來節省幾毫秒。 儘管可能不清楚,但輸入/退出方法正在使用傳遞的索引對陣列執行操作。例如,當最後5個收盤價格的平均值> x時,輸入/輸出信號可能觸發,因此有必要在每個't'檢查觸發器。我想我可以計算每一行的每個輸入/輸出信號,然後「模擬」。 – user3116841

回答

1
  1. 重寫代碼,以便通過簡單模式標誌和if-else-switches模式清除for-loop。
  2. 使用numba進行jit編譯整個函數,這應該提供1-3個數量級的加速。