ricequant / rqalpha

A extendable, replaceable Python algorithmic backtest && trading framework supporting multiple securities
http://rqalpha.io
Other
5.39k stars 1.62k forks source link

关于StockCommission中的get_commission的疑问 #290

Closed tiandian closed 6 years ago

tiandian commented 6 years ago

rqalpha在StockCommission类的get_commission方法中计算股票手续费, 其代码如下:

        commission = self.commission_map[order_id]
        cost_money = trade.last_price * trade.last_quantity * self.rate * self.multiplier
        if cost_money > commission:
            if commission == self.min_commission:
                self.commission_map[order_id] = 0
                return cost_money
            else:
                self.commission_map[order_id] = 0
                return cost_money - commission
        else:
            if commission == self.min_commission:
                self.commission_map[order_id] -= cost_money
                return commission
            else:
                self.commission_map[order_id] -= cost_money
                return 0

上述代码中使用了一个self.commission_map, 是考虑到一个Order可能会通过多次交易成交完成, 但导致如下问题:

  1. 代码啰嗦, 难以理解.
  2. 与现实不太符合。 现实中的手续费是与订单关联的, 最小手续费是与订单相关的, 与该订单是通过多少次交易完成无关.
  3. 由于多了一个self.commission_map, 在运行过程中self.commission_map是随订单数不断增大的, 未释放, 浪费内存.

建议将计算手续费功能与Order关联, 而不是与Trade关联, 与现实保持一致, 不但去掉了一个commission_map, 而且代码会简单的多,如下:

        cost_money = order._avg_price * order._filled_quantity * self.rate
        if cost_money > self.min_commission:
            return cost_money
        else:
            return self.min_commission
handsomu commented 6 years ago

的确会精简。之前的实现是基于 trade 发生,然后考虑到 order 有最小手续费的门槛,所以才在原来基础上进行的修改。我们会对此进行优化