You are here:  Home » 量化交易与机器学习 » backtrader » Analyzers- backtrader中文教程

Analyzers

Be它回溯测试或交易,能够分析的性能交易系统的关键是理解,如果不仅利润已经实现,但或者如果它是真的值得此外,如果已经有太多的风险实现当与参考资产(或无风险资产)相比的努力

这就是的Analyzer对象的系列有:提供分析中发生了什么,甚至一个什么样的analyzers

The接口的实际happening.

Nature是后Lines对象,功能例如为蓝本next方法,但有一个重要区别:

  • Analyzers不抱lines.

    That意味着他们并不昂贵,因为即使在内存方面在分析了数千条的价格,他们可能仍然只需持有一个结果在ecosystem

对象memory.

AnalyzerLocation是(如strategies, observersdatas)加入到该系统经过了cerebro比如:

  • addanalyzer(ancls, *args, **kwargs)

但是,当它在cerebro.run下面会发生对于每个strategy存在于system

  • ancls将被实例化*args**kwargs期间cerebro.run
  • ancls实例将被附接至装置strategy

That:

  • 如果回溯测试运行包含例如3 strategies然后3
    instances
    ancls将被创建和它们中的每会附着到不同的strategy.

Bottomline:an analyzer analyzes the performance of a single strategynot the performance of an entires system

其他Location

SomeAnalyzer实际上对象可以使用其他分析仪来完成其工作。例如:SharpeRatio使用的输出TimeReturn的calculations.

Thesesub-analyzersslave-analyzers也将被插入到相同的战略作为一个创建它们。但他们到完全看不见user.

Attributes

To开展工作的意图,Analyzer对象提供一些它会被自动地传递,并设置在实例默认属性易用性:

  • self.strategy:参考策略子类中的分析器对象被操作。由strategy可以访问任何也由analyzer
  • self.datas[x]:存在于数据阵列馈送战略。虽然这可能在strategy参考accesed时,快捷方式使工作更comfortable.
  • self.data:快捷方式self.datas[0]额外comfort.
  • self.dataX self.datas[x]

尽管他们可能是矫枉过正的一些其他别名可用:

* `self.dataX_Y` where X is a reference to `self.datas[X]` and `Y`
  refers to the line, finally pointing to: `self.datas[X].lines[Y]`

<>49<>

* `self.dataX_Name` which resolves to `self.datas[X].Name` returning
  the line by name rather than by index

对于第一个数据,最后两个快捷键都可以不初始X数字参考。例如:

* `self.data_2` refers to `self.datas[0].lines[2]`

的And

* `self.data_close` refers to `self.datas[0].close`

Returning analysis

TheAnalyzer基类创建一个self.rets(类型collections.OrderedDict)成员属性返回分析。这是在方法做create_analysis这可以通过的子类覆盖创建自定义analyzers.

MODUS operandi

虽然Analyzer对象不是Lines对象,因此不遍历线,他们已经设计遵循相同的操作pattern.

  1. Instantiated之前该系统被投入运动(因此主叫__init__
  2. 有信号用start
  3. prenext/nextstart/next的开始操作的将被调用继的计算出的最小周期的strategy的指示器工作的in.

    The默认行为prenextnextstart是下一个调用,因为分析仪可以从一开始就引发系统中分析被alive.

    It可以是习惯上称之为len(self)Lines的对象以检查实际金额的吧。这也适用于Analyzers通过返回对于价值self.strategy

  4. 订单和交易将被告知,就像他们是通过战略notify_ordernotify_trade
  5. 喜欢与战略进行现金和价值也将被通知在notify_cashvaluemethod
  6. Cash,价值和fundvalue和基金份额也将被通知喜欢它是与战略进行过notify_fundmethod
  7. stop将被调用信号operations

Once结束的常规操作周期已经完成,analyzers特色用于提取/输出information

  • get_analysis附加方法:在理想情况下(不执行)returnes一个dict – 样含有分析对象results.
  • print使用标准backtrader.WriterFile(除非被覆盖的),以从写的分析结果get_analysis.
  • pprintpretty print)使用Pythonpprint模块打印get_analysisresutls.

And最后:

  • get_analysis创建一个成员属性self.ret(类型collections.OrderedDict),其分析仪写

    可以覆盖此方法来改变这种behaviorAnalyzerAnalyzer Patterns

的分析results.

Subclasses`的Analyzerbacktrader平台对象开发已经揭示用于分析的生成2种不同的使用模式:

  1. 期间通过收集信息执行notify_xxxnext的方法,以及生成所述分析的当前信息在next

    `的TradeAnalyzer中,例如,只使用了notify_trade方法以产生statistics.

  2. Gather(或不)的信息如上述,但产生在一个分析在stopmethod

    TheSQNSystem Quality Number)中单次通过时要收集交易信息notify_trade但期间产生的统计的stopmethod

A快速example

As容易,因为它可以是:

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import datetime

import backtrader as bt
import backtrader.analyzers as btanalyzers
import backtrader.feeds as btfeeds
import backtrader.strategies as btstrats

cerebro = bt.Cerebro()

# data
dataname = "../datas/sample/2005-2006-day-001.txt"
data = btfeeds.BacktraderCSVData(dataname=dataname)

cerebro.adddata(data)

# strategy
cerebro.addstrategy(btstrats.SMA_CrossOver)

# Analyzer
cerebro.addanalyzer(btanalyzers.SharpeRatio, _name="mysharpe")

