Python 算法交易秘籍(五)(1)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Python 算法交易秘籍(五)

第九章:算法交易 - 回测

在构建算法交易策略之后,正如我们在上一章中所做的那样,第一步是对给定的策略配置在给定的时间段内进行回测。

回测是通过在过去的数据上虚拟执行交易策略并分析其风险和回报指标来评估交易策略性能的方法。这里不使用真实资金。典型的回测指标包括利润和损失P&L),最大回撤,总交易数,盈利交易数,亏损交易数,多头交易和空头交易,每笔盈利和亏损交易的平均利润等。直到这些指标满足必要要求为止,整个过程应该重复进行,逐步对策略参数和/或策略实施进行更改。

如果一个策略在过去的数据上表现良好,那么它在实时数据上也很可能表现良好。同样,如果一个策略在过去的数据上表现不佳,那么它在实时数据上也很可能表现不佳。这是回测的基本前提。您可以不断更改策略配置或实现,直到回测产生预期的结果为止。

回测还有助于在我们将策略用于真实资金之前验证策略的行为。这意味着它有助于确保策略在过去的各种营销场景中表现如预期。

对于回测,需要策略配置。它由多个参数组成,其中一些如下:

  • 开始和结束时间戳:回测应运行的时间段。
  • 金融工具:应进行回测的一个或多个金融工具。
  • 蜡烛间隔:许多可能的蜡烛间隔之一;例如,1 分钟,15 分钟,1 小时或 1 天。
  • 特定策略参数:策略中定义的自定义参数的值。
  • 策略模式:日内交易或交割之一。日内交易策略在当天结束时打入日内订单,这些订单在当天结束时结清。交割策略打入交割订单。这些订单不会在当天结束时结清,而是转到下一个交易日。

需要一个回测引擎来执行给定策略的回测。在本章中,您将使用由 AlgoBulls 提供的回测引擎 (algobulls.com),这是一个通过其开发者选项提供其服务的算法交易平台。它提供了一个名为pyalgotrading的 Python 包 (github.com/algobulls/pyalgotrading) 来提供这些服务。

您在第八章中编码了两种算法交易策略,算法交易策略 - 逐步编码。回想一下,策略描述如下:

  • EMA-Regular-Order 策略:该策略基于技术指标 EMA 和常规订单。(第八章 的前六个配方,算法交易策略 – 逐步编码。)
  • MACD-Bracket-Order 策略:该策略基于技术指标 MACD 和括号订单。(第八章 的剩余六个配方,算法交易策略 – 逐步编码。)

这些策略也作为名为 pyalgostrategypool 的 Python 包的一部分可用。您可以使用 pip 安装它,使用命令 $ pip install pyalgostrategypool。您还可以在 GitHub 上查看它们(github.com/algobulls/pyalgostrategypool)。

在上一章中,您已将这两个策略上传到您的 AlgoBulls 账户。在本章中,您将从您的 AlgoBulls 账户获取这些策略,并对其进行回测。回测后,您将收集策略执行日志和各种报告,即 P&L 报告、统计报告和订单历史。这些日志和报告有助于验证策略的表现,并为下一阶段——模拟交易做准备,然后我们最终进行实际交易。通过使用 pyalgotrading,您确保专注于通过回测开发和验证策略,而无需担心策略执行所需的生态系统。

本章包括了前述策略的逐步配方,从与 AlgoBulls 平台建立连接、获取策略、运行回测任务,到获取执行日志和各种类型的报告。

