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

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

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

MACD-Bracket-Order 策略 – 获取回测报告 – 盈亏表

在 AlgoBulls 平台上提交回测作业后,AlgoBulls 回测引擎开始执行策略。在其执行过程中,除了日志外,AlgoBulls 回测引擎还实时生成 P&L 表。该表包含了策略输入的每一笔交易的信息。它还包含了入口和出口订单之间的映射、交易 P&L 和累积 P&L 的详细信息,按时间顺序排序,最新的订单排在最前面。

这个表格通过个人和累积 P&L 数字帮助我们了解策略的整体表现。入口-出口订单映射也有助于验证策略的行为。

在这个食谱中,你将获取你的策略的 P&L 表报告。在提交回测作业后,只要你的策略打出第一笔交易,这个报告就可以获得。AlgoBulls 平台允许你实时获取 P&L 表,即使回测作业仍在进行中。在作业运行时间较长时,这对于获取策略表现的洞察力是有帮助的。pyalgotrading包提供了一个简单的方法,你可以用它来获取给定策略的 P&L 表。

确保你已经浏览了上一章的最后六个食谱,以完整地了解我们将使用的策略类的情况;也就是说,StrategyMACDBracketOrder

准备就绪

确保你的 Python 命名空间中有algobulls_connectionstrategy_code2对象可用。请参考本章的 MACD-Bracket-Order 策略 – 获取策略 食谱设置algobulls_connectionstrategy_code2对象。

如何操作…

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

>>> algobulls_connection.get_backtesting_report_pnl_table(strategy_code2)

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


运作原理…

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

  • instrument:输入的金融工具。
  • entry_timestamp:放置进入订单的时间戳。(请注意,它可能在进入'COMPLETE'状态之前保持一段时间处于'OPEN'状态。可以通过订单历史表找到此状态转换的时间,如本章的最后一个示例所述。)
  • entry_transaction_type:进入订单交易类型(BUYSELL)。
  • entry_quantity:进入订单数量。
  • 进入价格:进入订单执行并进入'COMPLETE'状态的价格。
  • 退出时间戳:放置退出订单的时间戳。(请注意,它可能在进入'COMPLETE'状态之前保持一段时间处于'OPEN'状态。)
  • exit_transaction_type:退出订单交易类型(BUYSELL)。
  • exit_quantity:退出订单数量。
  • 退出价格:退出订单执行并进入'COMPLETE'状态的价格。
  • pnl_absolute:退出订单执行价格与进入订单执行价格之间的差值。 在数学上,这可以表示为(退出价格 - 进入价格)*退出数量(对于多头交易),以及(进入价格 - 退出价格)*退出数量(对于空头交易)。 正值意味着交易是盈利交易。 负值意味着交易是亏损交易。
  • 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'状态,P&L 表报告将不再更新。 您可以在提交下一个相同策略的回测作业之前随时获取完整的 P&L 报告。 如果提交了新的回测作业(针对相同的策略),则将无法通过get_backtesting_report_pnl_table()方法再访问此报告。 如果您希望稍后参考,可以将获取的报告保存为.csv文件。

MACD-Bracket-Order 策略 - 获取回测报告 - 统计表

在 AlgoBulls 平台上提交回测任务后,AlgoBulls 回测引擎开始执行策略。在执行过程中,除了日志和 P&L 表之外,AlgoBulls 回测引擎还实时从 P&L 表生成摘要。这个摘要是一个包含各种统计数字的统计表,比如净利润(绝对值和百分比)、最大回撤(绝对值和百分比)、总交易次数、盈利交易、亏损交易、多头交易和空头交易的计数、最大盈利和最小盈利(或最大亏损)、以及每笔盈利和亏损交易的平均利润。这张表可以让我们快速了解策略的整体表现。

