佣金:信贷#

在某些情况下,实际经纪人账户中的现金金额可能会减少,因为资产操作包括利率。例如:

  • 卖空股票

  • ETF,包括做多和做空

该费用直接从经纪人账户的现金余额中扣除。但它仍然可以被视为佣金计划的一部分。因此,它已经在 backtrader 中建模。

已通过 CommInfoBase 类(以及主接口对象 CommissionInfo )进行了扩展,增加了以下内容:

  • 两个(2)个新参数,允许设置利率并确定是否仅应用于做空方向或做多和做空方向

参数#

  • interest (默认值: 0.0

    如果这个值非零,则为持有卖空头寸收取的年利率。这主要用于卖空股票。默认应用的公式是: days * price * size * (interest / 365)

必须指定为绝对值:0.05 -> 5%

注意

通过覆盖方法 get_credit_interest 可以更改行为

  • interest_long (默认值: False )

    有些产品(如ETF)在多头和空头仓位上都要收取利息。如果这个值为 True ,并且 interest 不为零,那么利息将在两个方向上都会被收取

公式#

默认实现将使用以下公式:

days * abs(size) * price * (interest / 365)

其中:

  • days : 开仓或上次计算信用利息以来的天数重写公式

*** ** ** ** ** ** **

为了改变公式,需要对 CommissionInfo 进行子类化。需要重写的方法是:

```python def _get_credit_interest(self, size, price, days, dt0, dt1):

‘’’ 此方法返回经纪人收取的信用利息成本。

size > 0 的情况下,只有在类参数 interest_longTrue 时才会调用此方法。

计算信用利息率的公式为:

公式: days * price * abs(size) * (interest / 365)

参数:
  • data :计算利息的数据源

  • size :当前仓位大小。对于多头仓位, size > 0 ;对于空头仓位, size < 0 (此参数不会为 0

  • price :当前仓位价格

  • days :自上次计算信用时经过的天数(此值等于(dt0 - dt1)。days)

``- `dt0 :(datetime.datetime)当前日期时间

  • dt1 :(datetime.datetime)上次计算的日期时间

dt0 和`dt1`未在默认实现中使用,并提供为覆盖的方法的额外输入。

也许 broker 在计算利率时不考虑周末或银行假期。在这种情况下,这个子类可以解决问题。

import backtrader as bt

class MyCommissionInfo(bt.CommInfo):

   def _get_credit_interest(self, size, price, days, dt0, dt1):
       return 1.0 * abs(size) * price * (self.p.interest / 365.0)

在这种情况下,在公式中:

  • days 已被替换为 1.0

如果周末/银行假期不计入,下一次计算将始终在上一次计算后的1个交易日之后发生。