【问题标题】:Trading with Numpy与 Numpy 交易
【发布时间】:2013-12-18 21:23:45
【问题描述】:

出于学习目的,我正在使用 Python 编写算法交易程序。使用 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 运行此循环的最有效(计算速度)方式是什么?

【问题讨论】:

  • 不是速度优化,但看起来可以使用for 循环和mode 变量更清楚地表明您是处于多头还是空头的中间,或者两者都不是。在 5 个位置增加循环计数器非常容易出错。
  • 您真的需要将t 1 递增1 并在每一步检查是进入还是退出多头还是空头,或者您是否可以直接计算下一个时间步长一种行为?您似乎没有访问 Ticks 数组来决定是进入还是退出操作。
  • @user2357112 谢谢。我最初用几个模式变量编写了这个循环,但我意识到我可以通过不检查每次迭代的模式来节省几毫秒。虽然可能不清楚,但进入/退出方法是使用传递的索引对数组执行操作。例如,当最后 5 个收盘价的平均值 > x 时,可能会触发进/出信号,因此有必要在每个 t 处检查触发。我想我可以计算每一行的每个进入/退出信号,然后“模拟”之后。

标签: python arrays numpy simulation algorithmic-trading


【解决方案1】:
  1. 重写代码,这样你就有了一个清晰的 for 循环,带有一个简单的模式标志和模式的 if-else-switches。
  2. 使用 numba 对整个函数进行 jit 编译,这样可以将速度提高 1-3 个数量级。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-17
    • 2015-10-13
    • 2011-06-10
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    相关资源
    最近更新 更多