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技术教程

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

  1. 用python从0开始创建一个区块链,从代码深入理解区块链

    作者认为最快的学习区块链的方式是自己创建一个,本文就跟随作者用Python来创建一个区块链. 对数字货币的崛起感到新奇的我们,并且想知道其背后的技术--区块链是怎样实现的. 但是完全搞懂区块链并非易事 ...

  2. Backtrader:实现一个简单的通达信的交易策略

    大体了解了Backtrader的运行原理后,尝试把一个通达信的交易策略改编为backtrader策略,并测试一下交易时间是否与通达信中出现的交易时间一致.如果一致,说明改写的策略有效. 通达信中有这样 ...

  3. Backtrader系列教程④:交易篇(上)

    预定系列 Backtrader 来了 Backtrader 数据篇 Backtrader 指标篇 Backtrader 交易篇(上) Backtrader 交易篇(下) Backtrader 策略篇 ...

  4. 锁是网络数据库中的一个非常重要的概念

    锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性.各种大型数据库所采用的锁的基本理论是一致的,但在具体 实现上各有差别.目前,大多数数据库管理系统都或多或少具有自我 ...

  5. 一个交易号的生成和还原过程

    需求是一个同学给的,我帮他做完,记录下. 需求如下: 业务变更内容及需求确认: 1.              原交易序号-->算法-->打乱交易序号 2.              打乱 ...

  6. 在git 2.13之前,只保存多个已更改的文件中的一个文件

    如何在我的分支上只隐藏多个已更改文件中的一个? #1楼 类似的情况. 提交并意识到它不行. git commit -a -m "message" git log -p 根据答案,这 ...

  7. Mina中的支付交易snark

    1. 引言 前序博客有: Mina的支付流程 Mina中目前的交易类型主要有: Coinbase交易:给产块者激励和手续费的交易,为内部交易. Fee_transfer交易:给snark worker ...

  8. 树莓派配置https://www.raspberrypi.org/documentation/configuration/中的一个单词翻译:

    树莓派配置https://www.raspberrypi.org/documentation/configuration/中的一个单词翻译: LED warning flash codes Descr ...

  9. 国际战略中aaa模式_AAA游戏中的微交易将继续存在(但仍然很糟糕)

    国际战略中aaa模式 This weekend, while most of the technology and gaming press wasn't working on anything pa ...

最新文章

  1. [转](不理想)Ubuntu下更改主显示器
  2. 使用vue2.0 vue-router vuex 模拟ios7操作
  3. shell常用的基础命令
  4. linux 内核驱动编程 简单例子 与_IO, _IOR, _IOW, _IOWR 宏解析
  5. 支付宝不止怀有“社交梦”,社区金融才是它的野心所在
  6. python分类预测降低准确率_python实现吴恩达机器学习练习3(多元分类器和神经网络)...
  7. React不提交表单并且获取表单中的数据
  8. IDEA Unable to import maven project: See logs for details
  9. 从设计的角度,浅谈艾尔登法环给我带来的游玩感受
  10. 5G/NR SSB学习总结
  11. “段子手”黄允松的严肃一面:数字化转型是颠覆式创新
  12. 图解《狂飙》人物关系
  13. 优雅!用了这两款插件,我成了整个公司代码写得最规范的码农
  14. vivado 2019.2下载地址分享,网盘分享
  15. 网 络 世 界 的 黑 暗 面
  16. 非线性方程线性化求参数的简单例子
  17. 基于微信小程序视频点播系统 视频点播小程序毕业设计 毕业论文 开题报告和效果图参考
  18. 学生端android版二1班,一起作业学生端安卓版
  19. 计算机网络连接设备不见了,计算机本地连接找不到了(不见了)如何修复
  20. python设计程序求10个数去掉最高分和最低分后的平均值_7-6、以下伪代码是体育评分,10个评委进行评分,去掉一个最高分,去掉一个最低分,再求平均值。...

热门文章

  1. Codeforces 832D题解报告
  2. C++引用的定义和使用
  3. 6.0.高等数学3-欧拉方程
  4. 莫比乌斯反演杂题题解
  5. ATmi-I接口软件
  6. 理解vue中的slot-scope=“scope“
  7. 【学习笔记】主成分分析法介绍
  8. 人工智能微信小程序之识别图片上的文字并提取出来(附源码)
  9. html中content属性,CSS3的content属性详解
  10. Linux虚拟主机配置(基于域名)