pyalgotrade源码分析4--PyAlgoTrade统计指标

统计指标的计算:

在前面分析流程的过程中提到过barfeed中__onBars()方法。

def __onBars(self, dateTime, bars):
    # 计算统计指标
    self.__notifyAnalyzers(lambda s: s.beforeOnBars(self, bars))

    # 运行策略onBars方法,onBars方法正是我们买卖的核心,
    self.onBars(bars)

    # 3: Notify that the bars were processed.
    self.__barsProcessedEvent.emit(self, bars)

        在该方法中做的第一件事就是进行统计分析,

self.__notifyAnalyzers(lambda s: s.beforeOnBars(self, bars))

        这里的s代表的就是统计指标,在运行统计计算的时候先执行beforeOnBars操作。

        在说明统计指标具体实现方法之前我们先来看一看统计指标时怎么使用的

from pyalgotrade.stratanalyzer import returns

myreturn = returns.Returns()
myStrategy.attachAnalyzer(myreturn)

        在此可以看到需要将统计分析方法注册到策略中,下面看一下注册的方法,

def attachAnalyzerEx(self, strategyAnalyzer, name=None):
    if strategyAnalyzer not in self.__analyzers:
        if name is not None:
            if name in self.__namedAnalyzers:
                raise Exception("A different analyzer named \'%s\' was already attached" % name)
            self.__namedAnalyzers[name] = strategyAnalyzer

        strategyAnalyzer.beforeAttach(self)
        self.__analyzers.append(strategyAnalyzer)
        strategyAnalyzer.attached(self)
  •     先执行beforeAttach方法
  •     然后在策略__analyzers中注册统计指标,
  •     最后再执行attached方法
      比如在计算收益率Return中:

def beforeAttach(self, strat):
    # Get or create a shared ReturnsAnalyzerBase
    analyzer = ReturnsAnalyzerBase.getOrCreateShared(strat)
    analyzer.getEvent().subscribe(self.__onReturns)
        在此方法中向event中注册__onReturns方法,__onReturns是计算统计指标的核心方法。
        然后再看一下beforeOnBars方法。
def beforeOnBars(self, strat, bars):
    self.__portfolioReturns.update(strat.getBroker().getEquity())

    # Notify that new returns are available.
    self.__event.emit(bars.getDateTime(), self)

        通过__event.emit()方法执行监听器中方法,运行在此之前注册的__onReturns方法,完成统计指标的计算。

         在计算统计指标的时候并不是所有的统计方法都是通过这样的流程计算的,比如说在计算最大回撤中,在beforeOnBars中直接进行计算。

def beforeOnBars(self, strat, bars):
    equity = self.calculateEquity(strat)
    self.__currDrawDown.update(bars.getDateTime(), equity, equity)
    self.__longestDDDuration = max(self.__longestDDDuration, self.__currDrawDown.getDuration())
    self.__maxDD = min(self.__maxDD, self.__currDrawDown.getMaxDrawDown())

       后续如果有需要在通过此类方法进行的计算的时候,按照具体需求可以按照不同的流程进行开发。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值