backtrader中何为一个交易trade?你可能并没理解它

1 概述

在backtrader回测程序中,当交易trade状态发生改变时,会触发策略的notify_trade方法,这里头可以输出交易trade信息,例子如下:

记录交易收益情况(可省略,默认不输出结果)

def notify_trade(self, trade):       
   
    if trade.isclosed:
        print('毛收益 %0.2f, 扣佣后收益 % 0.2f, 佣金 %.2f' %
              (trade.pnl, trade.pnlcomm, trade.commission))

不仔细的话,你可能想当然以为你已经理解了trade的概念,但仔细想想,你真的理解了吗?trade状态核实发生改变?他有几个状态?它到底是什么意思?很快你就会模糊了!

在我们一般买卖股票时,只涉及向券商发订单,并无交易(trade)的概念。并不是下一个买单,就是一个交易,下一个卖单,又代表另一个交易。交易的概念实际是用户方的概念。

2 那么backtrader中是如何定义交易的呢?

对正常采用自有资金购买股票,不能做空的情况下,当一个订单使得仓位从0变为正值,则打开了一个交易,此后,当某订单使得仓位从正值变为0,则该交易关闭,这两种情况都会触发notify_trade方法。

一个交易可能由多个订单组成。不能做空的情况下,举个例子观察交易状态的变化,在next方法中:

第一次下买单买100股,此订单执行时,仓位从0变为正值(100),系统打开一个交易,会触发notify_trade方法,在notify_trade中检查交易状态status,为1 open。

然后下第二张买单100股,订单执行时不会触发notify_trade,仓位变为200。

然后下卖单卖100股,仍然不会触发notify_trade,仓位变为100。

再下一个卖单卖100股,执行时,仓位从100变为0,关闭交易,触发notify_trade,交易状态为2 close。

不能做空的情况下,self.close()命令会一次性市价卖出全部仓位,关闭交易。

在可以做空的情况下,当仓位从0变为非0(长仓为正值,短仓为负值),则打开了一个交易,此后仓位从非0值变为0值,则交易关闭。在卖空操作中,self.close()默认会市价买回所有卖空仓位,关闭交易。

如果某个订单使得仓位从正值变到负值,或负值变到正值,则意味着两个动作:一个交易被关闭了(仓位从非0值变为0),一个新交易被打开了(仓位从0变为非0)。

trade对象具有如下属性:

附书源码tradestatus.py展示了交易状态的变化,读者可自行运行该源码,观察交易状态的变化。

3 更加高级的用法

我们可以在notify_trade方法中,利用变量self.trade记录交易对象,然后在其他地方使用它。

  def __init__(self):
    self.trade = None # 定义跟踪交易的变量

# 记录交易收益情况(可省略,默认不输出结果)
def notify_trade(self, trade):
    
    self.trade = trade # 记录交易
    if trade.isclosed:
        print('毛收益 %0.2f, 扣佣后收益 % 0.2f, 佣金 %.2f' %
              (trade.pnl, trade.pnlcomm, trade.commission))

有时候,我们希望对交易加以分类,比如,0表示趋势交易, 1表示均值回归交易。这样在回测结束时,可以分析不同交易的绩效。怎样做到这一点呢?

你在创建订单时,可以指定该订单所属交易类型,比如self.buy(tradeid=1),这样打开了一个交易,并设置tradeid为1表示均值回归交易,以后就可以对此进行分析。

更多内容请参考我们编写的深入浅出的backtrader技术教程

猜你喜欢

转载自blog.csdn.net/qtbgo/article/details/109799469