我正在python上运行回测程序。但是,即使数学/逻辑很简单,Python似乎也要花费极长的时间来计算FOR循环。
每行平均需要1秒钟;并且当我有成千上万到潜在的几万行数据时,花费的时间是不切实际的。
我使用熊猫数据框作为基础,并通过for循环生成正向计算。有没有更有效的方法,或者我该怎么做以减少计算时间?
def signal_TA1(data, periods):
columns = ['x1', 'x2', 'x3', .......]
pd_Append = pd.DataFrame((np.zeros((len(data.index),len(columns)))), columns = columns) #create and initialize as zeros needed columns
data = data.join(pd_Append)
data['Size'] = data.bidQ + data.askQ
data['prx'] = (data.bid * data.askQ + data.ask * data.bidQ)/data.Size
for i in range(1, len(data.index), 1):
data.emaX.iloc[i] = data.lambda_.iloc[i] * data.Size.iloc[i] + (1 - data.lambda_.iloc[i]) * data.emaX.iloc[i-1]
xxxxxx
xxxxx
xxxxx
return data
答案 0 :(得分:0)
(似乎,相对来说,numpy进程比熊猫更有效地循环了计算(因为每次都必须重新构建整个数组)。
基本上,我在函数内创建一个numpy数组[x,y]。然后,我通过for循环进行计算,并逐行填充numpy数组。最后,我仅将完成的numpy数组转换为pandas数据框(以便于显示和绘制)。 对于大约2500行数据和计算,时间差永远小于1秒。
def signal_M2(data, weight, pandas = True):
bid = np.array(data.bid)
ask = np.array(data.ask)
askQ = np.array(data.askQ)
bidQ = np.array(data.bidQ)
size = bidQ + askQ
VWAP = (bid * askQ + ask * bidQ)/(bidQ + askQ)
columns = [x1, x2, x3, x4, x5, .....]
datB = np.zeros((len(data.index), len(columns)))
datA = pd.DataFrame(index=[0], columns = columns)
lambda_ = 0.5
weight = 0.3
x1 = VWAP[0]
x2 = VWAP[0]
x3 = VWAP[0]
x4 = VWAP[0]
x5 = size[0]
....
....
datB[0] = (bid[0], ask[0], bidQ[0], askQ[0], size[0], ..........)
for row in range(1, len(data.index), 1):
x1 = lambda_ * size[row] + (1 - lambda_) * emaInertia
x2 = weight * VWAP[row] + (1 - weight) * emaPrx
x3 = weight * VWAP[row] + (1 -weight) * emaPrxSlow
x4 = weight * VWAP[row] + (1 -weight) * emaPrxFast
x5 = weight * VWAP[row] + (1 -weight) * emaPrxLead
if pandas == True:
datB[row] = (bid[row], ask[row], bidQ[row], ...........)
else:
print(................)
if pandas == True:
datB = pd.DataFrame(datB, columns = columns)
return datB
else :
print('no pandas dataframe was asked to be be stored')