1. 程式人生 > 其它 >pyalgotrade原始碼分析4--PyAlgoTrade統計指標

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())

後續如果有需要在通過此類方法進行的計算的時候,按照具體需求可以按照不同的流程進行開發。