在这个配方中,您将为您的策略获取统计表报告。此报告在您提交回测任务后,您的策略打入第一笔交易后即可获取。AlgoBulls 平台允许您实时获取统计表,即使回测任务仍在进行中。您可以在等待回测任务完成时获得对策略性能的见解,这在任务运行时间较长时非常有用。pyalgotrading 包提供了一个简单的方法,我们可以使用它来获取给定策略的统计表。

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

准备工作

确保您的 Python 命名空间中有 algobulls_connectionstrategy_code2 对象可用。请参考本章的 MACD-Bracket-Order 策略 - 获取策略 配方来设置 algobulls_connectionstrategy_code2 对象。

如何操作…

获取 strategy_code2 的回测统计报告:

>>> algobulls_connection.get_backtesting_report_statistics(strategy_code2)

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


工作原理…

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

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

还有更多…

如果在回测作业仍在运行时获取统计表,则上述数字将是中间数字,基于直到该时刻已完成的交易。随着更多交易的输入,这些数字可能会发生变化,直到回测作业完成。

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

MACD-Bracket-Order 策略 - 获取回测报告 - 订单历史

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

在这个配方中,您将获取您的策略的订单历史记录。只要您提交了回测作业后,您的策略就 punched in 第一笔交易,这个日志就可用了。AlgoBulls 平台允许您实时获取订单历史记录,即使回测作业仍在进行中。这样我们就可以获得处于最终状态的订单的详细信息,而不必等待回测作业完成。pyalgotrading软件包提供了一种简单的方法,我们可以用它来获取给定策略的订单历史记录。

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

准备就绪

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

怎么做…

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

>>> order_history = algobulls_connection.get_backtesting_report_order_history(strategy_code2)
>>> print(order_history)

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

...
+------------------+---------------------+----------------------------------+------+
| INST             | TIME                | ID                               | TT   |
|------------------+---------------------+----------------------------------+------|
| NSE_EQ:TATASTEEL | 2020-07-03 10:00:00 | 03436b72ad8a47a8b29bb727876b0b95 | BUY  |
+------------------+---------------------+----------------------------------+------+
+----+---------------------+------------------------+-------+
|    | TIME                | STATE                  | MSG   |
|----+---------------------+------------------------+-------|
|  0 | 2020-07-03 10:00:00 | PUT ORDER REQ RECEIVED |       |
|  1 | 2020-07-03 10:00:00 | VALIDATION PENDING     |       |
|  2 | 2020-07-03 10:00:00 | OPEN PENDING           |       |
|  3 | 2020-07-03 10:00:00 | TRIGGER PENDING        |       |
|  4 | 2020-07-03 12:30:00 | OPEN                   |       |
|  5 | 2020-07-03 12:30:00 | COMPLETE               |       |
+----+---------------------+------------------------+-------+
+------------------+---------------------+----------------------------------+------+
| INST             | TIME                | ID                               | TT   |
|------------------+---------------------+----------------------------------+------|
| NSE_EQ:TATASTEEL | 2020-07-03 10:00:00 | 62458cf47d5f4a12b6c31c490451fdb0 | BUY  |
+------------------+---------------------+----------------------------------+-----
+
+----+---------------------+------------------------+-------+
|    | TIME                | STATE                  | MSG   |
|----+---------------------+------------------------+-------|
|  0 | 2020-07-03 10:00:00 | PUT ORDER REQ RECEIVED |       |
|  1 | 2020-07-03 10:00:00 | VALIDATION PENDING     |       |
|  2 | 2020-07-03 10:00:00 | OPEN PENDING           |       |
|  3 | 2020-07-03 10:00:00 | OPEN                   |       |
|  4 | 2020-07-03 12:30:00 | CANCEL PENDING         |       |
|  5 | 2020-07-03 12:30:00 | CANCELLED              |       |
+----+---------------------+------------------------+-------+
...

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

