Analyzer アナライザーを理解するためのクオンツ フレームワーク バックトレーダーに関する記事

ノーベル賞受賞者ウィリアム・シャープ

導入

ストラテジーのパフォーマンス評価はクオンツ取引において非常に重要な部分であり、投資ではストラテジーの収益率だけでなく、ストラテジーのリスクも理解する必要があります。Backtrader は、戦略バックテストの効果を分析するためのさまざまなパフォーマンス指標を出力できるさまざまなアナライザーを提供します。

説明書

cerebro.addanalyzer(bt.analyzers.AnnualReturn, _name='AnnualReturn')
cerebro.addanalyzer(bt.analyzers.SharpeRatio, riskfreerate=0.003, annualize=True, _name='SharpeRatio')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='DrawDown')

strats = cerebro.run()

# 第一个策略
strat = strats[0]

print("--------------- AnnualReturn -----------------")
print(strat.analyzers.AnnualReturn.get_analysis())
print("--------------- SharpeRatio -----------------")
print(strat.analyzers.SharpeRatio.get_analysis())
print("--------------- DrawDown -----------------")
print(strat.analyzers.DrawDown.get_analysis())

AnnualReturn は年間リターン アナライザーを表し  SharpeRatio はシャープ レシオ アナライザーを表し、DrawDown はバックテスト アナライザーを表します。各アナライザーの結果は通常、以下に示すように OrderedDict 辞書の形式で返され、strat.analyzers.SharpeRatio.get_analysis()['sharperatio'] などのキーを介して必要な値を取得できます。

--------------- AnnualReturn -----------------
OrderedDict([(2010, 0.0055023006637382466), (2011, 0.0015355496623354892), (2012, 0.004218277850025043), (2013, 0.09220659214070048), (2014, 0.05213380413050861), (2015, 0.012115724348371826), (2016, -0.017901621371985033), (2017, 0.06763449420829182), (2018, 0.01391412496311406), (2019, 0.05472002239157425), (2020, 1.8864865026259587), (2021, 0.36892175167157526), (2022, -0.2711252801992251)])
--------------- SharpeRatio -----------------
OrderedDict([('sharperatio', 0.3360518820606975)])
--------------- DrawDown -----------------
AutoOrderedDict([('len', 145), ('drawdown', 35.66222565509548), ('moneydown', 21054.40185546875), ('max', AutoOrderedDict([('len', 648), ('drawdown', 40.770090001923634), ('moneydown', 24070.00244140625)]))])

Analyzerが出力する結果は数値のみであり、描画がないことがわかります。たとえばSharpeRatio 、シャープ比は 0.3360518820606975 の値と計算されます。実際、Analyzers lines オブジェクトは含まれていません。これは、アナライザー オブジェクトがメモリに非常に適しており、多くのメモリを占有しないことも意味します。

  • 詳細説明: アナライザーは、システム全体のパフォーマンスではなく、戦略のパフォーマンスを分析します。addanalyzer 関数によって追加されたアナライザー クラスの場合、cerebro.run 実行時に、各アナライザー インスタンスが各ストラテジーにリンクされます。バックテストに 3 つのストラテジーが含まれる場合、同じアナライザーの 3 つのインスタンスが作成され、各インスタンスは異なるストラテジーにリンクされます。

  • 一部のアナライザー オブジェクト は、アナライザーの出力をさらなる計算に 使用するAnalyzer など、タスクを完了するために他のアナライザーを使用しますが、これらの依存関係はユーザーには表示されません。SharpeRatioTimeReturn

バックトレーダーに付属するアナライザー

  • AnnualReturn:年間収益率

  • カルマー: カルマーレシオ

  • ドローダウン:リトレースメント

  • TimeDrawDown: 指定された時間粒度でのドローバック

  • GrossLeverage: 総レバレッジ

  • PositionsValue: 位置の値

  • PyFolio:  pyfolio と互換性のあるデータを生成します

  • LogReturnsRolling: ローリング ログの戻り値

  • PeriodStats: 特定の期間の基本的な統計情報

  • リターン: 対数法を使用して、合計、平均、複合、年換算のリターンを計算します。

  • SharpeRatio: シャープレシオ

  • SharpeRatio_A: 年換算シャープレシオ

  • SQN:システム品質番号

  • TimeReturn:さまざまな期間の収益率

  • TradeAnalyzer:勝ち、負けなどの取引統計。

  • 取引: 各取引の主題、価格、数量、その他の情報

  • VWR: 変動性加重リターン、ボラティリティ加重リターン

一般的に使用される Analyzer アナライザーには、AnnualReturn、DrawDown、PyFolio、SharpeRatio、TimeReturn などがあります。

新しい Analyzer アナライザーを作成する

backtrader に付属のアナライザーがニーズを満たせない場合は、独自のアナライザーを構築できます。例としてSharpeRatio 、リファレンスコードは次のとおりです。シャープレシオは最もよく使われる業績評価指標の一つで、単位変動による超過収益率を反映しており、大きいほど優れています。シャープレシオは、リスクフリーリターンに対する戦略の超過リターンをリターンの標準偏差で割ったものです。

