第九章:算法交易 - 回测
在构建算法交易策略之后,正如我们在上一章中所做的那样,第一步是对给定的策略配置在给定的时间段内进行回测。
回测是通过在过去的数据上虚拟执行交易策略并分析其风险和回报指标来评估交易策略性能的方法。这里不使用真实资金。典型的回测指标包括利润和损失(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
。
如何操作…
我们执行了本配方的以下步骤:
- 导入必要的模块:
>>> from pyalgotrading.algobulls import AlgoBullsConnection
- 创建一个新的 AlgoBulls 连接对象:
>>> algobulls_connection = AlgoBullsConnection()
- 获取授权 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'
- 使用您的 AlgoBulls 凭据登录前面的链接,获取您的令牌,并在此处设置它(有关更多详细信息,请参阅附录 II):
>>> algobulls_connection.set_access_token(' 80b7a69b168c5b3f15d56688841a8f2da5e2ab2c')
- 获取并显示到目前为止已创建和上传的所有策略:
>>> all_strategies = algobulls_connection.get_all_strategies() >>> all_strategies
我们得到了以下输出。您的输出可能不同(确保您已经按照第八章,算法交易策略*- 逐步编码*中的配方来获得类似的输出):
- 获取并显示第一个策略的策略代码:
>>> strategy_code1 = all_strategies.iloc[0]['strategyCode'] >>> strategy_code1
我们得到了以下输出(您的输出可能会有所不同):
'49287246f9704bbcbad76ade9e2091d9'
- 在对策略进行回测之前,您可以检查策略以确保您拥有正确的策略:
>>> 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_connection
的set_access_token()
方法设置它。如果令牌被接受,就会建立与 AlgoBulls 平台的成功连接。
在第 5 步中,你获取到目前已经创建并上传到 AlgoBulls 平台的所有策略。你使用get_all_strategies()
方法来执行此步骤,并将其赋值给一个新变量all_strategies
。这个变量是一个pandas.DataFrame
对象,具有strategyCode
和strategyName
列。这个表格包含了你之前上传的策略代码和策略名称的信息。如果你按照第八章中的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_connection
和strategy_code1
对象在您的 Python 命名空间中可用。请参阅上一配方以设置algobulls_connection
和strategy_code1
对象。
如何做…
我们为此配方执行以下步骤:
- 导入必要的模块:
>>> from datetime import datetime as dt >>> from pyalgotrading.constants import *
- 使用交易符号作为关键字搜索工具。将返回的对象分配给
instruments
:
>>> instruments = algobulls_connection.search_instrument('SBIN') >>> instruments
我们得到以下输出(您的输出可能会有所不同):
[{'id': 7, 'value': 'NSE:SBIN'}]
- 从
instruments
获取所选工具的value
:
>>> instrument = instruments[0]['value'] >>> instrument
我们得到以下输出:
'NSE:SBIN'
- 为
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.
- 检查已提交的回测作业的状态:
>>> algobulls_connection.get_backtesting_job_status(strategy_code1)
我们得到以下输出:
{'data': 'STARTING'}
- 一段时间后,再次检查已提交的作业状态:
>>> 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-name
和parameter-value
是键值对。你需要传递以下参数:timeperiod1: 5
timeperiod2: 12
(回想一下,EMA-Regular-Order 策略的参数是在其 __init__()
方法中定义的,如前一章的第一个示例所示)。
candle_interval
:用于回测获取的历史数据的蜡烛间隔。这应该是CandleInterval
类型的枚举。您在这里传递CandleInterval.MINUTES_15
。(CandleInterval
枚举提供了各种蜡烛间隔的枚举,其中一些是MINUTE_1
、MINUTES_3
、MINUTES_5
、MINUTES_10
、MINUTES_15
、MINUTES_30
、HOUR
和DAY
)。
如果作业提交成功,您将会在 backtest()
函数中看到打印的 Success
消息。
一旦作业提交,启动需要一段时间。启动后,根据策略的复杂性和使用 start_timestamp
和 end_timestamp
参数指定的回测持续时间,完成可能需要一些时间。几天的回测可能在几秒钟内完成,而几个月的回测可能需要几分钟。
在 步骤 5 中,您使用 algobulls_connection
对象的 get_backtesting_job_status()
方法获取作业状态。您在这里将 strategy_code1
作为参数传递。此方法返回一个字典,其中包含一个键值对 - data 和 job 状态。如果在放置作业后立即查询状态,您将得到 '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_connection
和strategy_code1
对象。请参考本章的第一个配方设置algobulls_connection
和strategy_code1
对象。
如何做…
我们对这个配方执行以下步骤:
- 获取
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.
- 再过一段时间,再次获取
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_connection
和 strategy_code1
对象在您的 Python 命名空间中可用。请参考本章第一篇教程设置 algobulls_connection
和 strategy_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
: 进入订单交易类型(BUY
或SELL
)。entry_quantity
: 进入订单数量。entry_price
: 进入订单执行的价格,并进入'COMPLETE'
状态。exit_timestamp
: 退出订单放置的时间戳。(请注意,它可能会在进入'COMPLETE'
状态之前保持'OPEN'
状态一段时间。)exit_transaction_type
: 退出订单交易类型(BUY
或SELL
)。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_connection
和strategy_code1
对象在你的 Python 命名空间中可用。参考本章第一个配方设置algobulls_connection
和strategy_code1
对象。
如何操作…
获取strategy_code1
的回测统计报告:
>>> algobulls_connection.get_backtesting_report_statistics(strategy_code1)
我们得到了以下输出(您的输出可能不同):
Python 算法交易秘籍(五)(2)https://developer.aliyun.com/article/1523020