工作原理…

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

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

  • 订单的描述性表,包括以下列:
  • INST:订单的金融工具
  • TIME:订单被放置的时间
  • ID:订单的唯一标识符
  • TT:订单交易类型(BUYSELL

表的示例如下所示:

+------------------+---------------------+----------------------------------+------+
| INST             | TIME                | ID                               | TT   |
|------------------+---------------------+----------------------------------+------|
| NSE_EQ:TATASTEEL | 2020-07-03 10:00:00 | 03436b72ad8a47a8b29bb727876b0b95 | BUY  |
+------------------+---------------------+----------------------------------+------+

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

  • 一个订单状态转换表,具有以下列:
  • TIME:订单进入由'STATE'列表示的状态的时间戳。
  • STATE:订单在'STATE'列中的状态进入时间戳所述的时间。
  • MSG:OMS 对于任何意外状态转换的额外消息;例如,进入REJECTED状态的订单具有来自 OMS 的说明其被拒绝原因的消息。此列通常为空。

表的示例如下所示:

+----+---------------------+------------------------+-------+
|    | TIME                | STATE                  | MSG   |
|----+---------------------+------------------------+-------|
|  0 | 2020-07-03 10:00:00 | PUT ORDER REQ RECEIVED |       |
|  1 | 2020-07-03 10:00:00 | VALIDATION PENDING     |       |
|  2 | 2020-07-03 10:00:00 | OPEN PENDING           |       |
|  3 | 2020-07-03 10:00:00 | TRIGGER PENDING        |       |
|  4 | 2020-07-03 12:30:00 | OPEN                   |       |
|  5 | 2020-07-03 12:30:00 | COMPLETE               |       |
+----+---------------------+------------------------+-------+

从这个表格可以看出,在上午 10:00 下单后,订单转移到'OPEN PENDING'状态。在停留了 2.5 小时后,订单转移到'COMPLETE'状态。这是预期的,因为该订单是一个区间限价订单。

还有更多…

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

第十章:算法交易 - 模拟交易

在第八章 算法交易策略 - 编码 - 逐步 中构建算法交易策略,并在上一章成功进行了令人满意的回测后,下一步是在实时市场中模拟交易这些策略。

模拟交易 是在实时市场小时内执行交易策略的方法,仅通过实时记录来自策略执行的交易。这些交易不通过经纪人使用真实资金执行。之前,这些交易记录是在纸上完成的,因此称为 纸上交易。这些虚拟交易可用于分析风险和回报指标。典型的模拟交易指标包括 盈亏P&L)、最大回撤、总交易次数、盈利交易、亏损交易、多头交易和空头交易、每个盈利和亏损交易的平均利润等。应至少进行几个交易日的模拟交易,并在这些指标满足必要要求之前,整个过程应重复进行,包括更新策略参数和/或策略实施,然后进行回测和模拟交易。

模拟交易背后的基本思想是,交易策略可以在实时市场中执行,几乎与实际交易相似,但不冒真实资金的风险。模拟交易有助于确保过去的市场情景,用于回测的情景仍然有效。如果过去的市场情景当前不再存在,即使回测结果盈利,模拟交易结果可能会相反。这表明在将策略用于真实资金之前,策略参数和/或策略实施需要更多工作。

对于模拟交易,需要一个策略配置。其中包含多个参数,其中一些如下:

  • 开始和结束时间:在当前一天内进行模拟交易的时间段。
  • 金融工具:应进行模拟交易的一个或多个金融工具。
  • 蜡烛间隔:各种可能的蜡烛间隔之一 - 例如,1 分钟15 分钟小时
  • 策略特定参数:策略中定义的自定义参数的值。
  • 策略模式:即日内或交割。日内策略进行日内订单,这些订单在一天结束时平仓。交割策略进行交割订单,这些订单不会在一天结束时平仓,并会延续到下一个交易日。

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

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

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

这些策略也作为 Python 包的一部分提供,pyalgostrategypool。您可以使用 pip 安装它,如下所示:$ pip install pyalgostrategypool

您还可以在 GitHub 上查看它们(github.com/algobulls/pyalgostrategypool)。

