当前位置:网站首页>Un des backtraders du cadre de quantification lit l'analyseur

Un des backtraders du cadre de quantification lit l'analyseur

2022-06-13 07:14:00 Zhuge dit que talk

Le prix Nobel William Sharp

Introduction

L'évaluation stratégique du rendement est un élément important de la quantification des transactions,L'investissement exige non seulement de connaître le rendement de la stratégie, Il faut également comprendre les risques de la stratégie.backtraderOffre une large gammeanalyzerAnalyseur,Peut produire plusieurs indicateurs de rendement,Utilisé pour analyser les effets des contre - Essais stratégiques.

Mode d'emploi

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

# Première Stratégie
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 Analyseur de rendement annualisé représentatif , SharpeRatio Représente l'analyseur de rapport Sharp , DrawDown Représente l'analyseur de rétrotest . Les résultats de chaque analyseur sont généralement les suivants: OrderedDict Retour du dictionnaire ,Comme suit,Peut passer keys Prenez ce dont vous avez besoin. values, Par exemple: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)]))])

Ça se voit., Analyzer Les résultats de sortie de l'analyseur sont tous des valeurs numériques , Pas de dessin .ParSharpeRatio Par exemple, Le rapport Sharp est calculé avec une valeur numérique 0.3360518820606975.En fait,,Analyzers Ne contient paslinesObjet,Ça veut aussi direanalyzer L'objet est très convivial pour la mémoire , Ça ne prend pas beaucoup de mémoire. .

  • Autres explications:Unanalyzer L'analyseur analyse le rendement d'une stratégie plutôt que celui de l'ensemble du système. . Adoptionaddanalyzer Classe d'analyseur ajoutée par la fonction ,Incerebro.run Exécution, Chaque instance d'analyseur est liée à chaque politique , Si le test de retour contient 3Stratégies, Alors le même analyseur aura 3 Instances créées , Chaque instance est liée à une politique différente

  • QuelquesAnalyzer  L'objet analyseur utilise d'autres analyzers Analyseur pour accomplir la tâche ,Par exemple,SharpeRatio UtiliséTimeReturn  Sortie de l'analyseur pour d'autres calculs , Mais ces utilisateurs dépendants ne sont pas visibles

backtraderAutoportanteAnalyzersAnalyseur

  • AnnualReturn:Rendement annualisé

  • Calmar: Taux de Kama

  • DrawDown:Repliez - vous

  • TimeDrawDown:  Retrait à la granularité temporelle spécifiée

  • GrossLeverage: Levier total

  • PositionsValue:  Valeur des positions

  • PyFolio:  Générer des données compatibles pyfolio

  • LogReturnsRolling: RoulerlogTaux de rendement

  • PeriodStats:  Statistiques de base pour la période de temps

  • Returns:  Calculer le total par la méthode logarithmique 、Moyenne、Composé、Rendement annualisé

  • SharpeRatio: Ratio Sharp

  • SharpeRatio_A:  Taux annuel de Sharp

  • SQN: Quantité de qualité du système System Quality Number

  • TimeReturn: Rendement à différents moments

  • TradeAnalyzer: Statistiques des transactions , Si vous gagnez 、 Nombre d'échecs, etc.

  • Transactions:  Objet de chaque transaction 、Prix、Quantité, etc.

  • VWR: variability weighted return, Rendement pondéré par la volatilité

FréquentAnalyzer L'analyseur a :AnnualReturn, DrawDown, PyFolio, SharpeRatio, TimeReturn.

NouveauAnalyzerAnalyseur

Sibacktrader L'analyseur fourni ne répond pas aux exigences ,Peut être construit par soi - mêmeAnalyzerAnalyseur.ParSharpeRatio Par exemple,Les codes de référence sont les suivants:. Sharp ratio est l'un des indicateurs de rendement les plus couramment utilisés , Il reflète le rendement excédentaire de la contribution des fluctuations unitaires ,Plus il est grand, mieux c'est.. Le ratio Sharp est égal au rendement excédentaire de la stratégie par rapport au rendement sans risque divisé par l'écart type de rendement. .

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 Comme la Stratégie , C'est à partir du 0RacinebarOn y va.
    def start(self):
        pass

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

    def next(self):
        pass

    #  En général, l'indice d'évaluation de l'ensemble de la stratégie est calculé après la fin de la stratégie. 
    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 Méthode spécifique à la classe , Renvoie la classe contenant les résultats de l'analyse dictObjet
    def get_analysis(self):
        return dict(sharperatio=self.ratio)

    #  Prend en charge les mêmes fonctions d'impression d'information que la politique 
    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

Comme le montre le code ci - dessus,Bien queAnalyzer Objet nonLines Objet et n'a pas besoin d'être linesItération précédente, Mais ils suivent le même mode de fonctionnement que la politique ,Oui, bien sûr.get_analysis  Cette méthode unique est utilisée pour renvoyer les résultats de l'analyse .

InbacktraderUtilisé dansPyFolio

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 InJupyter Notebook Peut également fonctionner à l'extérieur ,Mais dansJupyter Le meilleur support opérationnel à l'intérieur .

Par rapport au niveau de référencebenchmarkComparer

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)

Journal de sortie:

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

Notez que ce n'est pas tout. Analyzers Tous les Analyseurs sont pris en charge BenchmarkComparer.

Conclusions & Communication

Attention au numéro public Wechat:Zhuge dittalk,En savoir plus. Vous pouvez également obtenir une invitation à rejoindre le Groupe d'échange d'investissement 、 Groupe de discussion sur l'investissement quantitatif , Avec de nombreux passionnés d'investissement 、 Quantifier les praticiens 、 Les taureaux de la technologie communiquent ensemble 、Duel, Augmenter rapidement votre niveau d'investissement .

Ce n'est pas facile d'écrire,Je pense que cet article vous aidera.,Un petit coup de main.

RÉFÉRENCES

原网站

版权声明
本文为[Zhuge dit que talk]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/164/202206130712428264.html