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

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

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

如何运作…

在这个配方中,你使用algobulls_connection对象的get_backtesting_report_statistics()方法实时获取回测统计表。该方法接受策略代码作为参数。你在这里传递了strategy_code1。返回的数据是一个pandas.DataFrame对象,有两列 - highlight_typehighlight_value - 以及多行。行的描述如下:

  • 净盈亏:累积回测盈亏。这也是盈亏表中第一个条目的pnl_cumulative_absolute值。
  • 净盈亏 %:累积回测盈亏百分比。这也是盈亏表中第一个条目的pnl_cumulative_percentage值。
  • 最大回撤:盈亏表的pnl_cumulative列中的最低值。这表明您的策略在执行过程中遇到的最大损失。
  • 最大回撤 %:从数学上讲,这是*(最大回撤)* / *(相应的入场价格) / 出场数量 *× 100
  • 交易次数:会话期间的总交易次数(入场和出场计为一次)。
  • 获利次数:交易盈亏非负的交易次数。
  • 亏损次数:交易盈亏为负的交易次数。
  • 多头交易次数:输入交易类型为 'BUY' 的交易次数。
  • 空头交易次数:输入交易类型为 'SELL' 的交易次数。
  • 最大收益:所有交易中收益最大的交易的盈亏。
  • 最小收益:所有交易中收益最小的交易的盈亏。
  • 每次盈利交易的平均利润:在数学上,这是 (盈利交易的总盈亏) / (盈利交易的次数)
  • 每次亏损交易的平均利润:在数学上,这是 (亏损交易的总盈亏) / (亏损交易的次数)

还有更多…

如果在回测任务仍在运行时获取统计表,则上述数字将是中间数字,基于截至该时刻完成的交易。随着更多交易被输入,这些数字可能会更改,直到回测任务完成。

一旦回测任务转移到 'STOPPED' 状态,统计表将不再更改。您可以在提交下一个相同策略的回测任务之前的任何时间获取完整的统计表。如果提交了新的回测任务(相同的策略),则通过 get_backtesting_report_statistics() 方法将无法再访问此表。如果您希望以后参考,可以将获取的报告表保存到 .csv 文件中。

EMA-Regular-Order 策略 - 获取回测报告 - 订单历史

在 AlgoBulls 平台提交回测任务后,AlgoBulls 回测引擎开始执行策略。在执行过程中,除了日志外,AlgoBulls 回测引擎的盈亏表和统计表会实时生成订单历史记录。此日志包含每个订单的状态转换,以及每个订单状态的时间戳和附加信息(如果有)。订单历史记录对于理解交易从 'OPEN' 状态到 'COMPLETE''CANCELLED' 状态所需的时间至关重要。例如,MARKET 订单将立即从 'OPEN' 转换为 'COMPLETE',但是 LIMIT 订单可能需要一段时间,根据市场条件从 'OPEN' 转换到 'COMPLETE' - 甚至可能转为 'CANCELLED'。所有这些信息都包含在订单历史记录中。(有关订单状态转换的更多信息,请参见第六章的状态机图,在交易所上放置常规订单。)

在本配方中,你将获取你的策略的订单历史记录。只要你的策略首次进行交易,并提交了一个回测任务,这个日志就可以获取。AlgoBulls 平台允许你实时获取订单历史记录,即使回测任务仍在进行中也是如此。这帮助我们获取订单的最终状态的细节,而无需等待回测任务完成。pyalgotrading包提供了一个简单的方法,我们可以用它来获取给定策略的订单历史记录。

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

准备工作

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

如何做…

获取strategy_code1的回测订单历史报告:

>>> order_history = \
        algobulls_connection.get_backtesting_report_order_history(
                                                          strategy_code1)
>>> print(order_history)

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