由于您已经按照第八章,算法交易策略 - 逐步编码,将这两种策略上传到您的 AlgoBulls 账户。在本章中,您将从您的 AlgoBulls 账户中获取这些策略并对其进行模拟交易。在模拟交易后,您将获得策略执行日志和各种报告 - 即损益报告、统计报告和订单历史。这些日志和报告有助于验证策略的性能,并为实际交易做准备。通过使用 pyalgotrading,您可以确保在模拟交易中专注于开发和验证策略,而不必担心策略执行所需的生态系统。

本章包括了逐步配方,涵盖了之前提到的两种策略,从与 AlgoBulls 平台建立连接、获取策略、运行模拟交易任务到获取执行日志和各种类型的报告。

本章将涵盖以下内容:

  • EMA-Regular-Order 策略 – 获取该策略
  • EMA-Regular-Order 策略 – 模拟交易该策略
  • EMA-Regular-Order 策略 – 实时获取模拟交易日志
  • EMA-Regular-Order 策略 – 获取模拟交易报告 – 损益表
  • 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/Chapter10

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

在这个步骤中,您将从您在 AlgoBulls 平台上的帐户中获取策略类StrategyEMARegularOrder,这是您在第八章中通过EMA-Regular-Order 策略 – 在 AlgoBulls 交易平台上上传策略步骤中上传的。这个步骤首先建立到 AlgoBulls 平台的连接,查询您帐户中所有可用的策略,并获取所需策略类StrategyEMARegularOrder的详细信息。

确保您已经完成第八章中的前六个配方,Algorithmic Trading Strategies – Coding Step by Step,以获取使用的策略类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

我们得到以下输出。您的输出可能不同(确保您已经按照第八章中的配方,Algorithmic Trading Strategies – Coding Step by Step,来获得类似的输出):


  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。您应该从您的 Web 浏览器中访问此 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 交易平台 步骤中,在 Algorithmic Trading Strategies – Coding Step by Step)。您使用 algobulls_connection 对象的 get_strategy_details() 方法来检查策略。此方法以策略代码作为参数。您在这里传递 strategy_code1。此方法将整个类代码作为字符串返回。您将其分配给一个新变量 strategy_details1,并显示它。

如果您想要更改strategy_code1所引用的类代码,如步骤 7所示,请参考第八章中EMA-Regular-Order 策略 - 在 AlgoBulls 交易平台上上传策略配方的*There’s more…*部分,算法交易策略 - 逐步编码

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 time
>>> 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.papertrade(strategy_code=strategy_code1, 
        start_time=time(hour=9, minute=15), 
        end_time=time(hour=15, minute=30),
        instrument=instrument, 
        lots=1,
        strategy_parameters={
            'timeperiod1': 5,
            'timeperiod2': 12
        }, 
        candle_interval=CandleInterval.MINUTES_15)

我们得到以下输出:

Setting Strategy Config... Success.
Submitting PAPERTRADING job... Success.
  1. 检查已提交的纸上交易任务的状态:
>>> algobulls_connection.get_papertrading_job_status(
                                                strategy_code1)

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

相关实践学习
日志服务之使用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树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
24 2
|
10天前
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
在 Python 算法设计中,理解并巧妙运用时间复杂度和空间复杂度的知识,是实现高效、优雅代码的必经之路。通过不断地实践和优化,我们能够在这两个因素之间找到最佳的平衡点,创造出性能卓越的程序。
26 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
|
1天前
|
传感器 算法 C语言
基于无线传感器网络的节点分簇算法matlab仿真
该程序对传感器网络进行分簇,考虑节点能量状态、拓扑位置及孤立节点等因素。相较于LEACH算法,本程序评估网络持续时间、节点死亡趋势及能量消耗。使用MATLAB 2022a版本运行,展示了节点能量管理优化及网络生命周期延长的效果。通过簇头管理和数据融合,实现了能量高效和网络可扩展性。
下一篇
无影云桌面