BacktraderPython Hidden Powers 2

  |  

让我们进一步讨论一下Python的隐藏功能如何在 backtrader 中使用,以及如何实现它以尝试实现主要目标:易用性

这些定义是什么?

例如指针:

import backtrader as bt

class MyIndicator(bt.Indicator):

    lines = ('myline',)
    params = (('period', 20),)

    ...

任何能够阅读python的人都会说:

  • lines 是一个 tuple,实际上包含单个项目,一个字符串

  • params 也是一个 tuple,包含另一个有 tuple 2 个项目

但后来

扩展示例:

import backtrader as bt

class MyIndicator(bt.Indicator):

    lines = ('myline',)
    params = (('period', 20),)

    def __init__(self):

        self.lines.myline = (self.data.high - self.data.low) / self.p.period

对于任何人来说,这里都应该是显而易见的:

  • 类中的 定义 lines 已转换为属性,可以作为 self.lines 并依次包含定义中指定的属性 myline 来访问

  • 类中的 定义params已转换为属性,可以作为 self.p (或self.params) 访问,并依次包含定义中指定的属性period

    并且self.p.period 似乎有一个值,因为它直接用于算术运算(显然该值是定义中的值: 20

答案:元类

bt.Indicator 因此也有 MyIndicator 一个元类,这允许应用元编程概念。

在这种情况下,拦截「」的定义lines」和「参数」,使它们成为:

  • 实例的属性,即:可访问为self.linesself.params

  • 类的属性

  • 包含在其中atributes 定义的(和定义的值)

部分秘密

对于那些不熟悉元类的人来说,它或多或少是这样做的:

class MyMetaClass(type):

    def __new__(meta, name, bases, dct):
        ...

        lines = dct.pop('lines', ())
        params = dct.pop('params', ())

        # Some processing of lines and params ... takes place here

        ...

        dct['lines'] = MyLinesClass(info_from_lines)
        dct['params'] = MyParamsClass(info_from_params)

        ...

在这里,类的创建已被截获,lines 并且 params 和的定义已被替换为基于从定义中提取的信息的类。

仅凭这一点就无法到达,因此实例的创建也会被截获。使用 Pyton 3.x 语法:

class MyClass(Parent, metaclass=MyMetaClass):

    def __new__(cls, *args, **kwargs):

        obj = super(MyClass, cls).__new__(cls, *args, **kwargs)
        obj.lines = cls.lines()
        obj.params = cls.params()

        return obj

在这里,在上述实例中,上述实例被定义为MyLinesClassMyParamsClass 已放入 的实例 MyClass中。

不,没有冲突:

  • 该类可以说:「系统范围」 并包含其自己的属性linesparams 哪些是类

  • 该实例可以说:「系统本地」,并且每个实例都包含和的lines 实例(每次都不同) params

通常,例如,一个将用于self.lines 访问实例,但也可以使用 MyClass.lines 访问类。

后者使用户可以访问方法,这些方法不是用于一般用途的,但这是Python,没有什么可以被禁止的,更不用说 Open Source了。

结论

元类正在幕后工作,以提供一种机制,通过处理诸如和的定义之类的tuple东西,使almos成为元语言。linesparams

目标是让使用该平台的任何人的生活更轻松

推荐阅读

相关文章

Backtrader按日线交易

似乎在世界某个地方有一种权益(Interest)可以总结如下: 使用每日柱线引入订单,但使用开盘价 这来自工单#105订单执行逻辑与当前数据和#101动态投注计算中的对话 backtrader 尝试尽可能保持现实,并且在处理每日柱线时适用以下前提: 当每日柱被评估时,柱线已经结束 这是有道理的,

Backtrader期货补偿与现货补偿

版本1.9.32.116 增加了对社区中呈现的有趣用例 的支持 以期货开始交易,包括实物交割 让一个指针告诉你一些事情 如果需要, close 现货价格操作,有效地取消实物交割,无论是为了接收货物还是为了必须交付货物(并希望获利)来头寸。

Backtrader标杆

backtrader 包括 2 种不同类型的对象,可帮助进行跟踪: Observers Analyzers 工单 #89 是关于添加资产基准测试的。明智的是,人们实际上可能有一个策略,即使积极,也低于简单地跟踪资产所能提供的策略。

Backtrader股票筛选

在寻找其他一些东西时,我在StackOverlow家族网站之一上遇到了一个问题:Quantitative Finance aka Quant StackExchange。问题: 它被标记为Python,因此值得一看的是 backtrader 是否能够胜任这项任务。 分析仪本身 该问题似乎适合用于简单的分析器。

Backtrader混合时间帧

1.3.0.92版本带来了混合来自不同时间帧的数据(来自 data feeds 和/或指针)的可能性。 到版本:https://github.com/mementum/backtrader/发布/标签/1.3.0.92 背景:指示器是智能哑对象。 他们很聪明,因为他们可以进行复杂的计算。

Backtrader交叉回溯测试陷阱

在backtrader 社区中 ,倾向于重复的事情是,用户解释了拷贝在例如 TradingView 中获得的回溯测试结果的意愿,这些天非常流行,或者其他一些回溯测试平台。

Backtrader蟒蛇隐藏的力量3

Last,但并非最不重要的一点是,在这个系列中,关于如何在 backtrader 中使用Python的隐藏功能是一些神奇变量是如何出现的。

Backtrader 多数据范例

社区中的几个主题似乎以如何跟踪订单为导向,特别是当几个data feeds在起作用时,还包括当多个订单一起工作时,

Backtrader教程:数据馈送 - 熊猫

注意 pandas 并且必须安装其依赖项 支持Pandas Dataframes似乎受到很多人的关注,他们依赖于已经可用的解析代码来分析不同的数据源(包括CSV)和Pandas提供的其他功能。 数据馈送的重要声明。 注意 这些只是 声明。不要盲目拷贝此代码。

Backtrader教程:分析仪 - PyFolio

注意 从(至少)2017-07-25pyfolio 开始,API已更改,不再 create_full_tear_sheet 具有 gross_lev 作为命名参数的参数。