+-------------+---------------------+----------------------------------+------+
| INST        | TIME                | ID                               | TT   |
|-------------+---------------------+----------------------------------+------|
| NSE_EQ:SBIN | 2020-07-01 09:45:00 | 2333198611b744aeb287300d371c8eb5 | BUY  |
+-------------+---------------------+----------------------------------+------+
+----+---------------------+------------------------+-------+
|    | TIME                | STATE                  | MSG   |
|----+---------------------+------------------------+-------|
|  0 | 2020-07-01 09:45:00 | PUT ORDER REQ RECEIVED |       |
|  1 | 2020-07-01 09:45:00 | VALIDATION PENDING     |       |
|  2 | 2020-07-01 09:45:00 | OPEN PENDING           |       |
|  3 | 2020-07-01 09:45:00 | OPEN                   |       |
|  4 | 2020-07-01 09:45:00 | COMPLETE               |       |
+----+---------------------+------------------------+-------+
+-------------+---------------------+----------------------------------+------+
| INST        | TIME                | ID                               | TT   |
|-------------+---------------------+----------------------------------+------|
| NSE_EQ:SBIN | 2020-07-01 15:30:00 | 67f39f41885b476295e7e959b0470d49 | SELL |
+-------------+---------------------+----------------------------------+------+
+----+---------------------+------------------------+-------+
|    | TIME                | STATE                  | MSG   |
|----+---------------------+------------------------+-------|
|  0 | 2020-07-01 15:30:00 | PUT ORDER REQ RECEIVED |       |
|  1 | 2020-07-01 15:30:00 | VALIDATION PENDING     |       |
|  2 | 2020-07-01 15:30:00 | OPEN PENDING           |       |
|  3 | 2020-07-01 15:30:00 | OPEN                   |       |
|  4 | 2020-07-01 15:30:00 | COMPLETE               |       |
+----+---------------------+------------------------+-------+
...

这里未显示完整的输出。请访问此链接阅读完整的输出:github.com/algobulls/pyalgostrategypool/blob/master/pyalgostrategypool/sample/backtesting/strategy_ema_regular_order/oms_order_history.log

工作原理…

在本配方中,你使用algobulls_connection对象的get_backtesting_report_order_history()方法实时获取订单历史记录。此方法接受策略代码作为参数。你在这里传递了strategy_code1。返回的数据是一个字符串,描述如下:

对于每个订单,日志包含以下信息:

  • 一个包含以下列的描述性订单表:
  • INST: 订单的金融工具
  • TIME: 下单时间
  • ID: 订单的唯一 ID
  • TT: 订单交易类型(BUYSELL

此表的示例如下:

+-------------+---------------------+----------------------------------+------+
| INST        | TIME                | ID                               | TT   |
|-------------+---------------------+----------------------------------+------|
| NSE_EQ:SBIN | 2020-07-01 09:45:00 | 2333198611b744aeb287300d371c8eb5 | BUY  |
+-------------+---------------------+----------------------------------+------+

这些信息将帮助你在策略执行日志中找到这个确切的订单。

  • 一个订单状态转换表,包括以下列:
  • TIME: 订单进入由'STATE'列表示的状态的时间戳。
  • STATE: 订单在'TIME'列中提到的时间戳进入此'STATE'
  • MSG: 来自订单管理系统OMS)的额外信息,用于任何意外状态转换。例如,进入REJECTED状态的订单有来自 OMS 的拒绝原因的消息。该列通常为空。

此表的示例如下:

+----+---------------------+------------------------+-------+
|    | TIME                | STATE                  | MSG   |
|----+---------------------+------------------------+-------|
|  0 | 2020-07-01 09:45:00 | PUT ORDER REQ RECEIVED |       |
|  1 | 2020-07-01 09:45:00 | VALIDATION PENDING     |       |
|  2 | 2020-07-01 09:45:00 | OPEN PENDING           |       |
|  3 | 2020-07-01 09:45:00 | OPEN                   |       |
|  4 | 2020-07-01 09:45:00 | COMPLETE               |       |
+----+---------------------+------------------------+-------+

从这张表中,你可以看到,在上午 9:45 下单后,订单立即转移到'COMPLETE'状态。这是预期的,因为订单是常规市价订单。

还有更多…

一旦回测作业转移到'STOPPED'状态,就不会生成新的订单历史记录日志。您可以在提交下一个相同策略的回测作业之前的任何时间获取完整的订单历史记录日志。如果提交了新的回测作业(用于相同的策略),这些日志将不再通过get_backtesting_report_order_history()方法访问。如果您希望以后参考这些日志,可以将获取的日志保存到文件中。

MACD-Bracket-Order 策略 – 获取策略

在这个配方中,您将从您在 AlgoBulls 平台上的帐户中获取StrategyMACDBracketOrder策略类,这是您在上一章的最后一个配方中上传的。这个配方从建立到 AlgoBulls 平台的连接开始,查询您帐户中的所有可用策略,并获取所需策略类StrategyMACDBracketOrder的详细信息。

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

如何实现…

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

  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. 获取并显示第二个策略 MACD-Bracket-Order 策略 的策略代码:
>>> strategy_code2 = all_strategies.iloc[1]['strategyCode']
>>> strategy_code2

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

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

我们得到以下输出:

class StrategyMACDBracketOrder(StrategyBase):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fastMA_period = \
            self.strategy_parameters['fastma_period']
        self.slowMA_period = \
            self.strategy_parameters['slowma_period']
        self.signal_period = \
            self.strategy_parameters['signal_period']
        self.stoploss = \
            self.strategy_parameters['stoploss_trigger']
        self.target = self.strategy_parameters['target_trigger']
        self.trailing_stoploss = \
            self.strategy_parameters['trailing_stoploss_trigger']
        self.main_order = None
    def initialize(self):
        self.main_order = {}
    @staticmethod
    def name():
        return 'MACD Bracket 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_macd_bracket_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 列。此表包含您之前上传的策略代码和策略名称的信息。如果您遵循了第八章中的 MACD-Bracket-Order 策略 - 在 AlgoBulls 交易平台上上传策略 配方,算法交易策略 - 逐步编码,您将会找到一个名为 MACD-Regular-Order 策略 的策略。在步骤 6 中,您将策略 MACD-Regular-Order 策略 的策略代码分配给一个名为 strategy_code2 的新变量。策略代码显示在此步骤的输出中。此策略代码对于 AlgoBulls 平台上的每个策略都是唯一的。

最后,在步骤 7 中,您确保 strategy_code2 所引用的策略确实是您之前上传的那一个(在上一章的最后一个配方中)。您使用 algobulls_connection 对象的 get_strategy_details() 方法来检查策略。这个方法以策略代码作为参数。您在这里传递 strategy_code2。此方法返回整个类代码作为字符串。您将其赋值给一个新变量 strategy_details2,并显示它。

如果您想要更改由 strategy_code2 引用的类代码,如 步骤 7 中所示,请参考第八章的上一个配方的 更多信息… 部分,算法交易策略 - 逐步编码

MACD-Bracket-Order 策略 - 回测策略

在这个配方中,您将对 MACD-Bracket-Order 策略 进行回测。您必须在本章的上一个配方中从 AlgoBulls 平台的您的账户中获取此策略。您将利用 pyalgotrading 为这个配方提供的回测功能,这将在 AlgoBulls 平台上提交一个回测任务。

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

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

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

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

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

您可以参考本章的第二个配方,查看 AlgoBulls 平台上回测作业的状态机图。它展示了回测作业在其生命周期中的各种状态和转换。

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

准备就绪

确保algobulls_connectionstrategy_code2对象在您的 Python 命名空间中可用。请参考本章的上一配方来设置algobulls_connectionstrategy_code2对象。

如何操作…

我们执行以下步骤来完成此操作:

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

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

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

我们获得以下输出:

'NSE:TATASTEEL'
  1. strategy_code2提交回测作业:
>>> algobulls_connection.backtest(
        strategy_code=strategy_code2, 
        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={
            'fastma_period': 26, 
            'slowma_period': 6, 
            'signal_period': 9,
            'target_trigger': 0.01, 
            'stoploss_trigger': 0.01, 
            'trailing_stoploss_trigger': 1
        },
        candle_interval=CandleInterval.MINUTES_15)

我们获得以下输出:

Setting Strategy Config... Success.
Submitting BACKTESTING job... Success.
  1. 检查提交的回测作业的状态:
>>> algobulls_connection.get_backtesting_job_status(strategy_code2)
{'data': 'STARTING'}
  1. 过一段时间后再次检查提交的回测作业的状态:
>>> algobulls_connection.get_backtesting_job_status(strategy_code2)
{'data': 'STARTED'}

工作原理…

步骤 1中,您从datetime模块中导入datetime类,以及从pyalgotrading.constants模块中导入所有所需的常量。在步骤 2中,您使用algobulls_connection对象的search_instrument()方法获取您想要为其回测策略的工具,MACD-Bracket-Order 策略search_instrument()方法接受一个搜索字符串作为参数,该字符串应该是您感兴趣的工具的交易代码的部分或完整内容。这里您传递了'TATASTEEL'。该函数返回一个包含与搜索字符串匹配的工具详细信息的列表。可能会有多个工具的交易代码中含有搜索字符串。在步骤 3中,您获取第一个匹配工具的值,并将其赋值给一个新变量,instrument

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

  • strategy_code: 要进行回测的策略的策略代码。这应该是一个字符串。在这里,您传递了strategy_code2
  • start_timestamp: 进行回测的起始时间戳。这应该是一个datetime.datetime对象。这里,您传递了一个包含 2020 年 7 月 1 日 9:15 小时的值的对象 - dt(year=2020, month=7, day=1, hour=9, minute=15)。有关创建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: 进行回测的手数。这应该是一个整数。该数量由策略计算为手数×金融工具的手数。 (请参阅第八章的MACD-Bracket-Order 策略 - 编写策略 _select_instruments_for_entry 方法算法交易策略 - 逐步编码。) 在这里,您传递了1
  • strategy_parameters: 策略所需的参数名称和值。这应该是一个字典,其中parameter-nameparameter-value是键值对。您在这里传递以下参数:
  • fastma_period: 26
  • slowma_period: 6
  • signal_period: 9
  • target_trigger: 0.01
  • stoploss_trigger: 0.01
  • trailing_stoploss_trigger: 1