thestrats = cerebro.run()
thestrat = thestrats[0]

print("Sharpe Ratio:", thestrat.analyzers.mysharpe.get_analysis())

执行它(具有存储在其analyzer-test.py

$ ./analyzer-test.py
Sharpe Ratio: {"sharperatio": 11.647332609673256}

没有绘图,因为SharpeRatio是在端部的单个值一个Analyzer

Let的重复的calculation.

Forensic分析说Analyzers不是行对象,但无缝他们融入backtrader生态系统,内部API约定的几行对象后跟(实际上是一个其中mixture

已经演变NoteSharpeRatioThe代码采取例如进入每年出版账户这里的版本应该只是一个reference.

Please检查分析仪Reference

There是另外一个SharpeRatio_A其提供的值直接在年度形式无论对于所寻求的timeframe

CodeSharpeRatio,以用作基础(简化版本)

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import operator

from backtrader.utils.py3 import map
from backtrader import Analyzer, TimeFrame
from backtrader.mathsupport import average, standarddev
from backtrader.analyzers import AnnualReturn


class SharpeRatio(Analyzer):
    params = (("timeframe", TimeFrame.Years), ("riskfreerate", 0.01),)

    def __init__(self):
        super(SharpeRatio, self).__init__()
        self.anret = AnnualReturn()

    def start(self):
        # Not needed ... but could be used
        pass

    def next(self):
        # Not needed ... but could be used
        pass

    def stop(self):
        retfree = [self.p.riskfreerate] * len(self.anret.rets)
        retavg = average(list(map(operator.sub, self.anret.rets, retfree)))
        retdev = standarddev(self.anret.rets)

        self.ratio = retavg / retdev

    def get_analysis(self):
        return dict(sharperatio=self.ratio)

的代码可以细分为:

  • paramsdeclaration

    Although声明的那些不使用(意味着作为示例),Analyzers像大多数其他对象backtrader支持parameters

  • __init__ method

    Just像Strategies`声明Indicators__init__,该同样做分析与支持objects.

    In这种情况下:在SharpeRatio是使用年度Returns计算。该计算将是自动的并且将提供给SharpeRatio用于`的自己的calculations.

    Note

    The实际执行SharpeRatio使用了更通用后来发展TimeReturnanalyzer

  • next method

    SharpeRatio并不需要它,但这种方法将每个之后调用父策略调用next

  • start返回检验开始前右method

    Called。可用于额外初始化任务。Sharperatio不需要it

  • stop method

    叫回测结束之后。像SharpeRatio做,它可以用来完成/使calculation

  • get_analysis方法(返回dictionary)

    对于外部呼叫者访问产生analysis

    Returns:)与analysis.

Reference

class backtrader.Analyzer(辞典

分析的基类。所有分析仪是该one

An分析实例的子类的战略框架,并提供了分析该strategy.

自动将集成员的属性:

  • self.strategy(给访问strategy和任何从中访问)
  • self.datas[x]给予数据的数组访问饲料中本该系统,这也可以通过战略reference
  • self.data,使访问self.datas[0]
    • self.dataX -> self.datas[X]
    • self.dataX_Y -> self.datas[X].lines[Y]
    • self.dataX_name -> self.datas[X].name
    • self.data_name -> self.datas[0].name
    • self.data_Y -> self.datas[0].lines[Y]

这不是一个Lines反对意见,但方法和操作遵循相同的design

  • __init__实例化和初始setup
  • start/stop以用信号通知开始和operations
  • prenext的端/nextstart/next家庭的跟随方法/在strategy
  • notify_trade同样的方法进行的调用notify_order/notify_cashvalue/其接收相同的通知作为等效notify_fund操作strategy

The模式的方法是打开的并且没有图案是优选的。这样的可以与next的呼叫而产生的分析,在操作结束中stop甚至与像notify_trade

重要的是覆盖get_analysis返回一个方法了dict-like含有分析的结果对象(实际格式是实现有关)

开始()

调用,指示操作的开始,给分析仪时间设置了需要things

stop()

调用,以指示操作结束,给分析器时间关闭需要things

prenext()

调用该战略的各个prenext调用,直到最低该战略的时期已经reached

The默认行为的分析是调用next

nextstart()

正好调用一次战略的nextstart调用,当最小周期一直第一reached

next()

调用的策略中的每个下一次调用,一旦minum该战略的preiod一直reached

notify_cashvalue(现金价值)

下一个各cycle

notify_fund(现金,价值,fundvalue,股之前收到的现金/价值通知)

接收当前的现金,价值fundvalue和基金shares

notify_order(订单)

(各下一cycle

notify_trade之前接收订单通知交易)

接收贸易通知的每个下一个cycle

get_analysis(前)

返回dict-like对象与analysis

的结果在字典中的按键和分析结果的格式实施dependent.

It甚至没有强制执行的结果是一个dict-like object,只是在convention

The默认实现返回默认OrderedDictrets由默认创建的create_analysismethod

create_analysis()

意味着子类将覆盖。提供了一个机会来创建持有的analysis.

The默认行为结构是创建一个OrderedDict命名rets

打印(* ARGS,** kwargs)

打印出结果通过标准的get_analysis返回Writerfile对象,缺省写入事物标准output

pprint(* ARGS,** kwargs)

打印由`返回的结果get_analysis用漂亮打印Python模块(pprint

len()

通过实际传回调用len上分析仪支持策略的当前长度分析仪操作on