在本章中,我们将涵盖以下配方:

  • EMA-Regular-Order 策略 – 获取策略
  • EMA-Regular-Order 策略 – 回测策略
  • EMA-Regular-Order 策略 – 实时获取回测日志
  • EMA-Regular-Order 策略 – 获取回测报告 – P&L 表
  • EMA-Regular-Order 策略 – 获取回测报告 – 统计表
  • EMA-Regular-Order 策略 – 获取回测报告 – 订单历史
  • MACD-Bracket-Order 策略 – 获取策略
  • MACD-Bracket-Order 策略 – 回测策略
  • MACD-Bracket-Order 策略 – 实时获取回测日志
  • MACD-Bracket-Order 策略 – 获取回测报告 – P&L 表
  • MACD-Bracket-Order 策略 – 获取回测报告 – 统计表
  • MACD-Bracket-Order 策略 – 获取回测报告 – 订单历史

让我们开始吧!

技术要求

您将需要以下内容才能成功执行本章的配方:

  • Python 3.7+
  • Python 包:
  • pyalgotrading$ pip install pyalgotrading

本章最新的 Jupyter 笔记本可以在 GitHub 上找到:github.com/PacktPublishing/Python-Algorithmic-Trading-Cookbook/tree/master/Chapter09

EMA-Regular-Order 策略 - 获取策略

在这个配方中,您将从 AlgoBulls 平台上的您的账户中获取StrategyEMARegularOrder策略类,该策略类是您在第八章,算法交易策略 - 逐步编码中通过 EMA-Regular-Order 策略 - 上传策略 配方上传到 AlgoBulls 交易平台的。本配方从设置到 AlgoBulls 平台的连接开始,查询您账户中所有可用的策略,并获取所需策略类StrategyEMARegularOrder的详细信息。

确保您已经完成了前一章的前六个配方,以完全了解我们将要使用的策略类;即StrategyEMARegularOrder

如何操作…

我们执行了本配方的以下步骤:

  1. 导入必要的模块:
>>> from pyalgotrading.algobulls import AlgoBullsConnection
  1. 创建一个新的 AlgoBulls 连接对象:
>>> algobulls_connection = AlgoBullsConnection()
  1. 获取授权 URL:
>>> algobulls_connection.get_authorization_url()

我们得到了以下输出:

Please login to this URL with your AlgoBulls credentials and get your developer access token: https://app.algobulls.com/user/login
'https://app.algobulls.com/user/login'
  1. 使用您的 AlgoBulls 凭据登录前面的链接,获取您的令牌,并在此处设置它(有关更多详细信息,请参阅附录 II):