(回想一下,MACD-Bracket-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_code2作为参数传递。该方法返回一个键值对字典 - 数据和作业状态。如果在放置作业后立即查询状态,你会得到'STARTING'作为状态。在步骤 6中,你再次查询状态,如果作业已经启动,你会得到'STARTED'的状态。

成功提交意味着以所需格式传递了回测策略的最小输入。然而,这并不保证策略会在回测期间无错误地运行。策略的执行仍然可能在回测过程中遇到错误。要调试执行问题,你需要获取输出日志,这将在下一个示例中解释。错误的可能原因包括策略类的 Python 代码中的错误或传递给backtest()函数的strategy_parameters字典不完整。

还有更多…

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

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

如果在提交停止请求后查询状态,你会得到一个'STOPPING'的状态:

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

如果一段时间后再次查询状态,如果作业已经停止,你会得到'STOPPED'的状态:

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

MACD-Bracket-Order 策略 - 实时获取回测日志

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

在这个配方中,您将获取您的策略的回测日志。日志会在您提交的回测作业达到'STARTED'状态时开始出现。AlgoBulls 平台允许您实时获取日志,即使回测作业仍在进行中。您可以在不等待回测作业完成的情况下深入了解策略执行情况,这在作业运行时间较长时非常有用。pyalgotrading包提供了一个简单的方法来获取给定策略的执行日志。

确保您已经浏览了上一章的最后六个配方,以完整了解我们将要使用的策略类别;也就是StrategyMACDBracketOrder

准备工作

确保algobulls_connectionstrategy_code2对象在您的 Python 命名空间中可用。请参考本章的MACD-Bracket-Order strategy – fetching the strategy配方来设置algobulls_connectionstrategy_code2对象。

如何操作…

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

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

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

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

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

...
########################################
 INITIALIZING ALGOBULLS CORE (v3.2.0 SECURE MODE)... 
########################################
...
[BT] [2020-07-01 09:15:00] [INFO] [tls] STARTING ALGOBULLS CORE...
...
[BT] [2020-07-01 12:30:00] [CRITICAL] [order] [PLACING NEW ORDER] [2020-07-01 12:30:00] [1cbefcf395c344c88a228a1b01c32ef6] [BUY] [NSE:TATASTEEL] [QTY:1] [QTY PENDING: 1] [ENTRY PRICE: 322.6] [PRICE:322.6] [TRIGGER PRICE:None] [ORDER_TYPE_BRACKET] [ORDER_CODE_INTRADAY] [ORDER_VARIETY_LIMIT] [ORDER_POSITION_ENTER] [STOPLOSS TRIGGER:319.374] [TARGET TRIGGER:325.826] [TRAILING STOPLOSS TRIGGER:322.6]
...
[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] [CRITICAL] [tls] [User: ALGOBULLS VIRTUAL USER] Trading session completed
...

此处未显示完整输出。请访问以下链接阅读完整输出:github.com/algobulls/pyalgostrategypool/blob/master/pyalgostrategypool/sample/backtesting/strategy_macd_bracket_order/logs.txt

工作原理…

步骤 1中,您使用algobulls_connection对象的get_backtesting_logs()方法实时获取策略回测日志。此方法接受策略代码作为参数。在此处传递strategy_code2。返回的数据是一个字符串。如果在提交作业后立即尝试此步骤,您将获得一个字符串,指出日志尚未准备好([2020-07-30 17:27:25] 日志尚未准备好,请稍后重试。)。如果回测作业处于'STARTING'状态,则会发生这种情况。

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

还有更多…

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

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

相关实践学习
日志服务之使用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
|
2天前
|
传感器 算法 C语言
基于无线传感器网络的节点分簇算法matlab仿真
该程序对传感器网络进行分簇,考虑节点能量状态、拓扑位置及孤立节点等因素。相较于LEACH算法,本程序评估网络持续时间、节点死亡趋势及能量消耗。使用MATLAB 2022a版本运行,展示了节点能量管理优化及网络生命周期延长的效果。通过簇头管理和数据融合,实现了能量高效和网络可扩展性。
下一篇
无影云桌面