我正在values
中检索接近400k的值,这本身很慢(代码没有显示),然后我尝试通过卡尔曼滤波器对这些值进行预测,第一个循环需要一分钟才能运行,第二个循环需要2分半钟,我认为第一个循环可以进行矢量化,但我不确定如何,特别是window_sma
。第二个循环我不知道如何处理我增加x数组(x = np.append(x, new_x_col, axis=1)
)。
这是第一个尝试使用polyfit和polyval根据SMA的值进行预测:
window_sma = 200
sma_index = 500
offset = 50
SMA = talib.SMA(values, timeperiod = window_sma)
vector_X = [1, 2, 3, 15]
sma_predicted = []
start_time = time.time()
for i in range (sma_index, len(SMA)):
j = int(i - offset)
k = int(i - offset / 2)
window_sma = [SMA[j], SMA[k], SMA[i]]
polyfit = np.polyfit([1, 2, 3], window_sma, 2)
y_hat = np.polyval(polyfit, vector_X)
sma_predicted.append(y_hat[-1])
第二个尝试过滤第一个for循环的输出,以便更好地预测我从SMA获得的值:
# Kalman Filter
km = KalmanFilter(dim_x = 2, dim_z = 1)
# state transition matrix
km.F = np.array([[1.,1.],
[0.,1.]])
# Measurement function
km.H = np.array([[1.,0.]])
# Change in time
dt = 0.0001
a = 1.5
# Covariance Matrix
km.Q = np.power(a, 2) * \
np.array([[np.power(dt,4)/4, np.power(dt,3)/2],
[np.power(dt,3)/2, np.power(dt,2)]])
# Variance
km.R = 1000
# Identity Matrix
I = np.array([[1, 0], [0, 1]])
# Measurement Matrix
km.Z = np.array(sma_predicted)
# Initial state
x = np.zeros((2,1))
x = np.array([[sma_predicted[0]], [0]])
# Initial distribution state's covariance matrix
km.P = np.array([[1000, 0], [0, 1000]])
for i in range (0, len(sma_predicted) - 1):
# Prediction
new_x_col = np.dot(km.F, x[:, i]).reshape(2, 1)
x = np.append(x, new_x_col, axis=1)
km.P = km.F * km.P * km.F.T + km.Q
# Correction
K = np.dot(km.P, km.H.T) / (np.dot(np.dot(km.H, km.P), km.H.T) + km.R)
x[:, -1] = x[:, -1] + np.dot(K, (km.Z[i + 1] - np.dot(km.H, x[:, -1])))
#x[:, -1] = (x[:, -1] + K * (km.Z[i + 1] - km.H * x[:, -1])).reshape(2, i + 2)
km.P = (I - K * km.H) * km.P
谢谢!
答案 0 :(得分:2)
第二个值得先攻击,所以我会这样做。
你有这个:
x = np.array([[sma_predicted[0]], [0]])
for i in range (0, len(sma_predicted) - 1):
new_x_col = np.dot(km.F, x[:, i]).reshape(2, 1)
x = np.append(x, new_x_col, axis=1)
# ...
在NumPy中反复追加到同一个数组总是不好的做法,所以从这样开始:
x = np.zeros((2, len(sma_predicted)))
x[0, 0] = sma_predicted[0]
for i in range(len(sma_predicted) - 1):
x[:, i+1] = np.dot(km.F, x[:, i])
# ...
请注意,由于NumPy广播,不需要reshape(2, 1)
。
我意识到这并没有回答你所有隐含的问题,但也许它会让你开始。
如果dot
是ufunc
,那会很好,所以我们可以做np.dot.outer(km.F, x.T)
之类的事情,但事实并非如此(见this from 2009),所以我们可以'吨。您可以使用Numba实现更多加速(如我所示删除了append()
,您的代码是Numba的一个很好的候选者。)