import backtrader as bt

from backtrader.utils.py3 import map
from backtrader.mathsupport import average, standarddev

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

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

    # analyzer与策略一样,都是从第0根bar开始运行
    def start(self):
        pass

    def prenext(self):
        pass
    
    def nextstart(self):
        pass

    def next(self):
        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

    # Analyzer类特有方法,返回包含分析结果的类dict对象
    def get_analysis(self):
        return dict(sharperatio=self.ratio)

    # 支持与策略一样的信息打印函数
    def notify_order(self, order):
        pass

    def notify_trade(self, trade):
        pass
    
    def notify_cashvalue(self, cash, value):
        pass
    
    def notify_fund(self, cash, value, fundvalue, shares):
        pass

上記のコードからわかるように、Analyzer オブジェクトには Lines オブジェクトがなく、行を反復処理する必要はありませんが、戦略と同じ動作モードに従います。もちろん、分析結果をget_analysis 返すためのこの独自のメソッドもあります。

バックトレーダーでの PyFolio の使用

cerebro.addanalyzer(bt.analyzers.PyFolio)
strats = cerebro.run()
# retrieve the 1st strategy
strat0 = strats[0]
pyfolio = strats.analyzers.getbyname('pyfolio')
returns, positions, transactions, gross_lev = pyfoliozer.get_pf_items()

import pyfolio as pf
pf.create_full_tear_sheet(returns)

pyfolio Jupyter Notebookの外部で実行することもできますが、Jupyter 内部で実行する場合に最もよくサポートされます。

ベースラインベンチマークと比較する

import backtrader as bt

cerebro = bt.Cerebro()

spypd = bt.feeds.PandasData(dataname=spydata, name="spy")
cerebro.adddata(spypd)

cerebro.addanalyzer(bt.analyzers.TimeReturn, timeframe=bt.TimeFrame.Years, _name='TimeReturn')
cerebro.addanalyzer(bt.analyzers.TimeReturn, timeframe=bt.TimeFrame.Years, data=spypd, _name='BenchTimeReturn')

strats = cerebro.run()

time_return = strat.analyzers.getbyname('TimeReturn').get_analysis()
bench_time_return = strat.analyzers.getbyname('BenchTimeReturn').get_analysis()

print("--------------- TimeReturn -----------------")
print(time_return)
print("--------------- BenchTimeReturn -----------------")
print(bench_time_return)

出力ログ:

--------------- TimeReturn -----------------
OrderedDict([(datetime.date(2009, 12, 31), 0.0), (datetime.date(2010, 12, 31), 0.0055023006637382466), (datetime.date(2011, 12, 31), 0.0015355496623354892), (datetime.date(2012, 12, 31), 0.004218277850025043), (datetime.date(2013, 12, 31), 0.09220659214070048), (datetime.date(2014, 12, 31), 0.05213380413050861), (datetime.date(2015, 12, 31), 0.012115724348371826), (datetime.date(2016, 12, 31), -0.017901621371985033), (datetime.date(2017, 12, 31), 0.06763449420829182), (datetime.date(2018, 12, 31), 0.01391412496311406), (datetime.date(2019, 12, 31), 0.05472002239157425), (datetime.date(2020, 12, 31), 1.8864865026259587), (datetime.date(2021, 12, 31), 0.36892175167157526), (datetime.date(2022, 12, 31), -0.2711252801992251)])
--------------- SpyTimeReturn -----------------
OrderedDict([(datetime.date(2009, 12, 31), -0.011793865755532318), (datetime.date(2010, 12, 31), 0.12840988195524994), (datetime.date(2011, 12, 31), -0.001988071570576566), (datetime.date(2012, 12, 31), 0.134741065036728), (datetime.date(2013, 12, 31), 0.2968892471880906), (datetime.date(2014, 12, 31), 0.11289182180470925), (datetime.date(2015, 12, 31), -0.008124930541476227), (datetime.date(2016, 12, 31), 0.09643402233275422), (datetime.date(2017, 12, 31), 0.19384416771302204), (datetime.date(2018, 12, 31), -0.06347893319524989), (datetime.date(2019, 12, 31), 0.28785206349908), (datetime.date(2020, 12, 31), 0.16162313396749006), (datetime.date(2021, 12, 31), 0.2703540848726258), (datetime.date(2022, 12, 31), -0.13563244077211734)])

すべてのアナライザーがベンチマーク比較をサポートしているわけではないことに注意してください。

結論とコミュニケーション

詳細なコンテンツについては、WeChat 公開アカウント「Zhuge Shuo Talk」をフォローしてください。同時に、投資交流グループやクオンツ投資セミナー グループへの招待も受け取ることができます。そこでは、多くの投資愛好家、クオンツ実務家、テクノロジー専門家とコミュニケーションやディスカッションを行うことができ、投資レベルを迅速に向上させることができます。

記事を書くのは簡単ではありませんが、この記事が役に立ったと思ったら、ぜひ「いいね!」をお願いします。

参考

おすすめ

転載: blog.csdn.net/richardzhutalk/article/details/125239927