>>> algobulls_connection.set_access_token('
                    80b7a69b168c5b3f15d56688841a8f2da5e2ab2c')
  1. 获取并显示到目前为止已创建和上传的所有策略:
>>> all_strategies = algobulls_connection.get_all_strategies()
>>> all_strategies

我们得到了以下输出。您的输出可能不同(确保您已经按照第八章,算法交易策略*- 逐步编码*中的配方来获得类似的输出):


  1. 获取并显示第一个策略的策略代码:
>>> strategy_code1 = all_strategies.iloc[0]['strategyCode']
>>> strategy_code1

我们得到了以下输出(您的输出可能会有所不同):

'49287246f9704bbcbad76ade9e2091d9'
  1. 在对策略进行回测之前,您可以检查策略以确保您拥有正确的策略:
>>> strategy_details1 = \
        algobulls_connection.get_strategy_details(strategy_code1)
>>> print(strategy_details1)

我们得到了以下输出:

class StrategyEMARegularOrder(StrategyBase):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.timeperiod1 = self.strategy_parameters['timeperiod1']
        self.timeperiod2 = self.strategy_parameters['timeperiod2']
        self.main_order = None
    def initialize(self):
        self.main_order = {}
    @staticmethod
    def name():
        return 'EMA Regular Order Strategy'
    ….
    def strategy_exit_position(self, candle, instrument, 
                                sideband_info):
        if sideband_info['action'] == 'EXIT':
            self.main_order[instrument].exit_position()
            self.main_order[instrument] = None
            return True
        return False

此处未显示完整的输出。请访问以下链接以阅读完整的输出:github.com/algobulls/pyalgostrategypool/blob/master/pyalgostrategypool/strategy_ema_regular_order.py

工作原理…

第 1 步中,你导入必要的模块。在第 2 步中,创建了AlgoBullsConnection类的一个实例,命名为algobulls_connection。在第 3 步中,使用algobulls_connection对象的get_authorization_url()方法获取授权 URL。这将打印出授权 URL。你应该从浏览器中访问此 URL 以登录 AlgoBulls 平台并获取您的开发者访问令牌。(您可以在附录 II中找到更多细节,以及关于从 AlgoBulls 平台获取开发者访问令牌的屏幕截图。)你复制访问令牌,并在第 4 步中使用algobulls_connectionset_access_token()方法设置它。如果令牌被接受,就会建立与 AlgoBulls 平台的成功连接。

第 5 步中,你获取到目前已经创建并上传到 AlgoBulls 平台的所有策略。你使用get_all_strategies()方法来执行此步骤,并将其赋值给一个新变量all_strategies。这个变量是一个pandas.DataFrame对象,具有strategyCodestrategyName列。这个表格包含了你之前上传的策略代码和策略名称的信息。如果你按照第八章中的EMA-Regular-Order 策略-上传策略到 AlgoBulls 交易平台的步骤,你会找到一个名为EMA-Regular-Order 策略的策略。在第 6 步中,你将策略EMA-Regular-Order 策略的策略代码赋值给一个新变量strategy_code1。这个策略代码在此步骤的输出中显示。这个策略代码对于 AlgoBulls 平台上的每个策略都是唯一的。

最后,在第 7 步中,确保被strategy_code1引用的策略确实是你之前上传的那个(在第八章的EMA-Regular-Order 策略-上传策略到 AlgoBulls 交易平台配方中)。你使用algobulls_connection对象的get_strategy_details()方法来检查策略。这个方法将策略代码作为参数。你在这里传递strategy_code1。这个方法将整个类代码作为一个字符串返回。你将其赋值给一个新变量strategy_details1,并显示它。

如果你想要更改strategy_code1引用的类代码,如第 7 步所示,请参考第八章的EMA-Regular-Order 策略-上传策略到 AlgoBulls 交易平台配方中的*还有更多…*部分。

EMA-Regular-Order 策略-回测策略

在此配方中,您将对EMA-Regular-Order 策略进行回测。您必须在上一配方中从 AlgoBulls 平台的帐户中获取此策略。您将为此配方利用pyalgotrading提供的回测功能,该功能反过来会在 AlgoBulls 平台上提交一个回测作业。

提交后,回测将由 AlgoBulls 回测引擎运行。您可以随时查询状态以查找回测作业的状态。作业按给定顺序经历以下状态:

  • STARTING(中间状态)
  • STARTED(稳定状态)
  • STOPPING(中间状态)
  • STOPPED(稳定状态)

提交作业后,它将从中间状态开始,即STARTING。在此状态下,AlgoBulls 回测引擎获取策略并准备执行环境,这可能需要几分钟。完成后,作业移至STARTED状态。策略回测发生在此阶段。在此期间,作业保持在这个状态直到回测完成。完成后,作业移至中间状态,即STOPPING。在此状态下,AlgoBulls 回测引擎清理已分配给此作业的资源,这通常需要不到一分钟。最后,作业移至STOPPED状态。

如果您已经提交了一个策略回测作业,则不能为相同的策略提交另一个作业,直到第一个作业完成。这意味着您必须等待第一个作业转移到STOPPED状态。如果第一个作业运行时间很长,并且您想立即停止它,您可以通过pyalgotrading提交停止作业请求。在提交请求之前,您需要确保作业处于STARTED状态。

以下状态机图示了回测作业在 AlgoBulls 平台上的生命周期中的各种状态和转换:


提交回测作业后,您可以实时获取策略执行的日志和报告。日志和报告有助于验证策略的性能并调试任何潜在问题。

确保您已经阅读了上一章的前六个配方,以全面了解我们将使用的策略类;即StrategyEMARegularOrder

准备工作

确保algobulls_connectionstrategy_code1对象在您的 Python 命名空间中可用。请参阅上一配方以设置algobulls_connectionstrategy_code1对象。

如何做…

我们为此配方执行以下步骤:

  1. 导入必要的模块:
>>> from datetime import datetime as dt
>>> from pyalgotrading.constants import *
  1. 使用交易符号作为关键字搜索工具。将返回的对象分配给instruments
>>> instruments = algobulls_connection.search_instrument('SBIN')
>>> instruments

我们得到以下输出(您的输出可能会有所不同):

[{'id': 7, 'value': 'NSE:SBIN'}]
  1. instruments获取所选工具的value
>>> instrument = instruments[0]['value']
>>> instrument

我们得到以下输出:

'NSE:SBIN'
  1. strategy_code1提交一个回测任务:
>>> algobulls_connection.backtest(strategy_code=strategy_code1, 
        start_timestamp=dt(year=2020, month=7, day=1, hour=9, 
                            minute=15), 
        end_timestamp=dt(year=2020, month=7, day=7, hour=15, 
                            minute=30),
        instrument=instrument, 
        lots=1,
        strategy_parameters={
            'timeperiod1': 5,
            'timeperiod2': 12
        }, 
        candle_interval=CandleInterval.MINUTES_15)

我们得到以下输出:

Setting Strategy Config... Success.
Submitting BACKTESTING job... Success.
  1. 检查已提交的回测作业的状态:
>>> algobulls_connection.get_backtesting_job_status(strategy_code1)

我们得到以下输出:

{'data': 'STARTING'}
  1. 一段时间后,再次检查已提交的作业状态:
>>> algobulls_connection.get_backtesting_job_status(strategy_code1)

我们得到以下输出:

{'data': 'STARTED'}

工作原理如下…

步骤 1 中,你从 datetime 模块中导入 datetime 类和 pyalgotrading.constants 模块中的所有常量。在 步骤 2 中,你使用 algobulls_connection 对象的 search_instrument() 方法获取要为之进行策略回测的工具,EMA-Regular-Order 策略search_instrument() 方法接受一个搜索字符串作为参数,该参数应该是你感兴趣的工具的交易代码的一部分或完整的交易代码。你在这里传递'SBIN'。该函数返回一个包含与搜索字符串匹配的工具详情的列表。可能有多个工具的交易代码中都包含搜索字符串。在 步骤 3 中,你获取第一个匹配工具的值,并将其分配给一个新变量 instrument

步骤 4 中,你使用 algobulls_connection() 对象的 backtest() 方法提交了一个回测作业。它接受以下参数:

  • strategy_code: 要进行回测的策略的策略代码。这应该是一个字符串。你在这里传递 strategy_code1
  • start_timestamp: 从中开始回测的过去时间戳。这应该是一个 datetime.datetime 对象。在这里,你传递一个持有 2020 年 7 月 1 日 9:15 点的时间对象 - dt(year=2020, month=7, day=1, hour=9, minute=15)。有关创建 datetime 对象的详细信息,请参阅第一章中的 创建 datetime 对象 配方,处理和操作日期、时间和时间序列数据。.
  • end_timestamp: 回测应该执行的过去时间戳。这个对象应该持有一个比 start_timestamp 持有的时间戳值要晚的时间戳值。这应该是一个 datetime.datetime 实例。在这里,你传递一个持有 2020 年 7 月 7 日 15:30 点的时间对象 - dt(year=2020, month=7, day=7, hour=15, minute=30)
  • instrument: 应该为其运行回测的金融工具。将为此工具获取历史数据。这应该是一个字符串。你在这里传递 instrument
  • lots: 应进行回测的手数。这应该是一个整数。数量由策略计算得出,即 手数 × 金融工具的手数。 (请参阅上一章中的 EMA-Regular-Order 策略 - 编码 strategy_enter_position 方法)。你在这里传递1
  • strategy_parameters: 策略所需的参数名称和值。这应该是一个字典,其中parameter-nameparameter-value是键值对。你需要传递以下参数:
  • timeperiod1: 5
  • timeperiod2: 12

(回想一下,EMA-Regular-Order 策略的参数是在其 __init__() 方法中定义的,如前一章的第一个示例所示)。

  • candle_interval:用于回测获取的历史数据的蜡烛间隔。这应该是 CandleInterval 类型的枚举。您在这里传递 CandleInterval.MINUTES_15。(CandleInterval 枚举提供了各种蜡烛间隔的枚举,其中一些是 MINUTE_1MINUTES_3MINUTES_5MINUTES_10MINUTES_15MINUTES_30HOURDAY)。

如果作业提交成功,您将会在 backtest() 函数中看到打印的 Success 消息。

一旦作业提交,启动需要一段时间。启动后,根据策略的复杂性和使用 start_timestampend_timestamp 参数指定的回测持续时间,完成可能需要一些时间。几天的回测可能在几秒钟内完成,而几个月的回测可能需要几分钟。

步骤 5 中,您使用 algobulls_connection 对象的 get_backtesting_job_status() 方法获取作业状态。您在这里将 strategy_code1 作为参数传递。此方法返回一个字典,其中包含一个键值对 - datajob 状态。如果在放置作业后立即查询状态,您将得到 'STARTING' 作为状态。在 步骤 6 中,您在一段时间后再次查询状态,如果作业已启动,则状态将为 'STARTED'

成功提交意味着已以所需格式传递了回测策略所需的最小输入。但是,这并不保证策略将无错误地运行。在回测期间,策略的执行可能仍然会遇到错误。要调试执行问题,您需要获取输出日志,这在 MACD-Bracket-Order 策略 - 实时获取回测日志 配方中有解释。错误的可能原因可能是策略类 Python 代码中的错误或将不完整的 strategy_parameters 字典传递给 backtest() 函数。

还有更多…

如果作业运行时间很长,您希望在其完成之前停止它,您可以使用 algobulls_connection 对象的 stop_backtesting_job() 方法。此方法接受策略代码作为参数。您在这里传递 strategy_code1。此方法向 AlgoBulls 回测引擎提交停止请求。如果请求被接受,您将在此处看到 Success 消息:

>>> algobulls_connection.stop_backtesting_job(strategy_code1)
 Stopping BACKTESTING job... Success.

如果在提交停止请求后查询状态,您将会得到状态为 'STOPPING'

>>> algobulls_connection.get_backtesting_job_status(strategy_code1)
{'data': 'STOPPING'} 

如果在一段时间后再次查询状态,并且作业已停止,则状态将为 'STOPPED'

>>> algobulls_connection.get_backtesting_job_status(strategy_code1)
{'data': 'STOPPED'}

EMA-Regular-Order 策略 - 实时获取回测日志

在 AlgoBulls 平台上提交回测作业后,AlgoBulls 回测引擎开始执行策略。在执行过程中,AlgoBulls 回测引擎发生的每个事件以及所采取的每个决策都以精确的时间戳记录为文本日志。记录的活动示例包括给定策略配置,定期生成的每个新蜡烛,您的策略打出的交易,由这些交易创建的头寸的进入和退出,等待新蜡烛等等。这些日志对于验证策略行为以及调试在开发策略时经常遇到的行为或性能问题至关重要。

在这个配方中,你将获取你的策略的回测日志。一旦您提交的回测作业达到'STARTED'状态(有关回测作业状态的更多信息,请参考上一节),日志就会开始出现。AlgoBulls 平台允许您实时获取日志,即使回测作业仍在进行中。您可以在不必等待回测作业完成的情况下获取对策略执行的见解,这在作业运行时间很长时非常有用。pyalgotrading包提供了一个简单的方法,可用于获取给定策略的执行日志。

确保您已经阅读了上一章的前六个配方,以完全了解我们将使用的策略类的情况;即,StrategyEMARegularOrder

准备就绪

确保您的 Python 命名空间中可用algobulls_connectionstrategy_code1对象。请参考本章的第一个配方设置algobulls_connectionstrategy_code1对象。

如何做…

我们对这个配方执行以下步骤:

  1. 获取strategy_code1的回测执行日志:
>>> logs = algobulls_connection.get_backtesting_logs(
                                                strategy_code1)
>>> print(logs)

我们得到以下输出(您的输出可能有所不同):

[2020-07-30 17:25:18] Logs not available yet. Please retry in sometime.
  1. 再过一段时间,再次获取strategy_code1的回测执行日志:
>>> logs = algobulls_connection.get_backtesting_logs(
                                                strategy_code1)
>>> print(logs)

我们得到以下输出(您的输出可能有所不同):

...
########################################
 INITIALIZING ALGOBULLS CORE (v3.2.0 SECURE MODE)... 
########################################
[2020-07-30 11:56:29] Welcome ALGOBULLS VIRTUAL USER!
[2020-07-30 11:56:29] Reading strategy…
...
 [BT] [2020-07-01 09:15:00] [INFO] [tls] STARTING ALGOBULLS CORE...
...
[BT] [2020-07-01 09:45:00] [CRITICAL] [order] [PLACING NEW ORDER] [2020-07-01 09:45:00] [2333198611b744aeb287300d371c8eb5] [BUY] [NSE:SBIN] [QTY:1] [QTY PENDING: 1] [ENTRY PRICE: 180.25] [PRICE:None] [TRIGGER PRICE:None] [ORDER_TYPE_REGULAR] [ORDER_CODE_INTRADAY] [ORDER_VARIETY_MARKET] [ORDER_POSITION_ENTER]
...
 [BT] [2020-07-07 15:30:00] [INFO] [clock] Candle generation has been stopped...
[BT] [2020-07-07 15:30:00] [INFO] [tls] Received event END OF MARKET. Stopping Trading Core Engine…
[BT] [2020-07-07 15:30:00] [INFO] [tls] Exiting all open positions with order code: ORDER_CODE_INTRADAY (if any)...
[BT] [2020-07-07 15:30:00] [CRITICAL] [tls] [User: ALGOBULLS VIRTUAL USER] Trading session completed
 ...

这里没有显示完整的输出。请访问以下链接以阅读完整的输出:github.com/algobulls/pyalgostrategypool/blob/master/pyalgostrategypool/sample/backtesting/strategy_ema_regular_order/logs.txt

工作原理…

步骤 1中,您使用algobulls_connection对象的get_backtesting_logs()方法实时获取策略回测日志。此方法接受策略代码作为参数。您在这里传递了strategy_code1。返回数据是一个字符串。如果您在提交作业后立即尝试此步骤,则会得到一个字符串,该字符串显示日志尚未准备好([2020-07-30 17:27:25] Logs not available yet. Please retry in sometime.)。如果回测作业处于'STARTING'状态,则会发生这种情况。

步骤 2 中,您再次在一段时间后获取日志。如果作业处于 'STARTING' 状态之外,您就开始获取您的策略执行日志。每次调用 get_backtesting_logs() 函数时,您都会获得完整的回测日志。

还有更多…

一旦回测作业转移到 'STOPPED' 状态,就不会生成新的日志。在您提交下一个相同策略的回测作业之前,您可以随时获取完整的日志。如果提交了新的回测作业(针对相同的策略),这些日志将无法通过 get_backtesting_logs() 方法再次访问。如果您希望以后参考,您可以将获取的日志保存到文件中。

EMA-Regular-Order 策略 – 获取一个回测报告 – 收益和损失表

在 AlgoBulls 平台提交了一个回测作业后,AlgoBulls 回测引擎开始执行策略。在执行过程中,除了日志之外,AlgoBulls 回测引擎还实时生成了一个 P&L 表格。这个表格包含了策略 Punch 进来的每一笔交易的信息。它还包含了入场和出场订单之间的映射细节、交易 P&L 以及累计 P&L,按时间顺序排序,最新的订单排在最前面。这张表格让我们通过个别和累计 P&L 数字来洞察整体策略的表现。入场-出场订单映射也有助于验证策略行为。

在这个教程中,您将获取您的策略的 P&L 表格报告。在您提交了回测作业后,只要您的策略 Punch 进了第一笔交易,这份报告就会立即可用。AlgoBulls 平台允许您实时获取 P&L 表格,即使回测作业仍在进行中。您可以在等待回测作业完成时获取策略表现的洞察,这在作业运行时间较长时非常有用。pyalgotrading 包提供了一个简单的方法,用于获取给定策略的 P&L 表格。

确保您已经阅读了前一章的前六个教程,以完全了解我们将要使用的策略类;即 StrategyEMARegularOrder

准备工作

确保 algobulls_connectionstrategy_code1 对象在您的 Python 命名空间中可用。请参考本章第一篇教程设置 algobulls_connectionstrategy_code1 对象。

如何操作…

获取 strategy_code1 的回测 P&L 报告:

>>> algobulls_connection.get_backtesting_report_pnl_table(strategy_code1)

我们得到了以下输出。您的输出可能会有所不同(请注意,以下输出已被分成多个表格以表示目的。您将在您的 Jupyter Notebook 中看到一个宽表):


工作原理…

在本示例中,您使用algobulls_connection对象的get_backtesting_report_pnl_table()方法实时获取回测损益表。此方法接受策略代码作为参数。您在此处传递strategy_code1。返回的数据是一个pandas.DataFrame对象,具有以下多列,描述如下:

  • instrument: 进入交易的金融工具。
  • entry_timestamp: 进入订单放置的时间戳。(请注意,它可能会在进入'COMPLETE'状态之前保持'OPEN'状态一段时间。您可以使用订单历史表找到此状态转换的时间,如本章第六个示例所述。)
  • entry_transaction_type: 进入订单交易类型(BUYSELL)。
  • entry_quantity: 进入订单数量。
  • entry_price: 进入订单执行的价格,并进入'COMPLETE'状态。
  • exit_timestamp: 退出订单放置的时间戳。(请注意,它可能会在进入'COMPLETE'状态之前保持'OPEN'状态一段时间。)
  • exit_transaction_type: 退出订单交易类型(BUYSELL)。
  • exit_quantity: 退出订单数量。
  • exit_price: 退出订单执行的价格,并进入'COMPLETE'状态。
  • pnl_absolute: 退出订单执行价格与进入订单执行价格之间的差值。数学上,这是对于多头交易为(exit_price - entry_price)*exit_quantity,对于空头交易为(entry_price - exit_price)*exit_quantity。正值意味着交易盈利,负值意味着交易亏损。
  • pnl_percentage: 利润或亏损的百分比,相对于进入价格。数学上,这是pnl_absolute / entry_price / exit_quantity × 100
  • pnl_cumulative_absolute: 累积利润或亏损。数学上,这是以前交易的所有pnl_absolute值的总和。此数字直接反映了策略绩效与模拟时间的关系。
  • pnl_cumulative_percentage: 相对于进入价格的累积利润或亏损的百分比。数学上,这是pnl_cumulative / entry_price / exit quantity × 100

更多信息…

一旦回测作业转移到'STOPPED'状态,损益表报告将不再更新。您可以在提交下一个相同策略的回测作业之前随时获取完整的损益报告。如果提交了新的回测作业(针对相同策略),则无法再通过get_backtesting_report_pnl_table()方法访问此报告。如果您希望以后参考,可以将获取的报告保存为.csv文件。

EMA-Regular-Order 策略 — 获取回测报告 - 统计表

在 AlgoBulls 平台上提交回测任务后,AlgoBulls 回测引擎开始执行策略。在执行过程中,除了日志和盈亏表外,AlgoBulls 回测引擎还实时生成来自盈亏表的摘要。这个摘要是一个包含各种统计数字的统计表,例如净盈亏(绝对值和百分比)、最大回撤(绝对值和百分比)、总交易次数、盈利交易次数、亏损交易次数、多头交易和空头交易次数、最大收益和最小收益(或最大亏损),以及每笔盈利交易和亏损交易的平均利润。这个表提供了对整体策略表现的即时概览。

在这个配方中,您将获取您的策略的统计表报告。这份报告在您提交回测工作后,您的策略首次打入第一笔交易后即可获得。AlgoBulls 平台允许您实时获取统计表,即使回测工作仍在进行中。您可以在等待回测工作完成时就获得对策略表现的洞察,这对于长时间运行的工作非常有帮助。pyalgotrading包提供了一个简单的方法,用于获取给定策略的统计表。

确保您已经阅读了上一章的前六个配方,以完全了解我们将使用的策略类;即StrategyEMARegularOrder

准备工作

确保algobulls_connectionstrategy_code1对象在你的 Python 命名空间中可用。参考本章第一个配方设置algobulls_connectionstrategy_code1对象。

如何操作…

获取strategy_code1的回测统计报告:

>>> algobulls_connection.get_backtesting_report_statistics(strategy_code1)

我们得到了以下输出(您的输出可能不同):

Python 算法交易秘籍(五)(2)https://developer.aliyun.com/article/1523020

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
14天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
43 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
10天前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
22 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
7天前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
25 2
|
10天前
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
在 Python 算法设计中,理解并巧妙运用时间复杂度和空间复杂度的知识,是实现高效、优雅代码的必经之路。通过不断地实践和优化,我们能够在这两个因素之间找到最佳的平衡点,创造出性能卓越的程序。
27 4
|
11天前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
29 4
|
9天前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
21 1
|
10天前
|
算法 计算机视觉 Python
Python并查集大揭秘:让你在算法界呼风唤雨,秒杀一切复杂场景!
在编程与算法的广袤天地中,总有一些工具如同神兵利器,能够助你一臂之力,在复杂的问题前游刃有余。今天,我们就来深入探讨这样一件神器——Python并查集(Union-Find),看看它是如何让你在算法界呼风唤雨,轻松应对各种复杂场景的。
25 2
|
10天前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台。果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜'),然后基于TensorFlow库搭建CNN卷积神经网络算法模型,然后对数据集进行训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地文件方便后期调用。再使用Django框架搭建Web网页平台操作界面,实现用户上传一张果蔬图片识别其名称。
29 0
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
13天前
|
缓存 算法 数据处理
时间&空间复杂度,Python 算法的双重考验!如何优雅地平衡两者,打造极致性能?
在Python算法中,时间与空间复杂度的平衡至关重要。时间复杂度反映算法执行时间随输入规模的变化趋势,空间复杂度则关注额外存储空间的需求。优秀的算法需兼顾两者,如线性搜索时间复杂度为O(n),空间复杂度为O(1);二分查找在时间效率上显著提升至O(log n),空间复杂度保持为O(1);动态规划通过牺牲O(n)空间换取O(n)时间内的高效计算。实际应用中,需根据具体需求权衡,如实时数据处理重视时间效率,而嵌入式系统更关注空间节约。通过不断优化,我们能在Python中找到最佳平衡点,实现高性能程序。
35 3
|
5天前
|
数据挖掘 索引 Python
Python数据挖掘编程基础3
字典在数学上是一个映射,类似列表但使用自定义键而非数字索引,键在整个字典中必须唯一。可以通过直接赋值、`dict`函数或`dict.fromkeys`创建字典,并通过键访问元素。集合是一种不重复且无序的数据结构,可通过花括号或`set`函数创建,支持并集、交集、差集和对称差集等运算。
14 9
下一篇
无影云桌面